Merge release-2019 into master
authorRoland Schulz <roland.schulz@intel.com>
Wed, 23 Jan 2019 17:23:51 +0000 (09:23 -0800)
committerPaul Bauer <paul.bauer.q@gmail.com>
Wed, 23 Jan 2019 17:55:57 +0000 (18:55 +0100)
Change-Id: I17cea87b19b5350853fdf652539a2f43e6092784

694 files changed:
.travis.yml [deleted file]
CMakeLists.txt
COPYING
admin/builds/gromacs.py
admin/builds/pre-submit-matrix.txt
admin/builds/release-matrix.txt
cmake/CheckCCompilerFlag.cmake [deleted file]
cmake/CheckCXXCompilerFlag.cmake [deleted file]
cmake/gmxManageClangCudaConfig.cmake
cmake/gmxManageLmfit.cmake
cmake/gmxManageOpenMP.cmake
cmake/gmxVersionInfo.cmake
docs/CMakeLists.txt
docs/manual/CMakeLists.txt
docs/release-notes/2019/major/deprecated-functionality.rst
docs/release-notes/2020/major/removed-functionality.rst [new file with mode: 0644]
docs/release-notes/bugs-fixed.rst [new file with mode: 0644]
docs/release-notes/deprecated-functionality.rst [new file with mode: 0644]
docs/release-notes/features.rst [new file with mode: 0644]
docs/release-notes/highlights.rst [new file with mode: 0644]
docs/release-notes/index.rst
docs/release-notes/miscellaneous.rst [new file with mode: 0644]
docs/release-notes/performance.rst [new file with mode: 0644]
docs/release-notes/portability.rst [new file with mode: 0644]
docs/release-notes/removed-functionality.rst [new file with mode: 0644]
docs/release-notes/tools.rst [new file with mode: 0644]
docs/user-guide/environment-variables.rst
docs/user-guide/mdp-options.rst
src/CMakeLists.txt
src/api/CMakeLists.txt
src/api/cpp/context.cpp
src/api/cpp/session.cpp
src/api/cpp/tests/CMakeLists.txt
src/api/cpp/workflow/tests/CMakeLists.txt
src/config.h.cmakein
src/external/build-fftw/CMakeLists.txt
src/external/build-fftw/fftw-download.cmake.cmakein [deleted file]
src/gromacs/CMakeLists.txt
src/gromacs/domdec/domdec.h
src/gromacs/domdec/domdec_topology.cpp
src/gromacs/domdec/partition.cpp
src/gromacs/domdec/partition.h
src/gromacs/ewald/pme-gpu-types-host.h
src/gromacs/ewald/pme-load-balancing.cpp
src/gromacs/ewald/pme-only.cpp
src/gromacs/fileio/gmxfio-xdr.cpp
src/gromacs/fileio/groio.cpp
src/gromacs/fileio/pdbio.cpp
src/gromacs/fileio/pdbio.h
src/gromacs/fileio/tngio.cpp
src/gromacs/fileio/vmdio.cpp
src/gromacs/gmxana/dlist.cpp
src/gromacs/gmxana/gmx_ana.h
src/gromacs/gmxana/gmx_anadock.cpp [deleted file]
src/gromacs/gmxana/gmx_chi.cpp
src/gromacs/gmxana/gmx_disre.cpp
src/gromacs/gmxana/gmx_dyndom.cpp [deleted file]
src/gromacs/gmxana/gmx_mindist.cpp
src/gromacs/gmxana/gmx_morph.cpp [deleted file]
src/gromacs/gmxana/gmx_msd.cpp
src/gromacs/gmxana/gmx_nmr.cpp
src/gromacs/gmxana/gmx_pme_error.cpp
src/gromacs/gmxana/gstat.h
src/gromacs/gmxana/tests/CMakeLists.txt
src/gromacs/gmxana/tests/gmx_mindist.cpp [new file with mode: 0644]
src/gromacs/gmxana/tests/gmx_msd.cpp
src/gromacs/gmxana/tests/refdata/MindistTest_groupWorks.xml [new file with mode: 0644]
src/gromacs/gmxana/tests/refdata/MindistTest_matrixWorks.xml [new file with mode: 0644]
src/gromacs/gmxana/tests/refdata/MindistTest_maxDistWorks.xml [new file with mode: 0644]
src/gromacs/gmxana/tests/refdata/MindistTest_mindistDoesNotPickUpContacts.xml [new file with mode: 0644]
src/gromacs/gmxana/tests/refdata/MindistTest_mindistPicksUpContacts.xml [new file with mode: 0644]
src/gromacs/gmxana/tests/refdata/MindistTest_mindistWorksWithMultipleAtoms.xml [new file with mode: 0644]
src/gromacs/gmxana/tests/refdata/MindistTest_mindistWorksWithSingleAtoms.xml [new file with mode: 0644]
src/gromacs/gmxana/tests/refdata/MindistTest_ngWorks.xml [new file with mode: 0644]
src/gromacs/gmxana/tests/refdata/MindistTest_noPbcWorks.xml [new file with mode: 0644]
src/gromacs/gmxana/tests/refdata/MindistTest_resPerTimeWorks.xml [new file with mode: 0644]
src/gromacs/gmxana/tests/refdata/MsdMolTest_diffMolMassWeighted.xml [new file with mode: 0644]
src/gromacs/gmxana/tests/refdata/MsdMolTest_diffMolNonMassWeighted.xml [new file with mode: 0644]
src/gromacs/gmxana/tests/refdata/MsdMolTest_diffMolSelected.xml [new file with mode: 0644]
src/gromacs/gmxlib/network.cpp
src/gromacs/gmxlib/nonbonded/nb_kernel_c/nb_kernel_allvsall.cpp [deleted file]
src/gromacs/gmxlib/nonbonded/nonbonded.cpp
src/gromacs/gmxlib/nrnb.cpp
src/gromacs/gmxlib/nrnb.h
src/gromacs/gmxpreprocess/add_par.h
src/gromacs/gmxpreprocess/convparm.cpp
src/gromacs/gmxpreprocess/convparm.h
src/gromacs/gmxpreprocess/editconf.cpp [moved from src/gromacs/gmxana/gmx_editconf.cpp with 98% similarity]
src/gromacs/gmxpreprocess/editconf.h [moved from src/gromacs/gmxlib/nonbonded/nb_kernel_c/nb_kernel_allvsall.h with 69% similarity]
src/gromacs/gmxpreprocess/fflibutil.h
src/gromacs/gmxpreprocess/gen_ad.cpp
src/gromacs/gmxpreprocess/gen_ad.h
src/gromacs/gmxpreprocess/gen_maxwell_velocities.cpp
src/gromacs/gmxpreprocess/gen_vsite.cpp
src/gromacs/gmxpreprocess/gen_vsite.h
src/gromacs/gmxpreprocess/genhydro.cpp
src/gromacs/gmxpreprocess/genhydro.h
src/gromacs/gmxpreprocess/genion.cpp [moved from src/gromacs/gmxana/gmx_genion.cpp with 99% similarity]
src/gromacs/gmxpreprocess/genion.h [new file with mode: 0644]
src/gromacs/gmxpreprocess/genrestr.cpp [moved from src/gromacs/gmxana/gmx_genpr.cpp with 98% similarity]
src/gromacs/gmxpreprocess/genrestr.h [new file with mode: 0644]
src/gromacs/gmxpreprocess/gmxcpp.cpp
src/gromacs/gmxpreprocess/gmxcpp.h
src/gromacs/gmxpreprocess/gpp_atomtype.cpp
src/gromacs/gmxpreprocess/gpp_atomtype.h
src/gromacs/gmxpreprocess/gpp_bond_atomtype.cpp
src/gromacs/gmxpreprocess/gpp_bond_atomtype.h
src/gromacs/gmxpreprocess/gpp_nextnb.cpp
src/gromacs/gmxpreprocess/gpp_nextnb.h
src/gromacs/gmxpreprocess/grompp-impl.h
src/gromacs/gmxpreprocess/grompp.cpp
src/gromacs/gmxpreprocess/h_db.cpp
src/gromacs/gmxpreprocess/h_db.h
src/gromacs/gmxpreprocess/hackblock.cpp
src/gromacs/gmxpreprocess/hackblock.h
src/gromacs/gmxpreprocess/hizzie.h
src/gromacs/gmxpreprocess/insert-molecules.cpp
src/gromacs/gmxpreprocess/makeexclusiondistances.cpp
src/gromacs/gmxpreprocess/makeexclusiondistances.h
src/gromacs/gmxpreprocess/nm2type.cpp
src/gromacs/gmxpreprocess/nm2type.h
src/gromacs/gmxpreprocess/pdb2gmx.cpp
src/gromacs/gmxpreprocess/pdb2top.cpp
src/gromacs/gmxpreprocess/pdb2top.h
src/gromacs/gmxpreprocess/readir.cpp
src/gromacs/gmxpreprocess/readir.h
src/gromacs/gmxpreprocess/resall.cpp
src/gromacs/gmxpreprocess/resall.h
src/gromacs/gmxpreprocess/solvate.cpp
src/gromacs/gmxpreprocess/specbond.cpp
src/gromacs/gmxpreprocess/specbond.h
src/gromacs/gmxpreprocess/ter_db.cpp
src/gromacs/gmxpreprocess/ter_db.h
src/gromacs/gmxpreprocess/tests/CMakeLists.txt
src/gromacs/gmxpreprocess/tests/solvate.cpp
src/gromacs/gmxpreprocess/tests/topdirs.cpp [new file with mode: 0644]
src/gromacs/gmxpreprocess/tomorse.cpp
src/gromacs/gmxpreprocess/tomorse.h
src/gromacs/gmxpreprocess/topdirs.cpp
src/gromacs/gmxpreprocess/topdirs.h
src/gromacs/gmxpreprocess/topio.cpp
src/gromacs/gmxpreprocess/topio.h
src/gromacs/gmxpreprocess/toppush.cpp
src/gromacs/gmxpreprocess/toppush.h
src/gromacs/gmxpreprocess/topshake.cpp
src/gromacs/gmxpreprocess/topshake.h
src/gromacs/gmxpreprocess/toputil.cpp
src/gromacs/gmxpreprocess/toputil.h
src/gromacs/gmxpreprocess/vsite_parm.cpp
src/gromacs/gmxpreprocess/vsite_parm.h
src/gromacs/gmxpreprocess/x2top.cpp
src/gromacs/gmxpreprocess/xlate.cpp
src/gromacs/gmxpreprocess/xlate.h
src/gromacs/gpu_utils/cudautils.cu
src/gromacs/gpu_utils/cudautils.cuh
src/gromacs/gpu_utils/gpu_utils.cpp
src/gromacs/gpu_utils/gpu_utils.cu
src/gromacs/gpu_utils/gpu_utils.h
src/gromacs/gpu_utils/gpu_utils_ocl.cpp
src/gromacs/gpu_utils/hostallocator.h
src/gromacs/gpu_utils/oclraii.h
src/gromacs/gpu_utils/oclutils.cpp
src/gromacs/gpu_utils/oclutils.h
src/gromacs/gpu_utils/tests/hostallocator.cpp
src/gromacs/listed-forces/gpubonded-impl.h
src/gromacs/listed-forces/listed-internal.h
src/gromacs/listed-forces/manage-threading.cpp
src/gromacs/listed-forces/orires.cpp
src/gromacs/listed-forces/tests/bonded.cpp
src/gromacs/listed-forces/tests/refdata/BondedTest_IfuncAnglesPbcNo.xml [deleted file]
src/gromacs/listed-forces/tests/refdata/BondedTest_IfuncAnglesPbcXYZ.xml [deleted file]
src/gromacs/listed-forces/tests/refdata/BondedTest_IfuncAnglesPbcXy.xml [deleted file]
src/gromacs/listed-forces/tests/refdata/BondedTest_IfuncBondsPbcNo.xml [deleted file]
src/gromacs/listed-forces/tests/refdata/BondedTest_IfuncBondsPbcXy.xml [deleted file]
src/gromacs/listed-forces/tests/refdata/BondedTest_IfuncBondsPbcXyz.xml [deleted file]
src/gromacs/listed-forces/tests/refdata/BondedTest_IfuncProperDihedralsPbcNo.xml [deleted file]
src/gromacs/listed-forces/tests/refdata/BondedTest_IfuncProperDihedralsPbcXy.xml [deleted file]
src/gromacs/listed-forces/tests/refdata/BondedTest_IfuncProperDihedralsPbcXyz.xml [deleted file]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_BondAngle_0.xml [moved from src/gromacs/listed-forces/tests/refdata/BondedTest_BondAnglePbcNone.xml with 81% similarity]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_BondAngle_1.xml [moved from src/gromacs/listed-forces/tests/refdata/BondedTest_BondAnglePbcXy.xml with 81% similarity]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_BondAngle_2.xml [moved from src/gromacs/listed-forces/tests/refdata/BondedTest_BondAnglePbcXyz.xml with 81% similarity]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_BondAngle_3.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_BondAngle_4.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_BondAngle_5.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_BondAngle_6.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_BondAngle_7.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_BondAngle_8.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_DihedralAngle_0.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_DihedralAngle_1.xml [moved from src/gromacs/listed-forces/tests/refdata/BondedTest_DihedralAnglePbcXy.xml with 80% similarity]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_DihedralAngle_2.xml [moved from src/gromacs/listed-forces/tests/refdata/BondedTest_DihedralAnglePbcXyz.xml with 80% similarity]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_DihedralAngle_3.xml [moved from src/gromacs/listed-forces/tests/refdata/BondedTest_DihedralAnglePbcNone.xml with 83% similarity]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_DihedralAngle_4.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_DihedralAngle_5.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_DihedralAngle_6.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_DihedralAngle_7.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_DihedralAngle_8.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncAngles_0.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncAngles_1.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncAngles_2.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncAngles_3.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncAngles_4.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncAngles_5.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncAngles_6.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncAngles_7.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncAngles_8.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncBonds_0.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncBonds_1.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncBonds_2.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncBonds_3.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncBonds_4.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncBonds_5.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncBonds_6.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncBonds_7.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncBonds_8.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedralsFEP_0.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedralsFEP_1.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedralsFEP_2.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedralsFEP_3.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedralsFEP_4.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedralsFEP_5.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedralsFEP_6.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedralsFEP_7.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedralsFEP_8.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedrals_0.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedrals_1.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedrals_2.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedrals_3.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedrals_4.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedrals_5.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedrals_6.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedrals_7.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedrals_8.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncProperDihedrals_0.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncProperDihedrals_1.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncProperDihedrals_2.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncProperDihedrals_3.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncProperDihedrals_4.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncProperDihedrals_5.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncProperDihedrals_6.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncProperDihedrals_7.xml [new file with mode: 0644]
src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncProperDihedrals_8.xml [new file with mode: 0644]
src/gromacs/math/multidimarray.h [new file with mode: 0644]
src/gromacs/math/tests/CMakeLists.txt
src/gromacs/math/tests/multidimarray.cpp [new file with mode: 0644]
src/gromacs/mdlib/constr.cpp
src/gromacs/mdlib/coupling.cpp
src/gromacs/mdlib/forcerec.cpp
src/gromacs/mdlib/forcerec.h
src/gromacs/mdlib/lincs.cpp
src/gromacs/mdlib/md_support.cpp
src/gromacs/mdlib/md_support.h
src/gromacs/mdlib/mdatoms.cpp
src/gromacs/mdlib/mdatoms.h
src/gromacs/mdlib/mdebin.cpp
src/gromacs/mdlib/mdoutf.cpp
src/gromacs/mdlib/mdsetup.cpp
src/gromacs/mdlib/mdsetup.h
src/gromacs/mdlib/nbnxn_atomdata.cpp
src/gromacs/mdlib/nbnxn_atomdata.h
src/gromacs/mdlib/nbnxn_consts.h
src/gromacs/mdlib/nbnxn_cuda/nbnxn_cuda.cu
src/gromacs/mdlib/nbnxn_cuda/nbnxn_cuda_data_mgmt.cu
src/gromacs/mdlib/nbnxn_gpu.h
src/gromacs/mdlib/nbnxn_gpu_data_mgmt.h
src/gromacs/mdlib/nbnxn_grid.cpp
src/gromacs/mdlib/nbnxn_internal.h
src/gromacs/mdlib/nbnxn_kernels/nbnxn_kernel_common.cpp
src/gromacs/mdlib/nbnxn_kernels/nbnxn_kernel_common.h
src/gromacs/mdlib/nbnxn_kernels/nbnxn_kernel_cpu.cpp
src/gromacs/mdlib/nbnxn_kernels/nbnxn_kernel_cpu.h
src/gromacs/mdlib/nbnxn_kernels/nbnxn_kernel_file_generator/make_verlet_simd_kernel_files.py
src/gromacs/mdlib/nbnxn_kernels/nbnxn_kernel_file_generator/nbnxn_kernel_simd_2xnn_kernel.cpp.pre
src/gromacs/mdlib/nbnxn_kernels/nbnxn_kernel_file_generator/nbnxn_kernel_simd_4xn_kernel.cpp.pre
src/gromacs/mdlib/nbnxn_kernels/nbnxn_kernel_gpu_ref.cpp
src/gromacs/mdlib/nbnxn_kernels/nbnxn_kernel_gpu_ref.h
src/gromacs/mdlib/nbnxn_kernels/nbnxn_kernel_prune.cpp
src/gromacs/mdlib/nbnxn_kernels/nbnxn_kernel_ref_inner.h
src/gromacs/mdlib/nbnxn_kernels/nbnxn_kernel_ref_outer.h
src/gromacs/mdlib/nbnxn_kernels/nbnxn_kernel_ref_prune.cpp
src/gromacs/mdlib/nbnxn_kernels/nbnxn_kernel_ref_prune.h
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEwTwinCut_VdwLJ_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEwTwinCut_VdwLJ_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEwTwinCut_VdwLJ_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEw_VdwLJCombGeom_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEw_VdwLJCombGeom_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEw_VdwLJCombGeom_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEw_VdwLJCombLB_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEw_VdwLJCombLB_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEw_VdwLJCombLB_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEw_VdwLJEwCombGeom_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEw_VdwLJFSw_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEw_VdwLJFSw_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEw_VdwLJFSw_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEw_VdwLJPSw_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEw_VdwLJPSw_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEw_VdwLJPSw_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEw_VdwLJ_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEw_VdwLJ_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecEw_VdwLJ_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTab_VdwLJCombGeom_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTab_VdwLJCombLB_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTab_VdwLJCombLB_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTab_VdwLJCombLB_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTab_VdwLJFSw_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTab_VdwLJFSw_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTab_VdwLJFSw_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTab_VdwLJPSw_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTab_VdwLJPSw_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTab_VdwLJPSw_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTab_VdwLJ_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTab_VdwLJ_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecQSTab_VdwLJ_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecRF_VdwLJCombGeom_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecRF_VdwLJCombGeom_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecRF_VdwLJCombGeom_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecRF_VdwLJCombLB_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecRF_VdwLJCombLB_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecRF_VdwLJCombLB_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecRF_VdwLJEwCombGeom_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecRF_VdwLJFSw_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecRF_VdwLJFSw_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecRF_VdwLJFSw_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecRF_VdwLJPSw_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecRF_VdwLJPSw_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecRF_VdwLJPSw_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecRF_VdwLJ_F_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecRF_VdwLJ_VF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_ElecRF_VdwLJ_VgrpF_2xnn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_simd_2xnn.h
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_simd_2xnn_common.h
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_simd_2xnn_inner.h
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_simd_2xnn_outer.h
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_simd_2xnn_prune.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_2xnn/nbnxn_kernel_simd_2xnn_prune.h
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEwTwinCut_VdwLJ_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEwTwinCut_VdwLJ_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEwTwinCut_VdwLJ_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEw_VdwLJCombGeom_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEw_VdwLJCombGeom_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEw_VdwLJCombGeom_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEw_VdwLJCombLB_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEw_VdwLJCombLB_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEw_VdwLJCombLB_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEw_VdwLJEwCombGeom_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEw_VdwLJFSw_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEw_VdwLJFSw_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEw_VdwLJFSw_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEw_VdwLJPSw_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEw_VdwLJPSw_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEw_VdwLJPSw_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEw_VdwLJ_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEw_VdwLJ_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecEw_VdwLJ_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTab_VdwLJCombGeom_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTab_VdwLJCombLB_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTab_VdwLJCombLB_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTab_VdwLJCombLB_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTab_VdwLJFSw_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTab_VdwLJFSw_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTab_VdwLJFSw_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTab_VdwLJPSw_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTab_VdwLJPSw_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTab_VdwLJPSw_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTab_VdwLJ_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTab_VdwLJ_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecQSTab_VdwLJ_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecRF_VdwLJCombGeom_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecRF_VdwLJCombGeom_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecRF_VdwLJCombGeom_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecRF_VdwLJCombLB_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecRF_VdwLJCombLB_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecRF_VdwLJCombLB_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecRF_VdwLJEwCombGeom_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecRF_VdwLJFSw_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecRF_VdwLJFSw_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecRF_VdwLJFSw_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecRF_VdwLJPSw_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecRF_VdwLJPSw_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecRF_VdwLJPSw_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecRF_VdwLJ_F_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecRF_VdwLJ_VF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_ElecRF_VdwLJ_VgrpF_4xn.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_simd_4xn.h
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_simd_4xn_common.h
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_simd_4xn_inner.h
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_simd_4xn_outer.h
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_simd_4xn_prune.cpp
src/gromacs/mdlib/nbnxn_kernels/simd_4xn/nbnxn_kernel_simd_4xn_prune.h
src/gromacs/mdlib/nbnxn_ocl/nbnxn_ocl.cpp
src/gromacs/mdlib/nbnxn_ocl/nbnxn_ocl_data_mgmt.cpp
src/gromacs/mdlib/nbnxn_pairlist.h
src/gromacs/mdlib/nbnxn_search.cpp
src/gromacs/mdlib/nbnxn_search.h
src/gromacs/mdlib/nbnxn_search_simd_2xnn.h
src/gromacs/mdlib/nbnxn_search_simd_4xn.h
src/gromacs/mdlib/nbnxn_util.h
src/gromacs/mdlib/ns.cpp
src/gromacs/mdlib/qmmm.cpp
src/gromacs/mdlib/qmmm.h
src/gromacs/mdlib/shake.cpp
src/gromacs/mdlib/shake.h
src/gromacs/mdlib/shellfc.cpp
src/gromacs/mdlib/sim_util.cpp
src/gromacs/mdlib/sim_util.h
src/gromacs/mdlib/stat.cpp
src/gromacs/mdlib/stophandler.cpp
src/gromacs/mdlib/tests/CMakeLists.txt
src/gromacs/mdlib/tests/constr.cpp [new file with mode: 0644]
src/gromacs/mdlib/tests/constrdata.h [new file with mode: 0644]
src/gromacs/mdlib/tgroup.cpp
src/gromacs/mdlib/update.cpp
src/gromacs/mdlib/update.h
src/gromacs/mdlib/vcm.cpp
src/gromacs/mdlib/vcm.h
src/gromacs/mdrun/legacymdrunoptions.cpp
src/gromacs/mdrun/md.cpp
src/gromacs/mdrun/mimic.cpp
src/gromacs/mdrun/minimize.cpp
src/gromacs/mdrun/rerun.cpp
src/gromacs/mdrun/runner.cpp
src/gromacs/mdrun/tpi.cpp
src/gromacs/mdspan/CMakeLists.txt [new file with mode: 0644]
src/gromacs/mdspan/README [new file with mode: 0644]
src/gromacs/mdspan/accessor_policy.h [new file with mode: 0644]
src/gromacs/mdspan/extents.h [new file with mode: 0644]
src/gromacs/mdspan/layouts.h [new file with mode: 0644]
src/gromacs/mdspan/mdspan.h [new file with mode: 0644]
src/gromacs/mdspan/tests/CMakeLists.txt [new file with mode: 0644]
src/gromacs/mdspan/tests/accessor_policy.cpp [new file with mode: 0644]
src/gromacs/mdspan/tests/extents.cpp [new file with mode: 0644]
src/gromacs/mdspan/tests/layouts.cpp [new file with mode: 0644]
src/gromacs/mdspan/tests/mdspan.cpp [new file with mode: 0644]
src/gromacs/mdtypes/forcerec.h
src/gromacs/mdtypes/group.cpp [new file with mode: 0644]
src/gromacs/mdtypes/group.h
src/gromacs/mdtypes/state.h
src/gromacs/mimic/MimicCommunicator.cpp
src/gromacs/mimic/MimicCommunicator.h
src/gromacs/options/abstractoption.cpp
src/gromacs/options/abstractoption.h
src/gromacs/options/abstractoptionstorage.h
src/gromacs/options/basicoptions.cpp
src/gromacs/options/basicoptionstorage.h
src/gromacs/options/optionsassigner.cpp
src/gromacs/options/optionsassigner.h
src/gromacs/options/optionstoragetemplate.h
src/gromacs/options/tests/abstractoptionstorage.cpp
src/gromacs/options/tests/optionsassigner.cpp
src/gromacs/options/treesupport.cpp
src/gromacs/options/valueconverter.h
src/gromacs/pulling/pull.cpp
src/gromacs/selection/selectionfileoptionstorage.h
src/gromacs/selection/selectionoption.cpp
src/gromacs/selection/selectionoptionstorage.h
src/gromacs/taskassignment/decidegpuusage.cpp
src/gromacs/taskassignment/decidegpuusage.h
src/gromacs/timing/cyclecounter.cpp
src/gromacs/timing/wallcycle.cpp
src/gromacs/timing/wallcycle.h
src/gromacs/tools/check.cpp
src/gromacs/tools/dump.cpp
src/gromacs/topology/CMakeLists.txt
src/gromacs/topology/atomprop.cpp
src/gromacs/topology/atomprop.h
src/gromacs/topology/atoms.cpp
src/gromacs/topology/atoms.h
src/gromacs/topology/block.cpp
src/gromacs/topology/block.h
src/gromacs/topology/index.cpp
src/gromacs/topology/index.h
src/gromacs/topology/mtop_util.cpp
src/gromacs/topology/mtop_util.h
src/gromacs/topology/residuetypes.cpp
src/gromacs/topology/residuetypes.h
src/gromacs/topology/tests/CMakeLists.txt [new file with mode: 0644]
src/gromacs/topology/tests/mtop.cpp [new file with mode: 0644]
src/gromacs/topology/topology.cpp
src/gromacs/topology/topology.h
src/gromacs/trajectory/trajectoryframe.cpp
src/gromacs/trajectoryanalysis/modules/freevolume.cpp
src/gromacs/trajectoryanalysis/modules/sasa.cpp
src/gromacs/trajectoryanalysis/topologyinformation.cpp
src/gromacs/utility/any.cpp [moved from src/gromacs/utility/variant.cpp with 93% similarity]
src/gromacs/utility/any.h [moved from src/gromacs/utility/variant.h with 81% similarity]
src/gromacs/utility/coolstuff.cpp
src/gromacs/utility/defaultinitializationallocator.h [new file with mode: 0644]
src/gromacs/utility/enumerationhelpers.h [new file with mode: 0644]
src/gromacs/utility/keyvaluetree.h
src/gromacs/utility/keyvaluetreebuilder.h
src/gromacs/utility/keyvaluetreetransform.cpp
src/gromacs/utility/keyvaluetreetransform.h
src/gromacs/utility/pleasecite.cpp
src/gromacs/utility/stringutil.cpp
src/gromacs/utility/stringutil.h
src/gromacs/utility/tests/CMakeLists.txt
src/gromacs/utility/tests/defaultinitializationallocator.cpp [new file with mode: 0644]
src/gromacs/utility/tests/enumerationhelpers.cpp [new file with mode: 0644]
src/programs/CMakeLists.txt
src/programs/legacymodules.cpp
src/programs/mdrun/tests/CMakeLists.txt
src/programs/mdrun/tests/mimic.cpp
src/programs/mdrun/tests/minimize.cpp
src/programs/mdrun/tests/moduletest.cpp
src/programs/mdrun/tests/moduletest.h
src/programs/mdrun/tests/normalmodes.cpp [new file with mode: 0644]
src/programs/mdrun/tests/refdata/Angles1_SimpleMdrunTest_WithinTolerances_0.xml [new file with mode: 0644]
src/programs/mdrun/tests/refdata/Angles1_SimpleMdrunTest_WithinTolerances_1.xml [new file with mode: 0644]
src/programs/mdrun/tests/refdata/MinimizersWorkWithConstraints_EnergyMinimizationTest_WithinTolerances_0.xml
src/programs/mdrun/tests/refdata/MinimizersWorkWithConstraints_EnergyMinimizationTest_WithinTolerances_1.xml
src/programs/mdrun/tests/refdata/NormalModesWorks_NormalModesTest_WithinTolerances_0.xml [new file with mode: 0644]
src/programs/mdrun/tests/refdata/NormalModesWorks_NormalModesTest_WithinTolerances_1.xml [new file with mode: 0644]
src/programs/mdrun/tests/refdata/NormalModesWorks_NormalModesTest_WithinTolerances_2.xml [new file with mode: 0644]
src/programs/mdrun/tests/refdata/NormalModesWorks_NormalModesTest_WithinTolerances_3.xml [new file with mode: 0644]
src/programs/mdrun/tests/refdata/NormalModesWorks_NormalModesTest_WithinTolerances_4.xml [new file with mode: 0644]
src/programs/mdrun/tests/rerun.cpp
src/programs/mdrun/tests/simple_mdrun.cpp [new file with mode: 0644]
src/programs/mdrun/tests/spc-and-methanol.gro [deleted file]
src/programs/mdrun/tests/spc-and-methanol.ndx [deleted file]
src/programs/mdrun/tests/spc-and-methanol.top [deleted file]
src/programs/mdrun/tests/swapcoords.cpp
src/programs/mdrun/tests/tpitest.cpp
src/programs/view/Xstuff.h
src/programs/view/manager.cpp
src/programs/view/manager.h
src/testutils/CMakeLists.txt
src/testutils/cmdlinetest.cpp
src/testutils/cmdlinetest.h
src/testutils/refdata.cpp
src/testutils/refdata.h
src/testutils/simulationdatabase.cpp [moved from src/programs/mdrun/tests/simulationdatabase.cpp with 86% similarity]
src/testutils/simulationdatabase.h [moved from src/programs/mdrun/tests/simulationdatabase.h with 93% similarity]
src/testutils/simulationdatabase/1quantum.ndx [moved from src/programs/mdrun/tests/1quantum.ndx with 100% similarity]
src/testutils/simulationdatabase/2quantum.ndx [moved from src/programs/mdrun/tests/2quantum.ndx with 100% similarity]
src/testutils/simulationdatabase/4water.gro [moved from src/programs/mdrun/tests/4water.gro with 100% similarity]
src/testutils/simulationdatabase/4water.top [moved from src/programs/mdrun/tests/4water.top with 100% similarity]
src/testutils/simulationdatabase/OctaneSandwich.gro [moved from src/programs/mdrun/tests/OctaneSandwich.gro with 100% similarity]
src/testutils/simulationdatabase/OctaneSandwich.ndx [moved from src/programs/mdrun/tests/OctaneSandwich.ndx with 100% similarity]
src/testutils/simulationdatabase/OctaneSandwich.top [moved from src/programs/mdrun/tests/OctaneSandwich.top with 100% similarity]
src/testutils/simulationdatabase/ala.gro [moved from src/programs/mdrun/tests/ala.gro with 100% similarity]
src/testutils/simulationdatabase/ala.ndx [moved from src/programs/mdrun/tests/ala.ndx with 100% similarity]
src/testutils/simulationdatabase/ala.top [moved from src/programs/mdrun/tests/ala.top with 100% similarity]
src/testutils/simulationdatabase/alanine_vsite.itp [moved from src/programs/mdrun/tests/alanine_vsite.itp with 100% similarity]
src/testutils/simulationdatabase/alanine_vsite_solvated.gro [moved from src/programs/mdrun/tests/alanine_vsite_solvated.gro with 100% similarity]
src/testutils/simulationdatabase/alanine_vsite_solvated.ndx [moved from src/programs/mdrun/tests/alanine_vsite_solvated.ndx with 100% similarity]
src/testutils/simulationdatabase/alanine_vsite_solvated.top [moved from src/programs/mdrun/tests/alanine_vsite_solvated.top with 100% similarity]
src/testutils/simulationdatabase/alanine_vsite_vacuo.gro [moved from src/programs/mdrun/tests/alanine_vsite_vacuo.gro with 100% similarity]
src/testutils/simulationdatabase/alanine_vsite_vacuo.ndx [moved from src/programs/mdrun/tests/alanine_vsite_vacuo.ndx with 100% similarity]
src/testutils/simulationdatabase/alanine_vsite_vacuo.top [moved from src/programs/mdrun/tests/alanine_vsite_vacuo.top with 100% similarity]
src/testutils/simulationdatabase/allquantum.ndx [moved from src/programs/mdrun/tests/allquantum.ndx with 100% similarity]
src/testutils/simulationdatabase/angles1.gro [new file with mode: 0644]
src/testutils/simulationdatabase/angles1.ndx [moved from src/programs/mdrun/tests/butane1.ndx with 100% similarity]
src/testutils/simulationdatabase/angles1.top [new file with mode: 0644]
src/testutils/simulationdatabase/argon12.gro [moved from src/programs/mdrun/tests/argon12.gro with 100% similarity]
src/testutils/simulationdatabase/argon12.ndx [moved from src/programs/mdrun/tests/argon12.ndx with 100% similarity]
src/testutils/simulationdatabase/argon12.top [moved from src/programs/mdrun/tests/argon12.top with 100% similarity]
src/testutils/simulationdatabase/argon5832.gro [moved from src/programs/mdrun/tests/argon5832.gro with 100% similarity]
src/testutils/simulationdatabase/argon5832.ndx [moved from src/programs/mdrun/tests/argon5832.ndx with 100% similarity]
src/testutils/simulationdatabase/argon5832.top [moved from src/programs/mdrun/tests/argon5832.top with 100% similarity]
src/testutils/simulationdatabase/butane1.gro [moved from src/programs/mdrun/tests/butane1.gro with 100% similarity]
src/testutils/simulationdatabase/butane1.ndx [new file with mode: 0644]
src/testutils/simulationdatabase/butane_a0.xvg [moved from src/programs/mdrun/tests/butane_a0.xvg with 100% similarity]
src/testutils/simulationdatabase/butane_b0.xvg [moved from src/programs/mdrun/tests/butane_b0.xvg with 100% similarity]
src/testutils/simulationdatabase/butane_d0.xvg [moved from src/programs/mdrun/tests/butane_d0.xvg with 100% similarity]
src/testutils/simulationdatabase/glycine_no_constraints_vacuo.gro [moved from src/programs/mdrun/tests/glycine_no_constraints_vacuo.gro with 100% similarity]
src/testutils/simulationdatabase/glycine_no_constraints_vacuo.ndx [moved from src/programs/mdrun/tests/glycine_no_constraints_vacuo.ndx with 100% similarity]
src/testutils/simulationdatabase/glycine_no_constraints_vacuo.top [moved from src/programs/mdrun/tests/glycine_no_constraints_vacuo.top with 100% similarity]
src/testutils/simulationdatabase/glycine_vacuo.gro [moved from src/programs/mdrun/tests/glycine_vacuo.gro with 100% similarity]
src/testutils/simulationdatabase/glycine_vacuo.itp [moved from src/programs/mdrun/tests/glycine_vacuo.itp with 100% similarity]
src/testutils/simulationdatabase/glycine_vacuo.ndx [moved from src/programs/mdrun/tests/glycine_vacuo.ndx with 100% similarity]
src/testutils/simulationdatabase/glycine_vacuo.top [moved from src/programs/mdrun/tests/glycine_vacuo.top with 100% similarity]
src/testutils/simulationdatabase/mindist.ndx [new file with mode: 0644]
src/testutils/simulationdatabase/mindist_coords.gro [new file with mode: 0644]
src/testutils/simulationdatabase/nonanol_vacuo.gro [moved from src/programs/mdrun/tests/nonanol_vacuo.gro with 100% similarity]
src/testutils/simulationdatabase/nonanol_vacuo.ndx [moved from src/programs/mdrun/tests/nonanol_vacuo.ndx with 100% similarity]
src/testutils/simulationdatabase/nonanol_vacuo.top [moved from src/programs/mdrun/tests/nonanol_vacuo.top with 100% similarity]
src/testutils/simulationdatabase/one-tip5p.g96 [new file with mode: 0644]
src/testutils/simulationdatabase/one-tip5p.ndx [new file with mode: 0644]
src/testutils/simulationdatabase/one-tip5p.top [new file with mode: 0644]
src/testutils/simulationdatabase/scaled-water.g96 [new file with mode: 0644]
src/testutils/simulationdatabase/scaled-water.ndx [new file with mode: 0644]
src/testutils/simulationdatabase/scaled-water.top [new file with mode: 0644]
src/testutils/simulationdatabase/spc-and-methanol.gro
src/testutils/simulationdatabase/spc-dimer.g96 [new file with mode: 0644]
src/testutils/simulationdatabase/spc-dimer.ndx [new file with mode: 0644]
src/testutils/simulationdatabase/spc-dimer.top [new file with mode: 0644]
src/testutils/simulationdatabase/spc2.gro [moved from src/programs/mdrun/tests/spc2.gro with 100% similarity]
src/testutils/simulationdatabase/spc2.ndx [moved from src/programs/mdrun/tests/spc2.ndx with 100% similarity]
src/testutils/simulationdatabase/spc2.top [moved from src/programs/mdrun/tests/spc2.top with 100% similarity]
src/testutils/simulationdatabase/spc2.trr [moved from src/programs/mdrun/tests/spc2.trr with 100% similarity]
src/testutils/simulationdatabase/spc216.gro [moved from src/programs/mdrun/tests/spc216.gro with 100% similarity]
src/testutils/simulationdatabase/spc216.ndx [moved from src/programs/mdrun/tests/spc216.ndx with 100% similarity]
src/testutils/simulationdatabase/spc216.top [moved from src/programs/mdrun/tests/spc216.top with 100% similarity]
src/testutils/simulationdatabase/spc216_with_methane.gro [moved from src/programs/mdrun/tests/spc216_with_methane.gro with 100% similarity]
src/testutils/simulationdatabase/spc216_with_methane.top [moved from src/programs/mdrun/tests/spc216_with_methane.top with 100% similarity]
src/testutils/simulationdatabase/spc2_and_vacuum.gro [moved from src/programs/mdrun/tests/spc2_and_vacuum.gro with 100% similarity]
src/testutils/simulationdatabase/spc5.ndx [new file with mode: 0644]
src/testutils/simulationdatabase/spc5.pdb [new file with mode: 0644]
src/testutils/simulationdatabase/spc5.top [new file with mode: 0644]
src/testutils/simulationdatabase/spc5_3.ndx [new file with mode: 0644]
src/testutils/simulationdatabase/sw-dimer.g96 [new file with mode: 0644]
src/testutils/simulationdatabase/sw-dimer.ndx [new file with mode: 0644]
src/testutils/simulationdatabase/sw-dimer.top [new file with mode: 0644]
src/testutils/simulationdatabase/tip3p5.gro [moved from src/programs/mdrun/tests/spc5.gro with 100% similarity]
src/testutils/simulationdatabase/tip3p5.ndx [moved from src/programs/mdrun/tests/spc5.ndx with 100% similarity]
src/testutils/simulationdatabase/tip3p5.top [moved from src/programs/mdrun/tests/spc5.top with 99% similarity]
src/testutils/simulationdatabase/villin.g96 [new file with mode: 0644]
src/testutils/simulationdatabase/villin.ndx [new file with mode: 0644]
src/testutils/simulationdatabase/villin.top [new file with mode: 0644]
src/testutils/tests/refdata_tests.cpp
tests/CMakeLists.txt

diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644 (file)
index 3df332a..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-language: cpp
-
-before_install:
- - echo "yes" | sudo add-apt-repository ppa:kalakris/cmake #https://github.com/travis-ci/travis-ci/issues/2212
- - sudo apt-get update
- - sudo apt-get install libfftw3-dev libopenmpi-dev libx11-dev zlib1g-dev libgsl0-dev libxml2-dev libblas-dev liblapack-dev libboost-dev cmake
-
-env:
-  matrix:
-    - GMX_DOUBLE=OFF GMX_MPI=OFF
-    - GMX_DOUBLE=OFF GMX_MPI=ON
-    - GMX_DOUBLE=ON  GMX_MPI=OFF
-    - GMX_DOUBLE=ON  GMX_MPI=ON
-
-script: 
-  - mkdir build && pushd build && cmake -DGMX_DOUBLE=$GMX_DOUBLE -DGMX_MPI=$GMX_MPI .. && make -j4
-
-compiler:
-  - clang
-  - gcc
index 0191097c78c1962b53da399b1b797a01739ccc36..44ca7ade08d35796bd4d7ac654cbe8c48e0da1d7 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2009,2010,2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+# Copyright (c) 2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019, 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.
@@ -32,7 +32,7 @@
 # To help us fund GROMACS development, we humbly ask that you cite
 # the research papers on the package. Check out http://www.gromacs.org.
 
-cmake_minimum_required(VERSION 3.4.3)
+cmake_minimum_required(VERSION 3.9.6)
 
 # CMake modules/macros are in a subdirectory to keep this file cleaner
 # This needs to be set before project() in order to pick up toolchain files
@@ -146,21 +146,6 @@ set(GMX_STDLIB_LIBRARIES "" CACHE STRING "Linker libraries for a particular C++
 mark_as_advanced(GMX_STDLIB_CXX_FLAGS)
 mark_as_advanced(GMX_STDLIB_LIBRARIES)
 
-########################################################################
-# Detect CXX11 support and flags
-########################################################################
-# The cmake/Check{C,CXX}CompilerFlag.cmake files in the GROMACS distribution
-# are used with permission from CMake v3.0.0 so that GROMACS can detect
-# invalid options with the Intel Compilers, and we have added a line
-# to detect warnings with the Fujitsu compilers on K computer and ICC.
-# CMake-3.0 also has a bug where the FAIL_REGEX pattern for AIX contains
-# a semicolon. Since this is also used as a separator in lists inside CMake,
-# that string ends up being split into two separate patterns, and the last
-# part is just a single word that also matches other messages. We solved this
-# by replacing the semicolon with a period that matches any character.
-#
-# These files should be removed from the source tree when a CMake version that
-# includes the features in question becomes required for building GROMACS.
 include(CheckCCompilerFlag)
 include(CheckCXXCompilerFlag)
 
@@ -814,17 +799,6 @@ else()
     message("CMAKE_SHARED_LINKER_FLAGS: ${FFT_LINKER_FLAGS} ${MPI_LINKER_FLAGS}")
 endif()
 
-if(NOT GMX_OPENMP)
-    #Unset all OpenMP flags in case OpenMP was disabled either by the user
-    #or because it was only partially detected (e.g. only for C but not C++ compiler)
-    unset(OpenMP_C_FLAGS CACHE)
-    unset(OpenMP_CXX_FLAGS CACHE)
-else()
-    set(GMX_EXE_LINKER_FLAGS ${GMX_EXE_LINKER_FLAGS} ${OpenMP_LINKER_FLAGS})
-    set(GMX_SHARED_LINKER_FLAGS ${GMX_SHARED_LINKER_FLAGS} ${OpenMP_SHARED_LINKER_FLAGS})
-endif()
-
-
 ########################################################################
 # Specify install locations
 ########################################################################
diff --git a/COPYING b/COPYING
index 1d94bc08a950878a1cd095de1770a48aa4aa1103..7203cc4edfa9082eb165e2bb5e197f65675fe41d 100644 (file)
--- a/COPYING
+++ b/COPYING
@@ -25,6 +25,7 @@ This file contains the licenses for the following bodies of code:
 14. lmfit
 15. clFFT
 16. Guidelines Support Library (GSL)
+17. P0009 reference implementation (Sandia Corporation)
 
 Our chosen method for packaging distributions (CPack) only permits a
 package to have a single license file, so we are unfortunately forced
@@ -1322,3 +1323,45 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
 --
+
+17. P0009 reference implementation (Sandia Corporation)
+=======================================================
+
+   Files: src/gromacs/mdspan/*
+
+                         Kokkos v. 2.0
+              Copyright (2014) Sandia Corporation
+
+Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+the U.S. Government retains certain rights in this software.
+
+Kokkos is licensed under 3-clause BSD terms of use:
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the Corporation nor the names of the
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Questions? Contact Christian R. Trott (crtrott@sandia.gov)
index b1bde7ad28d666f7d0ff9e0cfb97ed7ee46d79fc..ec6fa73a5cd74e0decd1ce2e6f9823ef91ec49ca 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2015,2016,2017,2018, by the GROMACS development team, led by
+# Copyright (c) 2015,2016,2017,2018,2019, 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.
index 41976a95ef0a8db66ebfad0e4fca4bf1a31a9919..d4fcfa523e16bbe0ecd722b28ed96aefa2e3111e 100644 (file)
 
 # Test older gcc
 # Test oldest supported CUDA
+# Test oldest supported cmake
 # Test oldest supported Ubuntu
 # Test MPI with CUDA
 # Test MPI with gcc
-# Test cmake version from before new FindCUDA support (in 3.8)
 # Test MPMD PME with library MPI
-# Test recent cmake (3.7+), to cover minor FindCUDA changes from 3.7.0
-gcc-4.8 gpuhw=nvidia cuda-7.0 cmake-3.8.1 mpi npme=1 nranks=2 openmp
+gcc-4.8 gpuhw=nvidia cuda-7.0 cmake-3.9.6 mpi npme=1 nranks=2 openmp
 
 # Test non-default use of mdrun -gpu_id
 # Test newest gcc supported by newest CUDA at time of release
 # Test thread-MPI with CUDA
-# Test older cmake version (< 3.7)
 # Test SIMD implementation of pair search for GPU code-path
-gcc-7 gpuhw=nvidia gpu_id=1 cuda-10.0 thread-mpi openmp cmake-3.6.1 release-with-assert simd=avx2_256
+gcc-7 gpuhw=nvidia gpu_id=1 cuda-10.0 thread-mpi openmp cmake-3.10.0 release-with-assert simd=avx2_256
 
 # Test with libcxx
 # Test with ThreadSanitizer + OpenMP + SIMD
@@ -44,21 +42,19 @@ clang-7 no-hwloc tsan libcxx-7 openmp cmake-3.12.1 simd=avx2_256
 # Test fftpack fallback
 gcc-8 double x11 no-tng fftpack simd=sse4.1
 
-# Test oldest supported cmake
 # Test older clang
 # Test clang in double precision
 # Test without OpenMP
 # Test thread-MPI
 # Test AVX_128_FMA SIMD + Double (Important for Simd4N=Simd4 and sizeof(SimdInt32)!=4*GMX_SIMD_REAL_WIDTH)
 # Test with TNG support
-clang-3.4 double simd=avx_128_fma thread-mpi no-openmp fftpack cmake-3.4.3 tng
+clang-3.4 double simd=avx_128_fma thread-mpi no-openmp fftpack cmake-3.11.4 tng
 
 # Test newest clang at time of release
 # Test with AddressSanitizer (without OpenMP, see below)
 clang-7 no-openmp asan cmake-3.11.4
 
-# Test newest cmake at time of release
-# Test with clang-tidy (without OpenMP, cmake>=3.6)
+# Test with clang-tidy (without OpenMP)
 clang-7 no-openmp cmake-3.12.1 tidy
 
 # Test oldest supported MSVC on Windows
@@ -86,6 +82,7 @@ gcc-6 openmp gpuhw=nvidia opencl-1.2 clFFT-2.14 mpi simd=avx2_256
 gcc-8 openmp simd=avx2_256 gpuhw=amd opencl-1.2 clFFT-2.14 buildfftw
 
 # TODO
+# Test newest cmake at time of release
 # Add OpenMP support to ASAN build (but libomp.so in clang-4 reports leaks, so might need a suitable build or suppression)
 # Test hwloc-2 support
 # Test newest supported LTS Ubuntu
index 6fb2c09115b8ec6b2d61a00de2afd24e0a9f37a9..15f7314c9a655cab3dd8041d11936dcf8d774743 100644 (file)
@@ -23,7 +23,7 @@
 # Test oldest supported gcc at time of release
 # Test mpi support
 # Test mdrun-only build
-gcc-4.8 mpi mdrun-only release cmake-3.8.1
+gcc-4.8 mpi mdrun-only release cmake-3.9.6
 
 # Test static linking with gcc
 # Test newest gcc at time of release
@@ -36,7 +36,7 @@ icc-19 double release
 # Test static linking with clang
 # Test double precision
 # Test newest supported clang version
-clang-5 static double release cmake-3.6.1
+clang-5 static double release cmake-3.10.0
 
 # Test with GPU support
 # Test with newest CUDA at time of release
diff --git a/cmake/CheckCCompilerFlag.cmake b/cmake/CheckCCompilerFlag.cmake
deleted file mode 100644 (file)
index 5c7d436..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-# - Check whether the C compiler supports a given flag.
-# CHECK_C_COMPILER_FLAG(<flag> <var>)
-#  <flag> - the compiler flag
-#  <var>  - variable to store the result
-# This internally calls the check_c_source_compiles macro.
-# See help for CheckCSourceCompiles for a listing of variables
-# that can modify the build.
-
-#=============================================================================
-# Copyright 2006-2011 Kitware, Inc.
-# Copyright 2006 Alexander Neundorf <neundorf@kde.org>
-# Copyright 2011 Matthias Kretz <kretz@kde.org>
-#
-# ORIGINAL Copyright notice (from Copyright.txt):
-#
-# CMake - Cross Platform Makefile Generator
-# Copyright 2000-2011 Kitware, Inc., Insight Software Consortium
-# All rights reserved.
-
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 
-# * Redistributions of source code must retain the above copyright
-#   notice, this list of conditions and the following disclaimer.
-# 
-# * Redistributions in binary form must reproduce the above copyright
-#   notice, this list of conditions and the following disclaimer in the
-#   documentation and/or other materials provided with the distribution.
-#
-# * Neither the names of Kitware, Inc., the Insight Software Consortium,
-#   nor the names of their contributors may be used to endorse or promote
-#   products derived from this software without specific prior written
-#   permission.
-# 
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#=============================================================================
-
-INCLUDE(CheckCSourceCompiles)
-
-MACRO (CHECK_C_COMPILER_FLAG _FLAG _RESULT)
-   SET(SAFE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
-   SET(CMAKE_REQUIRED_FLAGS "${_FLAG}")
-   CHECK_C_SOURCE_COMPILES("int main(void) { return 0; }" ${_RESULT}
-     # Some compilers do not fail with a bad flag
-     FAIL_REGEX "command line option .* is valid for .* but not for C" # GNU
-     FAIL_REGEX "unrecognized .*option"                     # GNU
-     FAIL_REGEX "unknown .*option"                          # Clang
-     FAIL_REGEX "ignoring unknown option"                   # MSVC
-     FAIL_REGEX "warning D9002"                             # MSVC, any lang
-     FAIL_REGEX "option.*not supported"                     # Intel
-     FAIL_REGEX "invalid argument .*option"                 # Intel
-     FAIL_REGEX "ignoring option .*argument required"       # Intel
-     FAIL_REGEX "[Uu]nknown option"                         # HP
-     FAIL_REGEX "[Ww]arning: [Oo]ption"                     # SunPro
-     FAIL_REGEX "command option .* is not recognized"       # XL
-     FAIL_REGEX "command option .* contains an incorrect subargument" # XL
-     FAIL_REGEX "not supported in this configuration. ignored" # AIX
-     FAIL_REGEX "File with unknown suffix passed to linker" # PGI
-     FAIL_REGEX "WARNING: unknown flag:"                    # Open64
-     FAIL_REGEX "Incorrect command line option:"            # Borland
-     FAIL_REGEX "Warning: illegal option"                   # SunStudio 12
-     FAIL_REGEX "[Ww]arning: Invalid"                       # Fujitsu
-     )
-   SET (CMAKE_REQUIRED_FLAGS "${SAFE_CMAKE_REQUIRED_FLAGS}")
-ENDMACRO (CHECK_C_COMPILER_FLAG)
diff --git a/cmake/CheckCXXCompilerFlag.cmake b/cmake/CheckCXXCompilerFlag.cmake
deleted file mode 100644 (file)
index f11a835..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-# - Check whether the CXX compiler supports a given flag.
-# CHECK_CXX_COMPILER_FLAG(<flag> <var>)
-#  <flag> - the compiler flag
-#  <var>  - variable to store the result
-# This internally calls the check_cxx_source_compiles macro.  See help
-# for CheckCXXSourceCompiles for a listing of variables that can
-# modify the build.
-
-#=============================================================================
-# Copyright 2006-2010 Kitware, Inc.
-# Copyright 2006 Alexander Neundorf <neundorf@kde.org>
-# Copyright 2011 Matthias Kretz <kretz@kde.org>
-#
-# ORIGINAL Copyright notice (from Copyright.txt):
-#
-# CMake - Cross Platform Makefile Generator
-# Copyright 2000-2011 Kitware, Inc., Insight Software Consortium
-# All rights reserved.
-
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 
-# * Redistributions of source code must retain the above copyright
-#   notice, this list of conditions and the following disclaimer.
-# 
-# * Redistributions in binary form must reproduce the above copyright
-#   notice, this list of conditions and the following disclaimer in the
-#   documentation and/or other materials provided with the distribution.
-#
-# * Neither the names of Kitware, Inc., the Insight Software Consortium,
-#   nor the names of their contributors may be used to endorse or promote
-#   products derived from this software without specific prior written
-#   permission.
-# 
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#=============================================================================
-
-INCLUDE(CheckCXXSourceCompiles)
-
-MACRO (CHECK_CXX_COMPILER_FLAG _FLAG _RESULT)
-   SET(SAFE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
-   SET(CMAKE_REQUIRED_FLAGS "${_FLAG}")
-   CHECK_CXX_SOURCE_COMPILES("int main() { return 0;}" ${_RESULT}
-     # Some compilers do not fail with a bad flag
-     FAIL_REGEX "command line option .* is valid for .* but not for C\\\\+\\\\+" # GNU
-     FAIL_REGEX "unrecognized .*option"                     # GNU
-     FAIL_REGEX "unknown .*option"                          # Clang
-     FAIL_REGEX "ignoring unknown option"                   # MSVC
-     FAIL_REGEX "warning D9002"                             # MSVC, any lang
-     FAIL_REGEX "option.*not supported"                     # Intel
-     FAIL_REGEX "invalid argument .*option"                 # Intel
-     FAIL_REGEX "ignoring option .*argument required"       # Intel
-     FAIL_REGEX "ignoring option .*argument is of wrong type" # Intel
-     FAIL_REGEX "[Uu]nknown option"                         # HP
-     FAIL_REGEX "[Ww]arning: [Oo]ption"                     # SunPro
-     FAIL_REGEX "command option .* is not recognized"       # XL
-     FAIL_REGEX "command option .* contains an incorrect subargument" # XL
-     FAIL_REGEX "not supported in this configuration. ignored" # AIX
-     FAIL_REGEX "File with unknown suffix passed to linker" # PGI
-     FAIL_REGEX "WARNING: unknown flag:"                    # Open64
-     FAIL_REGEX "Incorrect command line option:"            # Borland
-     FAIL_REGEX "Warning: illegal option"                   # SunStudio 12
-     FAIL_REGEX "[Ww]arning: Invalid"                       # Fujitsu
-     )
-   SET (CMAKE_REQUIRED_FLAGS "${SAFE_CMAKE_REQUIRED_FLAGS}")
-ENDMACRO (CHECK_CXX_COMPILER_FLAG)
-
index c06a4ca710404a4eb9a6e80fb75bb2a7280172f8..4d8f45510801f1219fe175135a2096ef4af4ed75 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2017,2018, by the GROMACS development team, led by
+# Copyright (c) 2017,2018,2019, 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.
index 1152d0b8edec368db8ad4a37f8d8eaf62f1fc0e0..1656feb3c2ceb32308b67114bbeb2a286f4df464 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2016,2018, by the GROMACS development team, led by
+# Copyright (c) 2016,2018,2019, 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.
index 301778256b0ab7d7288b26ac1cfd8c4211139736..3673f84d98927279d85c9cb3fc1319c2ceac4ea0 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2012,2013,2014,2015,2016,2017, by the GROMACS development team, led by
+# Copyright (c) 2012,2013,2014,2015,2016,2017,2019, 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.
@@ -40,28 +40,7 @@ if(GMX_OPENMP)
     # We should do OpenMP detection if we get here
     # OpenMP check must come before other CFLAGS!
     find_package(OpenMP)
-    if(OPENMP_FOUND)
-        # CMake on Windows doesn't support linker flags passed to target_link_libraries
-        # (i.e. it treats /openmp as \openmp library file). Also, no OpenMP linker flags are needed.
-        if(NOT (WIN32 AND NOT MINGW))
-            if(CMAKE_COMPILER_IS_GNUCC AND GMX_PREFER_STATIC_OPENMP AND NOT APPLE)
-                set(OpenMP_LINKER_FLAGS "-Wl,-static -lgomp -lrt -Wl,-Bdynamic -lpthread")
-                set(OpenMP_SHARED_LINKER_FLAGS "")
-            else()
-                # Only set a linker flag if the user didn't set them manually
-                if(NOT DEFINED OpenMP_LINKER_FLAGS)
-                    set(OpenMP_LINKER_FLAGS "${OpenMP_C_FLAGS}")
-                endif()
-                if(NOT DEFINED OpenMP_SHARED_LINKER_FLAGS)
-                    set(OpenMP_SHARED_LINKER_FLAGS "${OpenMP_C_FLAGS}")
-                endif()
-            endif()
-        endif()
-        if(MINGW)
-            #GCC Bug 48659
-            set(OpenMP_C_FLAGS "${OpenMP_C_FLAGS} -mstackrealign")
-        endif()
-    else()
+    if(NOT OPENMP_FOUND)
         message(WARNING
                 "The compiler you are using does not support OpenMP parallelism. This might hurt your performance a lot, in particular with GPUs. Try using a more recent version, or a different compiler. For now, we are proceeding by turning off OpenMP.")
         set(GMX_OPENMP OFF CACHE STRING "Whether GROMACS will use OpenMP parallelism." FORCE)
index 46e3ede48fbf0ca4b931454f3d0b03b363e02962..a804d132e93ba529643f81edfbd2d54df1548ba9 100644 (file)
@@ -57,6 +57,7 @@
 #         GROMACS     2016   2
 #         GROMACS     2018   3
 #         GROMACS     2019   4
+#         GROMACS     2020   5
 #   LIBRARY_SOVERSION_MINOR so minor version for the built libraries.
 #       Should be increased for each release that changes only the implementation.
 #       In GROMACS, the typical policy is to increase it for each patch version
 
 # The GROMACS convention is that these are the version number of the next
 # release that is going to be made from this branch.
-set(GMX_VERSION_MAJOR 2019)
-set(GMX_VERSION_PATCH 1)
+set(GMX_VERSION_MAJOR 2020)
+set(GMX_VERSION_PATCH 0)
 # The suffix, on the other hand, is used mainly for betas and release
 # candidates, where it signifies the most recent such release from
 # this branch; it will be empty before the first such release, as well
@@ -212,7 +213,7 @@ set(GMX_VERSION_SUFFIX "")
 # here. The important thing is to minimize the chance of third-party
 # code being able to dynamically link with a version of libgromacs
 # that might not work.
-set(LIBRARY_SOVERSION_MAJOR 4)
+set(LIBRARY_SOVERSION_MAJOR 5)
 set(LIBRARY_SOVERSION_MINOR 0)
 set(LIBRARY_VERSION ${LIBRARY_SOVERSION_MAJOR}.${LIBRARY_SOVERSION_MINOR}.0)
 
@@ -235,13 +236,13 @@ if (NOT SOURCE_IS_SOURCE_DISTRIBUTION AND
 endif()
 
 set(REGRESSIONTEST_VERSION "${GMX_VERSION_STRING}")
-set(REGRESSIONTEST_BRANCH "refs/heads/release-2019")
+set(REGRESSIONTEST_BRANCH "refs/heads/master")
 # Run the regressiontests packaging job with the correct pakage
 # version string, and the release box checked, in order to have it
 # build the regressiontests tarball with all the right naming. The
 # naming affects the md5sum that has to go here, and if it isn't right
 # release workflow will report a failure.
-set(REGRESSIONTEST_MD5SUM "1271a74bfe91028b7f184866d5aee98e" CACHE INTERNAL "MD5 sum of the regressiontests tarball for this GROMACS version")
+set(REGRESSIONTEST_MD5SUM "3d06d41e07f523d70ae575b9ad75c670" CACHE INTERNAL "MD5 sum of the regressiontests tarball for this GROMACS version")
 
 math(EXPR GMX_VERSION_NUMERIC
      "${GMX_VERSION_MAJOR}*10000 + ${GMX_VERSION_PATCH}")
index c0d29b9794421376a221458ed2b8edfac0556329..55a43089e8503e9d50164baf2c78c38d2b33ef4c 100644 (file)
@@ -367,6 +367,15 @@ if (SPHINX_FOUND)
         how-to/visualize.rst
         install-guide/index.rst
         release-notes/index.rst
+        release-notes/highlights.rst
+        release-notes/features.rst
+        release-notes/performance.rst
+        release-notes/tools.rst
+        release-notes/bugs-fixed.rst
+        release-notes/removed-functionality.rst
+        release-notes/deprecated-functionality.rst
+        release-notes/portability.rst
+        release-notes/miscellaneous.rst
         release-notes/2019/2019.1.rst
         release-notes/2019/major/highlights.rst
         release-notes/2019/major/features.rst
@@ -535,7 +544,7 @@ if (SPHINX_FOUND)
     add_custom_target(install-guide
         COMMAND
             ${SPHINX_EXECUTABLE}
-            -q -E -b text
+            -q -b text
             -w sphinx-install.log
             -d ${CMAKE_CURRENT_BINARY_DIR}/install-guide/_doctrees
             -c ${SPHINX_INPUT_DIR}
@@ -558,12 +567,13 @@ if (SPHINX_FOUND)
     add_custom_target(webpage-sphinx
         DEPENDS sphinx-programs
         DEPENDS sphinx-input
-        DEPENDS sphinx-image-conversion 
+        DEPENDS sphinx-image-conversion
+        DEPENDS manual 
         COMMAND
             ${CMAKE_COMMAND} -E make_directory ${SPHINX_INPUT_DIR}/_static
         COMMAND
             ${SPHINX_EXECUTABLE}
-            -q -E -b html
+            -q -b html
             -w sphinx-html.log
             -d "${SPHINX_CACHE_DIR}"
             "${SPHINX_INPUT_DIR}"
@@ -577,7 +587,7 @@ if (SPHINX_FOUND)
     add_custom_target(man
         COMMAND
             ${SPHINX_EXECUTABLE}
-            -q -E -b man
+            -q -b man
             -w sphinx-man.log
             -d ${SPHINX_CACHE_DIR}
             -t do_man
index b0788a3cd2ab78cd346d15f180bb23324286de92..6bcecd540a8f6fb83412c4672d7244d7cb53ba17 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2014,2015,2016,2017,2018, by the GROMACS development team, led by
+# Copyright (c) 2014,2015,2016,2017,2018,2019, 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.
@@ -38,7 +38,7 @@ if(MANUAL_BUILD_IS_POSSIBLE)
         DEPENDS sphinx-programs sphinx-input
         COMMAND
             ${SPHINX_EXECUTABLE}
-            -q -E -b latex
+            -q -b latex
             -w sphinx-latex.log
             -d "${SPHINX_CACHE_DIR}"
             "${SPHINX_INPUT_DIR}"
index bcb0a362ce6c9479ea8ac8c61c1d83c602f92bfb..182ed840477078998bbc688640fdee7da8a6a466 100644 (file)
@@ -1,5 +1,3 @@
-.. _anticipated-changes:
-
 Changes anticipated to GROMACS 2019 functionality
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
diff --git a/docs/release-notes/2020/major/removed-functionality.rst b/docs/release-notes/2020/major/removed-functionality.rst
new file mode 100644 (file)
index 0000000..72f7a86
--- /dev/null
@@ -0,0 +1,17 @@
+Removed functionality
+^^^^^^^^^^^^^^^^^^^^^
+
+gmx anadock
+"""""""""""
+The gmx anadock tool was removed since it does not belong in gromacs
+(it analyzes AutoDock outputs).
+
+gmx dyndom
+""""""""""
+The gmx dyndom tool was removed since it does not belong in gromacs
+(it analyzes DynDom outputs).
+
+gmx morph
+"""""""""
+The gmx morph tool was removed since it yields non-physical structures
+that can easily be done by a script.
diff --git a/docs/release-notes/bugs-fixed.rst b/docs/release-notes/bugs-fixed.rst
new file mode 100644 (file)
index 0000000..81b559a
--- /dev/null
@@ -0,0 +1,2 @@
+Bugs fixed
+^^^^^^^^^^
diff --git a/docs/release-notes/deprecated-functionality.rst b/docs/release-notes/deprecated-functionality.rst
new file mode 100644 (file)
index 0000000..90218f4
--- /dev/null
@@ -0,0 +1,52 @@
+.. _anticipated-changes:
+
+Changes anticipated to |Gromacs| NEXT functionality
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Functionality deprecated in |Gromacs| NEXT
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Functionality deprecated in |Gromacs| 2019
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Generation of virtual sites to replace aromatic rings in standard residues
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+These are thought to produce artefacts under some circumstances
+(unpublished results), were never well tested, are not widely used,
+and we need to simplify pdb2gmx.
+
+``gmx mdrun -gcom``
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+This feature sometimes overrides the effects of various .mdp settings
+in a way that is difficult to understand and report. A user who wants
+to do communication between PP ranks less often should choose their
+``nst*`` mdp options accordingly.
+
+Benchmarking options only available with ``gmx benchmark``
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+Options such as ``-confout``, ``-resethway``, ``-resetstep`` are not
+intended for use by regular mdrun users, so making them only available
+with a dedicated tool is more clear. Also, this permits us to customize
+defaults for e.g. writing files at the end of a simulation part in ways
+that suit the respective mdrun and benchmark use cases, so ``-confout``
+will no longer be required.
+
+``gmx mdrun -nsteps``
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+The number of simulation steps described by the .tpr file can be
+changed with ``gmx convert-tpr``, or altered in .mdp file before the
+call to ``gmx grompp``. The convenience of this mdrun option was
+outweighted by the doubtful quality of its implementation, no clear
+record in the log file, and lack of maintenance.
+
+Functionality deprecated before |Gromacs| 2019
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+This functionality has been declared as deprecated in previous versions
+of |Gromacs|, but has not yet been removed.
+
+The group cutoff scheme
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+All remaining aspects of the group cutoff scheme will be removed, once
+a few remaining features (e.g. tabulated interactions, energy-group
+exclusions, and vacuum simulations) are available with the Verlet
+scheme. Deprecated in GROMACS 5.1
diff --git a/docs/release-notes/features.rst b/docs/release-notes/features.rst
new file mode 100644 (file)
index 0000000..5aa11eb
--- /dev/null
@@ -0,0 +1,2 @@
+New and improved features
+^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/docs/release-notes/highlights.rst b/docs/release-notes/highlights.rst
new file mode 100644 (file)
index 0000000..7026520
--- /dev/null
@@ -0,0 +1,14 @@
+Highlights
+^^^^^^^^^^
+
+|Gromacs| NEXT was released on INSERT DATE HERE. Patch releases may
+have been made since then, please use the updated versions!  Here are
+some highlights of what you can expect, along with more detail in the
+links below!
+
+As always, we've got several useful performance improvements, with or
+without GPUs, all enabled and automated by default. We are extremely
+interested in your feedback on how well this worked on your
+simulations and hardware. They are:
+
+* Cool quotes autogenerator 
index d200921c360cc40f3827a06d9e04440f0be58647..ac2a9646f992ee4abd381635cf2e1e43762d50ce 100644 (file)
@@ -8,18 +8,35 @@ releases of |Gromacs|. Major releases contain changes to the
 functionality supported, whereas patch releases contain only fixes for
 issues identified in the corresponding major releases.
 
-Two versions of |Gromacs| are under active maintenance, the 2019
-series and the 2018 series. In the latter, only highly conservative
+Two versions of |Gromacs| are under active maintenance, the NEXT
+series and the 2019 series. In the latter, only highly conservative
 fixes will be made, and only to address issues that affect scientific
 correctness. Naturally, some of those releases will be made after the
-year 2018 ends, but we keep 2018 in the name so users understand how
+year 2019 ends, but we keep 2018 in the name so users understand how
 up to date their version is. Such fixes will also be incorporated into
-the 2019 release series, as appropriate. Around the time the 2020
-release is made, the 2018 series will no longer be maintained.
+the NEXT release series, as appropriate. Around the time the NEXT+1
+release is made, the 2019 series will no longer be maintained.
 
 Where issue numbers are reported in these release notes, more details
 can be found at https://redmine.gromacs.org at that issue number.
 
+|Gromacs| NEXT series
+---------------------
+
+.. toctree::
+   :maxdepth: 1
+
+   highlights
+   features
+   performance
+   tools
+   bugs-fixed
+   deprecated-functionality
+   removed-functionality
+   portability
+   miscellaneous
+
+
 |Gromacs| 2019 series
 ---------------------
 
diff --git a/docs/release-notes/miscellaneous.rst b/docs/release-notes/miscellaneous.rst
new file mode 100644 (file)
index 0000000..bcff819
--- /dev/null
@@ -0,0 +1,9 @@
+Miscellaneous
+^^^^^^^^^^^^^
+
+grompp now warns if macros in mdp "define" field are unused in topology
+"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+Macros defined in the mdp (with e.g. -DPOSRES) now cause a warning
+in grompp if they are not encountered while parsing the topology file
+
+:issue:`1975`
diff --git a/docs/release-notes/performance.rst b/docs/release-notes/performance.rst
new file mode 100644 (file)
index 0000000..c9d7e7c
--- /dev/null
@@ -0,0 +1,2 @@
+Performance improvements
+^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/docs/release-notes/portability.rst b/docs/release-notes/portability.rst
new file mode 100644 (file)
index 0000000..bc64842
--- /dev/null
@@ -0,0 +1,2 @@
+Portability
+^^^^^^^^^^^
diff --git a/docs/release-notes/removed-functionality.rst b/docs/release-notes/removed-functionality.rst
new file mode 100644 (file)
index 0000000..8d99815
--- /dev/null
@@ -0,0 +1,2 @@
+Removed functionality
+^^^^^^^^^^^^^^^^^^^^^
diff --git a/docs/release-notes/tools.rst b/docs/release-notes/tools.rst
new file mode 100644 (file)
index 0000000..fb2512b
--- /dev/null
@@ -0,0 +1,2 @@
+Improvements to |Gromacs| tools
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
index a03d2958ad0a1ed69a59a9809c40b09ca0fc5778..ebfbe22ffa8875a48539908382af154b19812325 100644 (file)
@@ -282,9 +282,6 @@ Performance and Run Control
 ``GMX_NOOPTIMIZEDKERNELS``
         deprecated, use ``GMX_DISABLE_SIMD_KERNELS`` instead.
 
-``GMX_NO_ALLVSALL``
-        disables optimized all-vs-all kernels.
-
 ``GMX_NO_CART_REORDER``
         used in initializing domain decomposition communicators. Rank reordering
         is default, but can be switched off with this environment variable.
index ec0cb9f1310d031512a5fb1e753bbb684cce0532..ead69bfce4fe30c8c451563bd72ade01d1c9d66a 100644 (file)
@@ -1075,7 +1075,7 @@ Temperature coupling
    integrators, the leap-frog :mdp-value:`integrator=md` integrator
    only supports 1. Data for the NH chain variables is not printed
    to the :ref:`edr` file by default, but can be turned on with the
-   :mdp:`print-nose-hoover-chains` option.
+   :mdp:`print-nose-hoover-chain-variables` option.
 
 .. mdp:: print-nose-hoover-chain-variables
 
@@ -3050,7 +3050,7 @@ Electric fields
    E(t) = E0 exp ( -(t-t0)\ :sup:`2`/(2 sigma\ :sup:`2`) ) cos(omega (t-t0))
 
    For example, the four parameters for direction x are set in the
-   three fields of :mdp:`electric-field-x` (and similar for y and z)
+   three fields of ``electric-field-x`` (and similar for y and z)
    like
 
    electric-field-x  = E0 omega t0 sigma
index fe5f0c0f261ddf6ad1add541f2ef20a43b3c32a0..64fae1cc31a9c8a9ab2a497d38ee9cf40ac49c3d 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2009,2010,2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+# Copyright (c) 2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019, 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.
@@ -88,9 +88,6 @@ if (GMX_CLANG_TIDY)
    if(NOT CLANG_TIDY_EXE)
        message(FATAL_ERROR "clang-tidy not found.")
    endif()
-   if(CMAKE_VERSION VERSION_LESS "3.6")
-       message(FATAL_ERROR "clang-tidy support requires cmake 3.6.")
-   endif()
 endif()
 #####
 
index 67d428cbb10b3758fb168c19bcb31e157635a5cd..8f497476661bcde34c71c9e7fec19c6593d15863 100644 (file)
@@ -46,7 +46,7 @@
 # release string. For roadmap details, see https://redmine.gromacs.org/issues/2585
 set(GMXAPI_MAJOR 0)
 set(GMXAPI_MINOR 0)
-set(GMXAPI_PATCH 7)
+set(GMXAPI_PATCH 8)
 set(GMXAPI_RELEASE ${GMXAPI_MAJOR}.${GMXAPI_MINOR}.${GMXAPI_PATCH})
 
 ###############################
index 8b455db34d21074c2435b7d384df0958fe33a274..bea12dbf0f65ea0b57fcee99840275f772d3b693 100644 (file)
@@ -120,23 +120,22 @@ std::shared_ptr<Session> ContextImpl::launch(const Workflow &work)
          * a microstate for gmxapi interfaces.
          */
 
-        // Note: these output options normalize the file names, but not their
-        // paths. gmxapi 0.0.7 changes working directory for each session, so the
-        // relative paths are appropriate, but a near-future version will avoid
-        // changing directories once the process starts and manage file paths explicitly.
-        using gmxapi::c_majorVersion;
-        using gmxapi::c_minorVersion;
-        using gmxapi::c_patchVersion;
-        static_assert(!(c_majorVersion != 0 || c_minorVersion != 0 || c_patchVersion > 7),
-                      "Developer notice: check assumptions about working directory and relative file paths for this "
-                      "software version.");
-
         // Set input TPR name
         mdArgs_.emplace_back("-s");
         mdArgs_.emplace_back(filename);
+
         // Set checkpoint file name
         mdArgs_.emplace_back("-cpi");
         mdArgs_.emplace_back("state.cpt");
+        /* Note: we normalize the checkpoint file name, but not its full path.
+         * Through version 0.0.8, gmxapi clients change working directory
+         * for each session, so relative path(s) below are appropriate.
+         * A future gmxapi version should avoid changing directories once the
+         * process starts and instead manage files (paths) in an absolute and
+         * immutable way, with abstraction provided through the Context chain-of-responsibility.
+         * TODO: API abstractions for initializing simulations that may be new or partially complete.
+         * Reference gmxapi milestone 13 at https://redmine.gromacs.org/issues/2585
+         */
 
         // Create a mock argv. Note that argv[0] is expected to hold the program name.
         const int  offset = 1;
index 9d601e1161863ac8b64240473a8dbea08e60e911..e1abb57b7370fc0fbc18a7761b00065ff389a0c4 100644 (file)
@@ -191,15 +191,13 @@ std::unique_ptr<SessionImpl> SessionImpl::create(std::shared_ptr<ContextImpl>  c
                                                  gmx::LogFilePtr               logFilehandle,
                                                  gmx_multisim_t              * multiSim)
 {
-    using gmx::compat::make_unique;
     // We should be able to get a communicator (or subcommunicator) through the
     // Context.
-    std::unique_ptr<SessionImpl> impl = make_unique<SessionImpl>(std::move(context),
-                                                                 std::move(runnerBuilder),
-                                                                 simulationContext,
-                                                                 std::move(logFilehandle),
-                                                                 multiSim);
-    return impl;
+    return gmx::compat::make_unique<SessionImpl>(std::move(context),
+                                                 std::move(runnerBuilder),
+                                                 simulationContext,
+                                                 std::move(logFilehandle),
+                                                 multiSim);
 }
 
 SessionImpl::SessionImpl(std::shared_ptr<ContextImpl>  context,
index 17f35a123c46f76d5e3be2cb8e4738cec0204b76..c4c733d253ff8aba4895e088c9b294a0b14716b9 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2018, by the GROMACS development team, led by
+# Copyright (c) 2018,2019, 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.
index 5f75ee5b4fb20d35b28849229146d1feea406d3c..b37ecdb7d2aa48b0048d3d5e9a330f890307bd41 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2018, by the GROMACS development team, led by
+# Copyright (c) 2018,2019, 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.
index c685f264b5e4b23cbc7669b87e945dc1be873a54..2723c0511756b5cb27af8358be7d799c07fd595f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2009,2010,2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019, 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.
index 15e630b206a1d7c1e0dff59fef610b631e0a379b..1c2c1ae38b934fe403efda7b720fe7050e1faa0a 100644 (file)
@@ -100,47 +100,16 @@ set(GMX_BUILD_OWN_FFTW_MD5 8aac833c943d8e90d51b697b27d4384d CACHE STRING
     "Expected MD5 hash for the file at GMX_BUILD_OWN_FFTW_URL")
 mark_as_advanced(GMX_BUILD_OWN_FFTW_URL GMX_BUILD_OWN_FFTW_MD5)
 
-# ExternalProject at least up to CMake 3.0 prints a confusing error message if
-# download fails when MD5 verification is enabled.  So we manage the download
-# ourselves so that MD5 sum is not verified there, and then pass a local file
-# as the URL to ExternalProject.  This way, ExternalProject still verifies the
-# MD5 sum with a proper message if that fails.
-# TODO remove this when we require CMake 3.5+
-set(url "${GMX_BUILD_OWN_FFTW_URL}")
-# Determine whether we are actually downloading (this matches the conditions in
-# ExternalProject).  ExternalProject works as expected if passed a local file.
-set(is_download TRUE)
-if (IS_DIRECTORY "${url}" OR "${url}" MATCHES "^file://" OR NOT "${url}" MATCHES "^[a-z]+://")
-    set(is_download FALSE)
-endif()
-if (is_download)
-    # For simplicity, don't try to extract the file name from the URL, but use
-    # a hard-coded value.
-    set(remote_url "${GMX_BUILD_OWN_FFTW_URL}")
-    set(local_path "${CMAKE_CURRENT_BINARY_DIR}/fftw.tar.gz")
-    set(url ${local_path})
-    # Write a script to do our own download step (mimics what ExternalProject
-    # would do, but without MD5 sum verification at this step).
-    set(download_script ${CMAKE_CURRENT_BINARY_DIR}/fftw-download.cmake)
-    configure_file(fftw-download.cmake.cmakein ${download_script} @ONLY)
-endif()
-
 # The actual build target.
 set(EXTERNAL_FFTW_BUILD_TARGET fftwBuild)
 include(ExternalProject)
 ExternalProject_add(${EXTERNAL_FFTW_BUILD_TARGET}
-        URL "${url}" URL_MD5 ${GMX_BUILD_OWN_FFTW_MD5}
+        URL "${GMX_BUILD_OWN_FFTW_URL}"
+        URL_MD5 ${GMX_BUILD_OWN_FFTW_MD5}
         CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=<INSTALL_DIR> --libdir=<INSTALL_DIR>/lib --disable-fortran
         ${GMX_BUILD_OWN_FFTW_SHARED_FLAG} ${GMX_BUILD_OWN_FFTW_OPTIMIZATION_CONFIGURATION}
         ${GMX_BUILD_OWN_FFTW_PREC}
         ${GMX_BUILD_OWN_FFTW_TARGET_HOST})
-# Add a custom step to do our own download if that is necessary.
-if (is_download)
-    ExternalProject_add_step(${EXTERNAL_FFTW_BUILD_TARGET} pre-download
-            COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/fftw-download.cmake
-            DEPENDERS download)
-endif()
-
 ExternalProject_get_property(${EXTERNAL_FFTW_BUILD_TARGET} INSTALL_DIR)
 
 string(REGEX REPLACE "fftw" "fftw3" FFTW_LIBNAME ${LOWERFFTW})
diff --git a/src/external/build-fftw/fftw-download.cmake.cmakein b/src/external/build-fftw/fftw-download.cmake.cmakein
deleted file mode 100644 (file)
index 777fe3b..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-# Custom download script for Gromacs external FFTW build.
-
-# Mimics a similar script generated by CMake ExternalProject package, but
-# does not verify the MD5 sum (which would give confusing error messages if the
-# download fails).
-message(STATUS "downloading...
-     src='@remote_url@'
-     dest='@local_path@'")
-file(DOWNLOAD "@remote_url@" "@local_path@"
-     SHOW_PROGRESS STATUS status LOG log)
-list(GET status 0 status_code)
-list(GET status 1 status_string)
-if (NOT status_code EQUAL 0)
-  message(FATAL_ERROR "error: downloading '@remote_url@' failed
-     status_code: ${status_code}
-     status_string: ${status_string}
-     log: ${log}")
-endif()
-message(STATUS "downloading... done")
index d2f4e9b0e6e21ee7602902c762d16bbea037aca1..5520903032d2a6798842ecc76d39f0a7245e47f1 100644 (file)
@@ -107,6 +107,7 @@ add_subdirectory(linearalgebra)
 add_subdirectory(math)
 add_subdirectory(mdrun)
 add_subdirectory(mdrunutility)
+add_subdirectory(mdspan)
 add_subdirectory(mdtypes)
 add_subdirectory(onlinehelp)
 add_subdirectory(options)
@@ -311,11 +312,14 @@ target_link_libraries(libgromacs
                       PUBLIC
                       ${GMX_PUBLIC_LIBRARIES}
                       )
+if (GMX_OPENMP)
+    target_link_libraries(libgromacs PUBLIC OpenMP::OpenMP_CXX)
+endif()
 set_target_properties(libgromacs PROPERTIES
                       OUTPUT_NAME "gromacs${GMX_LIBS_SUFFIX}"
                       SOVERSION ${LIBRARY_SOVERSION_MAJOR}
                       VERSION ${LIBRARY_VERSION}
-                      COMPILE_FLAGS "${OpenMP_C_FLAGS}")
+                      )
 
 gmx_manage_lmfit()
 target_link_libraries(libgromacs PRIVATE lmfit)
index 61044f8c17067fc0e726dfc7ef06f9239bb58d6c..56208a19308fc65ce607a112c4053d0711066a08 100644 (file)
@@ -1,7 +1,8 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2005,2006,2007,2008,2009,2010,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2005 - 2014, The GROMACS development team.
+ * Copyright (c) 2015,2016,2017,2018,2019, 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.
@@ -323,20 +324,29 @@ void dd_make_reverse_top(FILE *fplog,
 void dd_make_local_cgs(struct gmx_domdec_t *dd, t_block *lcgs);
 
 /*! \brief Generate the local topology and virtual site data */
-void dd_make_local_top(struct gmx_domdec_t *dd, struct gmx_domdec_zones_t *zones,
-                       int npbcdim, matrix box,
-                       rvec cellsize_min, const ivec npulse,
-                       t_forcerec *fr,
-                       rvec *cgcm_or_x,
-                       gmx_vsite_t *vsite,
-                       const gmx_mtop_t *top, gmx_localtop_t *ltop);
+void dd_make_local_top(struct gmx_domdec_t       *dd,
+                       struct gmx_domdec_zones_t *zones,
+                       int                        npbcdim,
+                       matrix                     box,
+                       rvec                       cellsize_min,
+                       const ivec                 npulse,
+                       t_forcerec                *fr,
+                       rvec                      *cgcm_or_x,
+                       gmx_vsite_t               *vsite,
+                       const gmx_mtop_t          &top,
+                       gmx_localtop_t            *ltop);
 
 /*! \brief Sort ltop->ilist when we are doing free energy. */
 void dd_sort_local_top(gmx_domdec_t *dd, const t_mdatoms *mdatoms,
                        gmx_localtop_t *ltop);
 
-/*! \brief Construct local topology */
-gmx_localtop_t *dd_init_local_top(const gmx_mtop_t *top_global);
+/*! \brief Initialize local topology
+ *
+ * \param[in] top_global Reference to global topology.
+ * \param[in,out] top Pointer to new local topology
+ */
+void dd_init_local_top(const gmx_mtop_t &top_global,
+                       gmx_localtop_t   *top);
 
 /*! \brief Construct local state */
 void dd_init_local_state(struct gmx_domdec_t *dd,
index 1079f366967a7b00ca877e80bb92c4fd14e07f4e..97587f933a6fc22b8e4419d07b3b37c121ad09f1 100644 (file)
@@ -1,7 +1,8 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2006 - 2014, The GROMACS development team.
+ * Copyright (c) 2015,2016,2017,2018,2019, 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.
@@ -2069,7 +2070,7 @@ void dd_make_local_top(gmx_domdec_t *dd, gmx_domdec_zones_t *zones,
                        t_forcerec *fr,
                        rvec *cgcm_or_x,
                        gmx_vsite_t *vsite,
-                       const gmx_mtop_t *mtop, gmx_localtop_t *ltop)
+                       const gmx_mtop_t &mtop, gmx_localtop_t *ltop)
 {
     gmx_bool bRCheckMB, bRCheck2B;
     real     rc = -1;
@@ -2139,7 +2140,7 @@ void dd_make_local_top(gmx_domdec_t *dd, gmx_domdec_zones_t *zones,
     }
 
     dd->nbonded_local =
-        make_local_bondeds_excls(dd, zones, mtop, fr->cginfo,
+        make_local_bondeds_excls(dd, zones, &mtop, fr->cginfo,
                                  bRCheckMB, rcheck, bRCheck2B, rc,
                                  dd->localAtomGroupFromAtom.data(),
                                  pbc_null, cgcm_or_x,
@@ -2156,7 +2157,7 @@ void dd_make_local_top(gmx_domdec_t *dd, gmx_domdec_zones_t *zones,
         dd->nbonded_local += nexcl;
     }
 
-    ltop->atomtypes  = mtop->atomtypes;
+    ltop->atomtypes  = mtop.atomtypes;
 }
 
 void dd_sort_local_top(gmx_domdec_t *dd, const t_mdatoms *mdatoms,
@@ -2172,24 +2173,20 @@ void dd_sort_local_top(gmx_domdec_t *dd, const t_mdatoms *mdatoms,
     }
 }
 
-gmx_localtop_t *dd_init_local_top(const gmx_mtop_t *top_global)
+void dd_init_local_top(const gmx_mtop_t &top_global,
+                       gmx_localtop_t   *top)
 {
-    gmx_localtop_t *top;
-
-    snew(top, 1);
-
     /* TODO: Get rid of the const casts below, e.g. by using a reference */
-    top->idef.ntypes     = top_global->ffparams.numTypes();
-    top->idef.atnr       = top_global->ffparams.atnr;
-    top->idef.functype   = const_cast<t_functype *>(top_global->ffparams.functype.data());
-    top->idef.iparams    = const_cast<t_iparams *>(top_global->ffparams.iparams.data());
-    top->idef.fudgeQQ    = top_global->ffparams.fudgeQQ;
+    top->idef.ntypes     = top_global.ffparams.numTypes();
+    top->idef.atnr       = top_global.ffparams.atnr;
+    top->idef.functype   = const_cast<t_functype *>(top_global.ffparams.functype.data());
+    top->idef.iparams    = const_cast<t_iparams *>(top_global.ffparams.iparams.data());
+    top->idef.fudgeQQ    = top_global.ffparams.fudgeQQ;
     top->idef.cmap_grid  = new gmx_cmap_t;
-    *top->idef.cmap_grid = top_global->ffparams.cmap_grid;
-
-    top->idef.ilsort     = ilsortUNKNOWN;
+    *top->idef.cmap_grid = top_global.ffparams.cmap_grid;
 
-    return top;
+    top->idef.ilsort        = ilsortUNKNOWN;
+    top->useInDomainDecomp_ = true;
 }
 
 void dd_init_local_state(gmx_domdec_t *dd,
index 96ae045367318a1af2f980e00e360e876f49852f..bd00656df2b7468617981be14cf04a62f4913f31 100644 (file)
@@ -3002,7 +3002,7 @@ void dd_partition_system(FILE                    *fplog,
                          gmx_bool                 bMasterState,
                          int                      nstglobalcomm,
                          t_state                 *state_global,
-                         const gmx_mtop_t        *top_global,
+                         const gmx_mtop_t        &top_global,
                          const t_inputrec        *ir,
                          t_state                 *state_local,
                          PaddedVector<gmx::RVec> *f,
@@ -3243,7 +3243,7 @@ void dd_partition_system(FILE                    *fplog,
                   true, xGlobal,
                   &ddbox);
 
-        distributeState(mdlog, dd, *top_global, state_global, ddbox, state_local, f);
+        distributeState(mdlog, dd, top_global, state_global, ddbox, state_local, f);
 
         dd_make_local_cgs(dd, &top_local->cgs);
 
@@ -3536,7 +3536,7 @@ void dd_partition_system(FILE                    *fplog,
                 if (dd->splitConstraints || dd->splitSettles)
                 {
                     /* Only for inter-cg constraints we need special code */
-                    n = dd_make_local_constraints(dd, n, top_global, fr->cginfo,
+                    n = dd_make_local_constraints(dd, n, &top_global, fr->cginfo,
                                                   constr, ir->nProjOrder,
                                                   top_local->idef.il);
                 }
@@ -3640,7 +3640,7 @@ void dd_partition_system(FILE                    *fplog,
     if (comm->nstDDDump > 0 && step % comm->nstDDDump == 0)
     {
         dd_move_x(dd, state_local->box, state_local->x, nullWallcycle);
-        write_dd_pdb("dd_dump", step, "dump", top_global, cr,
+        write_dd_pdb("dd_dump", step, "dump", &top_global, cr,
                      -1, state_local->x.rvec_array(), state_local->box);
     }
 
@@ -3662,7 +3662,7 @@ void dd_partition_system(FILE                    *fplog,
     if (comm->DD_debug > 0)
     {
         /* Set the env var GMX_DD_DEBUG if you suspect corrupted indices */
-        check_index_consistency(dd, top_global->natoms, ncg_mtop(top_global),
+        check_index_consistency(dd, top_global.natoms, ncg_mtop(&top_global),
                                 "after partitioning");
     }
 
index be4885414ee72a79aa3622ca74efb932b7fd8605..2bdeacbc3085e8d5b101885cc6ed6e1f54b1fbb8 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2018, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019, 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.
@@ -93,7 +93,7 @@ void dd_partition_system(FILE                    *fplog,
                          gmx_bool                 bMasterState,
                          int                      nstglobalcomm,
                          t_state                 *state_global,
-                         const gmx_mtop_t        *top_global,
+                         const gmx_mtop_t        &top_global,
                          const t_inputrec        *ir,
                          t_state                 *state_local,
                          PaddedVector<gmx::RVec> *f,
index f8159ef2d42cca4c32647775a7fe6e1ab635ebc8..5a780ecba217b3d74dc38a40e8be5ed067e0c8b9 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2018, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019, 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.
@@ -125,7 +125,7 @@ struct PmeOutput
 struct PmeGpuStaging
 {
     //! Host-side force buffer
-    gmx::HostVector<gmx::RVec> h_forces;
+    gmx::PaddedHostVector<gmx::RVec> h_forces;
 
     /*! \brief Virial and energy intermediate host-side buffer. Size is PME_GPU_VIRIAL_AND_ENERGY_COUNT. */
     float  *h_virialAndEnergy;
index 6aad33b9ef5320b0410f1636c8ffe40c5268402b..a975b49788c517b1c8bba48e498109ee63f39396 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, 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.
@@ -134,35 +134,34 @@ static const char *pmelblim_str[epmelblimNR] =
 { "no", "box size", "domain decompostion", "PME grid restriction", "maximum allowed grid scaling" };
 
 struct pme_load_balancing_t {
-    gmx_bool     bSepPMERanks;       /**< do we have separate PME ranks? */
-    gmx_bool     bActive;            /**< is PME tuning active? */
-    int64_t      step_rel_stop;      /**< stop the tuning after this value of step_rel */
-    gmx_bool     bTriggerOnDLB;      /**< trigger balancing only on DD DLB */
-    gmx_bool     bBalance;           /**< are we in the balancing phase, i.e. trying different setups? */
-    int          nstage;             /**< the current maximum number of stages */
-
-    real         cut_spacing;        /**< the minimum cutoff / PME grid spacing ratio */
-    real         rcut_vdw;           /**< Vdw cutoff (does not change) */
-    real         rcut_coulomb_start; /**< Initial electrostatics cutoff */
-    real         rbufOuter_coulomb;  /**< the outer pairlist buffer size */
-    real         rbufOuter_vdw;      /**< the outer pairlist buffer size */
-    real         rbufInner_coulomb;  /**< the inner pairlist buffer size */
-    real         rbufInner_vdw;      /**< the inner pairlist buffer size */
-    matrix       box_start;          /**< the initial simulation box */
-    int          n;                  /**< the count of setup as well as the allocation size */
-    pme_setup_t *setup;              /**< the PME+cutoff setups */
-    int          cur;                /**< the inex (in setup) of the current setup */
-    int          fastest;            /**< index of the fastest setup up till now */
-    int          lower_limit;        /**< don't go below this setup index */
-    int          start;              /**< start of setup index range to consider in stage>0 */
-    int          end;                /**< end   of setup index range to consider in stage>0 */
-    int          elimited;           /**< was the balancing limited, uses enum above */
-    int          cutoff_scheme;      /**< Verlet or group cut-offs */
-
-    int          stage;              /**< the current stage */
-
-    int          cycles_n;           /**< step cycle counter cummulative count */
-    double       cycles_c;           /**< step cycle counter cummulative cycles */
+    gmx_bool                 bSepPMERanks;       /**< do we have separate PME ranks? */
+    gmx_bool                 bActive;            /**< is PME tuning active? */
+    int64_t                  step_rel_stop;      /**< stop the tuning after this value of step_rel */
+    gmx_bool                 bTriggerOnDLB;      /**< trigger balancing only on DD DLB */
+    gmx_bool                 bBalance;           /**< are we in the balancing phase, i.e. trying different setups? */
+    int                      nstage;             /**< the current maximum number of stages */
+
+    real                     cut_spacing;        /**< the minimum cutoff / PME grid spacing ratio */
+    real                     rcut_vdw;           /**< Vdw cutoff (does not change) */
+    real                     rcut_coulomb_start; /**< Initial electrostatics cutoff */
+    real                     rbufOuter_coulomb;  /**< the outer pairlist buffer size */
+    real                     rbufOuter_vdw;      /**< the outer pairlist buffer size */
+    real                     rbufInner_coulomb;  /**< the inner pairlist buffer size */
+    real                     rbufInner_vdw;      /**< the inner pairlist buffer size */
+    matrix                   box_start;          /**< the initial simulation box */
+    std::vector<pme_setup_t> setup;              /**< the PME+cutoff setups */
+    int                      cur;                /**< the index (in setup) of the current setup */
+    int                      fastest;            /**< index of the fastest setup up till now */
+    int                      lower_limit;        /**< don't go below this setup index */
+    int                      start;              /**< start of setup index range to consider in stage>0 */
+    int                      end;                /**< end   of setup index range to consider in stage>0 */
+    int                      elimited;           /**< was the balancing limited, uses enum above */
+    int                      cutoff_scheme;      /**< Verlet or group cut-offs */
+
+    int                      stage;              /**< the current stage */
+
+    int                      cycles_n;           /**< step cycle counter cummulative count */
+    double                   cycles_c;           /**< step cycle counter cummulative cycles */
 };
 
 /* TODO The code in this file should call this getter, rather than
@@ -172,6 +171,7 @@ bool pme_loadbal_is_active(const pme_load_balancing_t *pme_lb)
     return pme_lb != nullptr && pme_lb->bActive;
 }
 
+// TODO Return a unique_ptr to pme_load_balancing_t
 void pme_loadbal_init(pme_load_balancing_t     **pme_lb_p,
                       t_commrec                 *cr,
                       const gmx::MDLogger       &mdlog,
@@ -195,7 +195,7 @@ void pme_loadbal_init(pme_load_balancing_t     **pme_lb_p,
     // This is checked by grompp, but it doesn't hurt to check again.
     GMX_RELEASE_ASSERT(!(EEL_PME(ir.coulombtype) && EVDW_PME(ir.vdwtype) && ir.rcoulomb != ir.rvdw), "With Coulomb and LJ PME, rcoulomb should be equal to rvdw");
 
-    snew(pme_lb, 1);
+    pme_lb = new pme_load_balancing_t;
 
     pme_lb->bSepPMERanks      = !thisRankHasDuty(cr, DUTY_PME);
 
@@ -218,8 +218,7 @@ void pme_loadbal_init(pme_load_balancing_t     **pme_lb_p,
     EwaldBoxZScaler boxScaler(ir);
     boxScaler.scaleBox(box, pme_lb->box_start);
 
-    pme_lb->n = 1;
-    snew(pme_lb->setup, pme_lb->n);
+    pme_lb->setup.resize(1);
 
     pme_lb->rcut_vdw                 = ic.rvdw;
     pme_lb->rcut_coulomb_start       = ir.rcoulomb;
@@ -317,17 +316,15 @@ static gmx_bool pme_loadbal_increase_cutoff(pme_load_balancing_t *pme_lb,
                                             int                   pme_order,
                                             const gmx_domdec_t   *dd)
 {
-    pme_setup_t *set;
     real         fac, sp;
     real         tmpr_coulomb, tmpr_vdw;
     int          d;
     bool         grid_ok;
 
     /* Try to add a new setup with next larger cut-off to the list */
-    pme_lb->n++;
-    srenew(pme_lb->setup, pme_lb->n);
-    set          = &pme_lb->setup[pme_lb->n-1];
-    set->pmedata = nullptr;
+    pme_setup_t set;
+
+    set.pmedata = nullptr;
 
     NumPmeDomains numPmeDomains = getNumPmeDomains(dd);
 
@@ -341,19 +338,17 @@ static gmx_bool pme_loadbal_increase_cutoff(pme_load_balancing_t *pme_lb,
          */
         if (fac > 2.1)
         {
-            pme_lb->n--;
-
             return FALSE;
         }
 
         fac *= 1.01;
-        clear_ivec(set->grid);
+        clear_ivec(set.grid);
         sp = calcFftGrid(nullptr, pme_lb->box_start,
                          fac*pme_lb->setup[pme_lb->cur].spacing,
                          minimalPmeGridSize(pme_order),
-                         &set->grid[XX],
-                         &set->grid[YY],
-                         &set->grid[ZZ]);
+                         &set.grid[XX],
+                         &set.grid[YY],
+                         &set.grid[ZZ]);
 
         /* As here we can't easily check if one of the PME ranks
          * uses threading, we do a conservative grid check.
@@ -361,67 +356,68 @@ static gmx_bool pme_loadbal_increase_cutoff(pme_load_balancing_t *pme_lb,
          * per PME rank along x, which is not a strong restriction.
          */
         grid_ok = gmx_pme_check_restrictions(pme_order,
-                                             set->grid[XX], set->grid[YY], set->grid[ZZ],
+                                             set.grid[XX], set.grid[YY], set.grid[ZZ],
                                              numPmeDomains.x,
                                              true,
                                              false);
     }
     while (sp <= 1.001*pme_lb->setup[pme_lb->cur].spacing || !grid_ok);
 
-    set->rcut_coulomb = pme_lb->cut_spacing*sp;
-    if (set->rcut_coulomb < pme_lb->rcut_coulomb_start)
+    set.rcut_coulomb = pme_lb->cut_spacing*sp;
+    if (set.rcut_coulomb < pme_lb->rcut_coulomb_start)
     {
         /* This is unlikely, but can happen when e.g. continuing from
          * a checkpoint after equilibration where the box shrank a lot.
          * We want to avoid rcoulomb getting smaller than rvdw
          * and there might be more issues with decreasing rcoulomb.
          */
-        set->rcut_coulomb = pme_lb->rcut_coulomb_start;
+        set.rcut_coulomb = pme_lb->rcut_coulomb_start;
     }
 
     if (pme_lb->cutoff_scheme == ecutsVERLET)
     {
         /* Never decrease the Coulomb and VdW list buffers */
-        set->rlistOuter  = std::max(set->rcut_coulomb + pme_lb->rbufOuter_coulomb,
-                                    pme_lb->rcut_vdw + pme_lb->rbufOuter_vdw);
-        set->rlistInner  = std::max(set->rcut_coulomb + pme_lb->rbufInner_coulomb,
-                                    pme_lb->rcut_vdw + pme_lb->rbufInner_vdw);
+        set.rlistOuter  = std::max(set.rcut_coulomb + pme_lb->rbufOuter_coulomb,
+                                   pme_lb->rcut_vdw + pme_lb->rbufOuter_vdw);
+        set.rlistInner  = std::max(set.rcut_coulomb + pme_lb->rbufInner_coulomb,
+                                   pme_lb->rcut_vdw + pme_lb->rbufInner_vdw);
     }
     else
     {
         /* TODO Remove these lines and pme_lb->cutoff_scheme */
-        tmpr_coulomb     = set->rcut_coulomb + pme_lb->rbufOuter_coulomb;
+        tmpr_coulomb     = set.rcut_coulomb + pme_lb->rbufOuter_coulomb;
         tmpr_vdw         = pme_lb->rcut_vdw + pme_lb->rbufOuter_vdw;
         /* Two (known) bugs with cutoff-scheme=group here:
          * - This modification of rlist results in incorrect DD comunication.
          * - We should set fr->bTwinRange = (fr->rlistlong > fr->rlist).
          */
-        set->rlistOuter  = std::min(tmpr_coulomb, tmpr_vdw);
-        set->rlistInner  = set->rlistOuter;
+        set.rlistOuter  = std::min(tmpr_coulomb, tmpr_vdw);
+        set.rlistInner  = set.rlistOuter;
     }
 
-    set->spacing         = sp;
+    set.spacing         = sp;
     /* The grid efficiency is the size wrt a grid with uniform x/y/z spacing */
-    set->grid_efficiency = 1;
+    set.grid_efficiency = 1;
     for (d = 0; d < DIM; d++)
     {
-        set->grid_efficiency *= (set->grid[d]*sp)/norm(pme_lb->box_start[d]);
+        set.grid_efficiency *= (set.grid[d]*sp)/norm(pme_lb->box_start[d]);
     }
     /* The Ewald coefficient is inversly proportional to the cut-off */
-    set->ewaldcoeff_q =
-        pme_lb->setup[0].ewaldcoeff_q*pme_lb->setup[0].rcut_coulomb/set->rcut_coulomb;
+    set.ewaldcoeff_q =
+        pme_lb->setup[0].ewaldcoeff_q*pme_lb->setup[0].rcut_coulomb/set.rcut_coulomb;
     /* We set ewaldcoeff_lj in set, even when LJ-PME is not used */
-    set->ewaldcoeff_lj =
-        pme_lb->setup[0].ewaldcoeff_lj*pme_lb->setup[0].rcut_coulomb/set->rcut_coulomb;
+    set.ewaldcoeff_lj =
+        pme_lb->setup[0].ewaldcoeff_lj*pme_lb->setup[0].rcut_coulomb/set.rcut_coulomb;
 
-    set->count   = 0;
-    set->cycles  = 0;
+    set.count   = 0;
+    set.cycles  = 0;
 
     if (debug)
     {
         fprintf(debug, "PME loadbal: grid %d %d %d, coulomb cutoff %f\n",
-                set->grid[XX], set->grid[YY], set->grid[ZZ], set->rcut_coulomb);
+                set.grid[XX], set.grid[YY], set.grid[ZZ], set.rcut_coulomb);
     }
+    pme_lb->setup.push_back(set);
     return TRUE;
 }
 
@@ -460,7 +456,7 @@ static int pme_loadbal_end(pme_load_balancing_t *pme_lb)
     }
     else
     {
-        return pme_lb->n;
+        return pme_lb->setup.size();
     }
 }
 
@@ -493,7 +489,7 @@ static void switch_to_stage1(pme_load_balancing_t *pme_lb)
      * maxRelativeSlowdownAccepted times the fastest setup.
      */
     pme_lb->start = pme_lb->lower_limit;
-    while (pme_lb->start + 1 < pme_lb->n &&
+    while (pme_lb->start + 1 < static_cast<int>(pme_lb->setup.size()) &&
            (pme_lb->setup[pme_lb->start].count == 0 ||
             pme_lb->setup[pme_lb->start].cycles >
             pme_lb->setup[pme_lb->fastest].cycles*maxRelativeSlowdownAccepted))
@@ -512,7 +508,7 @@ static void switch_to_stage1(pme_load_balancing_t *pme_lb)
     }
 
     /* Decrease end only with setups that we timed and that are slow. */
-    pme_lb->end = pme_lb->n;
+    pme_lb->end = pme_lb->setup.size();
     if (pme_lb->setup[pme_lb->end - 1].count > 0 &&
         pme_lb->setup[pme_lb->end - 1].cycles >
         pme_lb->setup[pme_lb->fastest].cycles*maxRelativeSlowdownAccepted)
@@ -638,7 +634,7 @@ pme_load_balance(pme_load_balancing_t      *pme_lb,
     if (pme_lb->stage == 0 && pme_lb->cur > 0 &&
         cycles > pme_lb->setup[pme_lb->fastest].cycles*maxRelativeSlowdownAccepted)
     {
-        pme_lb->n = pme_lb->cur + 1;
+        pme_lb->setup.resize(pme_lb->cur + 1);
         /* Done with scanning, go to stage 1 */
         switch_to_stage1(pme_lb);
     }
@@ -651,7 +647,7 @@ pme_load_balance(pme_load_balancing_t      *pme_lb,
 
         do
         {
-            if (pme_lb->cur+1 < pme_lb->n)
+            if (pme_lb->cur+1 < static_cast<int>(pme_lb->setup.size()))
             {
                 /* We had already generated the next setup */
                 OK = TRUE;
@@ -705,7 +701,7 @@ pme_load_balance(pme_load_balancing_t      *pme_lb,
                 /* We hit the upper limit for the cut-off,
                  * the setup should not go further than cur.
                  */
-                pme_lb->n = pme_lb->cur + 1;
+                pme_lb->setup.resize(pme_lb->cur + 1);
                 print_loadbal_limited(fp_err, fp_log, step, pme_lb);
                 /* Switch to the next stage */
                 switch_to_stage1(pme_lb);
@@ -1127,8 +1123,5 @@ void pme_loadbal_done(pme_load_balancing_t *pme_lb,
         print_pme_loadbal_settings(pme_lb, fplog, mdlog, bNonBondedOnGPU);
     }
 
-    /* TODO: Here we should free all pointers in pme_lb,
-     * but as it contains pme data structures,
-     * we need to first make pme.c free all data.
-     */
+    delete pme_lb;
 }
index a0d9ee69995e66466f5a2c24d942a10d258a41c6..690a19df7439d62d85906ddc1882482e99072ff6 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -113,15 +113,15 @@ struct gmx_pme_pp {
     int                  peerRankId;     /**< The peer PP rank id                  */
     //@{
     /**< Vectors of A- and B-state parameters used to transfer vectors to PME ranks  */
-    gmx::HostVector<real>      chargeA;
-    std::vector<real>          chargeB;
-    std::vector<real>          sqrt_c6A;
-    std::vector<real>          sqrt_c6B;
-    std::vector<real>          sigmaA;
-    std::vector<real>          sigmaB;
+    gmx::PaddedHostVector<real> chargeA;
+    std::vector<real>           chargeB;
+    std::vector<real>           sqrt_c6A;
+    std::vector<real>           sqrt_c6B;
+    std::vector<real>           sigmaA;
+    std::vector<real>           sigmaB;
     //@}
-    gmx::HostVector<gmx::RVec> x; /**< Vector of atom coordinates to transfer to PME ranks */
-    std::vector<gmx::RVec>     f; /**< Vector of atom forces received from PME ranks */
+    gmx::HostVector<gmx::RVec>  x; /**< Vector of atom coordinates to transfer to PME ranks */
+    std::vector<gmx::RVec>      f; /**< Vector of atom forces received from PME ranks */
     //@{
     /**< Vectors of MPI objects used in non-blocking communication between multiple PP ranks per PME rank */
     std::vector<MPI_Request> req;
@@ -348,7 +348,7 @@ static int gmx_pme_recv_coeffs_coords(gmx_pme_pp        *pme_pp,
             {
                 pme_pp->sigmaB.resize(nat);
             }
-            pme_pp->x.resizeWithPadding(nat);
+            pme_pp->x.resize(nat);
             pme_pp->f.resize(nat);
 
             /* maxshift is sent when the charges are sent */
@@ -625,7 +625,7 @@ int gmx_pmeonly(struct gmx_pme_t *pme,
             //TODO this should be set properly by gmx_pme_recv_coeffs_coords,
             // or maybe use inputrecDynamicBox(ir), at the very least - change this when this codepath is tested!
             pme_gpu_prepare_computation(pme, boxChanged, box, wcycle, pmeFlags);
-            pme_gpu_launch_spread(pme, pme_pp->x.rvec_array(), wcycle);
+            pme_gpu_launch_spread(pme, as_rvec_array(pme_pp->x.data()), wcycle);
             pme_gpu_launch_complex_transforms(pme, wcycle);
             pme_gpu_launch_gather(pme, wcycle, PmeForceOutputHandling::Set);
             output = pme_gpu_wait_finish_task(pme, pmeFlags, wcycle);
@@ -633,7 +633,7 @@ int gmx_pmeonly(struct gmx_pme_t *pme,
         }
         else
         {
-            gmx_pme_do(pme, 0, natoms, pme_pp->x.rvec_array(), as_rvec_array(pme_pp->f.data()),
+            gmx_pme_do(pme, 0, natoms, as_rvec_array(pme_pp->x.data()), as_rvec_array(pme_pp->f.data()),
                        pme_pp->chargeA.data(), pme_pp->chargeB.data(),
                        pme_pp->sqrt_c6A.data(), pme_pp->sqrt_c6B.data(),
                        pme_pp->sigmaA.data(), pme_pp->sigmaB.data(), box,
index 55ec1f001e7ad7d3a02eba5c5cc100d50e23a89c..87a672112e572c928dd50fe7bc12418cc72a12f9 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -58,8 +58,9 @@ enum {
 
 static const char *eioNames[eioNR] =
 {
-    "REAL", "INT", "GMX_STE_T", "UCHAR", "NUCHAR", "USHORT", "RVEC", "NRVEC",
-    "IVEC", "STRING"
+    "REAL", "FLOAT", "DOUBLE", "INT", "INT64",
+    "UCHAR", "NUCHAR", "USHORT",
+    "RVEC", "NRVEC", "IVEC", "STRING"
 };
 
 void gmx_fio_setprecision(t_fileio *fio, gmx_bool bDouble)
index 5c7112f7ed31c2e08bd2f1a52005f36fae191d96..858bb3dacee1dee6ea729c4d63de0b38795b179b 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -511,23 +511,20 @@ void write_hconf_indexed_p(FILE *out, const char *title, const t_atoms *atoms,
 void write_hconf_mtop(FILE *out, const char *title, gmx_mtop_t *mtop,
                       const rvec *x, const rvec *v, const matrix box)
 {
-    int                     i, resnr;
-    gmx_mtop_atomloop_all_t aloop;
-    const t_atom           *atom;
-    char                   *atomname, *resname;
-
     fprintf(out, "%s\n", (title && title[0]) ? title : gmx::bromacs().c_str());
     fprintf(out, "%5d\n", mtop->natoms);
 
-    const char *format = get_hconf_format(v != nullptr);
+    const char         *format = get_hconf_format(v != nullptr);
 
-    aloop = gmx_mtop_atomloop_all_init(mtop);
-    while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
+    for (const AtomProxy &atomP : AtomRange(*mtop))
     {
-        gmx_mtop_atomloop_all_names(aloop, &atomname, &resnr, &resname);
+        int         i             = atomP.globalAtomNumber();
+        int         residueNumber = atomP.residueNumber();
+        const char *atomName      = atomP.atomName();
+        const char *residueName   = atomP.residueName();
 
         fprintf(out, "%5d%-5.5s%5.5s%5d",
-                resnr%100000, resname, atomname, (i+1)%100000);
+                residueNumber%100000, residueName, atomName, (i+1)%100000);
         /* next fprintf uses built format string */
         if (v)
         {
index 26dfd28c149fbbd6e03b99943f26cd922ea82e31..b6882696e6c618c97c0b7a0336b86799fd8137e1 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -77,7 +77,6 @@ static const char *pdbtp[epdbNR] = {
     "CONECT"
 };
 
-
 #define REMARK_SIM_BOX "REMARK    THIS IS A SIMULATION BOX"
 
 static void xlate_atomname_pdb2gmx(char *name)
@@ -309,20 +308,12 @@ void write_pdbfile_indexed(FILE *out, const char *title,
                            gmx_conect conect, gmx_bool bTerSepChains,
                            bool usePqrFormat)
 {
-    gmx_conect_t     *gc = static_cast<gmx_conect_t *>(conect);
-    int               i, ii;
-    int               resind, resnr;
-    enum PDB_record   type;
-    unsigned char     resic, ch;
-    char              altloc;
-    real              occup, bfac;
-    gmx_bool          bOccup;
-    int               chainnum, lastchainnum;
-    gmx_residuetype_t*rt;
-    const char       *p_restype;
-    const char       *p_lastrestype;
-
-    gmx_residuetype_init(&rt);
+    gmx_conect_t   *gc = static_cast<gmx_conect_t *>(conect);
+    enum PDB_record type;
+    char            altloc;
+    real            occup, bfac;
+    gmx_bool        bOccup;
+
 
     fprintf(out, "TITLE     %s\n", (title && title[0]) ? title : gmx::bromacs().c_str());
     if (box && ( (norm2(box[XX]) != 0.0f) || (norm2(box[YY]) != 0.0f) || (norm2(box[ZZ]) != 0.0f) ) )
@@ -335,9 +326,9 @@ void write_pdbfile_indexed(FILE *out, const char *title,
          * otherwise set them all to one
          */
         bOccup = TRUE;
-        for (ii = 0; (ii < nindex) && bOccup; ii++)
+        for (int ii = 0; (ii < nindex) && bOccup; ii++)
         {
-            i      = index[ii];
+            int i      = index[ii];
             bOccup = bOccup && (atoms->pdbinfo[i].occup == 0.0);
         }
     }
@@ -348,22 +339,26 @@ void write_pdbfile_indexed(FILE *out, const char *title,
 
     fprintf(out, "MODEL %8d\n", model_nr > 0 ? model_nr : 1);
 
-    lastchainnum      = -1;
-    p_restype         = nullptr;
+    int         lastchainnum      = -1;
+    std::string prevRestype;
+    std::string lastRestype;
 
-    for (ii = 0; ii < nindex; ii++)
+    ResidueType rt;
+    for (int ii = 0; ii < nindex; ii++)
     {
-        i             = index[ii];
-        resind        = atoms->atom[i].resind;
-        chainnum      = atoms->resinfo[resind].chainnum;
-        p_lastrestype = p_restype;
-        gmx_residuetype_get_type(rt, *atoms->resinfo[resind].name, &p_restype);
+        int i             = index[ii];
+        int resind        = atoms->atom[i].resind;
+        int chainnum      = atoms->resinfo[resind].chainnum;
+        lastRestype = prevRestype;
+        prevRestype = rt.typeNameForIndexedResidue(*atoms->resinfo[resind].name);
 
         /* Add a TER record if we changed chain, and if either the previous or this chain is protein/DNA/RNA. */
         if (bTerSepChains && ii > 0 && chainnum != lastchainnum)
         {
             /* Only add TER if the previous chain contained protein/DNA/RNA. */
-            if (gmx_residuetype_is_protein(rt, p_lastrestype) || gmx_residuetype_is_dna(rt, p_lastrestype) || gmx_residuetype_is_rna(rt, p_lastrestype))
+            if (rt.namedResidueHasType(lastRestype, "Protein") ||
+                rt.namedResidueHasType(lastRestype, "DNA") ||
+                rt.namedResidueHasType(lastRestype, "RNA"))
             {
                 fprintf(out, "TER\n");
             }
@@ -375,8 +370,9 @@ void write_pdbfile_indexed(FILE *out, const char *title,
 
         /* rename HG12 to 2HG1, etc. */
         nm    = xlate_atomname_gmx2pdb(nm);
-        resnr = atoms->resinfo[resind].nr;
-        resic = atoms->resinfo[resind].ic;
+        int           resnr = atoms->resinfo[resind].nr;
+        unsigned char resic = atoms->resinfo[resind].ic;
+        unsigned char ch;
         if (chainid != ' ')
         {
             ch = chainid;
@@ -458,13 +454,11 @@ void write_pdbfile_indexed(FILE *out, const char *title,
     if (nullptr != gc)
     {
         /* Write conect records */
-        for (i = 0; (i < gc->nconect); i++)
+        for (int i = 0; (i < gc->nconect); i++)
         {
             fprintf(out, "CONECT%5d%5d\n", gc->conect[i].ai+1, gc->conect[i].aj+1);
         }
     }
-
-    gmx_residuetype_destroy(rt);
 }
 
 void write_pdbfile(FILE *out, const char *title, const t_atoms *atoms, const rvec x[],
@@ -561,11 +555,11 @@ static void read_anisou(char line[], int natom, t_atoms *atoms)
     }
 }
 
-void get_pdb_atomnumber(const t_atoms *atoms, gmx_atomprop_t aps)
+void get_pdb_atomnumber(const t_atoms *atoms, AtomProperties *aps)
 {
     int    i, atomnumber, len;
     size_t k;
-    char   anm[6], anm_copy[6], *ptr;
+    char   anm[6], anm_copy[6];
     char   nc = '\0';
     real   eval;
 
@@ -582,7 +576,7 @@ void get_pdb_atomnumber(const t_atoms *atoms, gmx_atomprop_t aps)
         if ((anm[0] != ' ') && ((len <= 2) || !std::isdigit(anm[2])))
         {
             anm_copy[2] = nc;
-            if (gmx_atomprop_query(aps, epropElement, "???", anm_copy, &eval))
+            if (aps->setAtomProperty(epropElement, "???", anm_copy, &eval))
             {
                 atomnumber    = gmx::roundToInt(eval);
                 atomNumberSet = true;
@@ -590,7 +584,7 @@ void get_pdb_atomnumber(const t_atoms *atoms, gmx_atomprop_t aps)
             else
             {
                 anm_copy[1] = nc;
-                if (gmx_atomprop_query(aps, epropElement, "???", anm_copy, &eval))
+                if (aps->setAtomProperty(epropElement, "???", anm_copy, &eval))
                 {
                     atomnumber    = gmx::roundToInt(eval);
                     atomNumberSet = true;
@@ -606,27 +600,25 @@ void get_pdb_atomnumber(const t_atoms *atoms, gmx_atomprop_t aps)
             }
             anm_copy[0] = anm[k];
             anm_copy[1] = nc;
-            if (gmx_atomprop_query(aps, epropElement, "???", anm_copy, &eval))
+            if (aps->setAtomProperty(epropElement, "???", anm_copy, &eval))
             {
                 atomnumber    = gmx::roundToInt(eval);
                 atomNumberSet = true;
             }
         }
+        std::string buf;
         if (atomNumberSet)
         {
             atoms->atom[i].atomnumber = atomnumber;
-            ptr = gmx_atomprop_element(aps, atomnumber);
+            buf = aps->elementFromAtomNumber(atomnumber);
             if (debug)
             {
                 fprintf(debug, "Atomnumber for atom '%s' is %d\n",
                         anm, atomnumber);
             }
         }
-        else
-        {
-            ptr = nullptr;
-        }
-        std::strncpy(atoms->atom[i].elem, ptr == nullptr ? "" : ptr, 4);
+        buf.resize(3);
+        std::strncpy(atoms->atom[i].elem, buf.c_str(), 4);
     }
 }
 
index f3ecc7eec56013bb0af207c7c44ff19ae14895cd..46a3ca40d7d8f21389b996311d1aa3abc23ca3cd 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -45,7 +45,7 @@
 #include "gromacs/utility/basedefinitions.h"
 #include "gromacs/utility/real.h"
 
-struct gmx_atomprop;
+class AtomProperties;
 struct t_atoms;
 struct t_symtab;
 struct t_topology;
@@ -111,7 +111,7 @@ void write_pdbfile(FILE *out, const char *title, const t_atoms *atoms,
  * which may be useful for visualization purposes.
  */
 
-void get_pdb_atomnumber(const t_atoms *atoms, struct gmx_atomprop *aps);
+void get_pdb_atomnumber(const t_atoms *atoms, AtomProperties *aps);
 /* Routine to extract atomic numbers from the atom names */
 
 int read_pdbfile(FILE *in, char *title, int *model_nr,
index b69f38b7fb797536f2e54c2ffc2cd2db0b40b3ed..ee1b2d2e7aa74c0730370b9696b53f512ab33e13 100644 (file)
@@ -588,7 +588,7 @@ static gmx_bool all_atoms_selected(const gmx_mtop_t *mtop,
         {
             for (int atomIndex = 0; atomIndex < atoms.nr; atomIndex++, i++)
             {
-                if (getGroupType(&mtop->groups, gtype, i) != 0)
+                if (getGroupType(mtop->groups, gtype, i) != 0)
                 {
                     return FALSE;
                 }
@@ -664,7 +664,7 @@ static void add_selection_groups(gmx_tng_trajectory_t  gmx_tng,
                 char *res_name;
                 int   res_id;
 
-                if (getGroupType(&mtop->groups, egcCompressedX, i) != 0)
+                if (getGroupType(mtop->groups, egcCompressedX, i) != 0)
                 {
                     continue;
                 }
@@ -707,8 +707,8 @@ static void add_selection_groups(gmx_tng_trajectory_t  gmx_tng,
                             int atom1, atom2;
                             atom1 = ilist.iatoms[l] + atom_offset;
                             atom2 = ilist.iatoms[l + 1] + atom_offset;
-                            if (getGroupType(&mtop->groups, egcCompressedX, atom1) == 0 &&
-                                getGroupType(&mtop->groups, egcCompressedX, atom2) == 0)
+                            if (getGroupType(mtop->groups, egcCompressedX, atom1) == 0 &&
+                                getGroupType(mtop->groups, egcCompressedX, atom2) == 0)
                             {
                                 tng_molecule_bond_add(tng, mol, ilist.iatoms[l],
                                                       ilist.iatoms[l + 1], &tngBond);
@@ -724,14 +724,14 @@ static void add_selection_groups(gmx_tng_trajectory_t  gmx_tng,
                     atom1 = ilist.iatoms[l] + atom_offset;
                     atom2 = ilist.iatoms[l + 1] + atom_offset;
                     atom3 = ilist.iatoms[l + 2] + atom_offset;
-                    if (getGroupType(&mtop->groups, egcCompressedX, atom1) == 0)
+                    if (getGroupType(mtop->groups, egcCompressedX, atom1) == 0)
                     {
-                        if (getGroupType(&mtop->groups, egcCompressedX, atom2) == 0)
+                        if (getGroupType(mtop->groups, egcCompressedX, atom2) == 0)
                         {
                             tng_molecule_bond_add(tng, mol, atom1,
                                                   atom2, &tngBond);
                         }
-                        if (getGroupType(&mtop->groups, egcCompressedX, atom3) == 0)
+                        if (getGroupType(mtop->groups, egcCompressedX, atom3) == 0)
                         {
                             tng_molecule_bond_add(tng, mol, atom1,
                                                   atom3, &tngBond);
index c385701505869c618083b5fa6bcf6fde350acffd..a604cae1b88c3f9657bce3e334df99df8225fb2e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2009,2010,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2009,2010,2012,2013,2014,2015,2016,2017,2018,2019, 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.
@@ -38,6 +38,9 @@
 
 #include "config.h"
 
+#include "gromacs/utility/path.h"
+#include "gromacs/utility/stringutil.h"
+
 /* Derived from PluginMgr.C and catdcd.c */
 
 /* PluginMgr.C: Copyright: */
@@ -264,23 +267,19 @@ gmx_bool read_next_vmd_frame(gmx_vmdplugin_t *vmdplugin, t_trxframe *fr)
 
 static int load_vmd_library(const char *fn, gmx_vmdplugin_t *vmdplugin)
 {
-    char            pathname[GMX_PATH_MAX];
-    const char     *pathenv;
-    const char     *err;
-    int             ret = 0;
-    char            pathenv_buffer[GMX_PATH_MAX];
+    const char       *err;
+    int               ret = 0;
 #if !GMX_NATIVE_WINDOWS
-    glob_t          globbuf;
-    const char     *defpath_suffix = "/plugins/*/molfile";
-    const char     *defpathenv     = GMX_VMD_PLUGIN_PATH;
+    glob_t            globbuf;
+    const std::string defpath_suffix = "/plugins/*/molfile";
+    const std::string defpathenv     = GMX_VMD_PLUGIN_PATH;
 #else
-    WIN32_FIND_DATA ffd;
-    HANDLE          hFind = INVALID_HANDLE_VALUE;
-    char            progfolder[GMX_PATH_MAX];
-    char            defpathenv[GMX_PATH_MAX];
-    const char     *defpath_suffix = "\\plugins\\WIN32\\molfile";
+    WIN32_FIND_DATA   ffd;
+    HANDLE            hFind = INVALID_HANDLE_VALUE;
+    char              progfolder[GMX_PATH_MAX];
+    std::string       defpath_suffix = "\\plugins\\WIN32\\molfile";
     SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, SHGFP_TYPE_CURRENT, progfolder);
-    sprintf(defpathenv, "%s\\University of Illinois\\VMD\\plugins\\WIN32\\molfile", progfolder);
+    std::string       defpathenv = gmx::formatString("%s\\University of Illinois\\VMD\\plugins\\WIN32\\molfile", progfolder);
 #endif
 
     vmdplugin->api      = nullptr;
@@ -295,32 +294,26 @@ static int load_vmd_library(const char *fn, gmx_vmdplugin_t *vmdplugin)
      * plugins, then an implicit run-time path, and finally for one
      * given at configure time. This last might be hard-coded to the
      * default for VMD installs. */
-    pathenv = getenv("VMD_PLUGIN_PATH");
-    if (pathenv == nullptr)
+    std::string pathenv = getenv("VMD_PLUGIN_PATH");
+    if (pathenv.empty())
     {
         pathenv = getenv("VMDDIR");
-        if (nullptr == pathenv)
+        if (pathenv.empty())
         {
             printf("\nNeither VMD_PLUGIN_PATH or VMDDIR set. ");
-            printf("Using default location:\n%s\n", defpathenv);
+            printf("Using default location:\n%s\n", defpathenv.c_str());
             pathenv = defpathenv;
         }
         else
         {
             printf("\nVMD_PLUGIN_PATH no set, but VMDDIR is set. ");
-#ifdef _MSC_VER
-            _snprintf_s(pathenv_buffer, sizeof(pathenv_buffer), _TRUNCATE, "%s%s", pathenv, defpath_suffix);
-#else
-            snprintf(pathenv_buffer, sizeof(pathenv_buffer), "%s%s", pathenv, defpath_suffix);
-#endif
-            printf("Using semi-default location:\n%s\n", pathenv_buffer);
-            pathenv = pathenv_buffer;
+            pathenv = gmx::Path::join(pathenv, defpath_suffix);
+            printf("Using semi-default location:\n%s\n", pathenv.c_str());
         }
     }
-    strncpy(pathname, pathenv, sizeof(pathname));
 #if !GMX_NATIVE_WINDOWS
-    strcat(pathname, "/*.so");
-    glob(pathname, 0, nullptr, &globbuf);
+    std::string pathname = gmx::Path::join (pathenv, "/*.so");
+    glob(pathname.c_str(), 0, nullptr, &globbuf);
     if (globbuf.gl_pathc == 0)
     {
         printf("\nNo VMD Plugins found\n"
@@ -340,8 +333,8 @@ static int load_vmd_library(const char *fn, gmx_vmdplugin_t *vmdplugin)
     }
     globfree(&globbuf);
 #else
-    strcat(pathname, "\\*.so");
-    hFind = FindFirstFile(pathname, &ffd);
+    std::string pathname = gmx::Path::join(pathenv, "\\*.so");
+    hFind = FindFirstFile(pathname.c_str(), &ffd);
     if (INVALID_HANDLE_VALUE == hFind)
     {
         printf("\nNo VMD Plugins found\n");
@@ -349,9 +342,8 @@ static int load_vmd_library(const char *fn, gmx_vmdplugin_t *vmdplugin)
     }
     do
     {
-        char filename[GMX_PATH_MAX];
-        sprintf(filename, "%s\\%s", pathenv, ffd.cFileName);
-        ret |= load_sharedlibrary_plugins(filename, vmdplugin);
+        std::string filename = gmx::Path::join(pathenv, ffd.cFileName);
+        ret |= load_sharedlibrary_plugins(filename.c_str(), vmdplugin);
     }
     while (FindNextFile(hFind, &ffd )  != 0 && vmdplugin->api == NULL);
     FindClose(hFind);
index 6661f757f26ba31a482cf54cc0572de4ee27b06e..70ded720444045a5e5fc918e5b4db3795c23ef41 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2018,2019, 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.
@@ -48,7 +48,7 @@
 t_dlist *mk_dlist(FILE *log,
                   const t_atoms *atoms, int *nlist,
                   gmx_bool bPhi, gmx_bool bPsi, gmx_bool bChi, gmx_bool bHChi,
-                  int maxchi, int r0, gmx_residuetype_t *rt)
+                  int maxchi, int r0, ResidueType *rt)
 {
     int       i, j, ii;
     t_dihatms atm, prev;
@@ -220,7 +220,7 @@ t_dlist *mk_dlist(FILE *log,
             {
                 nc[6]++;
             }
-            dl[nl].index = gmx_residuetype_get_index(rt, thisres);
+            dl[nl].index = rt->indexFromResidueName(thisres);
 
             /* Prevent seg fault from unknown residues. If one adds a custom residue to
              * residuetypes.dat but somehow loses it, changes it, or does analysis on
index 0517719bcc2da62174af8f29f87ad73ffedea207..756865dc5cae80efe6161562b5250922d7272391 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2008, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -38,9 +38,6 @@
 #ifndef _gmx_ana_h
 #define _gmx_ana_h
 
-int
-gmx_anadock(int argc, char *argv[]);
-
 int
 gmx_analyze(int argc, char *argv[]);
 
@@ -101,12 +98,6 @@ gmx_dos(int argc, char *argv[]);
 int
 gmx_dyecoupl(int argc, char *argv[]);
 
-int
-gmx_dyndom(int argc, char *argv[]);
-
-int
-gmx_editconf(int argc, char *argv[]);
-
 int
 gmx_eneconv(int argc, char *argv[]);
 
@@ -122,12 +113,6 @@ gmx_lie(int argc, char *argv[]);
 int
 gmx_filter(int argc, char *argv[]);
 
-int
-gmx_genion(int argc, char *argv[]);
-
-int
-gmx_genpr(int argc, char *argv[]);
-
 int
 gmx_gyrate(int argc, char *argv[]);
 
@@ -161,9 +146,6 @@ gmx_mk_angndx(int argc, char *argv[]);
 int
 gmx_msd(int argc, char *argv[]);
 
-int
-gmx_morph(int argc, char *argv[]);
-
 int
 gmx_nmeig(int argc, char *argv[]);
 
diff --git a/src/gromacs/gmxana/gmx_anadock.cpp b/src/gromacs/gmxana/gmx_anadock.cpp
deleted file mode 100644 (file)
index b8ca3f8..0000000
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- * This file is part of the GROMACS molecular simulation package.
- *
- * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
- * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2012,2013,2014,2015,2017,2018, 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.
- */
-#include "gmxpre.h"
-
-#include <cmath>
-#include <cstdlib>
-#include <cstring>
-
-#include <string>
-
-#include "gromacs/commandline/pargs.h"
-#include "gromacs/fileio/confio.h"
-#include "gromacs/fileio/xvgr.h"
-#include "gromacs/gmxana/gmx_ana.h"
-#include "gromacs/math/vec.h"
-#include "gromacs/statistics/statistics.h"
-#include "gromacs/topology/topology.h"
-#include "gromacs/utility/arraysize.h"
-#include "gromacs/utility/cstringutil.h"
-#include "gromacs/utility/fatalerror.h"
-#include "gromacs/utility/futil.h"
-#include "gromacs/utility/path.h"
-#include "gromacs/utility/pleasecite.h"
-#include "gromacs/utility/smalloc.h"
-
-static const char *etitles[] = { "E-docked", "Free Energy" };
-
-typedef struct {
-    real     edocked, efree;
-    int      index, cluster_id;
-    t_atoms  atoms;
-    rvec    *x;
-    int      ePBC;
-    matrix   box;
-} t_pdbfile;
-
-static t_pdbfile *read_pdbf(const char *fn)
-{
-    t_pdbfile *pdbf;
-    double     e;
-    FILE      *fp;
-
-    snew(pdbf, 1);
-    t_topology top;
-    read_tps_conf(fn, &top, &pdbf->ePBC, &pdbf->x, nullptr, pdbf->box, FALSE);
-    pdbf->atoms = top.atoms;
-    fp          = gmx_ffopen(fn, "r");
-    char       buf[256], *ptr;
-    while ((ptr = fgets2(buf, 255, fp)) != nullptr)
-    {
-        if (std::strstr(buf, "Intermolecular") != nullptr)
-        {
-            ptr = std::strchr(buf, '=');
-            sscanf(ptr+1, "%lf", &e);
-            pdbf->edocked = e;
-        }
-        else if (std::strstr(buf, "Estimated Free") != nullptr)
-        {
-            ptr = std::strchr(buf, '=');
-            sscanf(ptr+1, "%lf", &e);
-            pdbf->efree = e;
-        }
-    }
-    gmx_ffclose(fp);
-
-    return pdbf;
-}
-
-static t_pdbfile **read_em_all(const std::string &fn, int *npdbf)
-{
-    t_pdbfile **pdbf = nullptr;
-    int         i, maxpdbf;
-    gmx_bool    bExist;
-
-    maxpdbf                 = 100;
-    snew(pdbf, maxpdbf);
-    i = 0;
-    do
-    {
-        auto newFilename = gmx::Path::concatenateBeforeExtension(fn, gmx::formatString("_%d", i+1));
-        if ((bExist = gmx_fexist(newFilename)))
-        {
-            pdbf[i]        = read_pdbf(newFilename.c_str());
-            pdbf[i]->index = i+1;
-            i++;
-            if (i >= maxpdbf)
-            {
-                maxpdbf += 100;
-                srenew(pdbf, maxpdbf);
-            }
-        }
-    }
-    while (bExist);
-
-    *npdbf = i;
-
-    printf("Found %d pdb files\n", i);
-
-    return pdbf;
-}
-
-static gmx_bool bFreeSort = FALSE;
-
-static int pdbf_comp(const void *a, const void *b)
-{
-    const t_pdbfile *pa, *pb;
-    real             x;
-    int              dc;
-
-    pa = *static_cast<t_pdbfile *const*>(a);
-    pb = *static_cast<t_pdbfile *const*>(b);
-
-    dc = pa->cluster_id - pb->cluster_id;
-
-    if (dc == 0)
-    {
-        if (bFreeSort)
-        {
-            x = pa->efree   - pb->efree;
-        }
-        else
-        {
-            x = pa->edocked - pb->edocked;
-        }
-
-        if (x < 0)
-        {
-            return -1;
-        }
-        else if (x > 0)
-        {
-            return 1;
-        }
-        else
-        {
-            return 0;
-        }
-    }
-    else
-    {
-        return dc;
-    }
-}
-
-static void analyse_em_all(int npdb, t_pdbfile *pdbf[], const char *edocked,
-                           const char *efree, const gmx_output_env_t *oenv)
-{
-    FILE *fp;
-    int   i;
-
-    for (int freeSort = 0; freeSort < 2; freeSort++)
-    {
-        bFreeSort = (freeSort == 1);
-        qsort(pdbf, npdb, sizeof(pdbf[0]), pdbf_comp);
-        fp = xvgropen(bFreeSort ? efree : edocked,
-                      etitles[bFreeSort], "()", "E (kJ/mol)", oenv);
-        for (i = 0; (i < npdb); i++)
-        {
-            fprintf(fp, "%12lf\n", bFreeSort ? pdbf[i]->efree : pdbf[i]->edocked);
-        }
-        xvgrclose(fp);
-    }
-}
-
-static void clust_stat(FILE *fp, int start, int end, t_pdbfile *pdbf[])
-{
-    int         i;
-    gmx_stats_t ed, ef;
-    real        aver, sigma;
-
-    ed = gmx_stats_init();
-    ef = gmx_stats_init();
-    for (i = start; (i < end); i++)
-    {
-        gmx_stats_add_point(ed, i-start, pdbf[i]->edocked, 0, 0);
-        gmx_stats_add_point(ef, i-start, pdbf[i]->efree, 0, 0);
-    }
-    gmx_stats_get_ase(ed, &aver, &sigma, nullptr);
-    fprintf(fp, "  <%12s> = %8.3f (+/- %6.3f)\n", etitles[FALSE], aver, sigma);
-    gmx_stats_get_ase(ef, &aver, &sigma, nullptr);
-    fprintf(fp, "  <%12s> = %8.3f (+/- %6.3f)\n", etitles[TRUE], aver, sigma);
-    gmx_stats_free(ed);
-    gmx_stats_free(ef);
-}
-
-static real rmsd_dist(t_pdbfile *pa, t_pdbfile *pb, gmx_bool bRMSD)
-{
-    int  i;
-    real rmsd;
-    rvec acm, bcm, dx;
-
-    if (bRMSD)
-    {
-        rmsd = 0;
-        for (i = 0; (i < pa->atoms.nr); i++)
-        {
-            rvec_sub(pa->x[i], pb->x[i], dx);
-            rmsd += iprod(dx, dx);
-        }
-        rmsd = std::sqrt(rmsd/pa->atoms.nr);
-    }
-    else
-    {
-        clear_rvec(acm);
-        clear_rvec(bcm);
-        for (i = 0; (i < pa->atoms.nr); i++)
-        {
-            rvec_inc(acm, pa->x[i]);
-            rvec_inc(bcm, pb->x[i]);
-        }
-        rvec_sub(acm, bcm, dx);
-        for (i = 0; (i < DIM); i++)
-        {
-            dx[i] /= pa->atoms.nr;
-        }
-        rmsd = norm(dx);
-    }
-    return rmsd;
-}
-
-static void line(FILE *fp)
-{
-    fprintf(fp, "                   - - - - - - - - - -\n");
-}
-
-static void cluster_em_all(FILE *fp, int npdb, t_pdbfile *pdbf[],
-                           gmx_bool bFree, gmx_bool bRMSD, real cutoff)
-{
-    int   i, j, k;
-    int  *cndx, ncluster;
-    real  rmsd;
-
-    bFreeSort = bFree;
-    qsort(pdbf, npdb, sizeof(pdbf[0]), pdbf_comp);
-
-    fprintf(fp, "Statistics over all structures:\n");
-    clust_stat(fp, 0, npdb, pdbf);
-    line(fp);
-
-    /* Index to first structure in a cluster */
-    snew(cndx, npdb);
-    ncluster = 1;
-
-    for (i = 1; (i < npdb); i++)
-    {
-        for (j = 0; (j < ncluster); j++)
-        {
-            rmsd = rmsd_dist(pdbf[cndx[j]], pdbf[i], bRMSD);
-            if (rmsd <= cutoff)
-            {
-                /* Structure i is in cluster j */
-                pdbf[i]->cluster_id = pdbf[cndx[j]]->cluster_id;
-                break;
-            }
-        }
-        if (j == ncluster)
-        {
-            /* New cluster! Cool! */
-            cndx[ncluster]      = i;
-            pdbf[i]->cluster_id = ncluster;
-            ncluster++;
-        }
-    }
-    cndx[ncluster] = npdb;
-    qsort(pdbf, npdb, sizeof(pdbf[0]), pdbf_comp);
-
-    j         = 0;
-    cndx[j++] = 0;
-    for (i = 1; (i < npdb); i++)
-    {
-        if (pdbf[i]->cluster_id != pdbf[i-1]->cluster_id)
-        {
-            cndx[j++] = i;
-        }
-    }
-    cndx[j] = npdb;
-    if (j != ncluster)
-    {
-        gmx_fatal(FARGS, "Consistency error: j = %d, ncluster = %d", j, ncluster);
-    }
-
-    fprintf(fp, "I found %d clusters based on %s and %s with a %.3f nm cut-off\n",
-            ncluster, etitles[bFree], bRMSD ? "RMSD" : "distance", cutoff);
-    line(fp);
-    for (j = 0; (j < ncluster); j++)
-    {
-        fprintf(fp, "Cluster: %3d  %s: %10.5f kJ/mol %3d elements\n",
-                j, etitles[bFree],
-                bFree ? pdbf[cndx[j]]->efree : pdbf[cndx[j]]->edocked,
-                cndx[j+1]-cndx[j]);
-        clust_stat(fp, cndx[j], cndx[j+1], pdbf);
-        for (k = cndx[j]; (k < cndx[j+1]); k++)
-        {
-            fprintf(fp, "  %3d", pdbf[k]->index);
-        }
-        fprintf(fp, "\n");
-        line(fp);
-    }
-    sfree(cndx);
-}
-
-int gmx_anadock(int argc, char *argv[])
-{
-    const char       *desc[] = {
-        "[THISMODULE] analyses the results of an Autodock run and clusters the",
-        "structures together, based on distance or RMSD. The docked energy",
-        "and free energy estimates are analysed, and for each cluster the",
-        "energy statistics are printed.[PAR]",
-        "An alternative approach to this is to cluster the structures first",
-        "using [gmx-cluster] and then sort the clusters on either lowest",
-        "energy or average energy."
-    };
-    t_filenm          fnm[] = {
-        { efPDB, "-f", nullptr,       ffREAD  },
-        { efXVG, "-od", "edocked", ffWRITE },
-        { efXVG, "-of", "efree",   ffWRITE },
-        { efLOG, "-g",  "anadock", ffWRITE }
-    };
-    gmx_output_env_t *oenv;
-#define NFILE asize(fnm)
-    static gmx_bool   bFree  = FALSE, bRMS = TRUE;
-    static real       cutoff = 0.2;
-    t_pargs           pa[]   = {
-        { "-free",   FALSE, etBOOL, {&bFree},
-          "Use Free energy estimate from autodock for sorting the classes" },
-        { "-rms",    FALSE, etBOOL, {&bRMS},
-          "Cluster on RMS or distance" },
-        { "-cutoff", FALSE, etREAL, {&cutoff},
-          "Maximum RMSD/distance for belonging to the same cluster" }
-    };
-#define NPA asize(pa)
-
-    FILE       *fp;
-    t_pdbfile **pdbf = nullptr;
-    int         npdbf;
-
-    if (!parse_common_args(&argc, argv, 0, NFILE, fnm, NPA, pa, asize(desc), desc, 0,
-                           nullptr, &oenv))
-    {
-        return 0;
-    }
-
-    fp = gmx_ffopen(opt2fn("-g", NFILE, fnm), "w");
-    please_cite(stdout, "Hetenyi2002b");
-    please_cite(fp, "Hetenyi2002b");
-
-    pdbf = read_em_all(opt2fn("-f", NFILE, fnm), &npdbf);
-
-    analyse_em_all(npdbf, pdbf, opt2fn("-od", NFILE, fnm), opt2fn("-of", NFILE, fnm),
-                   oenv);
-
-    cluster_em_all(fp, npdbf, pdbf, bFree, bRMS, cutoff);
-
-    gmx_ffclose(fp);
-
-    return 0;
-}
index 2dc33d2b1951dbaad6c45decc44662fc25cb7a45..4931615de89e916d1218abdf4dcb7dbda95d8549 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -435,7 +435,7 @@ static int reset_em_all(int nlist, t_dlist dlist[], int nf,
     return j;
 }
 
-static void histogramming(FILE *log, int nbin, gmx_residuetype_t *rt,
+static void histogramming(FILE *log, int nbin, ResidueType *rt,
                           int nf, int maxchi, real **dih,
                           int nlist, t_dlist dlist[],
                           const int index[],
@@ -486,7 +486,7 @@ static void histogramming(FILE *log, int nbin, gmx_residuetype_t *rt,
     const char *residue_name;
     int         rt_size;
 
-    rt_size = gmx_residuetype_get_size(rt);
+    rt_size = rt->numberOfEntries();
     if (bSSHisto)
     {
         fp = gmx_ffopen(ssdump, "r");
@@ -742,7 +742,7 @@ static void histogramming(FILE *log, int nbin, gmx_residuetype_t *rt,
                     normalize_histo(nbin, his_aa[Dih][i], (360.0/nbin), normhisto);
                 }
 
-                residue_name = gmx_residuetype_get_name(rt, i);
+                residue_name = rt->nameFromResidueIndex(i).c_str();
                 switch (Dih)
                 {
                     case edPhi:
@@ -1361,7 +1361,6 @@ int gmx_chi(int argc, char *argv[])
     gmx_bool           bDo_rt, bDo_oh, bDo_ot, bDo_jc;
     real               dt = 0, traj_t_ns;
     gmx_output_env_t  *oenv;
-    gmx_residuetype_t *rt;
 
     int                isize, *index;
     int                ndih, nactdih, nf;
@@ -1453,8 +1452,8 @@ int gmx_chi(int argc, char *argv[])
     }
     fprintf(log, "Title: %s\n", *top->name);
 
-    gmx_residuetype_init(&rt);
-    dlist = mk_dlist(log, &atoms, &nlist, bPhi, bPsi, bChi, bHChi, maxchi, r0, rt);
+    ResidueType rt;
+    dlist = mk_dlist(log, &atoms, &nlist, bPhi, bPsi, bChi, bHChi, maxchi, r0, &rt);
     fprintf(stderr, "%d residues with dihedrals found\n", nlist);
 
     if (nlist == 0)
@@ -1493,7 +1492,7 @@ int gmx_chi(int argc, char *argv[])
     }
 
     /* Histogramming & J coupling constants & calc of S2 order params */
-    histogramming(log, nbin, rt, nf, maxchi, dih, nlist, dlist, index,
+    histogramming(log, nbin, &rt, nf, maxchi, dih, nlist, dlist, index,
                   bPhi, bPsi, bOmega, bChi,
                   bNormHisto, bSSHisto, ftp2fn(efDAT, NFILE, fnm), bfac_max, &atoms,
                   bDo_jc, opt2fn("-jc", NFILE, fnm), oenv);
@@ -1593,7 +1592,5 @@ int gmx_chi(int argc, char *argv[])
         do_view(oenv, opt2fn("-corr", NFILE, fnm), "-nxy");
     }
 
-    gmx_residuetype_destroy(rt);
-
     return 0;
 }
index 52973b9c4138553c8ec36b9e5a30b1cc286ae43b..bb5438df7e741bef7856edb16001fde39da7bb75 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -70,6 +70,7 @@
 #include "gromacs/topology/index.h"
 #include "gromacs/topology/mtop_util.h"
 #include "gromacs/topology/topology.h"
+#include "gromacs/trajectoryanalysis/topologyinformation.h"
 #include "gromacs/utility/arraysize.h"
 #include "gromacs/utility/fatalerror.h"
 #include "gromacs/utility/futil.h"
@@ -658,15 +659,11 @@ int gmx_disre(int argc, char *argv[])
     };
 
     FILE             *out = nullptr, *aver = nullptr, *numv = nullptr, *maxxv = nullptr, *xvg = nullptr;
-    t_tpxheader       header;
-    gmx_mtop_t        mtop;
-    rvec             *xtop;
-    gmx_localtop_t   *top;
-    t_atoms          *atoms = nullptr;
+    gmx_localtop_t    top;
     t_fcdata          fcd;
     t_nrnb            nrnb;
     t_graph          *g;
-    int               ntopatoms, natoms, i, j, kkk;
+    int               i, j, kkk;
     t_trxstatus      *status;
     real              t;
     rvec             *x, *xav = nullptr;
@@ -715,12 +712,13 @@ int gmx_disre(int argc, char *argv[])
         init5(ntop);
     }
 
-    t_inputrec      irInstance;
-    t_inputrec     *ir = &irInstance;
+    t_inputrec               irInstance;
+    t_inputrec              *ir = &irInstance;
 
-    read_tpxheader(ftp2fn(efTPR, NFILE, fnm), &header, FALSE);
-    snew(xtop, header.natoms);
-    read_tpx(ftp2fn(efTPR, NFILE, fnm), ir, box, &ntopatoms, xtop, nullptr, &mtop);
+    gmx::TopologyInformation topInfo;
+    topInfo.fillFromInputFile(ftp2fn(efTPR, NFILE, fnm));
+    int                      ntopatoms = topInfo.mtop()->natoms;
+    AtomsDataPtr             atoms;
     bPDB = opt2bSet("-q", NFILE, fnm);
     if (bPDB)
     {
@@ -733,8 +731,7 @@ int gmx_disre(int argc, char *argv[])
             ind_fit[kkk] = kkk;
         }
 
-        snew(atoms, 1);
-        *atoms = gmx_mtop_global_atoms(&mtop);
+        atoms = topInfo.copyAtoms();
 
         if (atoms->pdbinfo == nullptr)
         {
@@ -743,7 +740,7 @@ int gmx_disre(int argc, char *argv[])
         atoms->havePdbInfo = TRUE;
     }
 
-    top = gmx_mtop_generate_local_top(&mtop, ir->efep != efepNO);
+    gmx_mtop_generate_local_top(*topInfo.mtop(), &top, ir->efep != efepNO);
 
     g        = nullptr;
     pbc_null = nullptr;
@@ -755,7 +752,7 @@ int gmx_disre(int argc, char *argv[])
         }
         else
         {
-            g = mk_graph(fplog, &top->idef, 0, mtop.natoms, FALSE, FALSE);
+            g = mk_graph(fplog, &top.idef, 0, ntopatoms, FALSE, FALSE);
         }
     }
 
@@ -782,9 +779,9 @@ int gmx_disre(int argc, char *argv[])
     }
 
     ir->dr_tau = 0.0;
-    init_disres(fplog, &mtop, ir, nullptr, nullptr, &fcd, nullptr, FALSE);
+    init_disres(fplog, topInfo.mtop(), ir, nullptr, nullptr, &fcd, nullptr, FALSE);
 
-    natoms = read_first_x(oenv, &status, ftp2fn(efTRX, NFILE, fnm), &t, &x, box);
+    int natoms = read_first_x(oenv, &status, ftp2fn(efTRX, NFILE, fnm), &t, &x, box);
     snew(f, 5*natoms);
 
     init_dr_res(&dr, fcd.disres.nres);
@@ -809,13 +806,13 @@ int gmx_disre(int argc, char *argv[])
                          "Largest Violation", "Time (ps)", "nm", oenv);
     }
 
-    auto mdAtoms = gmx::makeMDAtoms(fplog, mtop, *ir, false);
-    atoms2md(&mtop, ir, -1, nullptr, mtop.natoms, mdAtoms.get());
+    auto mdAtoms = gmx::makeMDAtoms(fplog, *topInfo.mtop(), *ir, false);
+    atoms2md(topInfo.mtop(), ir, -1, nullptr, ntopatoms, mdAtoms.get());
     update_mdatoms(mdAtoms->mdatoms(), ir->fepvals->init_lambda);
     init_nrnb(&nrnb);
     if (ir->ePBC != epbcNONE)
     {
-        gpbc = gmx_rmpbc_init(&top->idef, ir->ePBC, natoms);
+        gpbc = gmx_rmpbc_init(&top.idef, ir->ePBC, natoms);
     }
 
     j = 0;
@@ -841,14 +838,14 @@ int gmx_disre(int argc, char *argv[])
             }
             my_clust = clust->inv_clust[j];
             range_check(my_clust, 0, clust->clust->nr);
-            check_viol(fplog, &(top->idef.il[F_DISRES]),
-                       top->idef.iparams,
+            check_viol(fplog, &(top.idef.il[F_DISRES]),
+                       top.idef.iparams,
                        x, f, pbc_null, g, dr_clust, my_clust, isize, index, vvindex, &fcd);
         }
         else
         {
-            check_viol(fplog, &(top->idef.il[F_DISRES]),
-                       top->idef.iparams,
+            check_viol(fplog, &(top.idef.il[F_DISRES]),
+                       top.idef.iparams,
                        x, f, pbc_null, g, &dr, 0, isize, index, vvindex, &fcd);
         }
         if (bPDB)
@@ -893,23 +890,23 @@ int gmx_disre(int argc, char *argv[])
 
     if (clust)
     {
-        dump_clust_stats(fplog, fcd.disres.nres, &(top->idef.il[F_DISRES]),
-                         top->idef.iparams, clust->clust, dr_clust,
+        dump_clust_stats(fplog, fcd.disres.nres, &(top.idef.il[F_DISRES]),
+                         top.idef.iparams, clust->clust, dr_clust,
                          clust->grpname, isize, index);
     }
     else
     {
-        dump_stats(fplog, j, fcd.disres.nres, &(top->idef.il[F_DISRES]),
-                   top->idef.iparams, &dr, isize, index,
-                   bPDB ? atoms : nullptr);
+        dump_stats(fplog, j, fcd.disres.nres, &(top.idef.il[F_DISRES]),
+                   top.idef.iparams, &dr, isize, index,
+                   bPDB ? atoms.get() : nullptr);
         if (bPDB)
         {
             write_sto_conf(opt2fn("-q", NFILE, fnm),
                            "Coloured by average violation in Angstrom",
-                           atoms, xav, nullptr, ir->ePBC, box);
+                           atoms.get(), xav, nullptr, ir->ePBC, box);
         }
         dump_disre_matrix(opt2fn_null("-x", NFILE, fnm), &dr, fcd.disres.nres,
-                          j, &top->idef, &mtop, max_dr, nlevels, bThird);
+                          j, &top.idef, topInfo.mtop(), max_dr, nlevels, bThird);
         xvgrclose(out);
         xvgrclose(aver);
         xvgrclose(numv);
diff --git a/src/gromacs/gmxana/gmx_dyndom.cpp b/src/gromacs/gmxana/gmx_dyndom.cpp
deleted file mode 100644 (file)
index 55219d8..0000000
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * This file is part of the GROMACS molecular simulation package.
- *
- * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
- * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, 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.
- */
-#include "gmxpre.h"
-
-#include <cmath>
-
-#include "gromacs/commandline/pargs.h"
-#include "gromacs/fileio/confio.h"
-#include "gromacs/fileio/trxio.h"
-#include "gromacs/gmxana/gmx_ana.h"
-#include "gromacs/math/3dtransforms.h"
-#include "gromacs/math/units.h"
-#include "gromacs/math/vec.h"
-#include "gromacs/topology/atoms.h"
-#include "gromacs/topology/index.h"
-#include "gromacs/topology/topology.h"
-#include "gromacs/utility/arraysize.h"
-#include "gromacs/utility/fatalerror.h"
-#include "gromacs/utility/smalloc.h"
-
-static void rot_conf(t_atoms *atoms, const rvec x[], const rvec v[], real trans, real angle,
-                     rvec head, rvec tail, int isize, const int index[],
-                     rvec xout[], rvec vout[])
-{
-    rvec     arrow, xcm;
-    real     theta, phi, arrow_len;
-    mat4     Rx, Ry, Rz, Rinvy, Rinvz, Mtot;
-    mat4     temp1, temp2, temp3;
-    vec4     xv;
-    int      i, ai;
-
-    rvec_sub(tail, head, arrow);
-    arrow_len = norm(arrow);
-    if (debug)
-    {
-        fprintf(debug, "Arrow vector:   %10.4f  %10.4f  %10.4f\n",
-                arrow[XX], arrow[YY], arrow[ZZ]);
-        fprintf(debug, "Effective translation %g nm\n", trans);
-    }
-    if (arrow_len == 0.0)
-    {
-        gmx_fatal(FARGS, "Arrow vector not given");
-    }
-
-    /* Copy all aoms to output */
-    for (i = 0; (i < atoms->nr); i++)
-    {
-        copy_rvec(x[i], xout[i]);
-        copy_rvec(v[i], vout[i]);
-    }
-
-    /* Compute center of mass and move atoms there */
-    clear_rvec(xcm);
-    for (i = 0; (i < isize); i++)
-    {
-        rvec_inc(xcm, x[index[i]]);
-    }
-    for (i = 0; (i < DIM); i++)
-    {
-        xcm[i] /= isize;
-    }
-    if (debug)
-    {
-        fprintf(debug, "Center of mass: %10.4f  %10.4f  %10.4f\n",
-                xcm[XX], xcm[YY], xcm[ZZ]);
-    }
-    for (i = 0; (i < isize); i++)
-    {
-        rvec_sub(x[index[i]], xcm, xout[index[i]]);
-    }
-
-    /* Compute theta and phi that describe the arrow */
-    theta = std::acos(arrow[ZZ]/arrow_len);
-    phi   = std::atan2(arrow[YY]/arrow_len, arrow[XX]/arrow_len);
-    if (debug)
-    {
-        fprintf(debug, "Phi = %.1f, Theta = %.1f\n", RAD2DEG*phi, RAD2DEG*theta);
-    }
-
-    /* Now the total rotation matrix: */
-    /* Rotate a couple of times */
-    gmx_mat4_init_rotation(ZZ, -phi, Rz);
-    gmx_mat4_init_rotation(YY, M_PI/2-theta, Ry);
-    gmx_mat4_init_rotation(XX, angle*DEG2RAD, Rx);
-    Rx[WW][XX] = trans;
-    gmx_mat4_init_rotation(YY, theta-M_PI/2, Rinvy);
-    gmx_mat4_init_rotation(ZZ, phi, Rinvz);
-
-    gmx_mat4_mmul(temp1, Ry, Rz);
-    gmx_mat4_mmul(temp2, Rinvy, Rx);
-    gmx_mat4_mmul(temp3, temp2, temp1);
-    gmx_mat4_mmul(Mtot, Rinvz, temp3);
-
-    if (debug)
-    {
-        gmx_mat4_print(debug, "Rz", Rz);
-        gmx_mat4_print(debug, "Ry", Ry);
-        gmx_mat4_print(debug, "Rx", Rx);
-        gmx_mat4_print(debug, "Rinvy", Rinvy);
-        gmx_mat4_print(debug, "Rinvz", Rinvz);
-        gmx_mat4_print(debug, "Mtot", Mtot);
-    }
-
-    for (i = 0; (i < isize); i++)
-    {
-        ai = index[i];
-        gmx_mat4_transform_point(Mtot, xout[ai], xv);
-        rvec_add(xv, xcm, xout[ai]);
-        gmx_mat4_transform_point(Mtot, v[ai], xv);
-        copy_rvec(xv, vout[ai]);
-    }
-}
-
-int gmx_dyndom(int argc, char *argv[])
-{
-    const char       *desc[] = {
-        "[THISMODULE] reads a [REF].pdb[ref] file output from DynDom",
-        "(http://www.cmp.uea.ac.uk/dyndom/).",
-        "It reads the coordinates, the coordinates of the rotation axis,",
-        "and an index file containing the domains.",
-        "Furthermore, it takes the first and last atom of the arrow file",
-        "as command line arguments (head and tail) and",
-        "finally it takes the translation vector (given in DynDom info file)",
-        "and the angle of rotation (also as command line arguments). If the angle",
-        "determined by DynDom is given, one should be able to recover the",
-        "second structure used for generating the DynDom output.",
-        "Because of limited numerical accuracy this should be verified by",
-        "computing an all-atom RMSD (using [gmx-confrms]) rather than by file",
-        "comparison (using diff).[PAR]",
-        "The purpose of this program is to interpolate and extrapolate the",
-        "rotation as found by DynDom. As a result unphysical structures with",
-        "long or short bonds, or overlapping atoms may be produced. Visual",
-        "inspection, and energy minimization may be necessary to",
-        "validate the structure."
-    };
-    static real       trans0 = 0;
-    static rvec       head   = { 0, 0, 0 };
-    static rvec       tail   = { 0, 0, 0 };
-    static real       angle0 = 0, angle1 = 0, maxangle = 0;
-    static int        label  = 0, nframes = 11;
-    t_pargs           pa[]   = {
-        { "-firstangle",    FALSE, etREAL, {&angle0},
-          "Angle of rotation about rotation vector" },
-        { "-lastangle",    FALSE, etREAL, {&angle1},
-          "Angle of rotation about rotation vector" },
-        { "-nframe",   FALSE, etINT,  {&nframes},
-          "Number of steps on the pathway" },
-        { "-maxangle", FALSE, etREAL, {&maxangle},
-          "DymDom dtermined angle of rotation about rotation vector" },
-        { "-trans",    FALSE, etREAL, {&trans0},
-          "Translation (Angstrom) along rotation vector (see DynDom info file)" },
-        { "-head",     FALSE, etRVEC, {head},
-          "First atom of the arrow vector" },
-        { "-tail",     FALSE, etRVEC, {tail},
-          "Last atom of the arrow vector" }
-    };
-    int               i, j, natoms, isize;
-    t_trxstatus      *status;
-    int              *index = nullptr, *index_all;
-    char             *grpname;
-    real              angle, trans;
-    rvec             *x, *v, *xout, *vout;
-    matrix            box;
-    gmx_output_env_t *oenv;
-
-    t_filenm          fnm[] = {
-        { efPDB, "-f", "dyndom",  ffREAD },
-        { efTRO, "-o", "rotated", ffWRITE },
-        { efNDX, "-n", "domains", ffREAD }
-    };
-#define NFILE asize(fnm)
-
-    if (!parse_common_args(&argc, argv, 0, NFILE, fnm, asize(pa), pa,
-                           asize(desc), desc, 0, nullptr, &oenv))
-    {
-        return 0;
-    }
-
-    if (maxangle == 0)
-    {
-        gmx_fatal(FARGS, "maxangle not given");
-    }
-
-    t_topology *top;
-    snew(top, 1);
-    read_tps_conf(opt2fn("-f", NFILE, fnm), top, nullptr, &x, &v, box, FALSE);
-    t_atoms  &atoms = top->atoms;
-    if (atoms.pdbinfo == nullptr)
-    {
-        snew(atoms.pdbinfo, atoms.nr);
-    }
-    atoms.havePdbInfo = TRUE;
-    natoms            = atoms.nr;
-    snew(xout, natoms);
-    snew(vout, natoms);
-
-    printf("Select group to rotate:\n");
-    rd_index(ftp2fn(efNDX, NFILE, fnm), 1, &isize, &index, &grpname);
-    printf("Going to rotate %s containing %d atoms\n", grpname, isize);
-
-    snew(index_all, atoms.nr);
-    for (i = 0; (i < atoms.nr); i++)
-    {
-        index_all[i] = i;
-    }
-
-    status = open_trx(opt2fn("-o", NFILE, fnm), "w");
-
-    label = 'A';
-    for (i = 0; (i < nframes); i++, label++)
-    {
-        angle = angle0 + (i*(angle1-angle0))/(nframes-1);
-        trans = trans0*0.1*angle/maxangle;
-        printf("Frame: %2d (label %c), angle: %8.3f deg., trans: %8.3f nm\n",
-               i, label, angle, trans);
-        rot_conf(&atoms, x, v, trans, angle, head, tail, isize, index, xout, vout);
-
-        if (label > 'Z')
-        {
-            label -= 26;
-        }
-        for (j = 0; (j < atoms.nr); j++)
-        {
-            atoms.resinfo[atoms.atom[j].resind].chainid = label;
-        }
-
-        write_trx(status, atoms.nr, index_all, &atoms, i, angle, box, xout, vout, nullptr);
-    }
-    close_trx(status);
-
-    return 0;
-}
index 9ce1732513998f81d27c582046e1bf5767c00a1c..52cd5148f0fbe05c0ce5c177348c2599b7302df5 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -593,7 +593,17 @@ static void dist_plot(const char *fn, const char *afile, const char *dfile,
         xvgrclose(res);
     }
 
-    sfree(x0);
+    if (x0)
+    {
+        sfree(x0);
+    }
+
+    int freeLeg = bMat ? (ng == 1 ? 1 : (ng*(ng-1))/2)  : ng - 1;
+    for (int i = 0; i < freeLeg; i++)
+    {
+        sfree(leg[i]);
+    }
+    sfree(leg);
 }
 
 static int find_residues(const t_atoms *atoms, int n, const int index[], int **resindex)
@@ -667,11 +677,11 @@ int gmx_mindist(int argc, char *argv[])
         "Also [gmx-distance] and [gmx-pairdist] calculate distances."
     };
 
-    static gmx_bool   bMat             = FALSE, bPI = FALSE, bSplit = FALSE, bMax = FALSE, bPBC = TRUE;
-    static gmx_bool   bGroup           = FALSE;
-    static real       rcutoff          = 0.6;
-    static int        ng               = 1;
-    static gmx_bool   bEachResEachTime = FALSE, bPrintResName = FALSE;
+    gmx_bool          bMat             = FALSE, bPI = FALSE, bSplit = FALSE, bMax = FALSE, bPBC = TRUE;
+    gmx_bool          bGroup           = FALSE;
+    real              rcutoff          = 0.6;
+    int               ng               = 1;
+    gmx_bool          bEachResEachTime = FALSE, bPrintResName = FALSE;
     t_pargs           pa[]             = {
         { "-matrix", FALSE, etBOOL, {&bMat},
           "Calculate half a matrix of group-group distances" },
@@ -697,7 +707,7 @@ int gmx_mindist(int argc, char *argv[])
     gmx_output_env_t *oenv;
     t_topology       *top  = nullptr;
     int               ePBC = -1;
-    rvec             *x;
+    rvec             *x    = nullptr;
     matrix            box;
     gmx_bool          bTop = FALSE;
 
@@ -823,5 +833,17 @@ int gmx_mindist(int argc, char *argv[])
         do_view(oenv, numfnm, "-nxy");
     }
 
+    output_env_done(oenv);
+    done_top(top);
+    for (int i = 0; i < ng; i++)
+    {
+        sfree(index[i]);
+    }
+    sfree(index);
+    sfree(gnx);
+    sfree(x);
+    sfree(grpname);
+    sfree(top);
+
     return 0;
 }
diff --git a/src/gromacs/gmxana/gmx_morph.cpp b/src/gromacs/gmxana/gmx_morph.cpp
deleted file mode 100644 (file)
index 20618e0..0000000
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * This file is part of the GROMACS molecular simulation package.
- *
- * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
- * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017, 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.
- */
-#include "gmxpre.h"
-
-#include "gromacs/commandline/pargs.h"
-#include "gromacs/commandline/viewit.h"
-#include "gromacs/fileio/confio.h"
-#include "gromacs/fileio/trxio.h"
-#include "gromacs/fileio/xvgr.h"
-#include "gromacs/gmxana/gmx_ana.h"
-#include "gromacs/math/do_fit.h"
-#include "gromacs/topology/atoms.h"
-#include "gromacs/topology/index.h"
-#include "gromacs/topology/topology.h"
-#include "gromacs/utility/arraysize.h"
-#include "gromacs/utility/cstringutil.h"
-#include "gromacs/utility/fatalerror.h"
-#include "gromacs/utility/smalloc.h"
-
-static real dointerp(int n, rvec x1[], rvec x2[], rvec xx[],
-                     int I, int N, real first, real last)
-{
-    int    i, j;
-    double fac, fac0, fac1;
-
-    fac  = first + (I*(last-first))/(N-1);
-    fac0 = 1-fac;
-    fac1 = fac;
-    for (i = 0; (i < n); i++)
-    {
-        for (j = 0; (j < DIM); j++)
-        {
-            xx[i][j] = fac0*x1[i][j] + fac1*x2[i][j];
-        }
-    }
-
-    return fac;
-}
-
-int gmx_morph(int argc, char *argv[])
-{
-    const char       *desc[] = {
-        "[THISMODULE] does a linear interpolation of conformations in order to",
-        "create intermediates. Of course these are completely unphysical, but",
-        "that you may try to justify yourself. Output is in the form of a ",
-        "generic trajectory. The number of intermediates can be controlled with",
-        "the [TT]-ninterm[tt] flag. The first and last flag correspond to the way of",
-        "interpolating: 0 corresponds to input structure 1 while",
-        "1 corresponds to input structure 2.",
-        "If you specify [TT]-first[tt] < 0 or [TT]-last[tt] > 1 extrapolation will be",
-        "on the path from input structure x[SUB]1[sub] to x[SUB]2[sub]. In general, the coordinates",
-        "of the intermediate x(i) out of N total intermediates correspond to:[PAR]",
-        "x(i) = x[SUB]1[sub] + (first+(i/(N-1))*(last-first))*(x[SUB]2[sub]-x[SUB]1[sub])[PAR]",
-        "Finally the RMSD with respect to both input structures can be computed",
-        "if explicitly selected ([TT]-or[tt] option). In that case, an index file may be",
-        "read to select the group from which the RMS is computed."
-    };
-    t_filenm          fnm[] = {
-        { efSTX, "-f1", "conf1",  ffREAD },
-        { efSTX, "-f2", "conf2",  ffREAD },
-        { efTRX, "-o",  "interm", ffWRITE },
-        { efXVG, "-or", "rms-interm", ffOPTWR },
-        { efNDX, "-n",  "index",  ffOPTRD }
-    };
-#define NFILE asize(fnm)
-    static  int       ninterm = 11;
-    static  real      first   = 0.0;
-    static  real      last    = 1.0;
-    static  gmx_bool  bFit    = TRUE;
-    t_pargs           pa []   = {
-        { "-ninterm", FALSE, etINT,  {&ninterm},
-          "Number of intermediates" },
-        { "-first",   FALSE, etREAL, {&first},
-          "Corresponds to first generated structure (0 is input x[SUB]1[sub], see above)" },
-        { "-last",    FALSE, etREAL, {&last},
-          "Corresponds to last generated structure (1 is input x[SUB]2[sub], see above)" },
-        { "-fit",     FALSE, etBOOL, {&bFit},
-          "Do a least squares fit of the second to the first structure before interpolating" }
-    };
-    const char       *leg[] = { "Ref = 1\\Sst\\N conf", "Ref = 2\\Snd\\N conf" };
-    FILE             *fp    = nullptr;
-    int               i, isize, is_lsq, nat1, nat2;
-    t_trxstatus      *status;
-    int              *index, *index_lsq, *index_all, *dummy;
-    rvec             *x1, *x2, *xx;
-    matrix            box;
-    real              rms1, rms2, fac, *mass;
-    char             *grpname;
-    gmx_bool          bRMS;
-    gmx_output_env_t *oenv;
-
-    if (!parse_common_args(&argc, argv, PCA_CAN_VIEW,
-                           NFILE, fnm, asize(pa), pa, asize(desc), desc,
-                           0, nullptr, &oenv))
-    {
-        return 0;
-    }
-
-    t_topology *top;
-    snew(top, 1);
-    read_tps_conf(opt2fn("-f1", NFILE, fnm), top, nullptr, &x1, nullptr, box, FALSE);
-    nat1 = top->atoms.nr;
-    read_tps_conf(opt2fn("-f2", NFILE, fnm), top, nullptr, &x2, nullptr, box, FALSE);
-    nat2 = top->atoms.nr;
-    if (nat1 != nat2)
-    {
-        gmx_fatal(FARGS, "Number of atoms in first structure is %d, in second %d",
-                  nat1, nat2);
-    }
-    snew(xx, nat1);
-    t_atoms  &atoms = top->atoms;
-
-    snew(mass, nat1);
-    snew(index_all, nat1);
-    for (i = 0; (i < nat1); i++)
-    {
-        mass[i]      = 1;
-        index_all[i] = i;
-    }
-    if (bFit)
-    {
-        printf("Select group for LSQ superposition:\n");
-        get_index(&atoms, opt2fn_null("-n", NFILE, fnm), 1, &is_lsq, &index_lsq,
-                  &grpname);
-        reset_x(is_lsq, index_lsq, nat1, index_all, x1, mass);
-        reset_x(is_lsq, index_lsq, nat1, index_all, x2, mass);
-        do_fit(nat1, mass, x1, x2);
-    }
-
-    bRMS = opt2bSet("-or", NFILE, fnm);
-    if (bRMS)
-    {
-        fp = xvgropen(opt2fn("-or", NFILE, fnm), "RMSD", "Conf", "(nm)", oenv);
-        xvgr_legend(fp, asize(leg), leg, oenv);
-        printf("Select group for RMSD calculation:\n");
-        get_index(&atoms, opt2fn_null("-n", NFILE, fnm), 1, &isize, &index, &grpname);
-        printf("You selected group %s, containing %d atoms\n", grpname, isize);
-        rms1 = rmsdev_ind(isize, index, mass, x1, x2);
-        fprintf(stderr, "RMSD between input conformations is %g nm\n", rms1);
-    }
-
-    snew(dummy, nat1);
-    for (i = 0; (i < nat1); i++)
-    {
-        dummy[i] = i;
-    }
-    status = open_trx(ftp2fn(efTRX, NFILE, fnm), "w");
-
-    for (i = 0; (i < ninterm); i++)
-    {
-        fac = dointerp(nat1, x1, x2, xx, i, ninterm, first, last);
-        write_trx(status, nat1, dummy, &atoms, i, fac, box, xx, nullptr, nullptr);
-        if (bRMS)
-        {
-            rms1 = rmsdev_ind(isize, index, mass, x1, xx);
-            rms2 = rmsdev_ind(isize, index, mass, x2, xx);
-            fprintf(fp, "%10g  %10g  %10g\n", fac, rms1, rms2);
-        }
-    }
-
-    close_trx(status);
-
-    if (bRMS)
-    {
-        xvgrclose(fp);
-        do_view(oenv, opt2fn("-or", NFILE, fnm), "-nxy");
-    }
-
-    return 0;
-}
index ec7feb678f3c5790602819a41d4160b14025df60..8cbd28a23ee918de0913931d91a131e79b96a0be 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -41,6 +41,7 @@
 
 #include "gromacs/commandline/pargs.h"
 #include "gromacs/commandline/viewit.h"
+#include "gromacs/compat/make_unique.h"
 #include "gromacs/fileio/confio.h"
 #include "gromacs/fileio/trxio.h"
 #include "gromacs/fileio/xvgr.h"
@@ -49,6 +50,7 @@
 #include "gromacs/math/functions.h"
 #include "gromacs/math/utilities.h"
 #include "gromacs/math/vec.h"
+#include "gromacs/math/vectypes.h"
 #include "gromacs/pbcutil/rmpbc.h"
 #include "gromacs/statistics/statistics.h"
 #include "gromacs/topology/index.h"
@@ -59,7 +61,7 @@
 #include "gromacs/utility/gmxassert.h"
 #include "gromacs/utility/smalloc.h"
 
-#define FACTOR  1000.0  /* Convert nm^2/ps to 10e-5 cm^2/s */
+static constexpr double diffusionConversionFactor =  1000.0;  /* Convert nm^2/ps to 10e-5 cm^2/s */
 /* NORMAL = total diffusion coefficient (default). X,Y,Z is diffusion
    coefficient in X,Y,Z direction. LATERAL is diffusion coefficient in
    plane perpendicular to axis
@@ -68,108 +70,105 @@ typedef enum {
     NOT_USED, NORMAL, X, Y, Z, LATERAL
 } msd_type;
 
-typedef struct {
-    real          t0;         /* start time and time increment between  */
-    real          delta_t;    /* time between restart points */
-    real          beginfit,   /* the begin/end time for fits as reals between */
-                  endfit;     /* 0 and 1 */
-    real          dim_factor; /* the dimensionality factor for the diffusion
-                                 constant */
-    real        **data;       /* the displacement data. First index is the group
-                                 number, second is frame number */
-    real         *time;       /* frame time */
-    real         *mass;       /* masses for mass-weighted msd */
-    matrix      **datam;
-    rvec        **x0;         /* original positions */
-    rvec         *com;        /* center of mass correction for each frame */
-    gmx_stats_t **lsq;        /* fitting stats for individual molecule msds */
-    msd_type      type;       /* the type of msd to calculate (lateral, etc.)*/
-    int           axis;       /* the axis along which to calculate */
-    int           ncoords;
-    int           nrestart;   /* number of restart points */
-    int           nmol;       /* number of molecules (for bMol) */
-    int           nframes;    /* number of frames */
-    int           nlast;
-    int           ngrp;       /* number of groups to use for msd calculation */
-    int          *n_offs;
-    int         **ndata;      /* the number of msds (particles/mols) per data
-                                 point. */
-} t_corr;
-
-typedef real t_calc_func (t_corr *curr, int nx, const int index[], int nx0, rvec xc[],
-                          const rvec dcom, gmx_bool bTen, matrix mat);
-
-static real thistime(t_corr *curr)
-{
-    return curr->time[curr->nframes];
-}
-
-static int in_data(t_corr *curr, int nx00)
-{
-    return curr->nframes-curr->n_offs[nx00];
-}
-
-static t_corr *init_corr(int nrgrp, int type, int axis, real dim_factor,
-                         int nmol, gmx_bool bTen, gmx_bool bMass, real dt, const t_topology *top,
-                         real beginfit, real endfit)
-{
-    t_corr  *curr;
-    int      i;
-
-    snew(curr, 1);
-    curr->type       = static_cast<msd_type>(type);
-    curr->axis       = axis;
-    curr->ngrp       = nrgrp;
-    curr->nrestart   = 0;
-    curr->delta_t    = dt;
-    curr->beginfit   = (1 - 2*GMX_REAL_EPS)*beginfit;
-    curr->endfit     = (1 + 2*GMX_REAL_EPS)*endfit;
-    curr->x0         = nullptr;
-    curr->n_offs     = nullptr;
-    curr->nframes    = 0;
-    curr->nlast      = 0;
-    curr->dim_factor = dim_factor;
-
-    snew(curr->ndata, nrgrp);
-    snew(curr->data, nrgrp);
-    if (bTen)
+// TODO : Group related fields into a struct
+struct t_corr {
+    real                                         t0;         /* start time and time increment between  */
+    real                                         delta_t;    /* time between restart points */
+    real                                         beginfit,   /* the begin/end time for fits as reals between */
+                                                 endfit;     /* 0 and 1 */
+    real                                         dim_factor; /* the dimensionality factor for the diffusion
+                                                                constant */
+    std::vector< std::vector<real> >             data;       /* the displacement data. First index is the group
+                                                                number, second is frame number */
+    std::vector<real>                            time;       /* frame time */
+    std::vector<real>                            mass;       /* masses for mass-weighted msd */
+    matrix                                     **datam;
+    std::vector< std::vector<gmx::RVec> >        x0;         /* original positions */
+    std::vector<gmx::RVec>                       com;        /* center of mass correction for each frame */
+    gmx_stats_t                                **lsq;        /* fitting stats for individual molecule msds */
+    msd_type                                     type;       /* the type of msd to calculate (lateral, etc.)*/
+    int                                          axis;       /* the axis along which to calculate */
+    int                                          ncoords;
+    int                                          nrestart;   /* number of restart points */
+    int                                          nmol;       /* number of molecules (for bMol) */
+    int                                          nframes;    /* number of frames */
+    int                                          nlast;
+    int                                          ngrp;       /* number of groups to use for msd calculation */
+    std::vector<int>                             n_offs;
+    std::vector< std::vector<int> >              ndata;      /* the number of msds (particles/mols) per data
+                                                                point. */
+    t_corr(int nrgrp, int type, int axis, real dim_factor, int nrmol,
+           gmx_bool bTen, gmx_bool bMass, real dt, const t_topology *top,
+           real beginfit, real endfit) :
+        t0(0),
+        delta_t(dt),
+        beginfit((1 - 2*GMX_REAL_EPS)*beginfit),
+        endfit((1 + 2*GMX_REAL_EPS)*endfit),
+        dim_factor(dim_factor),
+        data(nrgrp, std::vector<real>()),
+        datam(nullptr),
+        lsq(nullptr),
+        type(static_cast<msd_type>(type)),
+        axis(axis),
+        ncoords(0),
+        nrestart(0),
+        nmol(nrmol),
+        nframes(0),
+        nlast(0),
+        ngrp(nrgrp),
+        ndata(nrgrp, std::vector<int>())
     {
-        snew(curr->datam, nrgrp);
-    }
-    for (i = 0; (i < nrgrp); i++)
-    {
-        curr->ndata[i] = nullptr;
-        curr->data[i]  = nullptr;
+
         if (bTen)
         {
-            curr->datam[i] = nullptr;
+            snew(datam, nrgrp);
+            for (int i = 0; i < nrgrp; i++)
+            {
+                datam[i] = nullptr;
+            }
         }
-    }
-    curr->time = nullptr;
-    curr->lsq  = nullptr;
-    curr->nmol = nmol;
-    if (curr->nmol > 0)
-    {
-        snew(curr->mass, curr->nmol);
-        for (i = 0; i < curr->nmol; i++)
+
+        if (nmol > 0)
         {
-            curr->mass[i] = 1;
+            mass.resize(nmol, 1);
+        }
+        else
+        {
+            if (bMass)
+            {
+                const t_atoms *atoms = &top->atoms;
+                mass.resize(atoms->nr);
+                for (int i = 0; (i < atoms->nr); i++)
+                {
+                    mass[i] = atoms->atom[i].m;
+                }
+            }
         }
     }
-    else
+    ~t_corr()
     {
-        if (bMass)
+        for (int i = 0; i < nrestart; i++)
         {
-            const t_atoms *atoms = &top->atoms;
-            snew(curr->mass, atoms->nr);
-            for (i = 0; (i < atoms->nr); i++)
+            for (int j = 0; j < nmol; j++)
             {
-                curr->mass[i] = atoms->atom[i].m;
+                gmx_stats_free(lsq[i][j]);
             }
         }
+        sfree(lsq);
     }
+};
+
+typedef real t_calc_func (t_corr *curr, int nx, const int index[], int nx0, rvec xc[],
+                          const rvec dcom, gmx_bool bTen, matrix mat);
 
-    return curr;
+static real thistime(t_corr *curr)
+{
+    return curr->time[curr->nframes];
+}
+
+static int in_data(t_corr *curr, int nx00)
+{
+    return curr->nframes-curr->n_offs[nx00];
 }
 
 static void corr_print(t_corr *curr, gmx_bool bTen, const char *fn, const char *title,
@@ -230,7 +229,7 @@ static void calc_corr(t_corr *curr, int nr, int nx, int index[], rvec xc[],
     {
         if ((thistime(curr) >= (curr->nlast*curr->delta_t)) && (nr == 0))
         {
-            std::memcpy(curr->x0[curr->nlast], xc, curr->ncoords*sizeof(xc[0]));
+            std::memcpy(curr->x0[curr->nlast].data()->as_vec(), xc, curr->ncoords*sizeof(xc[0]));
             curr->n_offs[curr->nlast] = curr->nframes;
             copy_rvec(com, curr->com[curr->nlast]);
             curr->nlast++;
@@ -264,7 +263,7 @@ static void calc_corr(t_corr *curr, int nr, int nx, int index[], rvec xc[],
     }
 }
 
-/* the non-mass-weighted mean-squared displacement calcuation */
+/* the non-mass-weighted mean-squared displacement calculation */
 static real calc1_norm(t_corr *curr, int nx, const int index[], int nx0, rvec xc[],
                        const rvec dcom, gmx_bool bTen, matrix mat)
 {
@@ -548,7 +547,6 @@ static void printmol(t_corr *curr, const char *fn,
                      const char *fn_pdb, const int *molindex, const t_topology *top,
                      rvec *x, int ePBC, matrix box, const gmx_output_env_t *oenv)
 {
-#define NDIST 100
     FILE       *out;
     gmx_stats_t lsq1;
     int         i, j;
@@ -556,7 +554,7 @@ static void printmol(t_corr *curr, const char *fn,
     t_pdbinfo  *pdbinfo = nullptr;
     const int  *mol2a   = nullptr;
 
-    out = xvgropen(fn, "Diffusion Coefficients / Molecule", "Molecule", "D", oenv);
+    out = xvgropen(fn, "Diffusion Coefficients / Molecule", "Molecule", "D (1e-5 cm^2/s)", oenv);
 
     if (fn_pdb)
     {
@@ -580,7 +578,7 @@ static void printmol(t_corr *curr, const char *fn,
         }
         gmx_stats_get_ab(lsq1, elsqWEIGHT_NONE, &a, &b, nullptr, nullptr, nullptr, nullptr);
         gmx_stats_free(lsq1);
-        D     = a*FACTOR/curr->dim_factor;
+        D     = a*diffusionConversionFactor/curr->dim_factor;
         if (D < 0)
         {
             D   = 0;
@@ -637,7 +635,7 @@ static void printmol(t_corr *curr, const char *fn,
  */
 static int corr_loop(t_corr *curr, const char *fn, const t_topology *top, int ePBC,
                      gmx_bool bMol, int gnx[], int *index[],
-                     t_calc_func *calc1, gmx_bool bTen, int *gnx_com, int *index_com[],
+                     t_calc_func *calc1, gmx_bool bTen, gmx::ArrayRef<const int> gnx_com, int *index_com[],
                      real dt, real t_pdb, rvec **x_pdb, matrix box_pdb,
                      const gmx_output_env_t *oenv)
 {
@@ -656,7 +654,7 @@ static int corr_loop(t_corr *curr, const char *fn, const t_topology *top, int eP
 #ifdef DEBUG
     fprintf(stderr, "Read %d atoms for first frame\n", natoms);
 #endif
-    if ((gnx_com != nullptr) && natoms < top->atoms.nr)
+    if ((!gnx_com.empty()) && natoms < top->atoms.nr)
     {
         fprintf(stderr, "WARNING: The trajectory only contains part of the system (%d of %d atoms) and therefore the COM motion of only this part of the system will be removed\n", natoms, top->atoms.nr);
     }
@@ -665,7 +663,7 @@ static int corr_loop(t_corr *curr, const char *fn, const t_topology *top, int eP
 
     // if com is requested, the data structure needs to be large enough to do this
     // to prevent overflow
-    if (bMol && !gnx_com)
+    if (bMol && gnx_com.empty())
     {
         curr->ncoords = curr->nmol;
         snew(xa[0], curr->ncoords);
@@ -715,10 +713,10 @@ static int corr_loop(t_corr *curr, const char *fn, const t_topology *top, int eP
         {
             curr->nrestart++;
 
-            srenew(curr->x0, curr->nrestart);
-            snew(curr->x0[curr->nrestart-1], curr->ncoords);
-            srenew(curr->com, curr->nrestart);
-            srenew(curr->n_offs, curr->nrestart);
+            curr->x0.resize(curr->nrestart);
+            curr->x0[curr->nrestart-1].resize(curr->ncoords);
+            curr->com.resize(curr->nrestart);
+            curr->n_offs.resize(curr->nrestart);
             srenew(curr->lsq, curr->nrestart);
             snew(curr->lsq[curr->nrestart-1], curr->nmol);
             for (i = 0; i < curr->nmol; i++)
@@ -739,20 +737,17 @@ static int corr_loop(t_corr *curr, const char *fn, const t_topology *top, int eP
             {
                 for (i = 0; (i < curr->ngrp); i++)
                 {
-                    curr->ndata[i] = nullptr;
-                    curr->data[i]  = nullptr;
                     if (bTen)
                     {
                         curr->datam[i] = nullptr;
                     }
                 }
-                curr->time = nullptr;
             }
             maxframes += 10;
             for (i = 0; (i < curr->ngrp); i++)
             {
-                srenew(curr->ndata[i], maxframes);
-                srenew(curr->data[i], maxframes);
+                curr->ndata[i].resize(maxframes);
+                curr->data[i].resize(maxframes);
                 if (bTen)
                 {
                     srenew(curr->datam[i], maxframes);
@@ -767,7 +762,7 @@ static int corr_loop(t_corr *curr, const char *fn, const t_topology *top, int eP
                     }
                 }
             }
-            srenew(curr->time, maxframes);
+            curr->time.resize(maxframes);
         }
 
         /* set the time */
@@ -802,7 +797,7 @@ static int corr_loop(t_corr *curr, const char *fn, const t_topology *top, int eP
         }
 
         /* calculate the center of mass */
-        if (gnx_com)
+        if (!gnx_com.empty())
         {
             calc_com(bMol, gnx_com[0], index_com[0], xa[cur], xa[prev], box,
                      &top->atoms, com);
@@ -812,7 +807,7 @@ static int corr_loop(t_corr *curr, const char *fn, const t_topology *top, int eP
         for (i = 0; (i < curr->ngrp); i++)
         {
             /* calculate something useful, like mean square displacements */
-            calc_corr(curr, i, gnx[i], index[i], xa[cur], (gnx_com != nullptr), com,
+            calc_corr(curr, i, gnx[i], index[i], xa[cur], (!gnx_com.empty()), com,
                       calc1, bTen);
         }
         cur    = prev;
@@ -878,33 +873,33 @@ static void do_corr(const char *trx_file, const char *ndx_file, const char *msd_
                     int type, real dim_factor, int axis,
                     real dt, real beginfit, real endfit, const gmx_output_env_t *oenv)
 {
-    t_corr        *msd;
-    int           *gnx;   /* the selected groups' sizes */
-    int          **index; /* selected groups' indices */
-    char         **grpname;
-    int            i, i0, i1, j, N, nat_trx;
-    real          *DD, *SigmaD, a, a2, b, r, chi2;
-    rvec          *x = nullptr;
-    matrix         box;
-    int           *gnx_com     = nullptr; /* the COM removal group size  */
-    int          **index_com   = nullptr; /* the COM removal group atom indices */
-    char         **grpname_com = nullptr; /* the COM removal group name */
-
-    snew(gnx, nrgrp);
+    std::unique_ptr<t_corr> msd;
+    std::vector<int>        gnx, gnx_com; /* the selected groups' sizes */
+    int                   **index;        /* selected groups' indices */
+    char                  **grpname;
+    int                     i, i0, i1, j, N, nat_trx;
+    std::vector<real>       SigmaD, DD;
+    real                    a, a2, b, r, chi2;
+    rvec                   *x = nullptr;
+    matrix                  box;
+    int                   **index_com   = nullptr; /* the COM removal group atom indices */
+    char                  **grpname_com = nullptr; /* the COM removal group name */
+
+    gnx.resize(nrgrp);
     snew(index, nrgrp);
     snew(grpname, nrgrp);
 
     fprintf(stderr, "\nSelect a group to calculate mean squared displacement for:\n");
-    get_index(&top->atoms, ndx_file, nrgrp, gnx, index, grpname);
+    get_index(&top->atoms, ndx_file, nrgrp, gnx.data(), index, grpname);
 
     if (bRmCOMM)
     {
-        snew(gnx_com, 1);
+        gnx_com.resize(1);
         snew(index_com, 1);
         snew(grpname_com, 1);
 
         fprintf(stderr, "\nNow select a group for center of mass removal:\n");
-        get_index(&top->atoms, ndx_file, 1, gnx_com, index_com, grpname_com);
+        get_index(&top->atoms, ndx_file, 1, gnx_com.data(), index_com, grpname_com);
     }
 
     if (mol_file)
@@ -912,12 +907,12 @@ static void do_corr(const char *trx_file, const char *ndx_file, const char *msd_
         index_atom2mol(&gnx[0], index[0], &top->mols);
     }
 
-    msd = init_corr(nrgrp, type, axis, dim_factor,
-                    mol_file == nullptr ? 0 : gnx[0], bTen, bMW, dt, top,
-                    beginfit, endfit);
+    msd = gmx::compat::make_unique<t_corr>(nrgrp, type, axis, dim_factor,
+                                           mol_file == nullptr ? 0 : gnx[0],
+                                           bTen, bMW, dt, top, beginfit, endfit);
 
     nat_trx =
-        corr_loop(msd, trx_file, top, ePBC, mol_file ? gnx[0] != 0 : false, gnx, index,
+        corr_loop(msd.get(), trx_file, top, ePBC, mol_file ? gnx[0] != 0 : false, gnx.data(), index,
                   (mol_file != nullptr) ? calc1_mol : (bMW ? calc1_mw : calc1_norm),
                   bTen, gnx_com, index_com, dt, t_pdb,
                   pdb_file ? &x : nullptr, box, oenv);
@@ -948,13 +943,10 @@ static void do_corr(const char *trx_file, const char *ndx_file, const char *msd_
         {
             snew(top->atoms.pdbinfo, top->atoms.nr);
         }
-        printmol(msd, mol_file, pdb_file, index[0], top, x, ePBC, box, oenv);
+        printmol(msd.get(), mol_file, pdb_file, index[0], top, x, ePBC, box, oenv);
         top->atoms.nr = i;
     }
 
-    DD     = nullptr;
-    SigmaD = nullptr;
-
     if (beginfit == -1)
     {
         i0       = gmx::roundToInt(0.1*(msd->nframes - 1));
@@ -991,8 +983,8 @@ static void do_corr(const char *trx_file, const char *ndx_file, const char *msd_
     }
     else
     {
-        snew(DD, msd->ngrp);
-        snew(SigmaD, msd->ngrp);
+        DD.resize(msd->ngrp);
+        SigmaD.resize(msd->ngrp);
         for (j = 0; j < msd->ngrp; j++)
         {
             if (N >= 4)
@@ -1006,8 +998,8 @@ static void do_corr(const char *trx_file, const char *ndx_file, const char *msd_
                 SigmaD[j] = 0;
             }
             lsq_y_ax_b(N, &(msd->time[i0]), &(msd->data[j][i0]), &(DD[j]), &b, &r, &chi2);
-            DD[j]     *= FACTOR/msd->dim_factor;
-            SigmaD[j] *= FACTOR/msd->dim_factor;
+            DD[j]     *= diffusionConversionFactor/msd->dim_factor;
+            SigmaD[j] *= diffusionConversionFactor/msd->dim_factor;
             if (DD[j] > 0.01 && DD[j] < 1e4)
             {
                 fprintf(stdout, "D[%10s] %.4f (+/- %.4f) 1e-5 cm^2/s\n",
@@ -1021,10 +1013,10 @@ static void do_corr(const char *trx_file, const char *ndx_file, const char *msd_
         }
     }
     /* Print mean square displacement */
-    corr_print(msd, bTen, msd_file,
+    corr_print(msd.get(), bTen, msd_file,
                "Mean Square Displacement",
                "MSD (nm\\S2\\N)",
-               msd->time[msd->nframes-1], beginfit, endfit, DD, SigmaD, grpname, oenv);
+               msd->time[msd->nframes-1], beginfit, endfit, DD.data(), SigmaD.data(), grpname, oenv);
 }
 
 int gmx_msd(int argc, char *argv[])
@@ -1204,6 +1196,7 @@ int gmx_msd(int argc, char *argv[])
             &top, ePBC, bTen, bMW, bRmCOMM, type, dim_factor, axis, dt, beginfit, endfit,
             oenv);
 
+    done_top(&top);
     view_all(oenv, NFILE, fnm);
 
     return 0;
index b8f15180e4bf6415862817ff1b8209b509e2bc4a..36035cf6801d0163553eb15ca848c24fb49426a7 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -62,6 +62,7 @@
 #include "gromacs/topology/mtop_lookup.h"
 #include "gromacs/topology/mtop_util.h"
 #include "gromacs/topology/topology.h"
+#include "gromacs/trajectoryanalysis/topologyinformation.h"
 #include "gromacs/utility/arraysize.h"
 #include "gromacs/utility/cstringutil.h"
 #include "gromacs/utility/fatalerror.h"
@@ -198,25 +199,17 @@ static void get_orires_parms(const char *topnm, t_inputrec *ir,
     done_top_mtop(&top, &mtop);
 }
 
-static int get_bounds(const char *topnm,
-                      real **bounds, int **index, int **dr_pair, int *npairs,
-                      gmx_mtop_t *mtop, gmx_localtop_t **ltop, t_inputrec *ir)
+static int get_bounds(real **bounds, int **index, int **dr_pair, int *npairs,
+                      gmx_localtop_t *top)
 {
-    gmx_localtop_t *top;
     t_functype     *functype;
     t_iparams      *ip;
-    int             natoms, i, j, k, type, ftype, natom;
+    int             i, j, k, type, ftype, natom;
     t_ilist        *disres;
     t_iatom        *iatom;
     real           *b;
     int            *ind, *pair;
     int             nb, label1;
-    matrix          box;
-
-    read_tpx(topnm, ir, box, &natoms, nullptr, nullptr, mtop);
-    snew(*ltop, 1);
-    top   = gmx_mtop_generate_local_top(mtop, ir->efep != efepNO);
-    *ltop = top;
 
     functype = top->idef.functype;
     ip       = top->idef.iparams;
@@ -423,32 +416,31 @@ int gmx_nmr(int argc, char *argv[])
     };
 
     FILE              /* *out     = NULL,*/ *out_disre = nullptr, *fp_pairs = nullptr, *fort = nullptr, *fodt = nullptr, *foten = nullptr;
-    ener_file_t        fp;
-    int                timecheck = 0;
-    gmx_mtop_t         mtop;
-    gmx_localtop_t    *top = nullptr;
-    gmx_enxnm_t       *enm = nullptr;
-    t_enxframe         fr;
-    int                nre, teller, teller_disre;
-    int                nor     = 0, nex = 0, norfr = 0, enx_i = 0;
-    real              *bounds  = nullptr, *violaver = nullptr, *oobs = nullptr, *orient = nullptr, *odrms = nullptr;
-    int               *index   = nullptr, *pair = nullptr, norsel = 0, *orsel = nullptr, *or_label = nullptr;
-    int                nbounds = 0, npairs;
-    gmx_bool           bDisRe, bDRAll, bORA, bORT, bODA, bODR, bODT, bORIRE, bOTEN;
-    gmx_bool           bCont;
-    double             sumaver, sumt;
-    int               *set     = nullptr, i, j, k, nset, sss;
-    char             **pairleg, **odtleg, **otenleg;
-    char             **leg = nullptr;
-    const char        *anm_j, *anm_k, *resnm_j, *resnm_k;
-    int                resnr_j, resnr_k;
-    const char        *orinst_sub = "@ subtitle \"instantaneous\"\n";
-    char               buf[256];
-    gmx_output_env_t  *oenv;
-    t_enxblock        *blk_disre = nullptr;
-    int                ndisre    = 0;
-
-    t_filenm           fnm[] = {
+    ener_file_t       fp;
+    int               timecheck = 0;
+    gmx_localtop_t    top;
+    gmx_enxnm_t      *enm = nullptr;
+    t_enxframe        fr;
+    int               nre, teller, teller_disre;
+    int               nor     = 0, nex = 0, norfr = 0, enx_i = 0;
+    real             *bounds  = nullptr, *violaver = nullptr, *oobs = nullptr, *orient = nullptr, *odrms = nullptr;
+    int              *index   = nullptr, *pair = nullptr, norsel = 0, *orsel = nullptr, *or_label = nullptr;
+    int               nbounds = 0, npairs;
+    gmx_bool          bDisRe, bDRAll, bORA, bORT, bODA, bODR, bODT, bORIRE, bOTEN;
+    gmx_bool          bCont;
+    double            sumaver, sumt;
+    int              *set     = nullptr, i, j, k, nset, sss;
+    char            **pairleg, **odtleg, **otenleg;
+    char            **leg = nullptr;
+    const char       *anm_j, *anm_k, *resnm_j, *resnm_k;
+    int               resnr_j, resnr_k;
+    const char       *orinst_sub = "@ subtitle \"instantaneous\"\n";
+    char              buf[256];
+    gmx_output_env_t *oenv;
+    t_enxblock       *blk_disre = nullptr;
+    int               ndisre    = 0;
+
+    t_filenm                                 fnm[] = {
         { efEDR, "-f",    nullptr,      ffREAD  },
         { efEDR, "-f2",   nullptr,      ffOPTRD },
         { efTPR, "-s",    nullptr,      ffOPTRD },
@@ -463,7 +455,7 @@ int gmx_nmr(int argc, char *argv[])
         { efXVG, "-oten", "oriten",  ffOPTWR }
     };
 #define NFILE asize(fnm)
-    int                npargs;
+    int                                      npargs;
 
     npargs = asize(pa);
     if (!parse_common_args(&argc, argv,
@@ -493,10 +485,10 @@ int gmx_nmr(int argc, char *argv[])
     do_enxnms(fp, &nre, &enm);
     free_enxnms(nre, enm);
 
-    t_inputrec  irInstance;
-    t_inputrec *ir = &irInstance;
+    t_inputrec               irInstance;
+    t_inputrec              *ir = &irInstance;
     init_enxframe(&fr);
-
+    gmx::TopologyInformation topInfo;
     if (!bDisRe)
     {
         if (bORIRE || bOTEN)
@@ -637,8 +629,12 @@ int gmx_nmr(int argc, char *argv[])
     }
     else
     {
-        nbounds = get_bounds(ftp2fn(efTPR, NFILE, fnm), &bounds, &index, &pair, &npairs,
-                             &mtop, &top, ir);
+        {
+            topInfo.fillFromInputFile(ftp2fn(efTPR, NFILE, fnm));
+            gmx_mtop_generate_local_top(*topInfo.mtop(), &top, ir->efep != efepNO);
+        }
+        nbounds = get_bounds(&bounds, &index, &pair, &npairs,
+                             &top);
         snew(violaver, npairs);
         out_disre = xvgropen(opt2fn("-o", NFILE, fnm), "Sum of Violations",
                              "Time (ps)", "nm", oenv);
@@ -685,8 +681,8 @@ int gmx_nmr(int argc, char *argv[])
                 t_iatom   *fa;
                 t_iparams *ip;
 
-                fa = top->idef.il[F_DISRES].iatoms;
-                ip = top->idef.iparams;
+                fa = top.idef.il[F_DISRES].iatoms;
+                ip = top.idef.iparams;
                 if (blk_disre->nsub != 2 ||
                     (blk_disre->sub[0].nr != blk_disre->sub[1].nr) )
                 {
@@ -694,10 +690,10 @@ int gmx_nmr(int argc, char *argv[])
                 }
 
                 ndisre = blk_disre->sub[0].nr;
-                if (ndisre != top->idef.il[F_DISRES].nr/3)
+                if (ndisre != top.idef.il[F_DISRES].nr/3)
                 {
                     gmx_fatal(FARGS, "Number of disre pairs in the energy file (%d) does not match the number in the run input file (%d)\n",
-                              ndisre, top->idef.il[F_DISRES].nr/3);
+                              ndisre, top.idef.il[F_DISRES].nr/3);
                 }
                 snew(pairleg, ndisre);
                 int molb = 0;
@@ -706,8 +702,8 @@ int gmx_nmr(int argc, char *argv[])
                     snew(pairleg[i], 30);
                     j = fa[3*i+1];
                     k = fa[3*i+2];
-                    mtopGetAtomAndResidueName(&mtop, j, &molb, &anm_j, &resnr_j, &resnm_j, nullptr);
-                    mtopGetAtomAndResidueName(&mtop, k, &molb, &anm_k, &resnr_k, &resnm_k, nullptr);
+                    mtopGetAtomAndResidueName(topInfo.mtop(), j, &molb, &anm_j, &resnr_j, &resnm_j, nullptr);
+                    mtopGetAtomAndResidueName(topInfo.mtop(), k, &molb, &anm_k, &resnr_k, &resnm_k, nullptr);
                     sprintf(pairleg[i], "%d %s %d %s (%d)",
                             resnr_j, anm_j, resnr_k, anm_k,
                             ip[fa[3*i]].disres.label);
index 5a5524085425e8f83587705ae75f5fa4a413d9d7..c621f00736c6fb2d03aa404afc6c4b114cf46c64 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2018,2019, 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.
@@ -801,9 +801,7 @@ static void create_info(t_inputinfo *info)
  */
 static int prepare_x_q(real *q[], rvec *x[], const gmx_mtop_t *mtop, const rvec x_orig[], t_commrec *cr)
 {
-    int                     i;
     int                     nq; /* number of charged particles */
-    gmx_mtop_atomloop_all_t aloop;
 
 
     if (MASTER(cr))
@@ -812,13 +810,13 @@ static int prepare_x_q(real *q[], rvec *x[], const gmx_mtop_t *mtop, const rvec
         snew(*x, mtop->natoms);
         nq = 0;
 
-        aloop = gmx_mtop_atomloop_all_init(mtop);
-        const t_atom *atom;
-        while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
+        for (const AtomProxy &atomP : AtomRange(*mtop))
         {
-            if (is_charge(atom->q))
+            const t_atom &local = atomP.atom();
+            int           i     = atomP.globalAtomNumber();
+            if (is_charge(local.q))
             {
-                (*q)[nq]     = atom->q;
+                (*q)[nq]     = local.q;
                 (*x)[nq][XX] = x_orig[i][XX];
                 (*x)[nq][YY] = x_orig[i][YY];
                 (*x)[nq][ZZ] = x_orig[i][ZZ];
index 43b80836a0de0716c7b719a6dd97dddd281d8e23..7abb9717bc047dad489eb12f3abc36d4e6574a93 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2018,2019, 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.
@@ -41,7 +41,7 @@
 #include "gromacs/topology/index.h"
 
 struct gmx_output_env_t;
-struct gmx_residuetype_t;
+class ResidueType;
 
 /* must correspond with 'leg' g_chi.c:727 */
 enum {
@@ -220,7 +220,7 @@ gmx_bool has_dihedral(int Dih, t_dlist *dl);
 t_dlist *mk_dlist(FILE *log,
                   const t_atoms *atoms, int *nlist,
                   gmx_bool bPhi, gmx_bool bPsi, gmx_bool bChi, gmx_bool bHChi,
-                  int maxchi, int r0, struct gmx_residuetype_t *rt);
+                  int maxchi, int r0, ResidueType *rt);
 
 void pr_dlist(FILE *fp, int nl, t_dlist dl[], real dt,  int printtype,
               gmx_bool bPhi, gmx_bool bPsi, gmx_bool bChi, gmx_bool bOmega, int maxchi);
index e8db2e4fc21cdc001bdcbbc935b7d53ce339abb8..4738db4f77206b9f01356c5788caa20bfd38a63f 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+# Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -39,6 +39,7 @@ gmx_add_gtest_executable(
     entropy.cpp
     gmx_traj.cpp
     gmx_trjconv.cpp
+    gmx_mindist.cpp
     gmx_msd.cpp
     )
 gmx_register_gtest_test(GmxAnaTest ${exename} INTEGRATION_TEST)
diff --git a/src/gromacs/gmxana/tests/gmx_mindist.cpp b/src/gromacs/gmxana/tests/gmx_mindist.cpp
new file mode 100644 (file)
index 0000000..b2e5459
--- /dev/null
@@ -0,0 +1,209 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2019, 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
+ * Tests for gmx mindist.
+ *
+ * \author Kevin Boyd <kevin.boyd@uconn.edu>
+ */
+
+#include "gmxpre.h"
+
+#include <cstdio>
+#include <cstdlib>
+
+#include "gromacs/gmxana/gmx_ana.h"
+#include "gromacs/utility/futil.h"
+#include "gromacs/utility/path.h"
+#include "gromacs/utility/textreader.h"
+
+#include "testutils/cmdlinetest.h"
+#include "testutils/refdata.h"
+#include "testutils/stdiohelper.h"
+#include "testutils/testfilemanager.h"
+#include "testutils/textblockmatchers.h"
+#include "testutils/xvgtest.h"
+
+namespace
+{
+
+using gmx::test::CommandLine;
+using gmx::test::XvgMatch;
+using gmx::test::StdioTestHelper;
+
+class MindistTest : public gmx::test::CommandLineTestBase
+{
+    public:
+        MindistTest()
+        {
+            setInputFile("-f", "mindist_coords.gro");
+            setInputFile("-s", "mindist_coords.gro");
+            setInputFile("-n", "mindist.ndx");
+        }
+
+        void runTest(const CommandLine &args, const char * stringForStdin)
+        {
+            StdioTestHelper stdioHelper(&fileManager());
+            stdioHelper.redirectStringToStdin(stringForStdin);
+
+            CommandLine &cmdline = commandLine();
+            cmdline.merge(args);
+            ASSERT_EQ(0, gmx_mindist(cmdline.argc(), cmdline.argv()));
+            checkOutputFiles();
+        }
+};
+
+/* mindist_coords.pdb has 3 beads spaced out in a 5 nm box, with the same yz coordinates
+ * and x coordinates of 1, 4, and 4.5. Indices are as follows
+ * index 0 : atom 1
+ * index 1 : atom 2
+ * index 2 : atom 3
+ * index 3 : atoms (1 ,2)
+ * index 4 : atoms (2, 3)
+ * index 5 : atoms (1, 2, 3)
+ */
+
+// Mindist between beads 0 and 1 should = 2 (across periodic boundaries)
+TEST_F(MindistTest, mindistWorksWithSingleAtoms)
+{
+    setOutputFile("-od", "mindist.xvg", XvgMatch());
+    const char *const  cmdline[] = {
+        "mindist"
+    };
+    const char * const stdIn = "0 1";
+    runTest(CommandLine(cmdline), stdIn);
+}
+
+// Mindist between group (0, 1) and bead 2 should = 0.5
+TEST_F(MindistTest, mindistWorksWithMultipleAtoms)
+{
+    setOutputFile("-od", "mindist.xvg", XvgMatch());
+    const char *const  cmdline[] = {
+        "mindist"
+    };
+    const char * const stdIn = "2 3";
+    runTest(CommandLine(cmdline), stdIn);
+}
+
+/* Should have 0 contacts with default cutoff */
+TEST_F(MindistTest, mindistDoesNotPickUpContacts)
+{
+    setOutputFile("-on", "ncontacts.xvg", XvgMatch());
+    const char * const cmdline[] = {
+        "mindist"
+    };
+    const char * const stdIn = "0 1";
+    runTest(CommandLine(cmdline), stdIn);
+}
+
+/* Should pick up one contact with 2.5 nm cutoff */
+TEST_F(MindistTest, mindistPicksUpContacts)
+{
+    setOutputFile("-on", "ncontacts.xvg", XvgMatch());
+    const char *const  cmdline[] = {
+        "mindist", "-d", "2.5",
+    };
+    const char * const stdIn = "0 1";
+    runTest(CommandLine(cmdline), stdIn);
+}
+
+TEST_F(MindistTest, ngWorks)
+{
+    setOutputFile("-od", "mindist.xvg", XvgMatch());
+    const char *const  cmdline[] = {
+        "mindist", "-ng", "2",
+    };
+    const char * const stdIn = "0 1 2";
+    runTest(CommandLine(cmdline), stdIn);
+}
+
+// 2 contacts within this cutoff, but only one should be reported
+TEST_F(MindistTest, groupWorks)
+{
+    setOutputFile("-on", "ncontacts.xvg", XvgMatch());
+    const char *const  cmdline[] = {
+        "mindist", "-group", "-d", "3"
+    };
+    const char * const stdIn = "3, 2";
+    runTest(CommandLine(cmdline), stdIn);
+}
+
+// Maximum distance between group (1, 2) and atom 3
+TEST_F(MindistTest, maxDistWorks)
+{
+    setOutputFile("-od", "mindist.xvg", XvgMatch());
+    const char *const  cmdline[] = {
+        "mindist", "-max"
+    };
+    const char * const stdIn = "2 3";
+    runTest(CommandLine(cmdline), stdIn);
+}
+
+/* Particles 1 and 2 are 2 nm away through pbc, but
+   should be 3 nm away with no pbc */
+TEST_F(MindistTest, noPbcWorks)
+{
+    setOutputFile("-od", "mindist.xvg", XvgMatch());
+    const char *const  cmdline[] = {
+        "mindist", "-nopbc"
+    };
+    const char * const stdIn = "0 1";
+    runTest(CommandLine(cmdline), stdIn);
+}
+
+// Group (1, 2), each res compared to particle 3
+TEST_F(MindistTest, resPerTimeWorks)
+{
+    setOutputFile("-or", "respertime.xvg", XvgMatch());
+    const char *const  cmdline[] = {
+        "mindist", "-respertime"
+    };
+    const char * const stdIn = "3 2";
+    runTest(CommandLine(cmdline), stdIn);
+}
+
+TEST_F(MindistTest, matrixWorks)
+{
+    setOutputFile("-od", "mindist.xvg", XvgMatch());
+    const char *const  cmdline[] = {
+        "mindist", "-matrix"
+    };
+    const char * const stdIn = "5";
+    runTest(CommandLine(cmdline), stdIn);
+}
+
+// TODO test periodic image - needs a tpr?
+
+} //namespace
index 43e85be8836d5ebe27fbf3a3dbca7f3617f4488e..6a21280fded1f715c0d3c8d98b358df977885fc8 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2018, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019, 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.
 
 #include "gmxpre.h"
 
+#include <cstdio>
+#include <cstdlib>
+
 #include "gromacs/gmxana/gmx_ana.h"
+#include "gromacs/gmxpreprocess/grompp.h"
 #include "gromacs/utility/futil.h"
+#include "gromacs/utility/path.h"
 #include "gromacs/utility/textreader.h"
 
 #include "testutils/cmdlinetest.h"
@@ -77,6 +82,59 @@ class MsdTest : public gmx::test::CommandLineTestBase
         }
 };
 
+class MsdMolTest : public gmx::test::CommandLineTestBase
+{
+    public:
+        MsdMolTest()
+        {
+            double    tolerance = 1e-5;
+            XvgMatch  xvg;
+            XvgMatch &toler     = xvg.tolerance(gmx::test::relativeToleranceAsFloatingPoint(1, tolerance));
+            setOutputFile("-mol", "msdmol.xvg", toler);
+        }
+
+        void runTest(const CommandLine &args, const char *ndxfile,
+                     const std::string &simulationName)
+        {
+            setInputFile("-f", simulationName + ".pdb");
+            std::string tpr = fileManager().getTemporaryFilePath(".tpr");
+            std::string mdp = fileManager().getTemporaryFilePath(".mdp");
+            FILE       *fp  = fopen(mdp.c_str(), "w");
+            fprintf(fp, "cutoff-scheme = verlet\n");
+            fprintf(fp, "rcoulomb      = 0.85\n");
+            fprintf(fp, "rvdw          = 0.85\n");
+            fprintf(fp, "rlist         = 0.85\n");
+            fclose(fp);
+
+            // Prepare a .tpr file
+            {
+                CommandLine caller;
+                auto        simDB = gmx::test::TestFileManager::getTestSimulationDatabaseDirectory();
+                auto        base  = gmx::Path::join(simDB, simulationName);
+                caller.append("grompp");
+                caller.addOption("-maxwarn", 0);
+                caller.addOption("-f", mdp.c_str());
+                std::string gro = (base + ".pdb");
+                caller.addOption("-c", gro.c_str());
+                std::string top = (base + ".top");
+                caller.addOption("-p", top.c_str());
+                std::string ndx = (base + ".ndx");
+                caller.addOption("-n", ndx.c_str());
+                caller.addOption("-o", tpr.c_str());
+                ASSERT_EQ(0, gmx_grompp(caller.argc(), caller.argv()));
+            }
+            // Run the MSD analysis
+            {
+                setInputFile("-n", ndxfile);
+                CommandLine &cmdline = commandLine();
+                cmdline.merge(args);
+                cmdline.addOption("-s", tpr.c_str());
+                ASSERT_EQ(0, gmx_msd(cmdline.argc(), cmdline.argv()));
+                checkOutputFiles();
+            }
+        }
+};
+
 /* msd_traj.xtc contains a 10 frame (1 ps per frame) simulation
  * containing 3 atoms, with different starting positions but identical
  * displacements. The displacements are calculated to yield the following
@@ -113,4 +171,32 @@ TEST_F(MsdTest, oneDimensionalDiffusion)
     };
     runTest(CommandLine(cmdline));
 }
+
+// Test the diffusion per molecule output, mass weighted
+TEST_F(MsdMolTest, diffMolMassWeighted)
+{
+    const char *const cmdline[] = {
+        "msd", "-trestart", "200"
+    };
+    runTest(CommandLine(cmdline), "spc5.ndx", "spc5");
+}
+
+// Test the diffusion per molecule output, non-mass weighted
+TEST_F(MsdMolTest, diffMolNonMassWeighted)
+{
+    const char *const cmdline[] = {
+        "msd", "-trestart", "200", "-mw", "no"
+    };
+    runTest(CommandLine(cmdline), "spc5.ndx", "spc5");
+}
+
+// Test the diffusion per molecule output, with selection
+TEST_F(MsdMolTest, diffMolSelected)
+{
+    const char *const cmdline[] = {
+        "msd", "-trestart", "200"
+    };
+    runTest(CommandLine(cmdline), "spc5_3.ndx", "spc5");
+}
+
 } //namespace
diff --git a/src/gromacs/gmxana/tests/refdata/MindistTest_groupWorks.xml b/src/gromacs/gmxana/tests/refdata/MindistTest_groupWorks.xml
new file mode 100644 (file)
index 0000000..9082586
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <OutputFiles Name="Files">
+    <File Name="-on">
+      <XvgLegend Name="Legend">
+        <String Name="XvgLegend"><![CDATA[
+title "Number of Contacts < 3 nm"
+xaxis  label "Time (ps)"
+yaxis  label "Number"
+TYPE xy
+s0 legend "atoms12-atom3"
+]]></String>
+      </XvgLegend>
+      <XvgData Name="Data">
+        <Sequence Name="Row0">
+          <Int Name="Length">2</Int>
+          <Real>0.000000e+00</Real>
+          <Real>1</Real>
+        </Sequence>
+      </XvgData>
+    </File>
+  </OutputFiles>
+</ReferenceData>
diff --git a/src/gromacs/gmxana/tests/refdata/MindistTest_matrixWorks.xml b/src/gromacs/gmxana/tests/refdata/MindistTest_matrixWorks.xml
new file mode 100644 (file)
index 0000000..26f206f
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <OutputFiles Name="Files">
+    <File Name="-od">
+      <XvgLegend Name="Legend">
+        <String Name="XvgLegend"><![CDATA[
+title "Minimum Distance"
+xaxis  label "Time (ps)"
+yaxis  label "Distance (nm)"
+TYPE xy
+s0 legend "atoms123-atoms123"
+s1 legend "atoms123-atoms123"
+s2 legend "atoms123-atoms123"
+]]></String>
+      </XvgLegend>
+      <XvgData Name="Data">
+        <Sequence Name="Row0">
+          <Int Name="Length">4</Int>
+          <Real>0.000000e+00</Real>
+          <Real>2.000000e+00</Real>
+          <Real>1.500000e+00</Real>
+          <Real>5.000000e-01</Real>
+        </Sequence>
+      </XvgData>
+    </File>
+  </OutputFiles>
+</ReferenceData>
diff --git a/src/gromacs/gmxana/tests/refdata/MindistTest_maxDistWorks.xml b/src/gromacs/gmxana/tests/refdata/MindistTest_maxDistWorks.xml
new file mode 100644 (file)
index 0000000..b697a2b
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <OutputFiles Name="Files">
+    <File Name="-od">
+      <XvgLegend Name="Legend">
+        <String Name="XvgLegend"><![CDATA[
+title "Maximum Distance"
+xaxis  label "Time (ps)"
+yaxis  label "Distance (nm)"
+TYPE xy
+s0 legend "atom3-atoms12"
+]]></String>
+      </XvgLegend>
+      <XvgData Name="Data">
+        <Sequence Name="Row0">
+          <Int Name="Length">2</Int>
+          <Real>0.000000e+00</Real>
+          <Real>1.500000e+00</Real>
+        </Sequence>
+      </XvgData>
+    </File>
+  </OutputFiles>
+</ReferenceData>
diff --git a/src/gromacs/gmxana/tests/refdata/MindistTest_mindistDoesNotPickUpContacts.xml b/src/gromacs/gmxana/tests/refdata/MindistTest_mindistDoesNotPickUpContacts.xml
new file mode 100644 (file)
index 0000000..4a3dd3b
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <OutputFiles Name="Files">
+    <File Name="-on">
+      <XvgLegend Name="Legend">
+        <String Name="XvgLegend"><![CDATA[
+title "Number of Contacts < 0.6 nm"
+xaxis  label "Time (ps)"
+yaxis  label "Number"
+TYPE xy
+s0 legend "atom1-atom2"
+]]></String>
+      </XvgLegend>
+      <XvgData Name="Data">
+        <Sequence Name="Row0">
+          <Int Name="Length">2</Int>
+          <Real>0.000000e+00</Real>
+          <Real>0</Real>
+        </Sequence>
+      </XvgData>
+    </File>
+  </OutputFiles>
+</ReferenceData>
diff --git a/src/gromacs/gmxana/tests/refdata/MindistTest_mindistPicksUpContacts.xml b/src/gromacs/gmxana/tests/refdata/MindistTest_mindistPicksUpContacts.xml
new file mode 100644 (file)
index 0000000..3716b7c
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <OutputFiles Name="Files">
+    <File Name="-on">
+      <XvgLegend Name="Legend">
+        <String Name="XvgLegend"><![CDATA[
+title "Number of Contacts < 2.5 nm"
+xaxis  label "Time (ps)"
+yaxis  label "Number"
+TYPE xy
+s0 legend "atom1-atom2"
+]]></String>
+      </XvgLegend>
+      <XvgData Name="Data">
+        <Sequence Name="Row0">
+          <Int Name="Length">2</Int>
+          <Real>0.000000e+00</Real>
+          <Real>1</Real>
+        </Sequence>
+      </XvgData>
+    </File>
+  </OutputFiles>
+</ReferenceData>
diff --git a/src/gromacs/gmxana/tests/refdata/MindistTest_mindistWorksWithMultipleAtoms.xml b/src/gromacs/gmxana/tests/refdata/MindistTest_mindistWorksWithMultipleAtoms.xml
new file mode 100644 (file)
index 0000000..7b1c5cf
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <OutputFiles Name="Files">
+    <File Name="-od">
+      <XvgLegend Name="Legend">
+        <String Name="XvgLegend"><![CDATA[
+title "Minimum Distance"
+xaxis  label "Time (ps)"
+yaxis  label "Distance (nm)"
+TYPE xy
+s0 legend "atom3-atoms12"
+]]></String>
+      </XvgLegend>
+      <XvgData Name="Data">
+        <Sequence Name="Row0">
+          <Int Name="Length">2</Int>
+          <Real>0.000000e+00</Real>
+          <Real>5.000000e-01</Real>
+        </Sequence>
+      </XvgData>
+    </File>
+  </OutputFiles>
+</ReferenceData>
diff --git a/src/gromacs/gmxana/tests/refdata/MindistTest_mindistWorksWithSingleAtoms.xml b/src/gromacs/gmxana/tests/refdata/MindistTest_mindistWorksWithSingleAtoms.xml
new file mode 100644 (file)
index 0000000..4e9a41d
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <OutputFiles Name="Files">
+    <File Name="-od">
+      <XvgLegend Name="Legend">
+        <String Name="XvgLegend"><![CDATA[
+title "Minimum Distance"
+xaxis  label "Time (ps)"
+yaxis  label "Distance (nm)"
+TYPE xy
+s0 legend "atom1-atom2"
+]]></String>
+      </XvgLegend>
+      <XvgData Name="Data">
+        <Sequence Name="Row0">
+          <Int Name="Length">2</Int>
+          <Real>0.000000e+00</Real>
+          <Real>2.000000e+00</Real>
+        </Sequence>
+      </XvgData>
+    </File>
+  </OutputFiles>
+</ReferenceData>
diff --git a/src/gromacs/gmxana/tests/refdata/MindistTest_ngWorks.xml b/src/gromacs/gmxana/tests/refdata/MindistTest_ngWorks.xml
new file mode 100644 (file)
index 0000000..29b3c08
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <OutputFiles Name="Files">
+    <File Name="-od">
+      <XvgLegend Name="Legend">
+        <String Name="XvgLegend"><![CDATA[
+title "Minimum Distance"
+xaxis  label "Time (ps)"
+yaxis  label "Distance (nm)"
+TYPE xy
+s0 legend "atom1-atom2"
+s1 legend "atom1-atom3"
+]]></String>
+      </XvgLegend>
+      <XvgData Name="Data">
+        <Sequence Name="Row0">
+          <Int Name="Length">3</Int>
+          <Real>0.000000e+00</Real>
+          <Real>2.000000e+00</Real>
+          <Real>1.500000e+00</Real>
+        </Sequence>
+      </XvgData>
+    </File>
+  </OutputFiles>
+</ReferenceData>
diff --git a/src/gromacs/gmxana/tests/refdata/MindistTest_noPbcWorks.xml b/src/gromacs/gmxana/tests/refdata/MindistTest_noPbcWorks.xml
new file mode 100644 (file)
index 0000000..f9cbb06
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <OutputFiles Name="Files">
+    <File Name="-od">
+      <XvgLegend Name="Legend">
+        <String Name="XvgLegend"><![CDATA[
+title "Minimum Distance"
+xaxis  label "Time (ps)"
+yaxis  label "Distance (nm)"
+TYPE xy
+s0 legend "atom1-atom2"
+]]></String>
+      </XvgLegend>
+      <XvgData Name="Data">
+        <Sequence Name="Row0">
+          <Int Name="Length">2</Int>
+          <Real>0.000000e+00</Real>
+          <Real>3.000000e+00</Real>
+        </Sequence>
+      </XvgData>
+    </File>
+  </OutputFiles>
+</ReferenceData>
diff --git a/src/gromacs/gmxana/tests/refdata/MindistTest_resPerTimeWorks.xml b/src/gromacs/gmxana/tests/refdata/MindistTest_resPerTimeWorks.xml
new file mode 100644 (file)
index 0000000..eeeab60
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <OutputFiles Name="Files">
+    <File Name="-or">
+      <XvgLegend Name="Legend">
+        <String Name="XvgLegend"><![CDATA[
+title "Minimum Distance"
+xaxis  label "Time (ps)"
+yaxis  label "Distance (nm)"
+TYPE xy
+s0 legend "atoms12-atom3"
+]]></String>
+      </XvgLegend>
+      <XvgData Name="Data">
+        <Sequence Name="Row0">
+          <Int Name="Length">3</Int>
+          <Real>0.000000e+00</Real>
+          <Real>1.5</Real>
+          <Real>0.5</Real>
+        </Sequence>
+      </XvgData>
+    </File>
+  </OutputFiles>
+</ReferenceData>
diff --git a/src/gromacs/gmxana/tests/refdata/MsdMolTest_diffMolMassWeighted.xml b/src/gromacs/gmxana/tests/refdata/MsdMolTest_diffMolMassWeighted.xml
new file mode 100644 (file)
index 0000000..9f4b165
--- /dev/null
@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <OutputFiles Name="Files">
+    <File Name="-mol">
+      <XvgLegend Name="Legend">
+        <String Name="XvgLegend"><![CDATA[
+title "Diffusion Coefficients / Molecule"
+xaxis  label "Molecule"
+yaxis  label "D (1e-5 cm^2/s)"
+TYPE xy
+]]></String>
+      </XvgLegend>
+      <XvgData Name="Data">
+        <Sequence Name="Row0">
+          <Int Name="Length">2</Int>
+          <Real>0</Real>
+          <Real>0.747088</Real>
+        </Sequence>
+        <Sequence Name="Row1">
+          <Int Name="Length">2</Int>
+          <Real>1</Real>
+          <Real>0.129497</Real>
+        </Sequence>
+        <Sequence Name="Row2">
+          <Int Name="Length">2</Int>
+          <Real>2</Real>
+          <Real>1.00167</Real>
+        </Sequence>
+        <Sequence Name="Row3">
+          <Int Name="Length">2</Int>
+          <Real>3</Real>
+          <Real>21.2013</Real>
+        </Sequence>
+        <Sequence Name="Row4">
+          <Int Name="Length">2</Int>
+          <Real>4</Real>
+          <Real>9.28605</Real>
+        </Sequence>
+      </XvgData>
+    </File>
+  </OutputFiles>
+</ReferenceData>
diff --git a/src/gromacs/gmxana/tests/refdata/MsdMolTest_diffMolNonMassWeighted.xml b/src/gromacs/gmxana/tests/refdata/MsdMolTest_diffMolNonMassWeighted.xml
new file mode 100644 (file)
index 0000000..9f4b165
--- /dev/null
@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <OutputFiles Name="Files">
+    <File Name="-mol">
+      <XvgLegend Name="Legend">
+        <String Name="XvgLegend"><![CDATA[
+title "Diffusion Coefficients / Molecule"
+xaxis  label "Molecule"
+yaxis  label "D (1e-5 cm^2/s)"
+TYPE xy
+]]></String>
+      </XvgLegend>
+      <XvgData Name="Data">
+        <Sequence Name="Row0">
+          <Int Name="Length">2</Int>
+          <Real>0</Real>
+          <Real>0.747088</Real>
+        </Sequence>
+        <Sequence Name="Row1">
+          <Int Name="Length">2</Int>
+          <Real>1</Real>
+          <Real>0.129497</Real>
+        </Sequence>
+        <Sequence Name="Row2">
+          <Int Name="Length">2</Int>
+          <Real>2</Real>
+          <Real>1.00167</Real>
+        </Sequence>
+        <Sequence Name="Row3">
+          <Int Name="Length">2</Int>
+          <Real>3</Real>
+          <Real>21.2013</Real>
+        </Sequence>
+        <Sequence Name="Row4">
+          <Int Name="Length">2</Int>
+          <Real>4</Real>
+          <Real>9.28605</Real>
+        </Sequence>
+      </XvgData>
+    </File>
+  </OutputFiles>
+</ReferenceData>
diff --git a/src/gromacs/gmxana/tests/refdata/MsdMolTest_diffMolSelected.xml b/src/gromacs/gmxana/tests/refdata/MsdMolTest_diffMolSelected.xml
new file mode 100644 (file)
index 0000000..4c05484
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <OutputFiles Name="Files">
+    <File Name="-mol">
+      <XvgLegend Name="Legend">
+        <String Name="XvgLegend"><![CDATA[
+title "Diffusion Coefficients / Molecule"
+xaxis  label "Molecule"
+yaxis  label "D (1e-5 cm^2/s)"
+TYPE xy
+]]></String>
+      </XvgLegend>
+      <XvgData Name="Data">
+        <Sequence Name="Row0">
+          <Int Name="Length">2</Int>
+          <Real>0</Real>
+          <Real>0.747088</Real>
+        </Sequence>
+        <Sequence Name="Row1">
+          <Int Name="Length">2</Int>
+          <Real>1</Real>
+          <Real>0.129497</Real>
+        </Sequence>
+        <Sequence Name="Row2">
+          <Int Name="Length">2</Int>
+          <Real>2</Real>
+          <Real>21.2013</Real>
+        </Sequence>
+      </XvgData>
+    </File>
+  </OutputFiles>
+</ReferenceData>
index 9276f5a444a83fb0d147ac4baeb28e22a26fbf25..3acd596aca74c9727223d135ba3935d5b35adce5 100644 (file)
@@ -125,12 +125,15 @@ void done_mpi_in_place_buf(mpi_in_place_buf_t *buf)
 
 void done_commrec(t_commrec *cr)
 {
-    if (nullptr != cr->dd)
+    if (MASTER(cr))
     {
-        // TODO: implement
-        // done_domdec(cr->dd);
+        if (nullptr != cr->dd)
+        {
+            // TODO: implement
+            // done_domdec(cr->dd);
+        }
+        done_mpi_in_place_buf(cr->mpb);
     }
-    done_mpi_in_place_buf(cr->mpb);
     sfree(cr);
 }
 
diff --git a/src/gromacs/gmxlib/nonbonded/nb_kernel_c/nb_kernel_allvsall.cpp b/src/gromacs/gmxlib/nonbonded/nb_kernel_c/nb_kernel_allvsall.cpp
deleted file mode 100644 (file)
index 57bd21d..0000000
+++ /dev/null
@@ -1,451 +0,0 @@
-/*
- * This file is part of the GROMACS molecular simulation package.
- *
- * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
- * Copyright (c) 2001-2009, The GROMACS Development Team.
- * Copyright (c) 2013,2014,2015,2017,2018, 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.
- */
-#include "gmxpre.h"
-
-#include "nb_kernel_allvsall.h"
-
-#include "config.h"
-
-#include <cmath>
-
-#include "gromacs/gmxlib/nrnb.h"
-#include "gromacs/math/functions.h"
-#include "gromacs/topology/block.h"
-#include "gromacs/utility/real.h"
-#include "gromacs/utility/smalloc.h"
-
-typedef struct
-{
-    real **    pvdwparam;
-    int *      jindex;
-    int **     exclusion_mask;
-}
-gmx_allvsall_data_t;
-
-static int
-calc_maxoffset(int i, int natoms)
-{
-    int maxoffset;
-
-    if ((natoms % 2) == 1)
-    {
-        /* Odd number of atoms, easy */
-        maxoffset = natoms/2;
-    }
-    else if ((natoms % 4) == 0)
-    {
-        /* Multiple of four is hard */
-        if (i < natoms/2)
-        {
-            if ((i % 2) == 0)
-            {
-                maxoffset = natoms/2;
-            }
-            else
-            {
-                maxoffset = natoms/2-1;
-            }
-        }
-        else
-        {
-            if ((i % 2) == 1)
-            {
-                maxoffset = natoms/2;
-            }
-            else
-            {
-                maxoffset = natoms/2-1;
-            }
-        }
-    }
-    else
-    {
-        /* natoms/2 = odd */
-        if ((i % 2) == 0)
-        {
-            maxoffset = natoms/2;
-        }
-        else
-        {
-            maxoffset = natoms/2-1;
-        }
-    }
-
-    return maxoffset;
-}
-
-
-static void
-setup_exclusions_and_indices(gmx_allvsall_data_t *   aadata,
-                             const t_blocka *        excl,
-                             int                     natoms)
-{
-    int i, j, k, iexcl;
-    int nj0, nj1;
-    int max_offset;
-    int max_excl_offset;
-
-    /* This routine can appear to be a bit complex, but it is mostly book-keeping.
-     * To enable the fast all-vs-all kernel we need to be able to stream through all coordinates
-     * whether they should interact or not.
-     *
-     * To avoid looping over the exclusions, we create a simple mask that is 1 if the interaction
-     * should be present, otherwise 0. Since exclusions typically only occur when i & j are close,
-     * we create a jindex array with three elements per i atom: the starting point, the point to
-     * which we need to check exclusions, and the end point.
-     * This way we only have to allocate a short exclusion mask per i atom.
-     */
-
-    /* Allocate memory for our modified jindex array */
-    snew(aadata->jindex, 3*natoms);
-
-    /* Pointer to lists with exclusion masks */
-    snew(aadata->exclusion_mask, natoms);
-
-    for (i = 0; i < natoms; i++)
-    {
-        /* Start */
-        aadata->jindex[3*i]   = i+1;
-        max_offset            = calc_maxoffset(i, natoms);
-
-        /* Exclusions */
-        nj0   = excl->index[i];
-        nj1   = excl->index[i+1];
-
-        /* first check the max range */
-        max_excl_offset = -1;
-
-        for (j = nj0; j < nj1; j++)
-        {
-            iexcl = excl->a[j];
-
-            k = iexcl - i;
-
-            if (k+natoms <= max_offset)
-            {
-                k += natoms;
-            }
-
-            max_excl_offset = (k > max_excl_offset) ? k : max_excl_offset;
-        }
-
-        max_excl_offset = (max_offset < max_excl_offset) ? max_offset : max_excl_offset;
-
-        aadata->jindex[3*i+1] = i+1+max_excl_offset;
-
-
-        snew(aadata->exclusion_mask[i], max_excl_offset);
-        /* Include everything by default */
-        for (j = 0; j < max_excl_offset; j++)
-        {
-            /* Use all-ones to mark interactions that should be present, compatible with SSE */
-            aadata->exclusion_mask[i][j] = 0xFFFFFFFF;
-        }
-
-        /* Go through exclusions again */
-        for (j = nj0; j < nj1; j++)
-        {
-            iexcl = excl->a[j];
-
-            k = iexcl - i;
-
-            if (k+natoms <= max_offset)
-            {
-                k += natoms;
-            }
-
-            if (k > 0 && k <= max_excl_offset)
-            {
-                /* Excluded, kill it! */
-                aadata->exclusion_mask[i][k-1] = 0;
-            }
-        }
-
-        /* End */
-        aadata->jindex[3*i+2] = i+1+max_offset;
-    }
-}
-
-static void
-setup_aadata(gmx_allvsall_data_t       **  p_aadata,
-             const t_blocka       *        excl,
-             int                           natoms,
-             const int *                   type,
-             int                           ntype,
-             const real *                  pvdwparam)
-{
-    int                  i, j, idx;
-    gmx_allvsall_data_t *aadata;
-    real                *p;
-
-    snew(aadata, 1);
-    *p_aadata = aadata;
-
-    /* Generate vdw params */
-    snew(aadata->pvdwparam, ntype);
-
-    for (i = 0; i < ntype; i++)
-    {
-        snew(aadata->pvdwparam[i], 2*natoms);
-        p = aadata->pvdwparam[i];
-
-        /* Lets keep it simple and use multiple steps - first create temp. c6/c12 arrays */
-        for (j = 0; j < natoms; j++)
-        {
-            idx             = i*ntype+type[j];
-            p[2*j]          = pvdwparam[2*idx];
-            p[2*j+1]        = pvdwparam[2*idx+1];
-        }
-    }
-
-    setup_exclusions_and_indices(aadata, excl, natoms);
-}
-
-
-
-void
-nb_kernel_allvsall(t_nblist gmx_unused *     nlist,
-                   rvec *                    xx,
-                   rvec *                    ff,
-                   struct t_forcerec *       fr,
-                   t_mdatoms *               mdatoms,
-                   nb_kernel_data_t *        kernel_data,
-                   t_nrnb *                  nrnb)
-{
-    gmx_allvsall_data_t *aadata;
-    int                  natoms;
-    int                  ni0, ni1;
-    int                  nj0, nj1, nj2;
-    int                  i, j, k;
-    real           *     charge;
-    int           *      type;
-    real                 facel;
-    real           *     pvdw;
-    int                  ggid;
-    int           *      mask;
-
-    real                 ix, iy, iz, iq;
-    real                 fix, fiy, fiz;
-    real                 jx, jy, jz, qq;
-    real                 dx, dy, dz;
-    real                 tx, ty, tz;
-    real                 rsq, rinv, rinvsq, rinvsix;
-    real                 vcoul, vctot;
-    real                 c6, c12, Vvdw6, Vvdw12, Vvdwtot;
-    real                 fscal;
-    const t_blocka      *excl;
-    real           *     f;
-    real           *     x;
-    real           *     Vvdw;
-    real           *     Vc;
-
-    x                   = xx[0];
-    f                   = ff[0];
-    charge              = mdatoms->chargeA;
-    type                = mdatoms->typeA;
-    facel               = fr->ic->epsfac;
-    natoms              = mdatoms->nr;
-    ni0                 = 0;
-    ni1                 = mdatoms->homenr;
-    aadata              = reinterpret_cast<gmx_allvsall_data_t *>(fr->AllvsAll_work);
-    excl                = kernel_data->exclusions;
-
-    Vc                  = kernel_data->energygrp_elec;
-    Vvdw                = kernel_data->energygrp_vdw;
-
-    if (aadata == nullptr)
-    {
-        setup_aadata(&aadata, excl, natoms, type, fr->ntype, fr->nbfp);
-        fr->AllvsAll_work  = aadata;
-    }
-
-    for (i = ni0; i < ni1; i++)
-    {
-        /* We assume shifts are NOT used for all-vs-all interactions */
-
-        /* Load i atom data */
-        ix                = x[3*i];
-        iy                = x[3*i+1];
-        iz                = x[3*i+2];
-        iq                = facel*charge[i];
-
-        pvdw              = aadata->pvdwparam[type[i]];
-
-        /* Zero the potential energy for this list */
-        Vvdwtot           = 0.0;
-        vctot             = 0.0;
-
-        /* Clear i atom forces */
-        fix               = 0.0;
-        fiy               = 0.0;
-        fiz               = 0.0;
-
-        /* Load limits for loop over neighbors */
-        nj0              = aadata->jindex[3*i];
-        nj1              = aadata->jindex[3*i+1];
-        nj2              = aadata->jindex[3*i+2];
-
-        mask             = aadata->exclusion_mask[i];
-
-        /* Prologue part, including exclusion mask */
-        for (j = nj0; j < nj1; j++, mask++)
-        {
-            if (*mask != 0)
-            {
-                k = j%natoms;
-
-                /* load j atom coordinates */
-                jx                = x[3*k];
-                jy                = x[3*k+1];
-                jz                = x[3*k+2];
-
-                /* Calculate distance */
-                dx                = ix - jx;
-                dy                = iy - jy;
-                dz                = iz - jz;
-                rsq               = dx*dx+dy*dy+dz*dz;
-
-                /* Calculate 1/r and 1/r2 */
-                rinv              = 1.0/sqrt(rsq);
-                rinvsq            = rinv*rinv;
-
-                /* Load parameters for j atom */
-                qq                = iq*charge[k];
-                c6                = pvdw[2*k];
-                c12               = pvdw[2*k+1];
-
-                /* Coulomb interaction */
-                vcoul             = qq*rinv;
-                vctot             = vctot+vcoul;
-
-                /* Lennard-Jones interaction */
-                rinvsix           = rinvsq*rinvsq*rinvsq;
-                Vvdw6             = c6*rinvsix;
-                Vvdw12            = c12*rinvsix*rinvsix;
-                Vvdwtot           = Vvdwtot+Vvdw12-Vvdw6;
-                fscal             = (vcoul+12.0*Vvdw12-6.0*Vvdw6)*rinvsq;
-
-                /* Calculate temporary vectorial force */
-                tx                = fscal*dx;
-                ty                = fscal*dy;
-                tz                = fscal*dz;
-
-                /* Increment i atom force */
-                fix               = fix + tx;
-                fiy               = fiy + ty;
-                fiz               = fiz + tz;
-
-                /* Decrement j atom force */
-                f[3*k]            = f[3*k]   - tx;
-                f[3*k+1]          = f[3*k+1] - ty;
-                f[3*k+2]          = f[3*k+2] - tz;
-            }
-            /* Inner loop uses 38 flops/iteration */
-        }
-
-        /* Main part, no exclusions */
-        for (j = nj1; j < nj2; j++)
-        {
-            k = j%natoms;
-
-            /* load j atom coordinates */
-            jx                = x[3*k];
-            jy                = x[3*k+1];
-            jz                = x[3*k+2];
-
-            /* Calculate distance */
-            dx                = ix - jx;
-            dy                = iy - jy;
-            dz                = iz - jz;
-            rsq               = dx*dx+dy*dy+dz*dz;
-
-            /* Calculate 1/r and 1/r2 */
-            rinv              = 1.0/sqrt(rsq);
-            rinvsq            = rinv*rinv;
-
-            /* Load parameters for j atom */
-            qq                = iq*charge[k];
-            c6                = pvdw[2*k];
-            c12               = pvdw[2*k+1];
-
-            /* Coulomb interaction */
-            vcoul             = qq*rinv;
-            vctot             = vctot+vcoul;
-
-            /* Lennard-Jones interaction */
-            rinvsix           = rinvsq*rinvsq*rinvsq;
-            Vvdw6             = c6*rinvsix;
-            Vvdw12            = c12*rinvsix*rinvsix;
-            Vvdwtot           = Vvdwtot+Vvdw12-Vvdw6;
-            fscal             = (vcoul+12.0*Vvdw12-6.0*Vvdw6)*rinvsq;
-
-            /* Calculate temporary vectorial force */
-            tx                = fscal*dx;
-            ty                = fscal*dy;
-            tz                = fscal*dz;
-
-            /* Increment i atom force */
-            fix               = fix + tx;
-            fiy               = fiy + ty;
-            fiz               = fiz + tz;
-
-            /* Decrement j atom force */
-            f[3*k]            = f[3*k]   - tx;
-            f[3*k+1]          = f[3*k+1] - ty;
-            f[3*k+2]          = f[3*k+2] - tz;
-
-            /* Inner loop uses 38 flops/iteration */
-        }
-
-        f[3*i]   += fix;
-        f[3*i+1] += fiy;
-        f[3*i+2] += fiz;
-
-        /* Add potential energies to the group for this list */
-        ggid             = 0;
-
-        Vc[ggid]         = Vc[ggid] + vctot;
-        Vvdw[ggid]       = Vvdw[ggid] + Vvdwtot;
-
-        /* Outer loop uses 6 flops/iteration */
-    }
-
-    /* 12 flops per outer iteration
-     * 19 flops per inner iteration
-     */
-    inc_nrnb(nrnb, eNR_NBKERNEL_ELEC_VDW_VF, (ni1-ni0)*12 + gmx::exactDiv(natoms*(natoms-1), 2)*19);
-}
index 270f9ecf5977a1bf2d6b3871078f3fe2c9b9ec78..8ca8aa9ef65c606b9af335c3eeb2fb067cb8d663 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2018,2019, 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.
@@ -334,11 +334,6 @@ void do_nonbonded(const t_forcerec  *fr,
     kernel_data.lambda                  = lambda;
     kernel_data.dvdl                    = dvdl;
 
-    if (fr->bAllvsAll)
-    {
-        gmx_incons("All-vs-all kernels have not been implemented in version 4.6");
-    }
-
     if (eNL >= 0)
     {
         i0 = eNL;
index 55d0695aee68a48ab5ca27b6fb14314c2077fb15..2755e8f23892fae77d9e31d471a5748e00dbd8c8 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2018,2019, 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.
@@ -84,7 +84,6 @@ static const t_nrnb_data nbdata[eNRNB] = {
     { "NB Generic kernel",               1 },
     { "NB Generic charge grp kernel",    1 },
     { "NB Free energy kernel",           1 },
-    { "NB All-vs-all",                   1 },
 
     { "Pair Search distance check",      9 }, /* nbnxn pair dist. check */
     /* nbnxn kernel flops are based on inner-loops without exclusion checks.
index 727297dc5afb7446c68b208d2f1239b1aa3c1b53..dbdcd202ce9679bd8519adab7f21d91caf69b5e5 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2018,2019, 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.
@@ -76,9 +76,8 @@ enum
     eNR_NBKERNEL_FREE_ENERGY,               /* Add other generic kernels _before_ the free energy one */
 
     eNR_NBKERNEL_TOTAL_NR,
-    eNR_NBKERNEL_ALLVSALL = eNR_NBKERNEL_TOTAL_NR, // Reuse the symbolic constant that indicates the last kernel
 
-    eNR_NBNXN_DIST2,
+    eNR_NBNXN_DIST2 = eNR_NBKERNEL_TOTAL_NR, // Reuse the symbolic constant that indicates the last kernel
     eNR_NBNXN_LJ_RF,          eNR_NBNXN_LJ_RF_E,
     eNR_NBNXN_LJ_TAB,         eNR_NBNXN_LJ_TAB_E,
     eNR_NBNXN_LJ_EWALD,       eNR_NBNXN_LJ_EWALD_E,
index f96cf02a1ff468a85c0598e59cc84c5c97aba2c3..8fd883d4bff29c748670848659d7a43480d09357 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2018,2019, 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.
 #ifndef GMX_GMXPREPROCESS_ADD_PAR_H
 #define GMX_GMXPREPROCESS_ADD_PAR_H
 
-#include "gromacs/gmxpreprocess/grompp-impl.h"
-#include "gromacs/gmxpreprocess/pdb2top.h"
 #include "gromacs/utility/real.h"
 
+struct t_params;
+struct t_restp;
+
 void add_param(t_params *ps, int ai, int aj, const real *c, char *s);
 
 void add_imp_param(t_params *ps, int ai, int aj, int ak, int al,
index 91fd43c7ee732774b3c8d7985ad5e47b1b797e5b..ee73c32e20d6343fce04f1e0de9b0804cf266120 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -45,6 +45,7 @@
 
 #include "gromacs/compat/make_unique.h"
 #include "gromacs/gmxpreprocess/gpp_atomtype.h"
+#include "gromacs/gmxpreprocess/grompp-impl.h"
 #include "gromacs/gmxpreprocess/topio.h"
 #include "gromacs/gmxpreprocess/toputil.h"
 #include "gromacs/math/functions.h"
index 78d84b296f39050fc1fa91fdec73b1e817fc458e..496d866d3d4eaca725a245a2be053f69b346e91e 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2019, 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.
 #ifndef GMX_GMXPREPROCESS_CONVPARM_H
 #define GMX_GMXPREPROCESS_CONVPARM_H
 
-#include "gromacs/gmxpreprocess/grompp-impl.h"
 #include "gromacs/utility/real.h"
 
 struct gmx_mtop_t;
+struct t_molinfo;
+struct t_params;
 
 void convert_params(int atnr, t_params nbtypes[],
                     t_molinfo *mi,
similarity index 98%
rename from src/gromacs/gmxana/gmx_editconf.cpp
rename to src/gromacs/gmxpreprocess/editconf.cpp
index 925cbe4ecec46db9aff7d438cb43aa3d74dabb87..58347b87a82f80534a51f6bc0380419df97bc4f7 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
  */
 #include "gmxpre.h"
 
+#include "editconf.h"
+
 #include <cmath>
 #include <cstring>
 
 #include <algorithm>
+#include <string>
 
 #include "gromacs/commandline/pargs.h"
 #include "gromacs/commandline/viewit.h"
@@ -47,7 +50,6 @@
 #include "gromacs/fileio/pdbio.h"
 #include "gromacs/fileio/tpxio.h"
 #include "gromacs/fileio/trxio.h"
-#include "gromacs/gmxana/gmx_ana.h"
 #include "gromacs/gmxana/princ.h"
 #include "gromacs/gmxlib/conformation-utilities.h"
 #include "gromacs/math/functions.h"
@@ -66,8 +68,7 @@
 #include "gromacs/utility/smalloc.h"
 #include "gromacs/utility/strdb.h"
 
-
-static real calc_mass(t_atoms *atoms, gmx_bool bGetMass, gmx_atomprop_t aps)
+static real calc_mass(t_atoms *atoms, gmx_bool bGetMass, AtomProperties *aps)
 {
     real tmass;
     int  i;
@@ -77,9 +78,9 @@ static real calc_mass(t_atoms *atoms, gmx_bool bGetMass, gmx_atomprop_t aps)
     {
         if (bGetMass)
         {
-            gmx_atomprop_query(aps, epropMass,
-                               *atoms->resinfo[atoms->atom[i].resind].name,
-                               *atoms->atomname[i], &(atoms->atom[i].m));
+            aps->setAtomProperty(epropMass,
+                                 std::string(*atoms->resinfo[atoms->atom[i].resind].name),
+                                 std::string(*atoms->atomname[i]), &(atoms->atom[i].m));
         }
         tmass += atoms->atom[i].m;
     }
@@ -716,7 +717,6 @@ int gmx_editconf(int argc, char *argv[])
     gmx_bool          bIndex, bSetSize, bSetAng, bDist, bSetCenter, bAlign;
     gmx_bool          bHaveV, bScale, bRho, bTranslate, bRotate, bCalcGeom, bCalcDiam;
     real              diam = 0, mass = 0, d, vdw;
-    gmx_atomprop_t    aps;
     gmx_conect        conect;
     gmx_output_env_t *oenv;
     t_filenm          fnm[] =
@@ -776,7 +776,7 @@ int gmx_editconf(int argc, char *argv[])
     outftp = fn2ftp(outfile);
     inftp  = fn2ftp(infile);
 
-    aps = gmx_atomprop_init();
+    AtomProperties aps;
 
     if (bMead && bGrasp)
     {
@@ -807,14 +807,14 @@ int gmx_editconf(int argc, char *argv[])
 
     if (fn2ftp(infile) == efPDB)
     {
-        get_pdb_atomnumber(&atoms, aps);
+        get_pdb_atomnumber(&atoms, &aps);
     }
     printf("Read %d atoms\n", atoms.nr);
 
     /* Get the element numbers if available in a pdb file */
     if (fn2ftp(infile) == efPDB)
     {
-        get_pdb_atomnumber(&atoms, aps);
+        get_pdb_atomnumber(&atoms, &aps);
     }
 
     if (ePBC != epbcNONE)
@@ -842,9 +842,9 @@ int gmx_editconf(int argc, char *argv[])
             /* Determine the Van der Waals radius from the force field */
             if (bReadVDW)
             {
-                if (!gmx_atomprop_query(aps, epropVDW,
-                                        *top->atoms.resinfo[top->atoms.atom[i].resind].name,
-                                        *top->atoms.atomname[i], &vdw))
+                if (!aps.setAtomProperty(epropVDW,
+                                         *top->atoms.resinfo[top->atoms.atom[i].resind].name,
+                                         *top->atoms.atomname[i], &vdw))
                 {
                     vdw = rvdw;
                 }
@@ -955,7 +955,7 @@ int gmx_editconf(int argc, char *argv[])
 
     if (bRho || bOrient || bAlign)
     {
-        mass = calc_mass(&atoms, !fn2bTPX(infile), aps);
+        mass = calc_mass(&atoms, !fn2bTPX(infile), &aps);
     }
 
     if (bOrient)
@@ -1341,8 +1341,6 @@ int gmx_editconf(int argc, char *argv[])
             write_sto_conf(outfile, *top_tmp->name, &atoms, x, bHaveV ? v : nullptr, ePBC, box);
         }
     }
-    gmx_atomprop_destroy(aps);
-
     do_view(oenv, outfile, nullptr);
 
     return 0;
similarity index 69%
rename from src/gromacs/gmxlib/nonbonded/nb_kernel_c/nb_kernel_allvsall.h
rename to src/gromacs/gmxpreprocess/editconf.h
index b52347f1a27db412bc87d4426979d25a532d6336..c1122c8088d9af698dc9f0b4bf3d65f7dec9ceb9 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2019, 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.
  * To help us fund GROMACS development, we humbly ask that you cite
  * the research papers on the package. Check out http://www.gromacs.org.
  */
-#ifndef _NB_KERNEL_ALLVSALL_H
-#define _NB_KERNEL_ALLVSALL_H
+#ifndef GMX_GMXPREPROCESS_EDITCONF_H
+#define GMX_GMXPREPROCESS_EDITCONF_H
 
-#include "config.h"
-
-#include "gromacs/gmxlib/nrnb.h"
-#include "gromacs/gmxlib/nonbonded/nb_kernel.h"
-#include "gromacs/math/vectypes.h"
-#include "gromacs/mdtypes/mdatom.h"
-#include "gromacs/mdtypes/nblist.h"
-
-void
-nb_kernel_allvsall(t_nblist *                nlist,
-                   rvec *                    x,
-                   rvec *                    f,
-                   struct t_forcerec *       fr,
-                   t_mdatoms *               mdatoms,
-                   nb_kernel_data_t *        kernel_data,
-                   t_nrnb *                  nrnb);
+int gmx_editconf(int argc, char *argv[]);
 
 #endif
index 6aeae89ce00fc9803fe5995d5f61a00e2b99960d..c608183a40c999a37370439bcb609e7ac3cb1038 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2010,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2014,2015,2018,2019, 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.
@@ -36,7 +36,7 @@
 #ifndef GMX_GMXPREPROCESS_FFLIBUTIL_H
 #define GMX_GMXPREPROCESS_FFLIBUTIL_H
 
-#include <stdio.h>
+#include <cstdio>
 
 #include <string>
 #include <vector>
index 464fc803486e2d971491a8c125a08adae3cc9809..c77553fb31b2d1c426bc8963ec4c8f57e726c86d 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -48,6 +48,8 @@
 
 #include "gromacs/fileio/confio.h"
 #include "gromacs/gmxpreprocess/gpp_nextnb.h"
+#include "gromacs/gmxpreprocess/grompp-impl.h"
+#include "gromacs/gmxpreprocess/hackblock.h"
 #include "gromacs/gmxpreprocess/notset.h"
 #include "gromacs/gmxpreprocess/pgutil.h"
 #include "gromacs/gmxpreprocess/resall.h"
index 15d6e17dae5a09b9f2e08796c2fa478c5b3794a0..6be288a493b7cd8c0ad31e581b7bdafac69fbe25 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2012,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2014,2015,2018,2019, 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.
 #ifndef GMX_GMXPREPROCESS_GEN_AD_H
 #define GMX_GMXPREPROCESS_GEN_AD_H
 
-#include "gromacs/gmxpreprocess/gpp_nextnb.h"
-#include "gromacs/gmxpreprocess/resall.h"
-#include "gromacs/gmxpreprocess/toputil.h"
+struct t_atoms;
+struct t_excls;
+struct t_hackblock;
+struct t_nextnb;
+struct t_params;
+struct t_restp;
 
 void generate_excls(t_nextnb *nnb, int nrexcl, t_excls excls[]);
 void clean_excls(t_nextnb *nnb, int nrexcl, t_excls excls[]);
index b42def31cc4ab06294ea72a6d5cf15aeb3c6f58c..5e1ee0da7ec6578593314b90c2eed4e40b83713e 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2018,2019, 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.
 static void low_mspeed(real tempi,
                        gmx_mtop_t *mtop, rvec v[], gmx::ThreeFry2x64<> * rng)
 {
-    int                                     i, m, nrdf;
-    real                                    boltz, sd;
-    real                                    ekin, temp, mass, scal;
-    gmx_mtop_atomloop_all_t                 aloop;
-    const t_atom                           *atom;
+    int                                     nrdf;
+    real                                    boltz;
+    real                                    ekin, temp;
     gmx::TabulatedNormalDistribution<real>  normalDist;
 
     boltz = BOLTZ*tempi;
     ekin  = 0.0;
     nrdf  = 0;
-    aloop = gmx_mtop_atomloop_all_init(mtop);
-    while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
+    for (const AtomProxy &atomP : AtomRange(*mtop))
     {
-        mass = atom->m;
+        const t_atom &local = atomP.atom();
+        int           i     = atomP.globalAtomNumber();
+        real          mass  = local.m;
         if (mass > 0)
         {
             rng->restart(i, 0);
-            sd = std::sqrt(boltz/mass);
-            for (m = 0; (m < DIM); m++)
+            real sd = std::sqrt(boltz/mass);
+            for (int m = 0; (m < DIM); m++)
             {
                 v[i][m] = sd*normalDist(*rng);
                 ekin   += 0.5*mass*v[i][m]*v[i][m];
@@ -82,10 +81,10 @@ static void low_mspeed(real tempi,
     temp = (2.0*ekin)/(nrdf*BOLTZ);
     if (temp > 0)
     {
-        scal = std::sqrt(tempi/temp);
-        for (i = 0; (i < mtop->natoms); i++)
+        real scal = std::sqrt(tempi/temp);
+        for (int i = 0; (i < mtop->natoms); i++)
         {
-            for (m = 0; (m < DIM); m++)
+            for (int m = 0; (m < DIM); m++)
             {
                 v[i][m] *= scal;
             }
index 6e4c36802f833f3e8e7abf159e6475312a5f47d9..b55d8a37f478836cabcc01020c33f4504de1406b 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -50,6 +50,8 @@
 #include "gromacs/gmxpreprocess/add_par.h"
 #include "gromacs/gmxpreprocess/fflibutil.h"
 #include "gromacs/gmxpreprocess/gpp_atomtype.h"
+#include "gromacs/gmxpreprocess/grompp-impl.h"
+#include "gromacs/gmxpreprocess/hackblock.h"
 #include "gromacs/gmxpreprocess/notset.h"
 #include "gromacs/gmxpreprocess/resall.h"
 #include "gromacs/gmxpreprocess/toputil.h"
@@ -71,7 +73,8 @@
 #define OPENDIR     '[' /* starting sign for directive         */
 #define CLOSEDIR    ']' /* ending sign for directive           */
 
-typedef struct {
+struct t_vsiteconf
+{
     char       atomtype[MAXNAME];  /* Type for the XH3/XH2 atom */
     bool       isplanar;           /* If true, the atomtype above and the three connected
                                     * ones are in a planar geometry. The two next entries
@@ -80,7 +83,7 @@ typedef struct {
     int    nhydrogens;             /* number of connected hydrogens */
     char   nextheavytype[MAXNAME]; /* Type for the heavy atom bonded to XH2/XH3 */
     char   dummymass[MAXNAME];     /* The type of MNH* or MCH3* dummy mass to use */
-} t_vsiteconf;
+};
 
 
 /* Structure to represent average bond and angles values in vsite aromatic
@@ -88,22 +91,25 @@ typedef struct {
  * forcefield; many forcefields (like Amber, OPLS) have some inherent strain in
  * 5-rings (i.e. the sum of angles is !=540, but impropers keep it planar)
  */
-typedef struct {
+struct t_vsitetop
+{
     char resname[MAXNAME];
     int  nbonds;
     int  nangles;
-    struct vsitetop_bond {
+    struct vsitetop_bond
+    {
         char   atom1[MAXNAME];
         char   atom2[MAXNAME];
         float  value;
     } *bond; /* list of bonds */
-    struct vsitetop_angle {
+    struct vsitetop_angle
+    {
         char   atom1[MAXNAME];
         char   atom2[MAXNAME];
         char   atom3[MAXNAME];
         float  value;
     } *angle; /* list of angles */
-} t_vsitetop;
+};
 
 
 enum {
@@ -534,7 +540,7 @@ static void print_bonds(FILE *fp, int o2n[],
 }
 
 static int get_atype(int atom, t_atoms *at, int nrtp, t_restp rtp[],
-                     gmx_residuetype_t *rt)
+                     ResidueType *rt)
 {
     int      type;
     bool     bNterm;
@@ -549,7 +555,7 @@ static int get_atype(int atom, t_atoms *at, int nrtp, t_restp rtp[],
     {
         /* get type from rtp */
         rtpp   = get_restp(*(at->resinfo[at->atom[atom].resind].name), nrtp, rtp);
-        bNterm = gmx_residuetype_is_protein(rt, *(at->resinfo[at->atom[atom].resind].name)) &&
+        bNterm = rt->namedResidueHasType(*(at->resinfo[at->atom[atom].resind].name), "Protein") &&
             (at->atom[atom].resind == 0);
         j    = search_jtype(rtpp, *(at->atomname[atom]), bNterm);
         type = rtpp->atom[j].type;
@@ -557,7 +563,7 @@ static int get_atype(int atom, t_atoms *at, int nrtp, t_restp rtp[],
     return type;
 }
 
-static int vsite_nm2type(const char *name, gpp_atomtype_t atype)
+static int vsite_nm2type(const char *name, gpp_atomtype *atype)
 {
     int tp;
 
@@ -572,7 +578,7 @@ static int vsite_nm2type(const char *name, gpp_atomtype_t atype)
 }
 
 static real get_amass(int atom, t_atoms *at, int nrtp, t_restp rtp[],
-                      gmx_residuetype_t *rt)
+                      ResidueType *rt)
 {
     real     mass;
     bool     bNterm;
@@ -587,7 +593,7 @@ static real get_amass(int atom, t_atoms *at, int nrtp, t_restp rtp[],
     {
         /* get mass from rtp */
         rtpp   = get_restp(*(at->resinfo[at->atom[atom].resind].name), nrtp, rtp);
-        bNterm = gmx_residuetype_is_protein(rt, *(at->resinfo[at->atom[atom].resind].name)) &&
+        bNterm = rt->namedResidueHasType(*(at->resinfo[at->atom[atom].resind].name), "Protein") &&
             (at->atom[atom].resind == 0);
         j    = search_jtype(rtpp, *(at->atomname[atom]), bNterm);
         mass = rtpp->atom[j].m;
@@ -861,7 +867,7 @@ static void calc_vsite3_param(real xd, real yd, real xi, real yi, real xj, real
 }
 
 
-static int gen_vsites_trp(gpp_atomtype_t atype, rvec *newx[],
+static int gen_vsites_trp(gpp_atomtype *atype, rvec *newx[],
                           t_atom *newatom[], char ***newatomname[],
                           int *o2n[], int *newvsite_type[], int *newcgnr[],
                           t_symtab *symtab, int *nadd, rvec x[], int *cgnr[],
@@ -1133,7 +1139,7 @@ static int gen_vsites_trp(gpp_atomtype_t atype, rvec *newx[],
 }
 
 
-static int gen_vsites_tyr(gpp_atomtype_t atype, rvec *newx[],
+static int gen_vsites_tyr(gpp_atomtype *atype, rvec *newx[],
                           t_atom *newatom[], char ***newatomname[],
                           int *o2n[], int *newvsite_type[], int *newcgnr[],
                           t_symtab *symtab, int *nadd, rvec x[], int *cgnr[],
@@ -1533,7 +1539,7 @@ static bool is_vsite(int vsite_type)
 
 static char atomnamesuffix[] = "1234";
 
-void do_vsites(int nrtp, t_restp rtp[], gpp_atomtype_t atype,
+void do_vsites(int nrtp, t_restp rtp[], gpp_atomtype *atype,
                t_atoms *at, t_symtab *symtab, rvec *x[],
                t_params plist[], int *vsite_type[], int *cgnr[],
                real mHmult, bool bVsiteAromatics,
@@ -1558,7 +1564,6 @@ void do_vsites(int nrtp, t_restp rtp[], gpp_atomtype_t atype,
     char             *resnm = nullptr;
     int               nvsiteconf, nvsitetop, cmplength;
     bool              isN, planarN, bFound;
-    gmx_residuetype_t*rt;
 
     t_vsiteconf      *vsiteconflist;
     /* pointer to a list of CH3/NH3/NH2 configuration entries.
@@ -1645,7 +1650,7 @@ void do_vsites(int nrtp, t_restp rtp[], gpp_atomtype_t atype,
     /* make index to tell which residues were already processed */
     snew(bResProcessed, at->nres);
 
-    gmx_residuetype_init(&rt);
+    ResidueType rt;
 
     /* generate vsite constructions */
     /* loop over all atoms */
@@ -1664,9 +1669,9 @@ void do_vsites(int nrtp, t_restp rtp[], gpp_atomtype_t atype,
          * N-terminus that must be treated first.
          */
         if (bVsiteAromatics &&
-            !strcmp(*(at->atomname[i]), "CA") &&
+            (strcmp(*(at->atomname[i]), "CA") == 0) &&
             !bResProcessed[resind] &&
-            gmx_residuetype_is_protein(rt, *(at->resinfo[resind].name)) )
+            rt.namedResidueHasType(*(at->resinfo[resind].name), "Protein") )
         {
             /* mark this residue */
             bResProcessed[resind] = TRUE;
@@ -1777,7 +1782,7 @@ void do_vsites(int nrtp, t_restp rtp[], gpp_atomtype_t atype,
             count_bonds(i, &plist[F_BONDS], at->atomname,
                         &nrbonds, &nrHatoms, Hatoms, &Heavy, &nrheavies, heavies);
             /* get Heavy atom type */
-            tpHeavy = get_atype(Heavy, at, nrtp, rtp, rt);
+            tpHeavy = get_atype(Heavy, at, nrtp, rtp, &rt);
             strcpy(tpname, get_atomtype_name(tpHeavy, atype));
 
             bWARNING       = FALSE;
@@ -1884,7 +1889,7 @@ void do_vsites(int nrtp, t_restp rtp[], gpp_atomtype_t atype,
                     }
                     /* get dummy mass type from first char of heavy atom type (N or C) */
 
-                    strcpy(nexttpname, get_atomtype_name(get_atype(heavies[0], at, nrtp, rtp, rt), atype));
+                    strcpy(nexttpname, get_atomtype_name(get_atype(heavies[0], at, nrtp, rtp, &rt), atype));
                     ch = get_dummymass_name(vsiteconflist, nvsiteconf, tpname, nexttpname);
 
                     if (ch == nullptr)
@@ -1934,10 +1939,10 @@ void do_vsites(int nrtp, t_restp rtp[], gpp_atomtype_t atype,
                     /* get atom masses, and set Heavy and Hatoms mass to zero */
                     for (j = 0; j < nrHatoms; j++)
                     {
-                        mHtot                += get_amass(Hatoms[j], at, nrtp, rtp, rt);
+                        mHtot                += get_amass(Hatoms[j], at, nrtp, rtp, &rt);
                         at->atom[Hatoms[j]].m = at->atom[Hatoms[j]].mB = 0;
                     }
-                    mtot              = mHtot + get_amass(Heavy, at, nrtp, rtp, rt);
+                    mtot              = mHtot + get_amass(Heavy, at, nrtp, rtp, &rt);
                     at->atom[Heavy].m = at->atom[Heavy].mB = 0;
                     if (mHmult != 1.0)
                     {
@@ -2048,8 +2053,6 @@ void do_vsites(int nrtp, t_restp rtp[], gpp_atomtype_t atype,
 
     }     /* for i < at->nr */
 
-    gmx_residuetype_destroy(rt);
-
     if (debug)
     {
         fprintf(debug, "Before inserting new atoms:\n");
index efa351924a0c2d2337daf34537a8a4f997c8edc7..a852a88fc9ef893fb7ea1983ce7a9e2f6a4a3f3d 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2018,2019, 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.
 #ifndef GMX_GMXPREPROCESS_GEN_VSITE_H
 #define GMX_GMXPREPROCESS_GEN_VSITE_H
 
-#include "gromacs/gmxpreprocess/gpp_atomtype.h"
-#include "gromacs/gmxpreprocess/grompp-impl.h"
-#include "gromacs/gmxpreprocess/hackblock.h"
+#include "gromacs/math/vectypes.h"
 #include "gromacs/utility/real.h"
 
+struct gpp_atomtype;
+struct t_atoms;
+struct t_params;
+struct t_restp;
+struct t_symtab;
+
 /* stuff for pdb2gmx */
 
-void do_vsites(int nrtp, t_restp rtp[], gpp_atomtype_t atype,
-               t_atoms *at, struct t_symtab *symtab, rvec *x[],
+void do_vsites(int nrtp, t_restp rtp[], gpp_atomtype *atype,
+               t_atoms *at, t_symtab *symtab, rvec *x[],
                t_params plist[], int *dummy_type[], int *cgnr[],
                real mHmult, bool bVSiteAromatics,
                const char *ffdir);
index e47c79e588eea88f19b76b731ce85a961b1e087e..abe0b48e947ee6f442fb4fdc12d2c1f254a05dc6 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2018,2019, 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.
 #include "gromacs/gmxlib/network.h"
 #include "gromacs/gmxpreprocess/calch.h"
 #include "gromacs/gmxpreprocess/h_db.h"
+#include "gromacs/gmxpreprocess/hackblock.h"
 #include "gromacs/gmxpreprocess/notset.h"
 #include "gromacs/gmxpreprocess/pgutil.h"
 #include "gromacs/gmxpreprocess/resall.h"
 #include "gromacs/gmxpreprocess/ter_db.h"
 #include "gromacs/math/vec.h"
+#include "gromacs/topology/atoms.h"
 #include "gromacs/topology/symtab.h"
 #include "gromacs/utility/cstringutil.h"
 #include "gromacs/utility/fatalerror.h"
index 79d0fd826d71b45babca039cf84105cb413b1394..b2ff682ab89867ef924c95076516b5bbc23a1f11 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2018,2019, 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.
 #ifndef GMX_GMXPREPROCESS_GENHYDRO_H
 #define GMX_GMXPREPROCESS_GENHYDRO_H
 
-#include "gromacs/fileio/pdbio.h"
-#include "gromacs/gmxpreprocess/hackblock.h"
+#include "gromacs/math/vectypes.h"
+
+struct t_atoms;
+struct t_hack;
+struct t_hackblock;
 
 int add_h(t_atoms **pdbaptr, rvec *xptr[],
           int nah, t_hackblock ah[],
similarity index 99%
rename from src/gromacs/gmxana/gmx_genion.cpp
rename to src/gromacs/gmxpreprocess/genion.cpp
index 1190caa175b0457bc5d85e4580303b81d2543395..297b2190e9606cb57a3db683f44d4b4e0b3f6c53 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -36,6 +36,8 @@
  */
 #include "gmxpre.h"
 
+#include "genion.h"
+
 #include <cctype>
 #include <cmath>
 #include <cstdlib>
@@ -43,7 +45,6 @@
 
 #include "gromacs/commandline/pargs.h"
 #include "gromacs/fileio/confio.h"
-#include "gromacs/gmxana/gmx_ana.h"
 #include "gromacs/math/units.h"
 #include "gromacs/math/utilities.h"
 #include "gromacs/math/vec.h"
diff --git a/src/gromacs/gmxpreprocess/genion.h b/src/gromacs/gmxpreprocess/genion.h
new file mode 100644 (file)
index 0000000..1ce7f9b
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2019, 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.
+ */
+#ifndef GMX_GMXPREPROCESS_GENION_H
+#define GMX_GMXPREPROCESS_GENION_H
+
+int gmx_genion(int argc, char *argv[]);
+
+#endif
similarity index 98%
rename from src/gromacs/gmxana/gmx_genpr.cpp
rename to src/gromacs/gmxpreprocess/genrestr.cpp
index e22380046e84d8064489dd7f532b21bdcabaef5b..a70cbb5c1c1b4b161996583a57422c318bf664ab 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2018,2019, 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.
@@ -36,6 +36,8 @@
  */
 #include "gmxpre.h"
 
+#include "genrestr.h"
+
 #include <cmath>
 #include <cstring>
 
@@ -43,7 +45,6 @@
 
 #include "gromacs/commandline/pargs.h"
 #include "gromacs/fileio/confio.h"
-#include "gromacs/gmxana/gmx_ana.h"
 #include "gromacs/math/vec.h"
 #include "gromacs/topology/index.h"
 #include "gromacs/topology/topology.h"
@@ -53,7 +54,7 @@
 #include "gromacs/utility/futil.h"
 #include "gromacs/utility/smalloc.h"
 
-int gmx_genpr(int argc, char *argv[])
+int gmx_genrestr(int argc, char *argv[])
 {
     const char        *desc[] = {
         "[THISMODULE] produces an #include file for a topology containing",
diff --git a/src/gromacs/gmxpreprocess/genrestr.h b/src/gromacs/gmxpreprocess/genrestr.h
new file mode 100644 (file)
index 0000000..d7264fe
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2019, 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.
+ */
+#ifndef GMX_GMXPREPROCESS_GENPR_H
+#define GMX_GMXPREPROCESS_GENPR_H
+
+int gmx_genrestr(int argc, char *argv[]);
+
+#endif
index 2c27664586e0a1d0098ff2a8cbea84bb5438ea0f..a8e621ca342a16c925ce0a0cf2bc4f39e872b68f 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2018,2019, 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.
@@ -49,6 +49,7 @@
 #include <algorithm>
 #include <memory>
 
+#include <unordered_set>
 #include <sys/types.h>
 
 #include "gromacs/utility/arrayref.h"
@@ -73,16 +74,16 @@ struct gmx_cpp
 {
     std::shared_ptr < std::vector < t_define>>    defines;
     std::shared_ptr < std::vector < std::string>> includes;
-
-    FILE             *fp = nullptr;
-    std::string       path;
-    std::string       cwd;
-    std::string       fn;
-    std::string       line;
-    int               line_nr;
-    std::vector<int>  ifdefs;
-    struct gmx_cpp   *child  = nullptr;
-    struct gmx_cpp   *parent = nullptr;
+    std::unordered_set<std::string> unmatched_defines;
+    FILE                           *fp = nullptr;
+    std::string                     path;
+    std::string                     cwd;
+    std::string                     fn;
+    std::string                     line;
+    int                             line_nr;
+    std::vector<int>                ifdefs;
+    struct gmx_cpp                 *child  = nullptr;
+    struct gmx_cpp                 *parent = nullptr;
 };
 
 static bool is_word_end(char c)
@@ -258,12 +259,14 @@ cpp_open_file(const char                                     *filenm,
                 {
                     std::string buf = cppopts[i] + 2;
                     buf.resize(ptr - cppopts[i] - 2);
-
                     add_define(cpp->defines.get(), buf, ptr + 1);
+                    cpp->unmatched_defines.insert(buf);
+
                 }
                 else
                 {
                     add_define(cpp->defines.get(), cppopts[i] + 2, "");
+                    cpp->unmatched_defines.insert(cppopts[i] + 2);
                 }
             }
             i++;
@@ -379,6 +382,14 @@ process_directive(gmx_cpp_t         *handlep,
             {
                 if (define.name == dval)
                 {
+                    // erase from unmatched_defines in original handle
+                    gmx_cpp_t root = handle;
+                    while (root->parent != nullptr)
+                    {
+                        root = root->parent;
+                    }
+                    root->unmatched_defines.erase(dval);
+
                     found = true;
                     break;
                 }
@@ -627,6 +638,14 @@ int cpp_read_line(gmx_cpp_t *handlep, int n, char buf[])
             }
             if (nn > 0)
             {
+                // Need to erase  unmatched define in original handle
+                gmx_cpp_t root = handle;
+                while (root->parent != nullptr)
+                {
+                    root = root->parent;
+                }
+                root->unmatched_defines.erase(define.name);
+
                 std::string  name;
                 const char  *ptr = buf;
                 const char  *ptr2;
@@ -738,3 +757,20 @@ char *cpp_error(gmx_cpp_t *handlep, int status)
 
     return gmx_strdup(buf);
 }
+
+std::string checkAndWarnForUnusedDefines(const gmx_cpp &handle)
+{
+    std::string warning;
+    if (!handle.unmatched_defines.empty())
+    {
+        warning = "The following macros were defined in the 'define' mdp field with the -D prefix, but "
+            "were not used in the topology:\n";
+        for (auto &str : handle.unmatched_defines)
+        {
+            warning += ("    " + str + "\n");
+        }
+        warning += "If you haven't made a spelling error, either use the macro you defined, "
+            "or don't define the macro";
+    }
+    return warning;
+}
index eca07f155ddb7b4cacddd864f68a0e088b063f53..f85fe06b54287f0df10410a03ee3c3ea1869fa38 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2008, The GROMACS development team.
- * Copyright (c) 2012,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2014,2015,2018,2019, 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.
@@ -86,4 +86,8 @@ void cpp_done(gmx_cpp_t handle);
  */
 char *cpp_error(gmx_cpp_t *handlep, int status);
 
+/* Returns warning message if strings defined in mdp define section (e.g. -DFLEXIBLE)
+ * were not not found when processing the topology */
+std::string checkAndWarnForUnusedDefines(const gmx_cpp &handle);
+
 #endif
index 5bbb1839e9869450e9e2e2ce8de4971db2d3484f..a5b905f6ef7051dbc2badc5686a91e4adebbc77e 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2011,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2011,2014,2015,2017,2018,2019, 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.
@@ -42,6 +42,7 @@
 #include <cmath>
 #include <cstring>
 
+#include "gromacs/gmxpreprocess/grompp-impl.h"
 #include "gromacs/gmxpreprocess/notset.h"
 #include "gromacs/gmxpreprocess/topdirs.h"
 #include "gromacs/gmxpreprocess/toputil.h"
 #include "gromacs/utility/fatalerror.h"
 #include "gromacs/utility/smalloc.h"
 
-typedef struct gpp_atomtype {
+struct gpp_atomtype
+{
     int              nr;           /* The number of atomtypes          */
     t_atom          *atom;         /* Array of atoms                   */
     char          ***atomname;     /* Names of the atomtypes           */
     t_param         *nb;           /* Nonbonded force default params   */
     int             *bondatomtype; /* The bond_atomtype for each atomtype  */
     int             *atomnumber;   /* Atomic number, used for QM/MM        */
-} t_gpp_atomtype;
+};
 
-int get_atomtype_type(const char *str, gpp_atomtype_t ga)
+int get_atomtype_type(const char *str, gpp_atomtype *ga)
 {
     int i;
 
@@ -77,12 +79,12 @@ int get_atomtype_type(const char *str, gpp_atomtype_t ga)
     return NOTSET;
 }
 
-int get_atomtype_ntypes(gpp_atomtype_t ga)
+int get_atomtype_ntypes(gpp_atomtype *ga)
 {
     return ga->nr;
 }
 
-char *get_atomtype_name(int nt, gpp_atomtype_t ga)
+char *get_atomtype_name(int nt, gpp_atomtype *ga)
 {
     if ((nt < 0) || (nt >= ga->nr))
     {
@@ -92,7 +94,7 @@ char *get_atomtype_name(int nt, gpp_atomtype_t ga)
     return *(ga->atomname[nt]);
 }
 
-real get_atomtype_massA(int nt, gpp_atomtype_t ga)
+real get_atomtype_massA(int nt, gpp_atomtype *ga)
 {
     if ((nt < 0) || (nt >= ga->nr))
     {
@@ -102,7 +104,7 @@ real get_atomtype_massA(int nt, gpp_atomtype_t ga)
     return ga->atom[nt].m;
 }
 
-real get_atomtype_massB(int nt, gpp_atomtype_t ga)
+real get_atomtype_massB(int nt, gpp_atomtype *ga)
 {
     if ((nt < 0) || (nt >= ga->nr))
     {
@@ -112,7 +114,7 @@ real get_atomtype_massB(int nt, gpp_atomtype_t ga)
     return ga->atom[nt].mB;
 }
 
-real get_atomtype_qA(int nt, gpp_atomtype_t ga)
+real get_atomtype_qA(int nt, gpp_atomtype *ga)
 {
     if ((nt < 0) || (nt >= ga->nr))
     {
@@ -122,7 +124,7 @@ real get_atomtype_qA(int nt, gpp_atomtype_t ga)
     return ga->atom[nt].q;
 }
 
-real get_atomtype_qB(int nt, gpp_atomtype_t ga)
+real get_atomtype_qB(int nt, gpp_atomtype *ga)
 {
     if ((nt < 0) || (nt >= ga->nr))
     {
@@ -132,7 +134,7 @@ real get_atomtype_qB(int nt, gpp_atomtype_t ga)
     return ga->atom[nt].qB;
 }
 
-int get_atomtype_ptype(int nt, gpp_atomtype_t ga)
+int get_atomtype_ptype(int nt, gpp_atomtype *ga)
 {
     if ((nt < 0) || (nt >= ga->nr))
     {
@@ -152,7 +154,7 @@ int get_atomtype_batype(int nt, const gpp_atomtype* ga)
     return ga->bondatomtype[nt];
 }
 
-int get_atomtype_atomnumber(int nt, gpp_atomtype_t ga)
+int get_atomtype_atomnumber(int nt, gpp_atomtype *ga)
 {
     if ((nt < 0) || (nt >= ga->nr))
     {
@@ -162,7 +164,7 @@ int get_atomtype_atomnumber(int nt, gpp_atomtype_t ga)
     return ga->atomnumber[nt];
 }
 
-real get_atomtype_nbparam(int nt, int param, gpp_atomtype_t ga)
+real get_atomtype_nbparam(int nt, int param, gpp_atomtype *ga)
 {
     if ((nt < 0) || (nt >= ga->nr))
     {
@@ -175,9 +177,9 @@ real get_atomtype_nbparam(int nt, int param, gpp_atomtype_t ga)
     return ga->nb[nt].c[param];
 }
 
-gpp_atomtype_t init_atomtype()
+gpp_atomtype *init_atomtype()
 {
-    gpp_atomtype_t ga;
+    gpp_atomtype *ga;
 
     snew(ga, 1);
 
@@ -191,7 +193,7 @@ gpp_atomtype_t init_atomtype()
     return ga;
 }
 
-int set_atomtype(int nt, gpp_atomtype_t ga, t_symtab *tab,
+int set_atomtype(int nt, gpp_atomtype *ga, t_symtab *tab,
                  t_atom *a, const char *name, t_param *nb,
                  int bondatomtype, int atomnumber)
 {
@@ -209,7 +211,7 @@ int set_atomtype(int nt, gpp_atomtype_t ga, t_symtab *tab,
     return nt;
 }
 
-int add_atomtype(gpp_atomtype_t ga, t_symtab *tab,
+int add_atomtype(gpp_atomtype *ga, t_symtab *tab,
                  t_atom *a, const char *name, t_param *nb,
                  int bondatomtype, int atomnumber)
 {
@@ -239,13 +241,13 @@ int add_atomtype(gpp_atomtype_t ga, t_symtab *tab,
     }
 }
 
-void print_at (FILE * out, gpp_atomtype_t ga)
+void print_at (FILE * out, gpp_atomtype *ga)
 {
     int         i;
     t_atom     *atom = ga->atom;
     t_param    *nb   = ga->nb;
 
-    fprintf (out, "[ %s ]\n", dir2str(d_atomtypes));
+    fprintf (out, "[ %s ]\n", dir2str(Directive::d_atomtypes));
     fprintf (out, "; %6s  %8s  %8s  %8s  %12s  %12s\n",
              "type", "mass", "charge", "particle", "c6", "c12");
     for (i = 0; (i < ga->nr); i++)
@@ -258,7 +260,7 @@ void print_at (FILE * out, gpp_atomtype_t ga)
     fprintf (out, "\n");
 }
 
-void done_atomtype(gpp_atomtype_t ga)
+void done_atomtype(gpp_atomtype *ga)
 {
     sfree(ga->atom);
     sfree(ga->atomname);
@@ -269,7 +271,7 @@ void done_atomtype(gpp_atomtype_t ga)
     sfree(ga);
 }
 
-static int search_atomtypes(gpp_atomtype_t ga, int *n, int typelist[],
+static int search_atomtypes(gpp_atomtype *ga, int *n, int typelist[],
                             int thistype,
                             t_param param[], int ftype)
 {
@@ -326,7 +328,7 @@ static int search_atomtypes(gpp_atomtype_t ga, int *n, int typelist[],
 
 void renum_atype(t_params plist[], gmx_mtop_t *mtop,
                  int *wall_atomtype,
-                 gpp_atomtype_t ga, bool bVerbose)
+                 gpp_atomtype *ga, bool bVerbose)
 {
     int         i, j, k, l, mi, mj, nat, nrfp, ftype, ntype;
     t_atoms    *atoms;
@@ -437,7 +439,7 @@ void renum_atype(t_params plist[], gmx_mtop_t *mtop,
     sfree(typelist);
 }
 
-void copy_atomtype_atomtypes(gpp_atomtype_t ga, t_atomtypes *atomtypes)
+void copy_atomtype_atomtypes(gpp_atomtype *ga, t_atomtypes *atomtypes)
 {
     int i, ntype;
 
index 20af27744ec83cf8a0e647208ce773de2298aafc..38bc3c08245abc2eb068d16570d418f965f00209 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2011,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2011,2014,2015,2018,2019, 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.
 #ifndef GMX_GMXPREPROCESS_GPP_ATOMTYPE_H
 #define GMX_GMXPREPROCESS_GPP_ATOMTYPE_H
 
-#include <stdio.h>
+#include <cstdio>
 
-#include "gromacs/gmxpreprocess/grompp-impl.h"
+#include "gromacs/utility/real.h"
 
 struct gmx_mtop_t;
-
-typedef struct gpp_atomtype *gpp_atomtype_t;
-
-int get_atomtype_type(const char *str, gpp_atomtype_t at);
+struct gpp_atomtype;
+struct t_atom;
+struct t_atomtypes;
+struct t_param;
+struct t_params;
+struct t_symtab;
+
+int get_atomtype_type(const char *str, gpp_atomtype *at);
 /* Return atomtype corresponding to case-insensitive str
    or NOTSET if not found */
 
-int get_atomtype_ntypes(gpp_atomtype_t at);
+int get_atomtype_ntypes(gpp_atomtype *at);
 /* Return number of atomtypes */
 
-char *get_atomtype_name(int nt, gpp_atomtype_t at);
+char *get_atomtype_name(int nt, gpp_atomtype *at);
 /* Return name corresponding to atomtype nt, or NULL if not found */
 
-real get_atomtype_massA(int nt, gpp_atomtype_t at);
-real get_atomtype_massB(int nt, gpp_atomtype_t at);
-real get_atomtype_qA(int nt, gpp_atomtype_t at);
-real get_atomtype_qB(int nt, gpp_atomtype_t at);
-int get_atomtype_ptype(int nt, gpp_atomtype_t at);
+real get_atomtype_massA(int nt, gpp_atomtype *at);
+real get_atomtype_massB(int nt, gpp_atomtype *at);
+real get_atomtype_qA(int nt, gpp_atomtype *at);
+real get_atomtype_qB(int nt, gpp_atomtype *at);
+int get_atomtype_ptype(int nt, gpp_atomtype *at);
 int get_atomtype_batype(int nt, const gpp_atomtype* at);
-int get_atomtype_atomnumber(int nt, gpp_atomtype_t at);
+int get_atomtype_atomnumber(int nt, gpp_atomtype *at);
 
 /* Return the above variable for atomtype nt, or NOTSET if not found */
 
-real get_atomtype_nbparam(int nt, int param, gpp_atomtype_t at);
+real get_atomtype_nbparam(int nt, int param, gpp_atomtype *at);
 /* Similar to the previous but returns the paramth parameter or NOTSET */
 
-gpp_atomtype_t init_atomtype();
+gpp_atomtype *init_atomtype();
 /* Return a new atomtype structure */
 
-void done_atomtype(gpp_atomtype_t at);
+void done_atomtype(gpp_atomtype *at);
 /* Free the memory in the structure */
 
-int set_atomtype(int nt, gpp_atomtype_t at, struct t_symtab *tab,
+int set_atomtype(int nt, gpp_atomtype *at, t_symtab *tab,
                  t_atom *a, const char *name, t_param *nb,
                  int bondatomtype, int atomnumber);
 /* Set the values of an existing atom type nt. Returns nt on success or
    NOTSET on error. */
 
-int add_atomtype(gpp_atomtype_t at, struct t_symtab *tab,
+int add_atomtype(gpp_atomtype *at, t_symtab *tab,
                  t_atom *a, const char *name, t_param *nb,
                  int bondatomtype, int atomnumber);
 /* Add a complete new atom type to an existing atomtype structure. Returns
    the number of the atom type. */
 
-void print_at (FILE * out, gpp_atomtype_t at);
+void print_at (FILE * out, gpp_atomtype *at);
 /* Print an atomtype record to a text file */
 
 void renum_atype(t_params plist[], gmx_mtop_t *mtop,
                  int *wall_atomtype,
-                 gpp_atomtype_t at, bool bVerbose);
+                 gpp_atomtype *at, bool bVerbose);
 
-void copy_atomtype_atomtypes(gpp_atomtype_t atype, t_atomtypes *atypes);
+void copy_atomtype_atomtypes(gpp_atomtype *atype, t_atomtypes *atypes);
 /* Copy from one structure to another */
 
 #endif
index 48ac1c4f6739daa061a2e327c028e9756f6d689b..d6d7e99d901fb9bea592261cc6265e035d34274b 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2011,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2011,2014,2015,2017,2018,2019, 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.
 #include "gromacs/utility/cstringutil.h"
 #include "gromacs/utility/smalloc.h"
 
-typedef struct {
+struct gpp_bond_atomtype
+{
     int              nr;       /* The number of atomtypes              */
     char          ***atomname; /* Names of the atomtypes               */
-} gpp_bond_atomtype;
+};
 
-int get_bond_atomtype_type(char *str, t_bond_atomtype at)
+int get_bond_atomtype_type(const char *str, gpp_bond_atomtype *at)
 {
-    gpp_bond_atomtype *ga = reinterpret_cast<gpp_bond_atomtype *>(at);
-
-    int                i;
-
-    for (i = 0; (i < ga->nr); i++)
+    for (int i = 0; (i < at->nr); i++)
     {
         /* Atom types are always case sensitive */
-        if (strcmp(str, *(ga->atomname[i])) == 0)
+        if (strcmp(str, *(at->atomname[i])) == 0)
         {
             return i;
         }
@@ -68,44 +65,38 @@ int get_bond_atomtype_type(char *str, t_bond_atomtype at)
     return NOTSET;
 }
 
-char *get_bond_atomtype_name(int nt, t_bond_atomtype at)
+char *get_bond_atomtype_name(int nt, gpp_bond_atomtype *at)
 {
-    gpp_bond_atomtype *ga = reinterpret_cast<gpp_bond_atomtype *>(at);
-
-    if ((nt < 0) || (nt >= ga->nr))
+    if ((nt < 0) || (nt >= at->nr))
     {
         return nullptr;
     }
 
-    return *(ga->atomname[nt]);
+    return *(at->atomname[nt]);
 }
 
-t_bond_atomtype init_bond_atomtype()
+gpp_bond_atomtype *init_bond_atomtype()
 {
     gpp_bond_atomtype *ga;
 
     snew(ga, 1);
 
-    return reinterpret_cast<t_bond_atomtype>(ga);
+    return ga;
 }
 
-void add_bond_atomtype(t_bond_atomtype at, t_symtab *tab,
+void add_bond_atomtype(gpp_bond_atomtype *at, t_symtab *tab,
                        char *name)
 {
-    gpp_bond_atomtype *ga = reinterpret_cast<gpp_bond_atomtype *>(at);
-
-    ga->nr++;
-    srenew(ga->atomname, ga->nr);
-    ga->atomname[ga->nr-1] = put_symtab(tab, name);
+    at->nr++;
+    srenew(at->atomname, at->nr);
+    at->atomname[at->nr-1] = put_symtab(tab, name);
 }
 
-void done_bond_atomtype(t_bond_atomtype *at)
+void done_bond_atomtype(gpp_bond_atomtype **at)
 {
-    gpp_bond_atomtype *ga = reinterpret_cast<gpp_bond_atomtype *>(*at);
-
-    sfree(ga->atomname);
-    ga->nr = 0;
-    sfree(ga);
+    sfree((*at)->atomname);
+    (*at)->nr = 0;
+    sfree(*at);
 
     *at = nullptr;
 }
index 4f0b6b26776adfadc235ed5bfe3e2604e08e7592..abd418f2e24ecafbc64d43b0a150cc384898cfb0 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2011,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2011,2014,2015,2018,2019, 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.
  * the research papers on the package. Check out http://www.gromacs.org.
  */
 
-#ifndef GMX_GMXPREPROCESS_GPP_BONDATOMTYPE_H
-#define GMX_GMXPREPROCESS_GPP_BONDATOMTYPE_H
+#ifndef GMX_GMXPREPROCESS_GPP_BOND_ATOMTYPE_H
+#define GMX_GMXPREPROCESS_GPP_BOND_ATOMTYPE_H
 
-#include <stdio.h>
+#include <cstdio>
 
-typedef struct gpp_bondatomtype *t_bond_atomtype;
+struct gpp_bond_atomtype;
+struct t_symtab;
 
-int get_bond_atomtype_type(char *str, t_bond_atomtype at);
+int get_bond_atomtype_type(const char *str, gpp_bond_atomtype *at);
 /* Return atomtype corresponding to case-insensitive str
    or NOTSET if not found */
 
-char *get_bond_atomtype_name(int nt, t_bond_atomtype at);
+char *get_bond_atomtype_name(int nt, gpp_bond_atomtype *at);
 /* Return name corresponding to atomtype nt, or NULL if not found */
 
-t_bond_atomtype init_bond_atomtype();
+gpp_bond_atomtype *init_bond_atomtype();
 /* Return a new atomtype structure */
 
-void done_bond_atomtype(t_bond_atomtype *at);
+void done_bond_atomtype(gpp_bond_atomtype **at);
 /* Free the memory in the structure */
 
-void add_bond_atomtype(t_bond_atomtype at, struct t_symtab *tab,
+void add_bond_atomtype(gpp_bond_atomtype *at, t_symtab *tab,
                        char *name);
 /* Add a complete new atom type to an existing atomtype structure */
 
index 1e445b6c990e50beebfe170239813853e8e07e00..66ef693a6bd379b3b3f1486f28ba593d65c8ec8f 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2011,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2011,2014,2015,2018,2019, 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.
@@ -41,6 +41,7 @@
 
 #include <cstdlib>
 
+#include "gromacs/gmxpreprocess/grompp-impl.h"
 #include "gromacs/gmxpreprocess/toputil.h"
 #include "gromacs/topology/ifunc.h"
 #include "gromacs/utility/fatalerror.h"
index 93f35d634a230d7f7feb1371403ec46cbfeb60be..569c079e8e96b4b58d4c150c1505e404a2c14099 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2010,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2010,2014,2015,2019, 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.
 #ifndef GMX_GMXPREPROCESS_GPP_NEXTNB_H
 #define GMX_GMXPREPROCESS_GPP_NEXTNB_H
 
-#include "gromacs/gmxpreprocess/grompp-impl.h"
+struct t_blocka;
+struct t_params;
 
-typedef struct {
+struct t_nextnb
+{
     int nr;     /* nr atoms (0 <= i < nr) (atoms->nr)          */
     int nrex;   /* with nrex lists of neighbours               */
     /* respectively containing zeroth, first   */
@@ -48,7 +50,7 @@ typedef struct {
     int  **nrexcl; /* with (0 <= nrx < nrexcl[i][nre]) neigbours    */
     /* per list stored in one 2d array of lists        */
     int ***a;      /* like this: a[i][nre][nrx]                        */
-} t_nextnb;
+};
 
 void init_nnb(t_nextnb *nnb, int nr, int nrex);
 /* Initiate the arrays for nnb (see above) */
index cf1fd66e8c6793430678d57c5be0c5e3acc3b042..bf4f03866d2859146554fc703387892793e2f33f 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2018,2019, 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.
 #include "gromacs/utility/basedefinitions.h"
 #include "gromacs/utility/real.h"
 
-struct t_block;
-struct t_blocka;
-
 #define MAXSLEN 32
 
-typedef struct {
-    bool     bSet;          /* Has this combination been set        */
-    real     c[4];          /* The non-bonded parameters            */
-} t_nbparam;
-/* The t_nbparam struct is used to temporary store the explicit
- * non-bonded parameter combinations, which will be copied to t_params.
- */
-
-typedef struct {
+struct t_param
+{
     int        a[MAXATOMLIST];   /* The atom list (eg. bonds: particle */
     /* i = a[0] (ai), j = a[1] (aj))   */
     real       c[MAXFORCEPARAM]; /* Force parameters (eg. b0 = c[0])   */
     char       s[MAXSLEN];       /* A string (instead of parameters),    *
                                   * read from the .rtp file in pdb2gmx   */
     const int &ai() const { return a[0]; }
-    int   &ai() { return a[0]; }
+    int       &ai() { return a[0]; }
     const int &aj() const { return a[1]; }
-    int   &aj() { return a[1]; }
+    int       &aj() { return a[1]; }
     const int &ak() const { return a[2]; }
-    int   &ak() { return a[2]; }
+    int       &ak() { return a[2]; }
     const int &al() const { return a[3]; }
-    int   &al() { return a[3]; }
+    int       &al() { return a[3]; }
     const int &am() const { return a[4]; }
-    int   &am() { return a[4]; }
+    int       &am() { return a[4]; }
 
     real      &c0() { return c[0]; }
     real      &c1() { return c[1]; }
     real      &c2() { return c[2]; }
-} t_param;
+};
 
-typedef struct {        // NOLINT (clang-analyzer-optin.performance.Padding)
+struct t_params
+{                       // NOLINT (clang-analyzer-optin.performance.Padding)
     int          nr;    /* The number of bonds in this record   */
     int          maxnr; /* The amount of elements in the array  */
     t_param     *param; /* Array of parameters (dim: nr or nr*nr) */
@@ -93,15 +84,16 @@ typedef struct {        // NOLINT (clang-analyzer-optin.performance.Padding)
 
     int        *cmap_types;   /* Store the five atomtypes followed by a number that identifies the type */
     int         nct;          /* Number of allocated elements in cmap_types */
+};
 
-} t_params;
-
-typedef struct {
+struct t_excls
+{
     int            nr;      /* The number of exclusions             */
     int           *e;       /* The excluded atoms                   */
-} t_excls;
+};
 
-typedef struct {
+struct t_molinfo
+{
     char            **name;
     int               nrexcl;       /* Number of exclusions per atom   */
     bool              excl_set;     /* Have exclusions been generated? */
@@ -111,59 +103,15 @@ typedef struct {
     t_block           mols;         /* Molecules                            */
     t_blocka          excls;        /* Exclusions                           */
     t_params          plist[F_NRE]; /* Parameters in old style              */
-} t_molinfo;
+};
 
-typedef struct {
+struct t_mols
+{
     char *name;
     int   nr;
-} t_mols;
+};
 
 bool is_int(double x);
 /* Returns TRUE when x is integer */
 
-/* Must correspond to strings in topdirs.c */
-typedef enum {
-    d_defaults,
-    d_atomtypes,
-    d_bondtypes,
-    d_constrainttypes,
-    d_pairtypes,
-    d_angletypes,
-    d_dihedraltypes,
-    d_nonbond_params,
-    d_implicit_genborn_params,
-    d_implicit_surface_params,
-    d_cmaptypes,
-    d_moleculetype,
-    d_atoms,
-    d_vsites2,
-    d_vsites3,
-    d_vsites4,
-    d_vsitesn,
-    d_bonds,
-    d_exclusions,
-    d_pairs,
-    d_pairs_nb,
-    d_angles,
-    d_dihedrals,
-    d_constraints,
-    d_settles,
-    d_polarization,
-    d_water_polarization,
-    d_thole_polarization,
-    d_system,
-    d_molecules,
-    d_position_restraints,
-    d_angle_restraints,
-    d_angle_restraints_z,
-    d_distance_restraints,
-    d_orientation_restraints,
-    d_dihedral_restraints,
-    d_cmap,
-    d_intermolecular_interactions,
-    d_maxdir,
-    d_invalid,
-    d_none
-} directive;
-
 #endif
index 2485d5a2e222325751ade6e26cf086dd1c903ca9..1c19a678378a9e940675332069245dd38376b1b7 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -79,6 +79,7 @@
 #include "gromacs/mdlib/compute_io.h"
 #include "gromacs/mdlib/constr.h"
 #include "gromacs/mdlib/perf_est.h"
+#include "gromacs/mdlib/qmmm.h"
 #include "gromacs/mdlib/sim_util.h"
 #include "gromacs/mdrunutility/mdmodules.h"
 #include "gromacs/mdtypes/inputrec.h"
@@ -180,10 +181,10 @@ static void check_eg_vs_cg(gmx_mtop_t *mtop)
             {
                 /* Get the energy group of the first atom in this charge group */
                 firstj  = astart + molt->cgs.index[cg];
-                firsteg = getGroupType(&mtop->groups, egcENER, firstj);
+                firsteg = getGroupType(mtop->groups, egcENER, firstj);
                 for (j = molt->cgs.index[cg]+1; j < molt->cgs.index[cg+1]; j++)
                 {
-                    eg = getGroupType(&mtop->groups, egcENER, astart+j);
+                    eg = getGroupType(mtop->groups, egcENER, astart+j);
                     if (eg != firsteg)
                     {
                         gmx_fatal(FARGS, "atoms %d and %d in charge group %d of molecule type '%s' are in different energy groups",
@@ -196,7 +197,7 @@ static void check_eg_vs_cg(gmx_mtop_t *mtop)
     }
 }
 
-static void check_cg_sizes(const char *topfn, const t_block *cgs, warninp_t wi)
+static void check_cg_sizes(const char *topfn, const t_block *cgs, warninp *wi)
 {
     int  maxsize, cg;
     char warn_buf[STRLEN];
@@ -224,7 +225,7 @@ static void check_cg_sizes(const char *topfn, const t_block *cgs, warninp_t wi)
     }
 }
 
-static void check_bonds_timestep(const gmx_mtop_t *mtop, double dt, warninp_t wi)
+static void check_bonds_timestep(const gmx_mtop_t *mtop, double dt, warninp *wi)
 {
     /* This check is not intended to ensure accurate integration,
      * rather it is to signal mistakes in the mdp settings.
@@ -363,36 +364,31 @@ static void check_bonds_timestep(const gmx_mtop_t *mtop, double dt, warninp_t wi
 
 static void check_vel(gmx_mtop_t *mtop, rvec v[])
 {
-    gmx_mtop_atomloop_all_t aloop;
-    const t_atom           *atom;
-    int                     a;
-
-    aloop = gmx_mtop_atomloop_all_init(mtop);
-    while (gmx_mtop_atomloop_all_next(aloop, &a, &atom))
+    for (const AtomProxy &atomP : AtomRange(*mtop))
     {
-        if (atom->ptype == eptShell ||
-            atom->ptype == eptBond  ||
-            atom->ptype == eptVSite)
+        const t_atom &local = atomP.atom();
+        int           i     = atomP.globalAtomNumber();
+        if (local.ptype == eptShell ||
+            local.ptype == eptBond  ||
+            local.ptype == eptVSite)
         {
-            clear_rvec(v[a]);
+            clear_rvec(v[i]);
         }
     }
 }
 
 static void check_shells_inputrec(gmx_mtop_t *mtop,
                                   t_inputrec *ir,
-                                  warninp_t   wi)
+                                  warninp    *wi)
 {
-    gmx_mtop_atomloop_all_t aloop;
-    const t_atom           *atom;
-    int                     a, nshells = 0;
-    char                    warn_buf[STRLEN];
+    int                        nshells = 0;
+    char                       warn_buf[STRLEN];
 
-    aloop = gmx_mtop_atomloop_all_init(mtop);
-    while (gmx_mtop_atomloop_all_next(aloop, &a, &atom))
+    for (const AtomProxy &atomP : AtomRange(*mtop))
     {
-        if (atom->ptype == eptShell ||
-            atom->ptype == eptBond)
+        const t_atom &local = atomP.atom();
+        if (local.ptype == eptShell ||
+            local.ptype == eptBond)
         {
             nshells++;
         }
@@ -499,12 +495,12 @@ static void
 new_status(const char *topfile, const char *topppfile, const char *confin,
            t_gromppopts *opts, t_inputrec *ir, gmx_bool bZero,
            bool bGenVel, bool bVerbose, t_state *state,
-           gpp_atomtype_t atype, gmx_mtop_t *sys,
+           gpp_atomtype *atype, gmx_mtop_t *sys,
            int *nmi, t_molinfo **mi, t_molinfo **intermolecular_interactions,
            t_params plist[],
            int *comb, double *reppow, real *fudgeQQ,
            gmx_bool bMorse,
-           warninp_t wi)
+           warninp *wi)
 {
     t_molinfo                  *molinfo = nullptr;
     std::vector<gmx_molblock_t> molblock;
@@ -670,14 +666,13 @@ new_status(const char *topfile, const char *topppfile, const char *confin,
     if (bGenVel)
     {
         real                   *mass;
-        gmx_mtop_atomloop_all_t aloop;
-        const t_atom           *atom;
 
         snew(mass, state->natoms);
-        aloop = gmx_mtop_atomloop_all_init(sys);
-        while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
+        for (const AtomProxy &atomP : AtomRange(*sys))
         {
-            mass[i] = atom->m;
+            const t_atom &local = atomP.atom();
+            int           i     = atomP.globalAtomNumber();
+            mass[i] = local.m;
         }
 
         if (opts->seed == -1)
@@ -820,7 +815,7 @@ static void read_posres(gmx_mtop_t *mtop, t_molinfo *molinfo, gmx_bool bTopB,
                         const char *fn,
                         int rc_scaling, int ePBC,
                         rvec com,
-                        warninp_t wi)
+                        warninp *wi)
 {
     gmx_bool           *hadAtom;
     rvec               *x, *v;
@@ -997,7 +992,7 @@ static void gen_posres(gmx_mtop_t *mtop, t_molinfo *mi,
                        const char *fnA, const char *fnB,
                        int rc_scaling, int ePBC,
                        rvec com, rvec comB,
-                       warninp_t wi)
+                       warninp *wi)
 {
     read_posres  (mtop, mi, FALSE, fnA, rc_scaling, ePBC, com, wi);
     /* It is safer to simply read the b-state posres rather than trying
@@ -1006,8 +1001,8 @@ static void gen_posres(gmx_mtop_t *mtop, t_molinfo *mi,
     read_posres(mtop, mi, TRUE, fnB, rc_scaling, ePBC, comB, wi);
 }
 
-static void set_wall_atomtype(gpp_atomtype_t at, t_gromppopts *opts,
-                              t_inputrec *ir, warninp_t wi)
+static void set_wall_atomtype(gpp_atomtype *at, t_gromppopts *opts,
+                              t_inputrec *ir, warninp *wi)
 {
     int  i;
     char warn_buf[STRLEN];
@@ -1197,7 +1192,7 @@ static void init_cmap_grid(gmx_cmap_t *cmap_grid, int ngrid, int grid_spacing)
 }
 
 
-static int count_constraints(const gmx_mtop_t *mtop, t_molinfo *mi, warninp_t wi)
+static int count_constraints(const gmx_mtop_t *mtop, t_molinfo *mi, warninp *wi)
 {
     int             count, count_mol, i;
     t_params       *plist;
@@ -1240,15 +1235,12 @@ static real calc_temp(const gmx_mtop_t *mtop,
                       const t_inputrec *ir,
                       rvec             *v)
 {
-    gmx_mtop_atomloop_all_t aloop;
-    const t_atom           *atom;
-    int                     a;
-
-    double                  sum_mv2 = 0;
-    aloop = gmx_mtop_atomloop_all_init(mtop);
-    while (gmx_mtop_atomloop_all_next(aloop, &a, &atom))
+    double                     sum_mv2 = 0;
+    for (const AtomProxy &atomP : AtomRange(*mtop))
     {
-        sum_mv2 += atom->m*norm2(v[a]);
+        const t_atom &local = atomP.atom();
+        int           i     = atomP.globalAtomNumber();
+        sum_mv2 += local.m*norm2(v[i]);
     }
 
     double nrdf = 0;
@@ -1261,7 +1253,7 @@ static real calc_temp(const gmx_mtop_t *mtop,
 }
 
 static real get_max_reference_temp(const t_inputrec *ir,
-                                   warninp_t         wi)
+                                   warninp          *wi)
 {
     real         ref_t;
     int          i;
@@ -1298,7 +1290,7 @@ static real get_max_reference_temp(const t_inputrec *ir,
  */
 static void checkForUnboundAtoms(const gmx_moltype_t     *molt,
                                  gmx_bool                 bVerbose,
-                                 warninp_t                wi)
+                                 warninp                 *wi)
 {
     const t_atoms *atoms = &molt->atoms;
 
@@ -1356,7 +1348,7 @@ static void checkForUnboundAtoms(const gmx_moltype_t     *molt,
 /* Checks all moleculetypes for unbound atoms */
 static void checkForUnboundAtoms(const gmx_mtop_t     *mtop,
                                  gmx_bool              bVerbose,
-                                 warninp_t             wi)
+                                 warninp              *wi)
 {
     for (const gmx_moltype_t &molt : mtop->moltype)
     {
@@ -1456,7 +1448,7 @@ static bool haveDecoupledModeInMol(const gmx_moltype_t            &molt,
  */
 static void checkDecoupledModeAccuracy(const gmx_mtop_t *mtop,
                                        const t_inputrec *ir,
-                                       warninp_t         wi)
+                                       warninp          *wi)
 {
     /* We only have issues with decoupled modes with normal MD.
      * With stochastic dynamics equipartitioning is enforced strongly.
@@ -1542,7 +1534,7 @@ static void set_verlet_buffer(const gmx_mtop_t *mtop,
                               t_inputrec       *ir,
                               real              buffer_temp,
                               matrix            box,
-                              warninp_t         wi)
+                              warninp          *wi)
 {
     real                   rlist_1x1;
     int                    n_nonlin_vsite;
@@ -1689,7 +1681,7 @@ int gmx_grompp(int argc, char *argv[])
     t_gromppopts          *opts;
     int                    nmi;
     t_molinfo             *mi, *intermolecular_interactions;
-    gpp_atomtype_t         atype;
+    gpp_atomtype          *atype;
     int                    nvsite, comb;
     t_params              *plist;
     real                   fudgeQQ;
@@ -1700,7 +1692,7 @@ int gmx_grompp(int argc, char *argv[])
     gmx_bool               have_atomnumber;
     gmx_output_env_t      *oenv;
     gmx_bool               bVerbose = FALSE;
-    warninp_t              wi;
+    warninp               *wi;
     char                   warn_buf[STRLEN];
 
     t_filenm               fnm[] = {
@@ -2137,7 +2129,7 @@ int gmx_grompp(int argc, char *argv[])
         pr_symtab(debug, 0, "After close", &sys.symtab);
     }
 
-    /* make exclusions between QM atoms */
+    /* make exclusions between QM atoms and remove charges if needed */
     if (ir->bQMMM)
     {
         if (ir->QMMMscheme == eQMMMschemenormal && ir->ns_type == ensSIMPLE)
@@ -2148,6 +2140,11 @@ int gmx_grompp(int argc, char *argv[])
         {
             generate_qmexcl(&sys, ir, wi, GmxQmmmMode::GMX_QMMM_ORIGINAL);
         }
+        if (ir->QMMMscheme != eQMMMschemeoniom)
+        {
+            std::vector<int> qmmmAtoms = qmmmAtomIndices(*ir, sys);
+            removeQmmmAtomCharges(&sys, qmmmAtoms);
+        }
     }
 
     if (ir->eI == eiMimic)
@@ -2231,7 +2228,7 @@ int gmx_grompp(int argc, char *argv[])
         }
     }
 
-    struct pull_t *pull = nullptr;
+    pull_t *pull = nullptr;
 
     if (ir->bPull)
     {
index 71da9aece88da71844c2c2e3266763ae4fde770c..b968c5f3a73b7a573762b77ea017142f2c410ae7 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -46,6 +46,7 @@
 #include <vector>
 
 #include "gromacs/gmxpreprocess/fflibutil.h"
+#include "gromacs/gmxpreprocess/hackblock.h"
 #include "gromacs/gmxpreprocess/notset.h"
 #include "gromacs/utility/arraysize.h"
 #include "gromacs/utility/cstringutil.h"
index c8e2df6f044bdfe21e3e2a31225b150c80dd072c..2b8d8f6bfc0673045af82c595f8e2dfaffd6ca4f 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2011,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2011,2014,2015,2019, 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.
 #ifndef GMX_GMXPREPROCESS_H_DB_H
 #define GMX_GMXPREPROCESS_H_DB_H
 
-#include <stdio.h>
+#include <cstdio>
 
-#include "gromacs/gmxpreprocess/hackblock.h"
+struct t_hack;
+struct t_hackblock;
 
 /* functions for the h-database */
 
index 7a300f1775292492726e6a193ed15a762e7b78c8..20ea7cb5a875c7adf10676f1d3c001099aebc492 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2011,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2011,2014,2015,2017,2018,2019, 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.
@@ -44,6 +44,7 @@
 #include "gromacs/gmxpreprocess/notset.h"
 #include "gromacs/math/vec.h"
 #include "gromacs/mdtypes/md_enums.h"
+#include "gromacs/topology/atoms.h"
 #include "gromacs/utility/cstringutil.h"
 #include "gromacs/utility/fatalerror.h"
 #include "gromacs/utility/smalloc.h"
index c8553b6bcc79cf167cde293636cadac500c954b7..e13145274925357844d807f4b06a067652e31cf2 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2018,2019, 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.
 #ifndef GMX_GMXPREPROCESS_HACKBLOCK_H
 #define GMX_GMXPREPROCESS_HACKBLOCK_H
 
-#include "gromacs/gmxpreprocess/gpp_atomtype.h"
-#include "gromacs/gmxpreprocess/grompp-impl.h"
-#include "gromacs/topology/symtab.h"
+#include <cstdio>
+
+#include "gromacs/topology/ifunc.h"
+
+struct t_atom;
 
 /* Used for reading .rtp/.tdb */
 /* ebtsBONDS must be the first, new types can be added to the end */
@@ -55,27 +57,30 @@ extern const int   btsNiatoms[ebtsNR];
    free/clear/copy/merge_t_* functions stay updated */
 
 /* BONDEDS */
-typedef struct {
+struct t_rbonded
+{
     char  *a[MAXATOMLIST]; /* atom names */
     char  *s;              /* optional define string which gets copied from
                               .rtp/.tdb to .top and will be parsed by cpp
                               during grompp */
-    bool match;            /* boolean to mark that the entry has been found */
+    bool     match;        /* boolean to mark that the entry has been found */
     char*   &ai() { return a[0]; }
     char*   &aj() { return a[1]; }
     char*   &ak() { return a[2]; }
     char*   &al() { return a[3]; }
     char*   &am() { return a[4]; }
-} t_rbonded;
+};
 
-typedef struct {
+struct t_rbondeds
+{
     int        type;     /* The type of bonded interaction */
     int        nb;       /* number of bondeds */
     t_rbonded *b;        /* bondeds */
-} t_rbondeds;
+};
 
 /* RESIDUES (rtp) */
-typedef struct {
+struct t_restp
+{
     char         *resname;
     /* The base file name this rtp entry was read from */
     char         *filebase;
@@ -91,10 +96,11 @@ typedef struct {
     bool          bRemoveDihedralIfWithImproper;
     /* list of bonded interactions to add */
     t_rbondeds    rb[ebtsNR];
-} t_restp;
+};
 
 /* Block to hack residues */
-typedef struct {
+struct t_hack
+{
     int      nr;      /* Number of atoms to hack    */
     char    *oname;   /* Old name                   */
     char    *nname;   /* New name                   */
@@ -116,9 +122,10 @@ typedef struct {
     char*      &aj() { return a[1]; }
     char*      &ak() { return a[2]; }
     char*      &al() { return a[3]; }
-} t_hack;
+};
 
-typedef struct {
+struct t_hackblock
+{
     char      *name;     /* Name of hack block (residue or terminus) */
     char      *filebase; /* The base file name this entry was read from */
     int        nhack;    /* Number of atoms to hack                  */
@@ -126,18 +133,7 @@ typedef struct {
     t_hack    *hack;     /* Hack list                                */
     /* list of bonded interactions to add */
     t_rbondeds rb[ebtsNR];
-} t_hackblock;
-
-typedef struct {
-    char *res1, *res2;
-    char *atom1, *atom2;
-    char *newres1, *newres2;
-    int   nbond1, nbond2;
-    real  length;
-} t_specbond;
-
-t_specbond *get_specbonds(int *nspecbond);
-void done_specbonds(int nsb, t_specbond sb[]);
+};
 
 void free_t_restp(int nrtp, t_restp **rtp);
 void free_t_hack(int nh, t_hack **h);
index 7de66843a9ac398fc317c642a1d07f86b7ec160d..4f70d6f49f64df4dc55565be8919d056ffd8852c 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2019, 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.
@@ -39,7 +39,9 @@
 #define GMX_GMXPREPROCESS_HIZZIE_H
 
 #include "gromacs/math/vectypes.h"
-#include "gromacs/topology/atoms.h"
+#include "gromacs/utility/real.h"
+
+struct t_atoms;
 
 void set_histp(t_atoms *pdba, rvec *x, real angle, real distance);
 /* calculate HIStidine protonation state */
index 9b477f91ef22018be891c24dafa90ff2b9a5dfbb..268b56e125bfea63d613b9513a5c24e3640f862e 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -173,12 +173,11 @@ static void insert_mols(int nmol_insrt, int ntry, int seed,
                         RotationType enum_rot)
 {
     fprintf(stderr, "Initialising inter-atomic distances...\n");
-    gmx_atomprop_t          aps = gmx_atomprop_init();
+    AtomProperties          aps;
     std::vector<real>       exclusionDistances(
-            makeExclusionDistances(atoms, aps, defaultDistance, scaleFactor));
+            makeExclusionDistances(atoms, &aps, defaultDistance, scaleFactor));
     const std::vector<real> exclusionDistances_insrt(
-            makeExclusionDistances(&atoms_insrt, aps, defaultDistance, scaleFactor));
-    gmx_atomprop_destroy(aps);
+            makeExclusionDistances(&atoms_insrt, &aps, defaultDistance, scaleFactor));
 
     const real       maxInsertRadius
         = *std::max_element(exclusionDistances_insrt.begin(),
index 9392081204531bf8d295ae0578eef2d76b159e58..ad524735d83c51af9903f1610e5eb2fa1901a63f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2014,2015,2016,2017,2018,2019, 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.
 
 #include "makeexclusiondistances.h"
 
+#include <string>
 #include <vector>
 
 #include "gromacs/topology/atomprop.h"
 #include "gromacs/topology/atoms.h"
 
 std::vector<real>
-makeExclusionDistances(const t_atoms *a, gmx_atomprop_t aps,
+makeExclusionDistances(const t_atoms *a, AtomProperties *aps,
                        real defaultDistance, real scaleFactor)
 {
     std::vector<real> exclusionDistances;
@@ -52,10 +53,10 @@ makeExclusionDistances(const t_atoms *a, gmx_atomprop_t aps,
         exclusionDistances.reserve(a->nr);
         for (int i = 0; i < a->nr; ++i)
         {
-            real value;
-            if (!gmx_atomprop_query(aps, epropVDW,
-                                    *(a->resinfo[a->atom[i].resind].name),
-                                    *(a->atomname[i]), &value))
+            real        value;
+            if (!aps->setAtomProperty(epropVDW,
+                                      std::string(*(a->resinfo[a->atom[i].resind].name)),
+                                      std::string(*(a->atomname[i])), &value))
             {
                 value = defaultDistance;
             }
index 8d0a3739310c5b5e2a27d721cf2e43f61f777192..fd89e741f146163a581b29b53ed2a8cbb412665d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2014,2015,2016,2018,2019, 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.
@@ -39,7 +39,7 @@
 
 #include "gromacs/utility/real.h"
 
-struct gmx_atomprop;
+class AtomProperties;
 struct t_atoms;
 
 /*! \brief Allocate and fill an array of inter-atomic half distances
@@ -49,7 +49,7 @@ struct t_atoms;
  * insert-molecules for deciding whether molecules clash. The return
  * pointer should be freed by the caller. */
 std::vector<real>
-makeExclusionDistances(const t_atoms *a, gmx_atomprop *aps,
+makeExclusionDistances(const t_atoms *a, AtomProperties *aps,
                        real defaultDistance, real scaleFactor);
 
 #endif
index a952ee5d1c85480fb647939768448bce0c49160a..836cec2227df606370d0c2698ef531d9e410ad50 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2008, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -49,6 +49,7 @@
 #include "gromacs/gmxpreprocess/fflibutil.h"
 #include "gromacs/gmxpreprocess/gpp_atomtype.h"
 #include "gromacs/gmxpreprocess/gpp_nextnb.h"
+#include "gromacs/gmxpreprocess/grompp-impl.h"
 #include "gromacs/gmxpreprocess/notset.h"
 #include "gromacs/gmxpreprocess/pdb2top.h"
 #include "gromacs/gmxpreprocess/toppush.h"
@@ -190,8 +191,8 @@ static int match_str(const char *atom, const char *template_string)
     }
 }
 
-int nm2type(int nnm, t_nm2type nm2t[], struct t_symtab *tab, t_atoms *atoms,
-            gpp_atomtype_t atype, int *nbonds, t_params *bonds)
+int nm2type(int nnm, t_nm2type nm2t[], t_symtab *tab, t_atoms *atoms,
+            gpp_atomtype *atype, int *nbonds, t_params *bonds)
 {
     int      cur = 0;
 #define prev (1-cur)
index e86af8228d1382ea915687baf13d1be1f40a9479..d9973d57eede4253c2739ca0ad4349f5cae35fae 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2008, The GROMACS development team.
- * Copyright (c) 2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2019, 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.
 #ifndef GMX_GMX_NM2TYPE_H
 #define GMX_GMX_NM2TYPE_H
 
-#include <stdio.h>
+#include <cstdio>
 
-#include "gromacs/gmxpreprocess/gpp_atomtype.h"
-#include "gromacs/gmxpreprocess/grompp-impl.h"
-#include "gromacs/topology/atoms.h"
+struct gpp_atomtype;
+struct t_atoms;
+struct t_params;
+struct t_symtab;
 
-typedef struct {
+struct t_nm2type
+{
     char    *elem, *type;
     double   q, m;
     int      nbonds;
     char   **bond;
     double  *blen;
-} t_nm2type;
+};
 
 t_nm2type *rd_nm2type(const char *ffdir, int *nnm);
 /* Read the name 2 type database. nnm is the number of entries
@@ -59,8 +61,8 @@ t_nm2type *rd_nm2type(const char *ffdir, int *nnm);
 void dump_nm2type(FILE *fp, int nnm, t_nm2type nm2t[]);
 /* Dump the database for debugging. Can be reread by the program */
 
-int nm2type(int nnm, t_nm2type nm2t[], struct t_symtab *tab, t_atoms *atoms,
-            gpp_atomtype_t atype, int *nbonds, t_params *bond);
+int nm2type(int nnm, t_nm2type nm2t[], t_symtab *tab, t_atoms *atoms,
+            gpp_atomtype *atype, int *nbonds, t_params *bond);
 /* Try to determine the atomtype (force field dependent) for the atoms
  * with help of the bond list
  */
index b5006f1fad59192e902b0fbeaeca7425d8543e81..4ec60422b5a393501197b4ade60aba134c9eca11 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -56,7 +56,9 @@
 #include "gromacs/gmxlib/conformation-utilities.h"
 #include "gromacs/gmxpreprocess/fflibutil.h"
 #include "gromacs/gmxpreprocess/genhydro.h"
+#include "gromacs/gmxpreprocess/grompp-impl.h"
 #include "gromacs/gmxpreprocess/h_db.h"
+#include "gromacs/gmxpreprocess/hackblock.h"
 #include "gromacs/gmxpreprocess/hizzie.h"
 #include "gromacs/gmxpreprocess/pdb2top.h"
 #include "gromacs/gmxpreprocess/pgutil.h"
@@ -101,7 +103,7 @@ static const char *res2bb_notermini(const char *name,
     int i;
 
     i = 0;
-    while (i < nrr && gmx_strcasecmp(name, rr[i].gmx) != 0)
+    while (i < nrr && !gmx::equalCaseInsensitive(name, rr[i].gmx))
     {
         i++;
     }
@@ -401,7 +403,7 @@ static void rename_pdbres(t_atoms *pdba, const char *oldnm, const char *newnm,
     for (i = 0; (i < pdba->nres); i++)
     {
         resnm = *pdba->resinfo[i].name;
-        if ((bFullCompare && (gmx_strcasecmp(resnm, oldnm) == 0)) ||
+        if ((bFullCompare && (gmx::equalCaseInsensitive(resnm, oldnm))) ||
             (!bFullCompare && strstr(resnm, oldnm) != nullptr))
         {
             /* Rename the residue name (not the rtp name) */
@@ -420,7 +422,7 @@ static void rename_bb(t_atoms *pdba, const char *oldnm, const char *newnm,
     {
         /* We have not set the rtp name yes, use the residue name */
         bbnm = *pdba->resinfo[i].name;
-        if ((bFullCompare && (gmx_strcasecmp(bbnm, oldnm) == 0)) ||
+        if ((bFullCompare && (gmx::equalCaseInsensitive(bbnm, oldnm))) ||
             (!bFullCompare && strstr(bbnm, oldnm) != nullptr))
         {
             /* Change the rtp builing block name */
@@ -535,8 +537,8 @@ static void write_posres(const char *fn, t_atoms *pdba, real fc)
 static int read_pdball(const char *inf, bool bOutput, const char *outf, char **title,
                        t_atoms *atoms, rvec **x,
                        int *ePBC, matrix box, bool bRemoveH,
-                       t_symtab *symtab, gmx_residuetype_t *rt, const char *watres,
-                       gmx_atomprop_t aps, bool bVerbose)
+                       t_symtab *symtab, ResidueType *rt, const char *watres,
+                       AtomProperties *aps, bool bVerbose)
 /* Read a pdb file. (containing proteins) */
 {
     int natom, new_natom, i;
@@ -584,7 +586,8 @@ static int read_pdball(const char *inf, bool bOutput, const char *outf, char **t
     rename_pdbres(atoms, "WAT", watres, false, symtab);
 
     rename_atoms("xlateat.dat", nullptr,
-                 atoms, symtab, nullptr, true, rt, true, bVerbose);
+                 atoms, symtab, nullptr, true,
+                 rt, true, bVerbose);
 
     if (natom == 0)
     {
@@ -701,10 +704,8 @@ static void sort_pdbatoms(t_restp restp[],
 {
     t_atoms     *pdba, *pdbnew;
     rvec       **xnew;
-    int          i, j;
     t_restp     *rptr;
     t_pdbindex  *pdbi;
-    int         *a;
     char        *atomnm;
 
     pdba   = *pdbaptr;
@@ -713,17 +714,13 @@ static void sort_pdbatoms(t_restp restp[],
     snew(xnew, 1);
     snew(pdbi, natoms);
 
-    for (i = 0; i < natoms; i++)
+    for (int i = 0; i < natoms; i++)
     {
         atomnm = *pdba->atomname[i];
         rptr   = &restp[pdba->atom[i].resind];
-        for (j = 0; (j < rptr->natom); j++)
-        {
-            if (gmx_strcasecmp(atomnm, *(rptr->atomname[j])) == 0)
-            {
-                break;
-            }
-        }
+        int j = std::find_if(rptr->atomname, rptr->atomname+rptr->natom,
+                             [&atomnm](char** it){return gmx::equalCaseInsensitive(atomnm, *it); })
+            - rptr->atomname;
         if (j == rptr->natom)
         {
             char buf[STRLEN];
@@ -754,7 +751,7 @@ static void sort_pdbatoms(t_restp restp[],
     std::sort(pdbi, pdbi+natoms, pdbicomp);
 
     /* pdba is sorted in pdbnew using the pdbi index */
-    snew(a, natoms);
+    std::vector<int> a(natoms);
     snew(pdbnew, 1);
     init_t_atoms(pdbnew, natoms, true);
     snew(*xnew, natoms);
@@ -762,7 +759,7 @@ static void sort_pdbatoms(t_restp restp[],
     pdbnew->nres = pdba->nres;
     sfree(pdbnew->resinfo);
     pdbnew->resinfo = pdba->resinfo;
-    for (i = 0; i < natoms; i++)
+    for (int i = 0; i < natoms; i++)
     {
         pdbnew->atom[i]     = pdba->atom[pdbi[i].index];
         pdbnew->atomname[i] = pdba->atomname[pdbi[i].index];
@@ -780,9 +777,8 @@ static void sort_pdbatoms(t_restp restp[],
     /* copy the sorted pdbnew back to pdba */
     *pdbaptr = pdbnew;
     *x       = *xnew;
-    add_grp(block, gnames, natoms, a, "prot_sort");
+    add_grp(block, gnames, a, "prot_sort");
     sfree(xnew);
-    sfree(a);
     sfree(pdbi);
 }
 
@@ -853,10 +849,10 @@ static int remove_duplicate_atoms(t_atoms *pdba, rvec x[], bool bVerbose)
 }
 
 static void
-checkResidueTypeSanity(t_atoms *            pdba,
-                       int                  r0,
-                       int                  r1,
-                       gmx_residuetype_t *  rt)
+checkResidueTypeSanity(t_atoms     *pdba,
+                       int          r0,
+                       int          r1,
+                       ResidueType *rt)
 {
     std::string startResidueString = gmx::formatString("%s%d", *pdba->resinfo[r0].name, pdba->resinfo[r0].nr);
     std::string endResidueString   = gmx::formatString("%s%d", *pdba->resinfo[r1-1].name, pdba->resinfo[r1-1].nr);
@@ -892,14 +888,13 @@ checkResidueTypeSanity(t_atoms *            pdba,
     if (chainID0 != ' ')
     {
         bool        allResiduesHaveSameType = true;
-        const char *restype0;
-        const char *restype;
-        gmx_residuetype_get_type(rt, *pdba->resinfo[r0].name, &restype0);
+        std::string restype;
+        std::string restype0 = rt->typeNameForIndexedResidue(*pdba->resinfo[r0].name);
 
         for (int i = r0 + 1; i < r1; i++)
         {
-            gmx_residuetype_get_type(rt, *pdba->resinfo[i].name, &restype);
-            if (gmx_strcasecmp(restype, restype0))
+            restype = rt->typeNameForIndexedResidue(*pdba->resinfo[i].name);
+            if (!gmx::equalCaseInsensitive(restype, restype0))
             {
                 allResiduesHaveSameType = false;
                 residueString           = gmx::formatString("%s%d", *pdba->resinfo[i].name, pdba->resinfo[i].nr);
@@ -918,17 +913,16 @@ checkResidueTypeSanity(t_atoms *            pdba,
                       "such as ligands, they should not have the same chain ID as the "
                       "adjacent protein chain since it's a separate molecule.",
                       startResidueString.c_str(), endResidueString.c_str(),
-                      restype0, residueString.c_str(), restype);
+                      restype0.c_str(), residueString.c_str(), restype.c_str());
         }
     }
 }
 
 static void find_nc_ter(t_atoms *pdba, int r0, int r1, int *r_start, int *r_end,
-                        gmx_residuetype_t *rt)
+                        ResidueType *rt)
 {
     int         i;
-    const char *p_startrestype;
-    const char *p_restype;
+    std::string p_startrestype;
 
     *r_start = -1;
     *r_end   = -1;
@@ -954,13 +948,15 @@ static void find_nc_ter(t_atoms *pdba, int r0, int r1, int *r_start, int *r_end,
     /* Find the starting terminus (typially N or 5') */
     for (i = r0; i < r1 && *r_start == -1; i++)
     {
-        gmx_residuetype_get_type(rt, *pdba->resinfo[i].name, &p_startrestype);
-        if (!gmx_strcasecmp(p_startrestype, "Protein") || !gmx_strcasecmp(p_startrestype, "DNA") || !gmx_strcasecmp(p_startrestype, "RNA") )
+        p_startrestype = rt->typeNameForIndexedResidue(*pdba->resinfo[i].name);
+        if (gmx::equalCaseInsensitive(p_startrestype, "Protein") ||
+            gmx::equalCaseInsensitive(p_startrestype, "DNA") ||
+            gmx::equalCaseInsensitive(p_startrestype, "RNA") )
         {
             printf("Identified residue %s%d as a starting terminus.\n", *pdba->resinfo[i].name, pdba->resinfo[i].nr);
             *r_start = i;
         }
-        else if (!gmx_strcasecmp(p_startrestype, "Ion"))
+        else if (gmx::equalCaseInsensitive(p_startrestype, "Ion"))
         {
             if (ionNotes < 5)
             {
@@ -1006,14 +1002,14 @@ static void find_nc_ter(t_atoms *pdba, int r0, int r1, int *r_start, int *r_end,
     if (*r_start >= 0)
     {
         /* Go through the rest of the residues, check that they are the same class, and identify the ending terminus. */
-        for (i = *r_start; i < r1; i++)
+        for (int i = *r_start; i < r1; i++)
         {
-            gmx_residuetype_get_type(rt, *pdba->resinfo[i].name, &p_restype);
-            if (!gmx_strcasecmp(p_restype, p_startrestype) && endWarnings == 0)
+            std::string p_restype = rt->typeNameForIndexedResidue(*pdba->resinfo[i].name);
+            if (!gmx::equalCaseInsensitive(p_restype, p_startrestype) && endWarnings == 0)
             {
                 *r_end = i;
             }
-            else if (!gmx_strcasecmp(p_startrestype, "Ion"))
+            else if (gmx::equalCaseInsensitive(p_startrestype, "Ion"))
             {
                 if (ionNotes < 5)
                 {
@@ -1038,8 +1034,8 @@ static void find_nc_ter(t_atoms *pdba, int r0, int r1, int *r_start, int *r_end,
                            "introduce a break, but that will be catastrophic if they should in fact be\n"
                            "linked. Please check your structure, and add %s to residuetypes.dat\n"
                            "if this was not correct.\n\n",
-                           *pdba->resinfo[i].name, pdba->resinfo[i].nr, p_restype,
-                           *pdba->resinfo[*r_start].name, pdba->resinfo[*r_start].nr, p_startrestype, *pdba->resinfo[i].name);
+                           *pdba->resinfo[i].name, pdba->resinfo[i].nr, p_restype.c_str(),
+                           *pdba->resinfo[*r_start].name, pdba->resinfo[*r_start].nr, p_startrestype.c_str(), *pdba->resinfo[i].name);
                 }
                 if (endWarnings == 4)
                 {
@@ -1671,8 +1667,7 @@ int pdb2gmx::run()
     open_symtab(&symtab);
 
     /* Residue type database */
-    gmx_residuetype_t *rt;
-    gmx_residuetype_init(&rt);
+    ResidueType rt;
 
     /* Read residue renaming database(s), if present */
     std::vector<std::string> rrn = fflib_search_file_end(ffdir_, ".r2b", FALSE);
@@ -1689,18 +1684,20 @@ int pdb2gmx::run()
 
     /* Add all alternative names from the residue renaming database to the list
        of recognized amino/nucleic acids. */
-    const char *p_restype;
     for (int i = 0; i < nrtprename; i++)
     {
-        int rc = gmx_residuetype_get_type(rt, rtprename[i].gmx, &p_restype);
-
         /* Only add names if the 'standard' gromacs/iupac base name was found */
-        if (rc == 0)
+
+        /* TODO this should be changed with gmx::optional so that we only need
+         * to search rt once.
+         */
+        if (rt.nameIndexedInResidueTypes(rtprename[i].gmx))
         {
-            gmx_residuetype_add(rt, rtprename[i].main, p_restype);
-            gmx_residuetype_add(rt, rtprename[i].nter, p_restype);
-            gmx_residuetype_add(rt, rtprename[i].cter, p_restype);
-            gmx_residuetype_add(rt, rtprename[i].bter, p_restype);
+            std::string restype = rt.typeNameForIndexedResidue(rtprename[i].gmx);
+            rt.addResidue(rtprename[i].main, restype);
+            rt.addResidue(rtprename[i].nter, restype);
+            rt.addResidue(rtprename[i].cter, restype);
+            rt.addResidue(rtprename[i].bter, restype);
         }
     }
 
@@ -1722,14 +1719,14 @@ int pdb2gmx::run()
         watres = "HOH";
     }
 
-    gmx_atomprop_t aps   = gmx_atomprop_init();
+    AtomProperties aps;
     char          *title;
     int            ePBC;
     t_atoms        pdba_all;
     rvec          *pdbx;
     int            natom = read_pdball(inputConfFile_.c_str(), bOutputSet_, outFile_.c_str(),
                                        &title, &pdba_all, &pdbx, &ePBC, box, bRemoveH_,
-                                       &symtab, rt, watres, aps, bVerbose_);
+                                       &symtab, &rt, watres, &aps, bVerbose_);
 
     if (natom == 0)
     {
@@ -1785,7 +1782,7 @@ int pdb2gmx::run()
         this_chainid       = ri->chainid;
         this_chainnumber   = ri->chainnum;
 
-        bWat_ = gmx_strcasecmp(*ri->name, watres) == 0;
+        bWat_ = gmx::equalCaseInsensitive(*ri->name, watres);
 
         if ((i == 0) || (this_chainnumber != prev_chainnumber) || (bWat_ != bPrevWat_))
         {
@@ -1967,7 +1964,7 @@ int pdb2gmx::run()
     check_occupancy(&pdba_all, inputConfFile_.c_str(), bVerbose_);
 
     /* Read atomtypes... */
-    gpp_atomtype_t atype = read_atype(ffdir_, &symtab);
+    gpp_atomtype *atype = read_atype(ffdir_, &symtab);
 
     /* read residue database */
     printf("Reading residue database... (%s)\n", forcefield_);
@@ -2034,7 +2031,7 @@ int pdb2gmx::run()
         for (int i = 0; i < cc->nterpairs; i++)
         {
             find_nc_ter(pdba, cc->chainstart[i], cc->chainstart[i+1],
-                        &(cc->r_start[j]), &(cc->r_end[j]), rt);
+                        &(cc->r_start[j]), &(cc->r_end[j]), &rt);
 
             if (cc->r_start[j] >= 0 && cc->r_end[j] >= 0)
             {
@@ -2153,7 +2150,7 @@ int pdb2gmx::run()
            do now :( AF 26-7-99 */
 
         rename_atoms(nullptr, ffdir_,
-                     pdba, &symtab, restp_chain, false, rt, false, bVerbose_);
+                     pdba, &symtab, restp_chain, false, &rt, false, bVerbose_);
 
         match_atomnames_with_rtp(restp_chain, hb_chain, pdba, x, bVerbose_);
 
@@ -2199,9 +2196,9 @@ int pdb2gmx::run()
 
         /* make up molecule name(s) */
 
-        int k = (cc->nterpairs > 0 && cc->r_start[0] >= 0) ? cc->r_start[0] : 0;
+        int         k = (cc->nterpairs > 0 && cc->r_start[0] >= 0) ? cc->r_start[0] : 0;
 
-        gmx_residuetype_get_type(rt, *pdba->resinfo[k].name, &p_restype);
+        std::string restype = rt.typeNameForIndexedResidue(*pdba->resinfo[k].name);
 
         std::string molname;
         std::string suffix;
@@ -2236,12 +2233,12 @@ int pdb2gmx::run()
 
             if (suffix.length() > 0)
             {
-                molname.append(p_restype);
+                molname.append(restype);
                 molname.append(suffix);
             }
             else
             {
-                molname = p_restype;
+                molname = restype;
             }
         }
         std::string itp_fn   = topologyFile_;;
@@ -2360,8 +2357,6 @@ int pdb2gmx::run()
     print_top_mols(top_file, title, ffdir_, watermodel_, nincl_, incls_, nmol_, mols_);
     gmx_fio_fclose(top_file);
 
-    gmx_residuetype_destroy(rt);
-
     /* now merge all chains back together */
     natom     = 0;
     int nres  = 0;
index 12ef25bd3196b38d378970663a52ab47e0255aa8..ecb7f264a8ce89982bc45c7960fc88a00b2ed360 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
 #include "gromacs/gmxpreprocess/gen_ad.h"
 #include "gromacs/gmxpreprocess/gen_vsite.h"
 #include "gromacs/gmxpreprocess/gpp_nextnb.h"
+#include "gromacs/gmxpreprocess/grompp-impl.h"
 #include "gromacs/gmxpreprocess/h_db.h"
+#include "gromacs/gmxpreprocess/hackblock.h"
 #include "gromacs/gmxpreprocess/notset.h"
 #include "gromacs/gmxpreprocess/pgutil.h"
 #include "gromacs/gmxpreprocess/resall.h"
+#include "gromacs/gmxpreprocess/specbond.h"
 #include "gromacs/gmxpreprocess/topdirs.h"
 #include "gromacs/gmxpreprocess/topio.h"
 #include "gromacs/gmxpreprocess/toputil.h"
@@ -439,7 +442,7 @@ void choose_watermodel(const char *wmsel, const char *ffdir,
 }
 
 static int name2type(t_atoms *at, int **cgnr,
-                     t_restp restp[], gmx_residuetype_t *rt)
+                     t_restp restp[], ResidueType *rt)
 {
     int         i, j, prevresind, resind, i0, prevcg, cg, curcg;
     char       *name;
@@ -464,7 +467,7 @@ static int name2type(t_atoms *at, int **cgnr,
         {
             bool bProt;
             resind = at->atom[i].resind;
-            bProt  = gmx_residuetype_is_protein(rt, *(at->resinfo[resind].name));
+            bProt  = rt->namedResidueHasType(*(at->resinfo[resind].name), "Protein");
             bNterm = bProt && (resind == 0);
             if (resind > 0)
             {
@@ -633,7 +636,7 @@ static void print_top_water(FILE *out, const char *ffdir, const char *water)
 
 static void print_top_system(FILE *out, const char *title)
 {
-    fprintf(out, "[ %s ]\n", dir2str(d_system));
+    fprintf(out, "[ %s ]\n", dir2str(Directive::d_system));
     fprintf(out, "; Name\n");
     fprintf(out, "%s\n\n", title[0] ? title : "Protein");
 }
@@ -661,7 +664,7 @@ void print_top_mols(FILE *out,
 
     if (nmol)
     {
-        fprintf(out, "[ %s ]\n", dir2str(d_molecules));
+        fprintf(out, "[ %s ]\n", dir2str(Directive::d_molecules));
         fprintf(out, "; %-15s %5s\n", "Compound", "#mols");
         for (int i = 0; i < nmol; i++)
         {
@@ -673,34 +676,34 @@ void print_top_mols(FILE *out,
 void write_top(FILE *out, const char *pr, const char *molname,
                t_atoms *at, bool bRTPresname,
                int bts[], t_params plist[], t_excls excls[],
-               gpp_atomtype_t atype, int *cgnr, int nrexcl)
+               gpp_atomtype *atype, int *cgnr, int nrexcl)
 /* NOTE: nrexcl is not the size of *excl! */
 {
     if (at && atype && cgnr)
     {
-        fprintf(out, "[ %s ]\n", dir2str(d_moleculetype));
+        fprintf(out, "[ %s ]\n", dir2str(Directive::d_moleculetype));
         fprintf(out, "; %-15s %5s\n", "Name", "nrexcl");
         fprintf(out, "%-15s %5d\n\n", molname ? molname : "Protein", nrexcl);
 
         print_atoms(out, atype, at, cgnr, bRTPresname);
-        print_bondeds(out, at->nr, d_bonds,      F_BONDS,    bts[ebtsBONDS], plist);
-        print_bondeds(out, at->nr, d_constraints, F_CONSTR,   0,              plist);
-        print_bondeds(out, at->nr, d_constraints, F_CONSTRNC, 0,              plist);
-        print_bondeds(out, at->nr, d_pairs,      F_LJ14,     0,              plist);
+        print_bondeds(out, at->nr, Directive::d_bonds,      F_BONDS,    bts[ebtsBONDS], plist);
+        print_bondeds(out, at->nr, Directive::d_constraints, F_CONSTR,   0,              plist);
+        print_bondeds(out, at->nr, Directive::d_constraints, F_CONSTRNC, 0,              plist);
+        print_bondeds(out, at->nr, Directive::d_pairs,      F_LJ14,     0,              plist);
         print_excl(out, at->nr, excls);
-        print_bondeds(out, at->nr, d_angles,     F_ANGLES,   bts[ebtsANGLES], plist);
-        print_bondeds(out, at->nr, d_dihedrals,  F_PDIHS,    bts[ebtsPDIHS], plist);
-        print_bondeds(out, at->nr, d_dihedrals,  F_IDIHS,    bts[ebtsIDIHS], plist);
-        print_bondeds(out, at->nr, d_cmap,       F_CMAP,     bts[ebtsCMAP],  plist);
-        print_bondeds(out, at->nr, d_polarization, F_POLARIZATION,   0,       plist);
-        print_bondeds(out, at->nr, d_thole_polarization, F_THOLE_POL, 0,       plist);
-        print_bondeds(out, at->nr, d_vsites2,    F_VSITE2,   0,              plist);
-        print_bondeds(out, at->nr, d_vsites3,    F_VSITE3,   0,              plist);
-        print_bondeds(out, at->nr, d_vsites3,    F_VSITE3FD, 0,              plist);
-        print_bondeds(out, at->nr, d_vsites3,    F_VSITE3FAD, 0,              plist);
-        print_bondeds(out, at->nr, d_vsites3,    F_VSITE3OUT, 0,              plist);
-        print_bondeds(out, at->nr, d_vsites4,    F_VSITE4FD, 0,              plist);
-        print_bondeds(out, at->nr, d_vsites4,    F_VSITE4FDN, 0,             plist);
+        print_bondeds(out, at->nr, Directive::d_angles,     F_ANGLES,   bts[ebtsANGLES], plist);
+        print_bondeds(out, at->nr, Directive::d_dihedrals,  F_PDIHS,    bts[ebtsPDIHS], plist);
+        print_bondeds(out, at->nr, Directive::d_dihedrals,  F_IDIHS,    bts[ebtsIDIHS], plist);
+        print_bondeds(out, at->nr, Directive::d_cmap,       F_CMAP,     bts[ebtsCMAP],  plist);
+        print_bondeds(out, at->nr, Directive::d_polarization, F_POLARIZATION,   0,       plist);
+        print_bondeds(out, at->nr, Directive::d_thole_polarization, F_THOLE_POL, 0,       plist);
+        print_bondeds(out, at->nr, Directive::d_vsites2,    F_VSITE2,   0,              plist);
+        print_bondeds(out, at->nr, Directive::d_vsites3,    F_VSITE3,   0,              plist);
+        print_bondeds(out, at->nr, Directive::d_vsites3,    F_VSITE3FD, 0,              plist);
+        print_bondeds(out, at->nr, Directive::d_vsites3,    F_VSITE3FAD, 0,              plist);
+        print_bondeds(out, at->nr, Directive::d_vsites3,    F_VSITE3OUT, 0,              plist);
+        print_bondeds(out, at->nr, Directive::d_vsites4,    F_VSITE4FD, 0,              plist);
+        print_bondeds(out, at->nr, Directive::d_vsites4,    F_VSITE4FDN, 0,             plist);
 
         if (pr)
         {
@@ -1502,7 +1505,7 @@ scrub_charge_groups(int *cgnr, int natoms)
 
 
 void pdb2top(FILE *top_file, const char *posre_fn, const char *molname,
-             t_atoms *atoms, rvec **x, gpp_atomtype_t atype, t_symtab *tab,
+             t_atoms *atoms, rvec **x, gpp_atomtype *atype, t_symtab *tab,
              int nrtp, t_restp rtp[],
              t_restp *restp, t_hackblock *hb,
              bool bAllowMissing,
@@ -1525,10 +1528,9 @@ void pdb2top(FILE *top_file, const char *posre_fn, const char *molname,
     int              *vsite_type;
     int               i, nmissat;
     int               bts[ebtsNR];
-    gmx_residuetype_t*rt;
 
     init_plist(plist);
-    gmx_residuetype_init(&rt);
+    ResidueType rt;
 
     /* Make bonds */
     at2bonds(&(plist[F_BONDS]), hb,
@@ -1540,7 +1542,7 @@ void pdb2top(FILE *top_file, const char *posre_fn, const char *molname,
                atoms, nssbonds, ssbonds,
                bAllowMissing);
 
-    nmissat = name2type(atoms, &cgnr, restp, rt);
+    nmissat = name2type(atoms, &cgnr, restp, &rt);
     if (nmissat)
     {
         if (bAllowMissing)
@@ -1653,7 +1655,6 @@ void pdb2top(FILE *top_file, const char *posre_fn, const char *molname,
     /* cleaning up */
     free_t_hackblock(atoms->nres, &hb);
     free_t_restp(atoms->nres, &restp);
-    gmx_residuetype_destroy(rt);
 
     /* we should clean up hb and restp here, but that is a *L*O*T* of work! */
     sfree(cgnr);
index e20b973ffa4fbacd5836ef3ce17f55ad85171f9f..ea29fe1dedf4d212198d0e6f29343971d0a396e9 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2018,2019, 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.
 #ifndef GMX_GMXPREPROCESS_PDB2TOP_H
 #define GMX_GMXPREPROCESS_PDB2TOP_H
 
-#include "gromacs/gmxpreprocess/gpp_atomtype.h"
-#include "gromacs/gmxpreprocess/grompp-impl.h"
-#include "gromacs/gmxpreprocess/hackblock.h"
-#include "gromacs/gmxpreprocess/toputil.h"
+#include <cstdio>
+
+#include "gromacs/math/vectypes.h"
+
+struct gpp_atomtype;
+struct t_atoms;
+struct t_excls;
+struct t_hackblock;
+struct t_mols;
+struct t_params;
+struct t_resinfo;
+struct t_restp;
+struct t_ssbond;
+struct t_symtab;
 
 /* this *MUST* correspond to array in pdb2top.c */
 enum {
@@ -49,11 +59,6 @@ enum {
 };
 extern const char *hh[ehisNR];
 
-typedef struct {
-    int   res1, res2;
-    char *a1, *a2;
-} t_ssbond;
-
 void choose_ff(const char *ffsel,
                char *forcefield, int ff_maxlen,
                char *ffdir, int ffdir_maxlen);
@@ -101,12 +106,12 @@ void print_top_mols(FILE *out,
 void write_top(FILE *out, const char *pr, const char *molname,
                t_atoms *at, bool bRTPresname,
                int bts[], t_params plist[], t_excls excls[],
-               gpp_atomtype_t atype, int *cgnr, int nrexcl);
+               gpp_atomtype *atype, int *cgnr, int nrexcl);
 /* NOTE: nrexcl is not the size of *excl! */
 
 void pdb2top(FILE *top_file, const char *posre_fn, const char *molname,
              t_atoms *atoms, rvec **x,
-             gpp_atomtype_t atype, struct t_symtab *tab,
+             gpp_atomtype *atype, t_symtab *tab,
              int nrtp, t_restp rtp[],
              t_restp *restp, t_hackblock *hb,
              bool bAllowMissing,
index d0df5b43234ab3b5b19f0c7543bb8c52f6cd5be5..3d92b2fe21fec9da248cd02e7dda6570f46e52d3 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -2760,13 +2760,11 @@ static bool do_numbering(int natoms, gmx_groups_t *groups,
 static void calc_nrdf(const gmx_mtop_t *mtop, t_inputrec *ir, char **gnames)
 {
     t_grpopts              *opts;
-    const gmx_groups_t     *groups;
     pull_params_t          *pull;
     int                     natoms, ai, aj, i, j, d, g, imin, jmin;
     int                    *nrdf2, *na_vcm, na_tot;
     double                 *nrdf_tc, *nrdf_vcm, nrdf_uc, *nrdf_vcm_sub;
     ivec                   *dof_vcm;
-    gmx_mtop_atomloop_all_t aloop;
     int                     mol, ftype, as;
 
     /* Calculate nrdf.
@@ -2778,24 +2776,24 @@ static void calc_nrdf(const gmx_mtop_t *mtop, t_inputrec *ir, char **gnames)
 
     opts = &ir->opts;
 
-    groups = &mtop->groups;
+    const gmx_groups_t &groups = mtop->groups;
     natoms = mtop->natoms;
 
     /* Allocate one more for a possible rest group */
     /* We need to sum degrees of freedom into doubles,
      * since floats give too low nrdf's above 3 million atoms.
      */
-    snew(nrdf_tc, groups->grps[egcTC].nr+1);
-    snew(nrdf_vcm, groups->grps[egcVCM].nr+1);
-    snew(dof_vcm, groups->grps[egcVCM].nr+1);
-    snew(na_vcm, groups->grps[egcVCM].nr+1);
-    snew(nrdf_vcm_sub, groups->grps[egcVCM].nr+1);
+    snew(nrdf_tc, groups.grps[egcTC].nr+1);
+    snew(nrdf_vcm, groups.grps[egcVCM].nr+1);
+    snew(dof_vcm, groups.grps[egcVCM].nr+1);
+    snew(na_vcm, groups.grps[egcVCM].nr+1);
+    snew(nrdf_vcm_sub, groups.grps[egcVCM].nr+1);
 
-    for (i = 0; i < groups->grps[egcTC].nr; i++)
+    for (i = 0; i < groups.grps[egcTC].nr; i++)
     {
         nrdf_tc[i] = 0;
     }
-    for (i = 0; i < groups->grps[egcVCM].nr+1; i++)
+    for (i = 0; i < groups.grps[egcVCM].nr+1; i++)
     {
         nrdf_vcm[i]     = 0;
         clear_ivec(dof_vcm[i]);
@@ -2804,15 +2802,15 @@ static void calc_nrdf(const gmx_mtop_t *mtop, t_inputrec *ir, char **gnames)
     }
 
     snew(nrdf2, natoms);
-    aloop = gmx_mtop_atomloop_all_init(mtop);
-    const t_atom *atom;
-    while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
+    for (const AtomProxy &atomP : AtomRange(*mtop))
     {
+        const t_atom &local = atomP.atom();
+        int           i     = atomP.globalAtomNumber();
         nrdf2[i] = 0;
-        if (atom->ptype == eptAtom || atom->ptype == eptNucleus)
+        if (local.ptype == eptAtom || local.ptype == eptNucleus)
         {
             g = getGroupType(groups, egcFREEZE, i);
-            for (d = 0; d < DIM; d++)
+            for (int d = 0; d < DIM; d++)
             {
                 if (opts->nFreeze[g][d] == 0)
                 {
@@ -2831,7 +2829,7 @@ static void calc_nrdf(const gmx_mtop_t *mtop, t_inputrec *ir, char **gnames)
     for (const gmx_molblock_t &molb : mtop->molblock)
     {
         const gmx_moltype_t &molt = mtop->moltype[molb.type];
-        atom = molt.atoms.atom;
+        const t_atom        *atom = molt.atoms.atom;
         for (mol = 0; mol < molb.nmol; mol++)
         {
             for (ftype = F_CONSTR; ftype <= F_CONSTRNC; ftype++)
@@ -2932,7 +2930,7 @@ static void calc_nrdf(const gmx_mtop_t *mtop, t_inputrec *ir, char **gnames)
                     nrdf_vcm[getGroupType(groups, egcVCM, ai)] -= 0.5*imin;
                     if (nrdf_tc[getGroupType(groups, egcTC, ai)] < 0)
                     {
-                        gmx_fatal(FARGS, "Center of mass pulling constraints caused the number of degrees of freedom for temperature coupling group %s to be negative", gnames[groups->grps[egcTC].nm_ind[getGroupType(groups, egcTC, ai)]]);
+                        gmx_fatal(FARGS, "Center of mass pulling constraints caused the number of degrees of freedom for temperature coupling group %s to be negative", gnames[groups.grps[egcTC].nm_ind[getGroupType(groups, egcTC, ai)]]);
                     }
                 }
                 else
@@ -2955,7 +2953,7 @@ static void calc_nrdf(const gmx_mtop_t *mtop, t_inputrec *ir, char **gnames)
          * the number of degrees of freedom in each vcm group when COM
          * translation is removed and 6 when rotation is removed as well.
          */
-        for (j = 0; j < groups->grps[egcVCM].nr+1; j++)
+        for (j = 0; j < groups.grps[egcVCM].nr+1; j++)
         {
             switch (ir->comm_mode)
             {
@@ -2978,10 +2976,10 @@ static void calc_nrdf(const gmx_mtop_t *mtop, t_inputrec *ir, char **gnames)
             }
         }
 
-        for (i = 0; i < groups->grps[egcTC].nr; i++)
+        for (i = 0; i < groups.grps[egcTC].nr; i++)
         {
             /* Count the number of atoms of TC group i for every VCM group */
-            for (j = 0; j < groups->grps[egcVCM].nr+1; j++)
+            for (j = 0; j < groups.grps[egcVCM].nr+1; j++)
             {
                 na_vcm[j] = 0;
             }
@@ -2999,7 +2997,7 @@ static void calc_nrdf(const gmx_mtop_t *mtop, t_inputrec *ir, char **gnames)
              */
             nrdf_uc    = nrdf_tc[i];
             nrdf_tc[i] = 0;
-            for (j = 0; j < groups->grps[egcVCM].nr+1; j++)
+            for (j = 0; j < groups.grps[egcVCM].nr+1; j++)
             {
                 if (nrdf_vcm[j] > nrdf_vcm_sub[j])
                 {
@@ -3009,7 +3007,7 @@ static void calc_nrdf(const gmx_mtop_t *mtop, t_inputrec *ir, char **gnames)
             }
         }
     }
-    for (i = 0; (i < groups->grps[egcTC].nr); i++)
+    for (i = 0; (i < groups.grps[egcTC].nr); i++)
     {
         opts->nrdf[i] = nrdf_tc[i];
         if (opts->nrdf[i] < 0)
@@ -3018,7 +3016,7 @@ static void calc_nrdf(const gmx_mtop_t *mtop, t_inputrec *ir, char **gnames)
         }
         fprintf(stderr,
                 "Number of degrees of freedom in T-Coupling group %s is %.2f\n",
-                gnames[groups->grps[egcTC].nm_ind[i]], opts->nrdf[i]);
+                gnames[groups.grps[egcTC].nm_ind[i]], opts->nrdf[i]);
     }
 
     sfree(nrdf2);
@@ -3954,7 +3952,6 @@ void triple_check(const char *mdparin, t_inputrec *ir, gmx_mtop_t *sys,
     real                     *mgrp, mt;
     rvec                      acc;
     gmx_mtop_atomloop_block_t aloopb;
-    gmx_mtop_atomloop_all_t   aloop;
     ivec                      AbsRef;
     char                      warn_buf[STRLEN];
 
@@ -4143,11 +4140,11 @@ void triple_check(const char *mdparin, t_inputrec *ir, gmx_mtop_t *sys,
     {
         clear_rvec(acc);
         snew(mgrp, sys->groups.grps[egcACC].nr);
-        aloop = gmx_mtop_atomloop_all_init(sys);
-        const t_atom *atom;
-        while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
+        for (const AtomProxy &atomP : AtomRange(*sys))
         {
-            mgrp[getGroupType(&sys->groups, egcACC, i)] += atom->m;
+            const t_atom &local = atomP.atom();
+            int           i     = atomP.globalAtomNumber();
+            mgrp[getGroupType(sys->groups, egcACC, i)] += local.m;
         }
         mt = 0.0;
         for (i = 0; (i < sys->groups.grps[egcACC].nr); i++)
index 963f16dddd44c91bfa0ba8e15a1142ff43c00dc6..e5508a3996fe65e6c391de7ca863cac1b55d9b7c 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -39,7 +39,8 @@
 #define GMX_GMXPREPROCESS_READIR_H
 
 #include "gromacs/fileio/readinp.h"
-#include "gromacs/gmxpreprocess/grompp-impl.h"
+#include "gromacs/math/vectypes.h"
+#include "gromacs/utility/real.h"
 
 namespace gmx
 {
@@ -51,6 +52,7 @@ struct gmx_mtop_t;
 struct gmx_output_env_t;
 struct pull_params_t;
 struct pull_t;
+struct t_blocka;
 struct t_grpopts;
 struct t_inpfile;
 struct t_inputrec;
index a2294135cd8ecc8c0901d482b601446a4f4f3e02..0c67d5abd66db8d37ab889c7291c104cfb1bf0a7 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
 #include <vector>
 
 #include "gromacs/gmxpreprocess/fflibutil.h"
+#include "gromacs/gmxpreprocess/gpp_atomtype.h"
+#include "gromacs/gmxpreprocess/grompp-impl.h"
+#include "gromacs/gmxpreprocess/hackblock.h"
 #include "gromacs/gmxpreprocess/notset.h"
 #include "gromacs/gmxpreprocess/pgutil.h"
+#include "gromacs/topology/atoms.h"
 #include "gromacs/topology/symtab.h"
 #include "gromacs/utility/cstringutil.h"
 #include "gromacs/utility/fatalerror.h"
 #include "gromacs/utility/smalloc.h"
 #include "gromacs/utility/strdb.h"
 
-gpp_atomtype_t read_atype(const char *ffdir, t_symtab *tab)
+gpp_atomtype *read_atype(const char *ffdir, t_symtab *tab)
 {
     FILE                    *in;
     char                     buf[STRLEN], name[STRLEN];
     double                   m;
     int                      nratt = 0;
-    gpp_atomtype_t           at;
+    gpp_atomtype            *at;
     t_atom                  *a;
     t_param                 *nb;
 
@@ -106,7 +110,7 @@ gpp_atomtype_t read_atype(const char *ffdir, t_symtab *tab)
     return at;
 }
 
-static void print_resatoms(FILE *out, gpp_atomtype_t atype, t_restp *rtp)
+static void print_resatoms(FILE *out, gpp_atomtype *atype, t_restp *rtp)
 {
     int   j, tp;
     char *tpnm;
@@ -130,7 +134,7 @@ static void print_resatoms(FILE *out, gpp_atomtype_t atype, t_restp *rtp)
 }
 
 static bool read_atoms(FILE *in, char *line,
-                       t_restp *r0, t_symtab *tab, gpp_atomtype_t atype)
+                       t_restp *r0, t_symtab *tab, gpp_atomtype *atype)
 {
     int    i, j, cg, maxentries;
     char   buf[256], buf1[256];
@@ -294,7 +298,7 @@ static void print_resall_header(FILE *out, t_restp rtp[])
 }
 
 void print_resall(FILE *out, int nrtp, t_restp rtp[],
-                  gpp_atomtype_t atype)
+                  gpp_atomtype *atype)
 {
     int i, bt;
 
@@ -319,7 +323,7 @@ void print_resall(FILE *out, int nrtp, t_restp rtp[],
 }
 
 void read_resall(const char *rrdb, int *nrtpptr, t_restp **rtp,
-                 gpp_atomtype_t atype, t_symtab *tab,
+                 gpp_atomtype *atype, t_symtab *tab,
                  bool bAllowOverrideRTP)
 {
     FILE         *in;
index df7bc35f91e1fef859a627c7b0ba9eb97679c73a..8a59c0a7735d56dbdab258de402ea7be3a1ce347 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2010,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2014,2015,2018,2019, 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.
 #ifndef GMX_GMXPREPROCESS_RESALL_H
 #define GMX_GMXPREPROCESS_RESALL_H
 
-#include "gromacs/gmxpreprocess/gpp_atomtype.h"
-#include "gromacs/gmxpreprocess/grompp-impl.h"
-#include "gromacs/gmxpreprocess/hackblock.h"
+#include <cstdio>
+
+struct gpp_atomtype;
+struct t_restp;
+struct t_symtab;
 
 char *search_rtp(const char *key, int nrtp, t_restp rtp[]);
 /* Search for an entry in the rtp database, returns the rtp residue name.
@@ -53,16 +55,16 @@ t_restp *get_restp(const char *rtpname, int nrtp, t_restp rtp[]);
  * Generates a fatal error when rtpname is not found.
  */
 
-gpp_atomtype_t read_atype(const char *ffdir, struct t_symtab *tab);
+gpp_atomtype *read_atype(const char *ffdir, t_symtab *tab);
 /* read atom type database(s) */
 
 void read_resall(const char *resdb, int *nrtp, t_restp **rtp,
-                 gpp_atomtype_t atype, struct t_symtab *tab,
+                 gpp_atomtype *atype, t_symtab *tab,
                  bool bAllowOverrideRTP);
 /* read rtp database, append to the existing database */
 
 void print_resall(FILE *out, int nrtp, t_restp rtp[],
-                  gpp_atomtype_t atype);
+                  gpp_atomtype *atype);
 /* write rtp database */
 
 #endif
index 59764a9f70c99de9848d6b57063d6fe6fd3ef865..40405d567016736b2042e80d7ea692dba70527e5 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -642,7 +642,7 @@ static void add_solv(const char *filename,
                      const gmx::TopologyInformation &topInfo,
                      t_atoms *atoms,
                      std::vector<RVec> *x, std::vector<RVec> *v,
-                     matrix box, gmx_atomprop_t aps,
+                     matrix box, AtomProperties *aps,
                      real defaultDistance, real scaleFactor,
                      real rshell, int max_sol)
 {
@@ -743,8 +743,12 @@ static void add_solv(const char *filename,
     }
 }
 
-static void update_top(t_atoms *atoms, int firstSolventResidueIndex, matrix box, int NFILE, t_filenm fnm[],
-                       gmx_atomprop_t aps)
+static void update_top(t_atoms        *atoms,
+                       int             firstSolventResidueIndex,
+                       matrix          box,
+                       int             NFILE,
+                       t_filenm        fnm[],
+                       AtomProperties *aps)
 {
     FILE        *fpin, *fpout;
     char         buf[STRLEN*2], buf2[STRLEN], *temp;
@@ -760,9 +764,9 @@ static void update_top(t_atoms *atoms, int firstSolventResidueIndex, matrix box,
     mtot = 0;
     for (i = 0; (i < atoms->nr); i++)
     {
-        gmx_atomprop_query(aps, epropMass,
-                           *atoms->resinfo[atoms->atom[i].resind].name,
-                           *atoms->atomname[i], &mm);
+        aps->setAtomProperty(epropMass,
+                             std::string(*atoms->resinfo[atoms->atom[i].resind].name),
+                             std::string(*atoms->atomname[i]), &mm);
         mtot += mm;
     }
 
@@ -920,7 +924,6 @@ int gmx_solvate(int argc, char *argv[])
     /* parameter data */
     gmx_bool       bProt, bBox;
     const char    *conf_prot, *confout;
-    gmx_atomprop_t aps;
 
     t_filenm       fnm[] = {
         { efSTX, "-cp", "protein", ffOPTRD },
@@ -968,7 +971,7 @@ int gmx_solvate(int argc, char *argv[])
                   "a box size (-box) must be specified");
     }
 
-    aps = gmx_atomprop_init();
+    AtomProperties           aps;
 
     gmx::TopologyInformation topInfo;
     std::vector<RVec>        x, v;
@@ -1017,7 +1020,7 @@ int gmx_solvate(int argc, char *argv[])
     }
 
     add_solv(solventFileName, topInfo, atoms.get(), &x, &v, box,
-             aps, defaultDistance, scaleFactor, r_shell, max_sol);
+             &aps, defaultDistance, scaleFactor, r_shell, max_sol);
 
     /* write new configuration 1 to file confout */
     confout = ftp2fn(efSTO, NFILE, fnm);
@@ -1029,9 +1032,7 @@ int gmx_solvate(int argc, char *argv[])
     /* print size of generated configuration */
     fprintf(stderr, "\nOutput configuration contains %d atoms in %d residues\n",
             atoms->nr, atoms->nres);
-    update_top(atoms.get(), firstSolventResidueIndex, box, NFILE, fnm, aps);
-
-    gmx_atomprop_destroy(aps);
+    update_top(atoms.get(), firstSolventResidueIndex, box, NFILE, fnm, &aps);
     output_env_done(oenv);
 
     return 0;
index a7e9ee784ac78f40d7a36002fe3dc04980a28838..e4f303244def680b2e1e5fd7561d1b7ab7354475 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
 #include "gromacs/utility/smalloc.h"
 #include "gromacs/utility/strdb.h"
 
+struct t_specbond
+{
+    char *res1, *res2;
+    char *atom1, *atom2;
+    char *newres1, *newres2;
+    int   nbond1, nbond2;
+    real  length;
+};
+
 bool yesno()
 {
     char c;
index fc0de3519f61b30fc6e46dedbd9487142be4da72..10eb17839fa6ee137aa41d66a8119589bea55f86 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2018,2019, 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.
 #ifndef GMX_GMXPREPROCESS_SPECBOND_H
 #define GMX_GMXPREPROCESS_SPECBOND_H
 
-#include "gromacs/gmxpreprocess/pdb2top.h"
+#include "gromacs/math/vectypes.h"
+
+struct t_atoms;
+struct t_specbond;
+
+struct t_ssbond
+{
+    int   res1, res2;
+    char *a1, *a2;
+};
 
 int mk_specbonds(t_atoms *pdba, rvec x[], bool bInteractive,
                  t_ssbond **specbonds, bool bVerbose);
 
+t_specbond *get_specbonds(int *nspecbond);
+void done_specbonds(int nsb, t_specbond sb[]);
+
 bool yesno();
 
 #endif
index eb2f80a06697fde2047234b2fa91658088b65664..866f8103688d61c79bd70b4db9def8cc8793cfd5 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2018,2019, 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.
 
 #include "gromacs/fileio/gmxfio.h"
 #include "gromacs/gmxpreprocess/fflibutil.h"
+#include "gromacs/gmxpreprocess/gpp_atomtype.h"
+#include "gromacs/gmxpreprocess/grompp-impl.h"
 #include "gromacs/gmxpreprocess/h_db.h"
+#include "gromacs/gmxpreprocess/hackblock.h"
 #include "gromacs/gmxpreprocess/notset.h"
 #include "gromacs/gmxpreprocess/resall.h"
 #include "gromacs/gmxpreprocess/toputil.h"
@@ -90,7 +93,7 @@ static int find_kw(char *keyw)
 #define FATAL() gmx_fatal(FARGS, "Reading Termini Database: not enough items on line\n%s", line)
 
 static void read_atom(char *line, bool bAdd,
-                      char **nname, t_atom *a, gpp_atomtype_t atype, int *cgnr)
+                      char **nname, t_atom *a, gpp_atomtype *atype, int *cgnr)
 {
     int    nr, i;
     char   buf[5][30];
@@ -143,14 +146,14 @@ static void read_atom(char *line, bool bAdd,
     }
 }
 
-static void print_atom(FILE *out, t_atom *a, gpp_atomtype_t atype)
+static void print_atom(FILE *out, t_atom *a, gpp_atomtype *atype)
 {
     fprintf(out, "\t%s\t%g\t%g\n",
             get_atomtype_name(a->type, atype), a->m, a->q);
 }
 
 static void print_ter_db(const char *ff, char C, int nb, t_hackblock tb[],
-                         gpp_atomtype_t atype)
+                         gpp_atomtype *atype)
 {
     FILE *out;
     int   i, j, k, bt, nrepl, nadd, ndel;
@@ -247,7 +250,7 @@ static void print_ter_db(const char *ff, char C, int nb, t_hackblock tb[],
 
 static void read_ter_db_file(const char *fn,
                              int *ntbptr, t_hackblock **tbptr,
-                             gpp_atomtype_t atype)
+                             gpp_atomtype *atype)
 {
     char         filebase[STRLEN], *ptr;
     FILE        *in;
@@ -403,7 +406,7 @@ static void read_ter_db_file(const char *fn,
 }
 
 int read_ter_db(const char *ffdir, char ter,
-                t_hackblock **tbptr, gpp_atomtype_t atype)
+                t_hackblock **tbptr, gpp_atomtype *atype)
 {
     char   ext[STRLEN];
     int    ntb;
index 50ef9bf6caa071f6a32d80e113cb79243780c230..c30d616c6a5245793b83be0d4832c333b2cd56e7 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2011,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2011,2014,2015,2018,2019, 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.
 #ifndef GMX_GMXPREPROCESS_TER_DB_H
 #define GMX_GMXPREPROCESS_TER_DB_H
 
-#include "gromacs/gmxpreprocess/grompp-impl.h"
-#include "gromacs/gmxpreprocess/hackblock.h"
-
+struct gpp_atomtype;
+struct t_hackblock;
 
 int read_ter_db(const char *ffdir, char ter,
-                t_hackblock **tbptr, gpp_atomtype_t atype);
+                t_hackblock **tbptr, gpp_atomtype *atype);
 /* Read database for N&C terminal hacking */
 
 t_hackblock **filter_ter(int nb, t_hackblock tb[],
index 7f6eb28c11a01294b01ba37dd5701493fd28727c..f3d52e323747768cd8f34e837f1d691c1c01eba4 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2014,2015,2017,2018, by the GROMACS development team, led by
+# Copyright (c) 2014,2015,2017,2018,2019, 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.
@@ -37,6 +37,7 @@ gmx_add_unit_test(GmxPreprocessTests gmxpreprocess-test
     insert-molecules.cpp
     readir.cpp
     solvate.cpp
+    topdirs.cpp
     )
 
 # Currently these are too slow to run in Jenkins, so they are in their
index 8b8e6594593cded197500e4a7449b8013eb2a631..c4e5f36e9e18f0374ec32f333fc6dcb99d486266 100644 (file)
@@ -104,12 +104,7 @@ TEST_F(SolvateTest, cs_cp_p_Works)
         "solvate", "-cs"
     };
     setInputFile("-cp", "spc-and-methanol.gro");
-
-    // TODO: Consider adding a convenience method for this.
-    std::string topFileName           = gmx::test::TestFileManager::getInputFilePath("spc-and-methanol.top");
-    std::string modifiableTopFileName = fileManager().getTemporaryFilePath(".top");
-    gmx_file_copy(topFileName.c_str(), modifiableTopFileName.c_str(), true);
-    commandLine().addOption("-p", modifiableTopFileName);
+    setModifiableInputFile("-p", "spc-and-methanol.top");
 
     runTest(CommandLine(cmdline));
 }
@@ -134,14 +129,7 @@ TEST_F(SolvateTest, update_Topology_Works)
     };
     setInputFile("-cs", "mixed_solvent.gro");
     setInputFile("-cp", "simple.gro");
-
-    // TODO: Consider adding a convenience method for this.
-    // Copies topology file to where it would be found as an output file, so the copied
-    // .top file is used as both input and output
-    std::string topFileName           = gmx::test::TestFileManager::getInputFilePath("simple.top");
-    std::string modifiableTopFileName = fileManager().getTemporaryFilePath("simple.top");
-    gmx_file_copy(topFileName.c_str(), modifiableTopFileName.c_str(), true);
-    setOutputFile("-p", "simple.top", ExactTextMatch());
+    setInputAndOutputFile("-p", "simple.top", ExactTextMatch());
 
     runTest(CommandLine(cmdline));
 }
diff --git a/src/gromacs/gmxpreprocess/tests/topdirs.cpp b/src/gromacs/gmxpreprocess/tests/topdirs.cpp
new file mode 100644 (file)
index 0000000..cd1fa35
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2019, 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
+ * Test routines that handle topology directive data structures
+ * and files.
+ *
+ * \author Mark Abraham <mark.j.abraham@gmail.com>
+ */
+#include "gmxpre.h"
+
+#include "gromacs/gmxpreprocess/topdirs.h"
+
+#include <gtest/gtest.h>
+
+#include "gromacs/utility/enumerationhelpers.h"
+
+TEST(TopDirTests, NamesArrayHasCorrectSize)
+{
+    for (auto d : gmx::EnumerationWrapper<Directive>())
+    {
+        // If the enumeration is extended, but there is no matching
+        // name, then at least one element will be value initialized,
+        // ie. to nullptr, which this test will catch.
+        auto name = dir2str(d);
+        EXPECT_NE(name, nullptr);
+    }
+}
index 7f732196be1a19afaf48cbde604a49deb33045aa..7cef8dfee78e671fbe6676ec1246204129d793ec 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2018,2019, 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.
@@ -187,7 +187,7 @@ static real search_e_diss(int n2m, t_2morse t2m[], char *ai, char *aj)
     }
 }
 
-void convert_harmonics(int nrmols, t_molinfo mols[], gpp_atomtype_t atype)
+void convert_harmonics(int nrmols, t_molinfo mols[], gpp_atomtype *atype)
 {
     int       n2m;
     t_2morse *t2m;
index 7d94dc29c600d59133eb1431b15c3740bf402223..778e477cbcf27b6dcc08b236ef9a7a50f26d6c7a 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
 #ifndef GMX_GMXPREPROCESS_TOMORSE_H
 #define GMX_GMXPREPROCESS_TOMORSE_H
 
-#include <stdio.h>
+struct gpp_atomtype;
+struct t_molinfo;
 
-#include "gromacs/gmxpreprocess/gpp_atomtype.h"
-#include "gromacs/gmxpreprocess/grompp-impl.h"
-
-void convert_harmonics(int nrmols, t_molinfo mols[], gpp_atomtype_t atype);
+void convert_harmonics(int nrmols, t_molinfo mols[], gpp_atomtype *atype);
 
 #endif
index 14b15bee590e693ac96e31cd89bc3cd4ad2f6749..87da79bf201f910a7aa0e405295e65602ca9bcdf 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2018,2019, 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.
 #include <cstdarg>
 #include <cstdio>
 
+#include <algorithm>
+
+#include "gromacs/topology/idef.h"
 #include "gromacs/utility/cstringutil.h"
+#include "gromacs/utility/enumerationhelpers.h"
 #include "gromacs/utility/fatalerror.h"
 #include "gromacs/utility/smalloc.h"
 
-/* Must correspond to the directive enum in grompp-impl.h */
-static const char *directive_names[d_maxdir+1] = {
-    "defaults",
-    "atomtypes",
-    "bondtypes",
-    "constrainttypes",
-    "pairtypes",
-    "angletypes",
-    "dihedraltypes",
-    "nonbond_params",
-    "implicit_genborn_params",
-    "implicit_surface_params",
-    "cmaptypes",
-    /* All the directives above can not appear after moleculetype */
-    "moleculetype",
-    "atoms",
-    "virtual_sites2",
-    "virtual_sites3",
-    "virtual_sites4",
-    "virtual_sitesn",
-    "bonds",
-    "exclusions",
-    "pairs",
-    "pairs_nb",
-    "angles",
-    "dihedrals",
-    "constraints",
-    "settles",
-    "polarization",
-    "water_polarization",
-    "thole_polarization",
-    "system",
-    "molecules",
-    "position_restraints",
-    "angle_restraints",
-    "angle_restraints_z",
-    "distance_restraints",
-    "orientation_restraints",
-    "dihedral_restraints",
-    "cmap",
-    "intermolecular_interactions",
-    "invalid"
-};
+/* Must correspond to the Directive enum in grompp-impl.h */
+static gmx::EnumerationArray<Directive, const char *> directive_names
+    = { {
+            "defaults",
+            "atomtypes",
+            "bondtypes",
+            "constrainttypes",
+            "pairtypes",
+            "angletypes",
+            "dihedraltypes",
+            "nonbond_params",
+            "implicit_genborn_params",
+            "implicit_surface_params",
+            "cmaptypes",
+            /* All the directives above can not appear after moleculetype */
+            "moleculetype",
+            "atoms",
+            "virtual_sites2",
+            "virtual_sites3",
+            "virtual_sites4",
+            "virtual_sitesn",
+            "bonds",
+            "exclusions",
+            "pairs",
+            "pairs_nb",
+            "angles",
+            "dihedrals",
+            "constraints",
+            "settles",
+            "polarization",
+            "water_polarization",
+            "thole_polarization",
+            "system",
+            "molecules",
+            "position_restraints",
+            "angle_restraints",
+            "angle_restraints_z",
+            "distance_restraints",
+            "orientation_restraints",
+            "dihedral_restraints",
+            "cmap",
+            "intermolecular_interactions",
+            "maxdirs",
+            "invalid",
+            "none"
+        }};
 
-int ifunc_index(directive d, int type)
+int ifunc_index(Directive d, int type)
 {
     switch (d)
     {
-        case d_bondtypes:
-        case d_bonds:
+        case Directive::d_bondtypes:
+        case Directive::d_bonds:
             switch (type)
             {
                 case 1:
@@ -120,8 +127,8 @@ int ifunc_index(directive d, int type)
                 default:
                     gmx_fatal(FARGS, "Invalid bond type %d", type);
             }
-        case d_angles:
-        case d_angletypes:
+        case Directive::d_angles:
+        case Directive::d_angletypes:
             switch (type)
             {
                 case 1:
@@ -145,9 +152,9 @@ int ifunc_index(directive d, int type)
                 default:
                     gmx_fatal(FARGS, "Invalid angle type %d", type);
             }
-        case d_pairs:
-        case d_pairtypes:
-            if (type == 1 || (d == d_pairtypes && type == 2))
+        case Directive::d_pairs:
+        case Directive::d_pairtypes:
+            if (type == 1 || (d == Directive::d_pairtypes && type == 2))
             {
                 return F_LJ14;
             }
@@ -159,10 +166,10 @@ int ifunc_index(directive d, int type)
             {
                 gmx_fatal(FARGS, "Invalid pairs type %d", type);
             }
-        case d_pairs_nb:
+        case Directive::d_pairs_nb:
             return F_LJC_PAIRS_NB;
-        case d_dihedrals:
-        case d_dihedraltypes:
+        case Directive::d_dihedrals:
+        case Directive::d_dihedraltypes:
             switch (type)
             {
                 case 1:
@@ -186,11 +193,11 @@ int ifunc_index(directive d, int type)
                 default:
                     gmx_fatal(FARGS, "Invalid dihedral type %d", type);
             }
-        case d_cmaptypes:
-        case d_cmap:
+        case Directive::d_cmaptypes:
+        case Directive::d_cmap:
             return F_CMAP;
 
-        case d_nonbond_params:
+        case Directive::d_nonbond_params:
             if (type == 1)
             {
                 return F_LJ;
@@ -199,9 +206,9 @@ int ifunc_index(directive d, int type)
             {
                 return F_BHAM;
             }
-        case d_vsites2:
+        case Directive::d_vsites2:
             return F_VSITE2;
-        case d_vsites3:
+        case Directive::d_vsites3:
             switch (type)
             {
                 case 1:
@@ -215,7 +222,7 @@ int ifunc_index(directive d, int type)
                 default:
                     gmx_fatal(FARGS, "Invalid vsites3 type %d", type);
             }
-        case d_vsites4:
+        case Directive::d_vsites4:
             switch (type)
             {
                 case 1:
@@ -225,10 +232,10 @@ int ifunc_index(directive d, int type)
                 default:
                     gmx_fatal(FARGS, "Invalid vsites4 type %d", type);
             }
-        case d_vsitesn:
+        case Directive::d_vsitesn:
             return F_VSITEN;
-        case d_constraints:
-        case d_constrainttypes:
+        case Directive::d_constraints:
+        case Directive::d_constrainttypes:
             switch (type)
             {
                 case 1:
@@ -238,9 +245,9 @@ int ifunc_index(directive d, int type)
                 default:
                     gmx_fatal(FARGS, "Invalid constraints type %d", type);
             }
-        case d_settles:
+        case Directive::d_settles:
             return F_SETTLE;
-        case d_position_restraints:
+        case Directive::d_position_restraints:
             switch (type)
             {
                 case 1:
@@ -250,7 +257,7 @@ int ifunc_index(directive d, int type)
                 default:
                     gmx_fatal(FARGS, "Invalid position restraint type %d", type);
             }
-        case d_polarization:
+        case Directive::d_polarization:
             switch (type)
             {
                 case 1:
@@ -260,19 +267,19 @@ int ifunc_index(directive d, int type)
                 default:
                     gmx_fatal(FARGS, "Invalid polarization type %d", type);
             }
-        case d_thole_polarization:
+        case Directive::d_thole_polarization:
             return F_THOLE_POL;
-        case d_water_polarization:
+        case Directive::d_water_polarization:
             return F_WATER_POL;
-        case d_angle_restraints:
+        case Directive::d_angle_restraints:
             return F_ANGRES;
-        case d_angle_restraints_z:
+        case Directive::d_angle_restraints_z:
             return F_ANGRESZ;
-        case d_distance_restraints:
+        case Directive::d_distance_restraints:
             return F_DISRES;
-        case d_orientation_restraints:
+        case Directive::d_orientation_restraints:
             return F_ORIRES;
-        case d_dihedral_restraints:
+        case Directive::d_dihedral_restraints:
             return F_DIHRES;
         default:
             gmx_fatal(FARGS, "invalid directive %s in ifunc_index (%s:%d)",
@@ -280,21 +287,14 @@ int ifunc_index(directive d, int type)
     }
 }
 
-const char *dir2str (directive d)
+const char *dir2str (Directive d)
 {
-    if (d < d_maxdir)
-    {
-        return directive_names[d];
-    }
-    else
-    {
-        return directive_names[d_maxdir];
-    }
+    int index = static_cast<int>(d);
+    return directive_names[index];
 }
 
-directive str2dir (char *dstr)
+Directive str2dir (char *dstr)
 {
-    int  d;
     char buf[STRLEN], *ptr;
 
     /* Hack to be able to read old topologies */
@@ -308,52 +308,49 @@ directive str2dir (char *dstr)
         ptr = dstr;
     }
 
-    for (d = 0; (d < d_maxdir); d++)
+    for (auto d : gmx::EnumerationWrapper<Directive>())
     {
-        if (gmx_strcasecmp_min(ptr, dir2str(static_cast<directive>(d))) == 0)
+        if (gmx_strcasecmp_min(ptr, dir2str(static_cast<Directive>(d))) == 0)
         {
-            return static_cast<directive>(d);
+            return static_cast<Directive>(d);
         }
     }
 
-    return d_invalid;
+    return Directive::d_invalid;
 }
 
-static directive **necessary = nullptr;
+static gmx::EnumerationArray<Directive, Directive *> necessary = {{ nullptr }};
 
-static void set_nec(directive **n, ...)
+static void set_nec(Directive **n, ...)
 /* Must always have at least one extra argument */
 {
     va_list   ap;
     int       ind = 0;
-    directive d;
+    Directive d;
 
     va_start(ap, n);
     do
     {
-        d = static_cast<directive>(va_arg(ap, int));
+        d = static_cast<Directive>(va_arg(ap, int));
         srenew(*n, ++ind);
         (*n)[ind-1] = d;
     }
-    while (d != d_none);
+    while (d != Directive::d_none);
     va_end(ap);
 }
 
 void DS_Init(DirStack **DS)
 {
-    if (necessary == nullptr)
+    if (necessary[0] == nullptr)
     {
-        int i;
-
-        snew(necessary, d_maxdir);
-        set_nec(&(necessary[d_defaults]), d_none);
-        set_nec(&(necessary[d_atomtypes]), d_defaults, d_none);
-        set_nec(&(necessary[d_bondtypes]), d_atomtypes, d_none);
-        set_nec(&(necessary[d_constrainttypes]), d_atomtypes, d_none);
-        set_nec(&(necessary[d_pairtypes]), d_atomtypes, d_none);
-        set_nec(&(necessary[d_angletypes]), d_atomtypes, d_none);
-        set_nec(&(necessary[d_dihedraltypes]), d_atomtypes, d_none);
-        set_nec(&(necessary[d_nonbond_params]), d_atomtypes, d_none);
+        set_nec(&(necessary[Directive::d_defaults]), Directive::d_none);
+        set_nec(&(necessary[Directive::d_atomtypes]), Directive::d_defaults, Directive::d_none);
+        set_nec(&(necessary[Directive::d_bondtypes]), Directive::d_atomtypes, Directive::d_none);
+        set_nec(&(necessary[Directive::d_constrainttypes]), Directive::d_atomtypes, Directive::d_none);
+        set_nec(&(necessary[Directive::d_pairtypes]), Directive::d_atomtypes, Directive::d_none);
+        set_nec(&(necessary[Directive::d_angletypes]), Directive::d_atomtypes, Directive::d_none);
+        set_nec(&(necessary[Directive::d_dihedraltypes]), Directive::d_atomtypes, Directive::d_none);
+        set_nec(&(necessary[Directive::d_nonbond_params]), Directive::d_atomtypes, Directive::d_none);
         // Note that the content of the next two directives are
         // ignored, but if grompp reads them in old force field files,
         // it still needs to understand that they are in a valid place
@@ -361,50 +358,36 @@ void DS_Init(DirStack **DS)
         // be in the same place that was valid in old versions (ie. child
         // directive of [atomtypes]) but any relevant case will
         // satisfy that.
-        set_nec(&(necessary[d_implicit_genborn_params]), d_atomtypes, d_none);
-        set_nec(&(necessary[d_implicit_surface_params]), d_atomtypes, d_none);
-        set_nec(&(necessary[d_cmaptypes]), d_atomtypes, d_none);
-        set_nec(&(necessary[d_moleculetype]), d_atomtypes, d_none);
-        set_nec(&(necessary[d_atoms]), d_moleculetype, d_none);
-        set_nec(&(necessary[d_vsites2]), d_atoms, d_none);
-        set_nec(&(necessary[d_vsites3]), d_atoms, d_none);
-        set_nec(&(necessary[d_vsites4]), d_atoms, d_none);
-        set_nec(&(necessary[d_vsitesn]), d_atoms, d_none);
-        set_nec(&(necessary[d_bonds]), d_atoms, d_none);
-        set_nec(&(necessary[d_exclusions]), d_bonds, d_constraints, d_settles, d_none);
-        set_nec(&(necessary[d_pairs]), d_atoms, d_none);
-        set_nec(&(necessary[d_pairs_nb]), d_atoms, d_none);
-        set_nec(&(necessary[d_angles]), d_atoms, d_none);
-        set_nec(&(necessary[d_polarization]), d_atoms, d_none);
-        set_nec(&(necessary[d_water_polarization]), d_atoms, d_none);
-        set_nec(&(necessary[d_thole_polarization]), d_atoms, d_none);
-        set_nec(&(necessary[d_dihedrals]), d_atoms, d_none);
-        set_nec(&(necessary[d_constraints]), d_atoms, d_none);
-        set_nec(&(necessary[d_settles]), d_atoms, d_none);
-        set_nec(&(necessary[d_system]), d_moleculetype, d_none);
-        set_nec(&(necessary[d_molecules]), d_system, d_none);
-        set_nec(&(necessary[d_position_restraints]), d_atoms, d_none);
-        set_nec(&(necessary[d_angle_restraints]), d_atoms, d_none);
-        set_nec(&(necessary[d_angle_restraints_z]), d_atoms, d_none);
-        set_nec(&(necessary[d_distance_restraints]), d_atoms, d_none);
-        set_nec(&(necessary[d_orientation_restraints]), d_atoms, d_none);
-        set_nec(&(necessary[d_dihedral_restraints]), d_atoms, d_none);
-        set_nec(&(necessary[d_cmap]), d_atoms, d_none);
-        set_nec(&(necessary[d_intermolecular_interactions]), d_molecules, d_none);
-
-        for (i = 0; (i < d_maxdir); i++)
-        {
-            if (necessary[i])
-            {
-                directive d;
-                int       j = 0;
-                do
-                {
-                    d = necessary[i][j++];
-                }
-                while (d != d_none);
-            }
-        }
+        set_nec(&(necessary[Directive::d_implicit_genborn_params]), Directive::d_atomtypes, Directive::d_none);
+        set_nec(&(necessary[Directive::d_implicit_surface_params]), Directive::d_atomtypes, Directive::d_none);
+        set_nec(&(necessary[Directive::d_cmaptypes]), Directive::d_atomtypes, Directive::d_none);
+        set_nec(&(necessary[Directive::d_moleculetype]), Directive::d_atomtypes, Directive::d_none);
+        set_nec(&(necessary[Directive::d_atoms]), Directive::d_moleculetype, Directive::d_none);
+        set_nec(&(necessary[Directive::d_vsites2]), Directive::d_atoms, Directive::d_none);
+        set_nec(&(necessary[Directive::d_vsites3]), Directive::d_atoms, Directive::d_none);
+        set_nec(&(necessary[Directive::d_vsites4]), Directive::d_atoms, Directive::d_none);
+        set_nec(&(necessary[Directive::d_vsitesn]), Directive::d_atoms, Directive::d_none);
+        set_nec(&(necessary[Directive::d_bonds]), Directive::d_atoms, Directive::d_none);
+        set_nec(&(necessary[Directive::d_exclusions]), Directive::d_bonds, Directive::d_constraints, Directive::d_settles, Directive::d_none);
+        set_nec(&(necessary[Directive::d_pairs]), Directive::d_atoms, Directive::d_none);
+        set_nec(&(necessary[Directive::d_pairs_nb]), Directive::d_atoms, Directive::d_none);
+        set_nec(&(necessary[Directive::d_angles]), Directive::d_atoms, Directive::d_none);
+        set_nec(&(necessary[Directive::d_polarization]), Directive::d_atoms, Directive::d_none);
+        set_nec(&(necessary[Directive::d_water_polarization]), Directive::d_atoms, Directive::d_none);
+        set_nec(&(necessary[Directive::d_thole_polarization]), Directive::d_atoms, Directive::d_none);
+        set_nec(&(necessary[Directive::d_dihedrals]), Directive::d_atoms, Directive::d_none);
+        set_nec(&(necessary[Directive::d_constraints]), Directive::d_atoms, Directive::d_none);
+        set_nec(&(necessary[Directive::d_settles]), Directive::d_atoms, Directive::d_none);
+        set_nec(&(necessary[Directive::d_system]), Directive::d_moleculetype, Directive::d_none);
+        set_nec(&(necessary[Directive::d_molecules]), Directive::d_system, Directive::d_none);
+        set_nec(&(necessary[Directive::d_position_restraints]), Directive::d_atoms, Directive::d_none);
+        set_nec(&(necessary[Directive::d_angle_restraints]), Directive::d_atoms, Directive::d_none);
+        set_nec(&(necessary[Directive::d_angle_restraints_z]), Directive::d_atoms, Directive::d_none);
+        set_nec(&(necessary[Directive::d_distance_restraints]), Directive::d_atoms, Directive::d_none);
+        set_nec(&(necessary[Directive::d_orientation_restraints]), Directive::d_atoms, Directive::d_none);
+        set_nec(&(necessary[Directive::d_dihedral_restraints]), Directive::d_atoms, Directive::d_none);
+        set_nec(&(necessary[Directive::d_cmap]), Directive::d_atoms, Directive::d_none);
+        set_nec(&(necessary[Directive::d_intermolecular_interactions]), Directive::d_molecules, Directive::d_none);
     }
     *DS = nullptr;
 
@@ -422,7 +405,7 @@ void DS_Done (DirStack **DS)
     }
 }
 
-void DS_Push (DirStack **DS, directive d)
+void DS_Push (DirStack **DS, Directive d)
 {
     DirStack *D;
 
@@ -432,7 +415,7 @@ void DS_Push (DirStack **DS, directive d)
     *DS     = D;
 }
 
-int DS_Search(DirStack *DS, directive d)
+int DS_Search(DirStack *DS, Directive d)
 {
     DirStack *D;
 
@@ -445,19 +428,19 @@ int DS_Search(DirStack *DS, directive d)
     return static_cast<int>(D != nullptr);
 }
 
-int DS_Check_Order(DirStack *DS, directive d)
+int DS_Check_Order(DirStack *DS, Directive d)
 {
-    directive d0;
+    Directive d0;
     int       i = 0;
 
     /* Check if parameter definitions appear after a moleculetype directive */
-    if (d < d_moleculetype && DS_Search(DS, d_moleculetype))
+    if (d < Directive::d_moleculetype && DS_Search(DS, Directive::d_moleculetype))
     {
         return FALSE;
     }
 
     /* Check if all the necessary directives have appeared before directive d */
-    if (necessary[d][0] == d_none)
+    if (necessary[d][0] == Directive::d_none)
     {
         return TRUE;
     }
@@ -471,7 +454,7 @@ int DS_Check_Order(DirStack *DS, directive d)
                 return TRUE;
             }
         }
-        while (d0 != d_none);
+        while (d0 != Directive::d_none);
     }
     return FALSE;
 }
index 38a664a2d0f24f0b71fede126ada2c3238de7e19..e869439aca22ab153ae4757bb0e9b5de54244fe9 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2019, 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.
 #ifndef GMX_GMXPREPROCESS_TOPDIRS_H
 #define GMX_GMXPREPROCESS_TOPDIRS_H
 
-#include "gromacs/gmxpreprocess/grompp-impl.h"
+/* Must correspond to strings in topdirs.cpp */
+enum class Directive : int
+{
+    d_defaults,
+    d_atomtypes,
+    d_bondtypes,
+    d_constrainttypes,
+    d_pairtypes,
+    d_angletypes,
+    d_dihedraltypes,
+    d_nonbond_params,
+    d_implicit_genborn_params,
+    d_implicit_surface_params,
+    d_cmaptypes,
+    d_moleculetype,
+    d_atoms,
+    d_vsites2,
+    d_vsites3,
+    d_vsites4,
+    d_vsitesn,
+    d_bonds,
+    d_exclusions,
+    d_pairs,
+    d_pairs_nb,
+    d_angles,
+    d_dihedrals,
+    d_constraints,
+    d_settles,
+    d_polarization,
+    d_water_polarization,
+    d_thole_polarization,
+    d_system,
+    d_molecules,
+    d_position_restraints,
+    d_angle_restraints,
+    d_angle_restraints_z,
+    d_distance_restraints,
+    d_orientation_restraints,
+    d_dihedral_restraints,
+    d_cmap,
+    d_intermolecular_interactions,
+    d_maxdir,
+    d_invalid,
+    d_none,
+    Count
+};
 
-typedef struct tagDirStack {
-    directive           d;
-    struct tagDirStack *prev;
-} DirStack;
+struct DirStack
+{
+    Directive           d;
+    DirStack           *prev;
+};
 
-int ifunc_index(directive d, int type);
+int ifunc_index(Directive d, int type);
 
-const char *dir2str (directive d);
+const char *dir2str (Directive d);
 
-directive str2dir (char *dstr);
+Directive str2dir (char *dstr);
 
 void DS_Init (DirStack **DS);
 
 void DS_Done (DirStack **DS);
 
-void DS_Push (DirStack **DS, directive d);
+void DS_Push (DirStack **DS, Directive d);
 
-int  DS_Search (DirStack *DS, directive d);
+int  DS_Search (DirStack *DS, Directive d);
 
-int  DS_Check_Order (DirStack *DS, directive d);
+int  DS_Check_Order (DirStack *DS, Directive d);
 
 #endif
index 2c8be67277565e59c27b0513f4816f8b2b68faab..c6b541c00cad74ec48b6be65e164b24f6ac92ba5 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
 
 #include <algorithm>
 
+#include <unordered_set>
 #include <sys/types.h>
 
 #include "gromacs/fileio/gmxfio.h"
 #include "gromacs/fileio/warninp.h"
 #include "gromacs/gmxpreprocess/gmxcpp.h"
+#include "gromacs/gmxpreprocess/gpp_atomtype.h"
 #include "gromacs/gmxpreprocess/gpp_bond_atomtype.h"
 #include "gromacs/gmxpreprocess/gpp_nextnb.h"
 #include "gromacs/gmxpreprocess/grompp-impl.h"
 #define OPENDIR     '[' /* starting sign for directive */
 #define CLOSEDIR    ']' /* ending sign for directive   */
 
-static void free_nbparam(t_nbparam **param, int nr)
-{
-    int i;
-
-    assert(param);
-    for (i = 0; i < nr; i++)
-    {
-        assert(param[i]);
-        sfree(param[i]);
-    }
-    sfree(param);
-}
-
-static int copy_nbparams(t_nbparam **param, int ftype, t_params *plist, int nr)
-{
-    int i, j, f;
-    int nrfp, ncopy;
-
-    nrfp = NRFP(ftype);
-
-    ncopy = 0;
-    for (i = 0; i < nr; i++)
-    {
-        for (j = 0; j <= i; j++)
-        {
-            assert(param);
-            if (param[i][j].bSet)
-            {
-                for (f = 0; f < nrfp; f++)
-                {
-                    plist->param[nr*i+j].c[f] = param[i][j].c[f];
-                    plist->param[nr*j+i].c[f] = param[i][j].c[f];
-                }
-                ncopy++;
-            }
-        }
-    }
-
-    return ncopy;
-}
-
 static void gen_pairs(t_params *nbs, t_params *pairs, real fudge, int comb)
 {
     int     i, j, ntp, nrfp, nrfpA, nrfpB, nnn;
@@ -176,7 +137,7 @@ static void gen_pairs(t_params *nbs, t_params *pairs, real fudge, int comb)
     }
 }
 
-double check_mol(const gmx_mtop_t *mtop, warninp_t wi)
+double check_mol(const gmx_mtop_t *mtop, warninp *wi)
 {
     char     buf[256];
     int      i, ri, pt;
@@ -282,7 +243,7 @@ static void sum_q(const t_atoms *atoms, int numMols,
 }
 
 static void get_nbparm(char *nb_str, char *comb_str, int *nb, int *comb,
-                       warninp_t wi)
+                       warninp *wi)
 {
     int  i;
     char warn_buf[STRLEN];
@@ -328,7 +289,7 @@ static void get_nbparm(char *nb_str, char *comb_str, int *nb, int *comb,
 }
 
 static char ** cpp_opts(const char *define, const char *include,
-                        warninp_t wi)
+                        warninp *wi)
 {
     int         n, len;
     int         ncppopts = 0;
@@ -415,7 +376,7 @@ static void make_atoms_sys(const std::vector<gmx_molblock_t> &molblock,
 static char **read_topol(const char *infile, const char *outfile,
                          const char *define, const char *include,
                          t_symtab    *symtab,
-                         gpp_atomtype_t atype,
+                         gpp_atomtype *atype,
                          int         *nrmols,
                          t_molinfo   **molinfo,
                          t_molinfo   **intermolecular_interactions,
@@ -429,7 +390,7 @@ static char **read_topol(const char *infile, const char *outfile,
                          bool        bFEP,
                          bool        bZero,
                          bool        usingFullRangeElectrostatics,
-                         warninp_t       wi)
+                         warninp    *wi)
 {
     FILE                 *out;
     int                   i, sl, nb_funct;
@@ -441,13 +402,13 @@ static char **read_topol(const char *infile, const char *outfile,
     double                fLJ, fQQ, fPOW;
     t_molinfo            *mi0   = nullptr;
     DirStack             *DS;
-    directive             d, newd;
+    Directive             d, newd;
     t_nbparam           **nbparam, **pair;
     gmx::ExclusionBlocks *exclusionBlocks;
     real                  fudgeLJ = -1;    /* Multiplication factor to generate 1-4 from LJ */
     bool                  bReadDefaults, bReadMolType, bGenPairs, bWarn_copy_A_B;
     double                qt = 0, qBt = 0; /* total charge */
-    t_bond_atomtype       batype;
+    gpp_bond_atomtype    *batype;
     int                   lastcg = -1;
     int                   dcatt  = -1, nmol_couple;
     /* File handling variables */
@@ -481,12 +442,12 @@ static char **read_topol(const char *infile, const char *outfile,
     }
 
     /* some local variables */
-    DS_Init(&DS);                /* directive stack    */
-    nmol            = 0;         /* no molecules yet...        */
-    d               = d_invalid; /* first thing should be a directive */
-    nbparam         = nullptr;   /* The temporary non-bonded matrix */
-    pair            = nullptr;   /* The temporary pair interaction matrix */
-    exclusionBlocks = nullptr;   /* the extra exclusions */
+    DS_Init(&DS);                           /* directive stack */
+    nmol            = 0;                    /* no molecules yet...     */
+    d               = Directive::d_invalid; /* first thing should be a directive */
+    nbparam         = nullptr;              /* The temporary non-bonded matrix */
+    pair            = nullptr;              /* The temporary pair interaction matrix */
+    exclusionBlocks = nullptr;              /* the extra exclusions */
     nb_funct        = F_LJ;
 
     *reppow  = 12.0;      /* Default value for repulsion power     */
@@ -587,7 +548,7 @@ static char **read_topol(const char *infile, const char *outfile,
                     }
                     trim (dirstr);
 
-                    if ((newd = str2dir(dirstr)) == d_invalid)
+                    if ((newd = str2dir(dirstr)) == Directive::d_invalid)
                     {
                         sprintf(errbuf, "Invalid directive %s", dirstr);
                         warning_error(wi, errbuf);
@@ -606,10 +567,10 @@ static char **read_topol(const char *infile, const char *outfile,
                                been present, and which actually are */
                             gmx_fatal(FARGS, "%s\nInvalid order for directive %s",
                                       cpp_error(&handle, eCPP_SYNTAX), dir2str(newd));
-                            /* d = d_invalid; */
+                            /* d = Directive::d_invalid; */
                         }
 
-                        if (d == d_intermolecular_interactions)
+                        if (d == Directive::d_intermolecular_interactions)
                         {
                             if (*intermolecular_interactions == nullptr)
                             {
@@ -627,7 +588,7 @@ static char **read_topol(const char *infile, const char *outfile,
                     }
                     sfree(dirstr);
                 }
-                else if (d != d_invalid)
+                else if (d != Directive::d_invalid)
                 {
                     /* Not a directive, just a plain string
                      * use a gigantic switch to decode,
@@ -635,7 +596,7 @@ static char **read_topol(const char *infile, const char *outfile,
                      */
                     switch (d)
                     {
-                        case d_defaults:
+                        case Directive::d_defaults:
                             if (bReadDefaults)
                             {
                                 gmx_fatal(FARGS, "%s\nFound a second defaults directive.\n",
@@ -676,21 +637,21 @@ static char **read_topol(const char *infile, const char *outfile,
                                     *reppow   = fPOW;
                                 }
                             }
-                            nb_funct = ifunc_index(d_nonbond_params, nb_funct);
+                            nb_funct = ifunc_index(Directive::d_nonbond_params, nb_funct);
 
                             break;
-                        case d_atomtypes:
+                        case Directive::d_atomtypes:
                             push_at(symtab, atype, batype, pline, nb_funct,
                                     &nbparam, bGenPairs ? &pair : nullptr, wi);
                             break;
 
-                        case d_bondtypes:
+                        case Directive::d_bondtypes:
                             push_bt(d, plist, 2, nullptr, batype, pline, wi);
                             break;
-                        case d_constrainttypes:
+                        case Directive::d_constrainttypes:
                             push_bt(d, plist, 2, nullptr, batype, pline, wi);
                             break;
-                        case d_pairtypes:
+                        case Directive::d_pairtypes:
                             if (bGenPairs)
                             {
                                 push_nbt(d, pair, atype, pline, F_LJ14, wi);
@@ -700,47 +661,35 @@ static char **read_topol(const char *infile, const char *outfile,
                                 push_bt(d, plist, 2, atype, nullptr, pline, wi);
                             }
                             break;
-                        case d_angletypes:
+                        case Directive::d_angletypes:
                             push_bt(d, plist, 3, nullptr, batype, pline, wi);
                             break;
-                        case d_dihedraltypes:
+                        case Directive::d_dihedraltypes:
                             /* Special routine that can read both 2 and 4 atom dihedral definitions. */
                             push_dihedraltype(d, plist, batype, pline, wi);
                             break;
 
-                        case d_nonbond_params:
+                        case Directive::d_nonbond_params:
                             push_nbt(d, nbparam, atype, pline, nb_funct, wi);
                             break;
-                        /*
-                           case d_blocktype:
-                           nblock++;
-                           srenew(block,nblock);
-                           srenew(blockinfo,nblock);
-                           blk0=&(block[nblock-1]);
-                           bi0=&(blockinfo[nblock-1]);
-                           init_top(blk0);
-                           init_molinfo(bi0);
-                           push_molt(symtab,bi0,pline);
-                           break;
-                         */
-
-                        case d_implicit_genborn_params:
+
+                        case Directive::d_implicit_genborn_params:
                             // Skip this line, so old topologies with
                             // GB parameters can be read.
                             break;
 
-                        case d_implicit_surface_params:
+                        case Directive::d_implicit_surface_params:
                             // Skip this line, so that any topologies
                             // with surface parameters can be read
                             // (even though these were never formally
                             // supported).
                             break;
 
-                        case d_cmaptypes:
+                        case Directive::d_cmaptypes:
                             push_cmaptype(d, plist, 5, atype, batype, pline, wi);
                             break;
 
-                        case d_moleculetype:
+                        case Directive::d_moleculetype:
                         {
                             if (!bReadMolType)
                             {
@@ -785,47 +734,47 @@ static char **read_topol(const char *infile, const char *outfile,
                             mi0->atoms.havePdbInfo          = FALSE;
                             break;
                         }
-                        case d_atoms:
+                        case Directive::d_atoms:
                             push_atom(symtab, &(mi0->cgs), &(mi0->atoms), atype, pline, &lastcg, wi);
                             break;
 
-                        case d_pairs:
+                        case Directive::d_pairs:
                             push_bond(d, plist, mi0->plist, &(mi0->atoms), atype, pline, FALSE,
                                       bGenPairs, *fudgeQQ, bZero, &bWarn_copy_A_B, wi);
                             break;
-                        case d_pairs_nb:
+                        case Directive::d_pairs_nb:
                             push_bond(d, plist, mi0->plist, &(mi0->atoms), atype, pline, FALSE,
                                       FALSE, 1.0, bZero, &bWarn_copy_A_B, wi);
                             break;
 
-                        case d_vsites2:
-                        case d_vsites3:
-                        case d_vsites4:
-                        case d_bonds:
-                        case d_angles:
-                        case d_constraints:
-                        case d_settles:
-                        case d_position_restraints:
-                        case d_angle_restraints:
-                        case d_angle_restraints_z:
-                        case d_distance_restraints:
-                        case d_orientation_restraints:
-                        case d_dihedral_restraints:
-                        case d_dihedrals:
-                        case d_polarization:
-                        case d_water_polarization:
-                        case d_thole_polarization:
+                        case Directive::d_vsites2:
+                        case Directive::d_vsites3:
+                        case Directive::d_vsites4:
+                        case Directive::d_bonds:
+                        case Directive::d_angles:
+                        case Directive::d_constraints:
+                        case Directive::d_settles:
+                        case Directive::d_position_restraints:
+                        case Directive::d_angle_restraints:
+                        case Directive::d_angle_restraints_z:
+                        case Directive::d_distance_restraints:
+                        case Directive::d_orientation_restraints:
+                        case Directive::d_dihedral_restraints:
+                        case Directive::d_dihedrals:
+                        case Directive::d_polarization:
+                        case Directive::d_water_polarization:
+                        case Directive::d_thole_polarization:
                             push_bond(d, plist, mi0->plist, &(mi0->atoms), atype, pline, TRUE,
                                       bGenPairs, *fudgeQQ, bZero, &bWarn_copy_A_B, wi);
                             break;
-                        case d_cmap:
+                        case Directive::d_cmap:
                             push_cmap(d, plist, mi0->plist, &(mi0->atoms), atype, pline, wi);
                             break;
 
-                        case d_vsitesn:
+                        case Directive::d_vsitesn:
                             push_vsitesn(d, mi0->plist, &(mi0->atoms), pline, wi);
                             break;
-                        case d_exclusions:
+                        case Directive::d_exclusions:
                             GMX_ASSERT(exclusionBlocks, "exclusionBlocks must always be allocated so exclusions can be processed");
                             if (!exclusionBlocks[nmol-1].nr)
                             {
@@ -833,11 +782,11 @@ static char **read_topol(const char *infile, const char *outfile,
                             }
                             push_excl(pline, &(exclusionBlocks[nmol-1]), wi);
                             break;
-                        case d_system:
+                        case Directive::d_system:
                             trim(pline);
                             title = put_symtab(symtab, pline);
                             break;
-                        case d_molecules:
+                        case Directive::d_molecules:
                         {
                             int      whichmol;
                             bool     bCouple;
@@ -904,6 +853,14 @@ static char **read_topol(const char *infile, const char *outfile,
         }
     }
     while (!done);
+
+    // Check that all strings defined with -D were used when processing topology
+    std::string unusedDefineWarning = checkAndWarnForUnusedDefines(*handle);
+    if (!unusedDefineWarning.empty())
+    {
+        warning(wi, unusedDefineWarning);
+    }
+
     sfree(cpp_opts_return);
 
     if (out)
@@ -995,14 +952,14 @@ char **do_top(bool                          bVerbose,
               int                          *combination_rule,
               double                       *repulsion_power,
               real                         *fudgeQQ,
-              gpp_atomtype_t                atype,
+              gpp_atomtype                 *atype,
               int                          *nrmols,
               t_molinfo                   **molinfo,
               t_molinfo                   **intermolecular_interactions,
               const t_inputrec             *ir,
               std::vector<gmx_molblock_t>  *molblock,
               bool                         *ffParametrizedWithHBondConstraints,
-              warninp_t                     wi)
+              warninp                      *wi)
 {
     /* Tmpfile might contain a long path */
     const char *tmpfile;
@@ -1359,7 +1316,7 @@ static void generate_qmexcl_moltype(gmx_moltype_t *molt, const unsigned char *gr
     free(blink);
 } /* generate_qmexcl */
 
-void generate_qmexcl(gmx_mtop_t *sys, t_inputrec *ir, warninp_t wi, GmxQmmmMode qmmmMode)
+void generate_qmexcl(gmx_mtop_t *sys, t_inputrec *ir, warninp *wi, GmxQmmmMode qmmmMode)
 {
     /* This routine expects molt->molt[m].ilist to be of size F_NRE and ordered.
      */
index fd9c620cd533b44377782a02e042bc5dba1e807c..c3ec5d5ff35e5c802a4180fbb70394f7fc49880c 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2012,2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2014,2015,2016,2018,2019, 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.
 
 #include <vector>
 
-#include "gromacs/gmxpreprocess/gpp_atomtype.h"
-#include "gromacs/gmxpreprocess/grompp-impl.h"
+#include "gromacs/utility/real.h"
 
 struct gmx_molblock_t;
 struct gmx_mtop_t;
+struct gpp_atomtype;
 struct t_gromppopts;
 struct t_inputrec;
+struct t_molinfo;
+struct t_params;
+struct t_symtab;
 struct warninp;
 enum struct GmxQmmmMode;
 typedef warninp *warninp_t;
@@ -59,12 +62,12 @@ char **do_top(bool                          bVerbose,
               const char                   *topppfile,
               t_gromppopts                 *opts,
               bool                          bZero,
-              struct t_symtab              *symtab,
+              t_symtab                     *symtab,
               t_params                      plist[],
               int                          *combination_rule,
               double                       *repulsion_power,
               real                         *fudgeQQ,
-              gpp_atomtype_t                atype,
+              gpp_atomtype                 *atype,
               int                          *nrmols,
               t_molinfo                   **molinfo,
               t_molinfo                   **intermolecular_interactions,
index 1f150be42ade2386b3dc0e9c94a18392b700b40e..6828bb0703b429ccdb205ebe07229a4458a8752c 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -49,6 +49,7 @@
 #include "gromacs/fileio/warninp.h"
 #include "gromacs/gmxpreprocess/gpp_atomtype.h"
 #include "gromacs/gmxpreprocess/gpp_bond_atomtype.h"
+#include "gromacs/gmxpreprocess/grompp-impl.h"
 #include "gromacs/gmxpreprocess/notset.h"
 #include "gromacs/gmxpreprocess/readir.h"
 #include "gromacs/gmxpreprocess/topdirs.h"
@@ -65,8 +66,8 @@
 #include "gromacs/utility/smalloc.h"
 #include "gromacs/utility/stringutil.h"
 
-void generate_nbparams(int comb, int ftype, t_params *plist, gpp_atomtype_t atype,
-                       warninp_t wi)
+void generate_nbparams(int comb, int ftype, t_params *plist, gpp_atomtype *atype,
+                       warninp *wi)
 {
     int   i, j, k = -1, nf;
     int   nr, nrfp;
@@ -190,7 +191,17 @@ void generate_nbparams(int comb, int ftype, t_params *plist, gpp_atomtype_t atyp
     }
 }
 
-static void realloc_nb_params(gpp_atomtype_t at,
+/*! \brief Used to temporarily store the explicit non-bonded parameter
+ * combinations, which will be copied to t_params. */
+struct t_nbparam
+{
+    //! Has this combination been set.
+    bool     bSet;
+    //! The non-bonded parameters
+    real     c[4];
+};
+
+static void realloc_nb_params(gpp_atomtype *at,
                               t_nbparam ***nbparam, t_nbparam ***pair)
 {
     /* Add space in the non-bonded parameters matrix */
@@ -204,6 +215,47 @@ static void realloc_nb_params(gpp_atomtype_t at,
     }
 }
 
+int copy_nbparams(t_nbparam **param, int ftype, t_params *plist, int nr)
+{
+    int i, j, f;
+    int nrfp, ncopy;
+
+    nrfp = NRFP(ftype);
+
+    ncopy = 0;
+    for (i = 0; i < nr; i++)
+    {
+        for (j = 0; j <= i; j++)
+        {
+            GMX_RELEASE_ASSERT(param, "Must have valid parameters");
+            if (param[i][j].bSet)
+            {
+                for (f = 0; f < nrfp; f++)
+                {
+                    plist->param[nr*i+j].c[f] = param[i][j].c[f];
+                    plist->param[nr*j+i].c[f] = param[i][j].c[f];
+                }
+                ncopy++;
+            }
+        }
+    }
+
+    return ncopy;
+}
+
+void free_nbparam(t_nbparam **param, int nr)
+{
+    int i;
+
+    GMX_RELEASE_ASSERT(param, "Must have valid parameters");
+    for (i = 0; i < nr; i++)
+    {
+        GMX_RELEASE_ASSERT(param[i], "Must have valid parameters");
+        sfree(param[i]);
+    }
+    sfree(param);
+}
+
 static void copy_B_from_A(int ftype, double *c)
 {
     int nrfpA, nrfpB, i;
@@ -218,10 +270,10 @@ static void copy_B_from_A(int ftype, double *c)
     }
 }
 
-void push_at (t_symtab *symtab, gpp_atomtype_t at, t_bond_atomtype bat,
+void push_at (t_symtab *symtab, gpp_atomtype *at, gpp_bond_atomtype *bat,
               char *line, int nb_funct,
               t_nbparam ***nbparam, t_nbparam ***pair,
-              warninp_t wi)
+              warninp *wi)
 {
     typedef struct {
         const char *entry;
@@ -535,7 +587,7 @@ static void push_bondtype(t_params     *       bt,
                           int                  ftype,
                           bool                 bAllowRepeat,
                           const char *         line,
-                          warninp_t            wi)
+                          warninp             *wi)
 {
     int      nr   = bt->nr;
     int      nrfp = NRFP(ftype);
@@ -663,10 +715,10 @@ static void push_bondtype(t_params     *       bt,
     }
 }
 
-void push_bt(directive d, t_params bt[], int nral,
-             gpp_atomtype_t at,
-             t_bond_atomtype bat, char *line,
-             warninp_t wi)
+void push_bt(Directive d, t_params bt[], int nral,
+             gpp_atomtype *at,
+             gpp_bond_atomtype *bat, char *line,
+             warninp *wi)
 {
     const char *formal[MAXATOMLIST+1] = {
         "%s",
@@ -763,9 +815,9 @@ void push_bt(directive d, t_params bt[], int nral,
 }
 
 
-void push_dihedraltype(directive d, t_params bt[],
-                       t_bond_atomtype bat, char *line,
-                       warninp_t wi)
+void push_dihedraltype(Directive d, t_params bt[],
+                       gpp_bond_atomtype *bat, char *line,
+                       warninp *wi)
 {
     const char  *formal[MAXATOMLIST+1] = {
         "%s",
@@ -932,9 +984,9 @@ void push_dihedraltype(directive d, t_params bt[],
 }
 
 
-void push_nbt(directive d, t_nbparam **nbt, gpp_atomtype_t atype,
+void push_nbt(Directive d, t_nbparam **nbt, gpp_atomtype *atype,
               char *pline, int nb_funct,
-              warninp_t wi)
+              warninp *wi)
 {
     /* swap the atoms */
     const char *form3 = "%*s%*s%*s%lf%lf%lf";
@@ -1059,9 +1111,9 @@ void push_nbt(directive d, t_nbparam **nbt, gpp_atomtype_t atype,
 }
 
 void
-push_cmaptype(directive d, t_params bt[], int nral, gpp_atomtype_t at,
-              t_bond_atomtype bat, char *line,
-              warninp_t wi)
+push_cmaptype(Directive d, t_params bt[], int nral, gpp_atomtype *at,
+              gpp_bond_atomtype *bat, char *line,
+              warninp *wi)
 {
     const char  *formal = "%s%s%s%s%s%s%s%s%n";
 
@@ -1210,7 +1262,7 @@ static void push_atom_now(t_symtab *symtab, t_atoms *at, int atomnr,
                           char *resnumberic,
                           char *resname, char *name, real m0, real q0,
                           int typeB, char *ctypeB, real mB, real qB,
-                          warninp_t wi)
+                          warninp *wi)
 {
     int           j, resind = 0, resnr;
     unsigned char ric;
@@ -1306,8 +1358,8 @@ static void push_cg(t_block *block, int *lastindex, int index, int a)
 }
 
 void push_atom(t_symtab *symtab, t_block *cgs,
-               t_atoms *at, gpp_atomtype_t atype, char *line, int *lastcg,
-               warninp_t wi)
+               t_atoms *at, gpp_atomtype *atype, char *line, int *lastcg,
+               warninp *wi)
 {
     int           nr, ptype;
     int           cgnumber, atomnr, type, typeB, nscan;
@@ -1386,7 +1438,7 @@ void push_atom(t_symtab *symtab, t_block *cgs,
 }
 
 void push_molt(t_symtab *symtab, int *nmol, t_molinfo **mol, char *line,
-               warninp_t wi)
+               warninp *wi)
 {
     char       type[STRLEN];
     int        nrexcl, i;
@@ -1516,10 +1568,10 @@ static bool default_nb_params(int ftype, t_params bt[], t_atoms *at,
 }
 
 static bool default_cmap_params(t_params bondtype[],
-                                t_atoms *at, gpp_atomtype_t atype,
+                                t_atoms *at, gpp_atomtype *atype,
                                 t_param *p, bool bB,
                                 int *cmap_type, int *nparam_def,
-                                warninp_t wi)
+                                warninp *wi)
 {
     int        i, nparam_found;
     int        ct;
@@ -1591,7 +1643,7 @@ static int natom_match(t_param *pi,
 }
 
 static bool default_params(int ftype, t_params bt[],
-                           t_atoms *at, gpp_atomtype_t atype,
+                           t_atoms *at, gpp_atomtype *atype,
                            t_param *p, bool bB,
                            t_param **param_def,
                            int *nparam_def)
@@ -1709,11 +1761,11 @@ static bool default_params(int ftype, t_params bt[],
 
 
 
-void push_bond(directive d, t_params bondtype[], t_params bond[],
-               t_atoms *at, gpp_atomtype_t atype, char *line,
+void push_bond(Directive d, t_params bondtype[], t_params bond[],
+               t_atoms *at, gpp_atomtype *atype, char *line,
                bool bBonded, bool bGenPairs, real fudgeQQ,
                bool bZero, bool *bWarn_copy_A_B,
-               warninp_t wi)
+               warninp *wi)
 {
     const char  *aaformat[MAXATOMLIST] = {
         "%d%d",
@@ -2117,9 +2169,9 @@ void push_bond(directive d, t_params bondtype[], t_params bond[],
     }
 }
 
-void push_cmap(directive d, t_params bondtype[], t_params bond[],
-               t_atoms *at, gpp_atomtype_t atype, char *line,
-               warninp_t wi)
+void push_cmap(Directive d, t_params bondtype[], t_params bond[],
+               t_atoms *at, gpp_atomtype *atype, char *line,
+               warninp *wi)
 {
     const char *aaformat[MAXATOMLIST+1] =
     {
@@ -2210,9 +2262,9 @@ void push_cmap(directive d, t_params bondtype[], t_params bond[],
 
 
 
-void push_vsitesn(directive d, t_params bond[],
+void push_vsitesn(Directive d, t_params bond[],
                   t_atoms *at, char *line,
-                  warninp_t wi)
+                  warninp *wi)
 {
     char   *ptr;
     int     type, ftype, j, n, ret, nj, a;
@@ -2321,7 +2373,7 @@ void push_vsitesn(directive d, t_params bond[],
 
 void push_mol(int nrmols, t_molinfo mols[], char *pline, int *whichmol,
               int *nrcopies,
-              warninp_t wi)
+              warninp *wi)
 {
     char type[STRLEN];
 
@@ -2385,7 +2437,7 @@ void push_mol(int nrmols, t_molinfo mols[], char *pline, int *whichmol,
     }
 }
 
-void push_excl(char *line, gmx::ExclusionBlocks *b2, warninp_t wi)
+void push_excl(char *line, gmx::ExclusionBlocks *b2, warninp *wi)
 {
     int  i, j;
     int  n;
@@ -2432,7 +2484,7 @@ void push_excl(char *line, gmx::ExclusionBlocks *b2, warninp_t wi)
     while (n == 1);
 }
 
-int add_atomtype_decoupled(t_symtab *symtab, gpp_atomtype_t at,
+int add_atomtype_decoupled(t_symtab *symtab, gpp_atomtype *at,
                            t_nbparam ***nbparam, t_nbparam ***pair)
 {
     t_atom  atom;
@@ -2524,7 +2576,7 @@ static void convert_pairs_to_pairsQ(t_params *plist,
     plist[F_LJ14].param = nullptr;
 }
 
-static void generate_LJCpairsNB(t_molinfo *mol, int nb_funct, t_params *nbp, warninp_t wi)
+static void generate_LJCpairsNB(t_molinfo *mol, int nb_funct, t_params *nbp, warninp *wi)
 {
     int       n, ntype, i, j, k;
     t_atom   *atom;
@@ -2604,7 +2656,7 @@ static void set_excl_all(t_blocka *excl)
 
 static void decouple_atoms(t_atoms *atoms, int atomtype_decouple,
                            int couple_lam0, int couple_lam1,
-                           const char *mol_name, warninp_t wi)
+                           const char *mol_name, warninp *wi)
 {
     int  i;
 
@@ -2647,7 +2699,7 @@ static void decouple_atoms(t_atoms *atoms, int atomtype_decouple,
 void convert_moltype_couple(t_molinfo *mol, int atomtype_decouple, real fudgeQQ,
                             int couple_lam0, int couple_lam1,
                             bool bCoupleIntra, int nb_funct, t_params *nbp,
-                            warninp_t wi)
+                            warninp *wi)
 {
     convert_pairs_to_pairsQ(mol->plist, fudgeQQ, &mol->atoms);
     if (!bCoupleIntra)
index 9c318e21b8271c98fe63138f81e41d8077265737..798769271cc97082580ccf12a0857a4366639dfc 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2018,2019, 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.
 #ifndef GMX_GMXPREPROCESS_TOPPUSH_H
 #define GMX_GMXPREPROCESS_TOPPUSH_H
 
-#include "gromacs/fileio/warninp.h"
-#include "gromacs/gmxpreprocess/gpp_atomtype.h"
-#include "gromacs/gmxpreprocess/gpp_bond_atomtype.h"
-#include "gromacs/gmxpreprocess/toputil.h"
+#include "gromacs/utility/real.h"
+
+enum class Directive : int;
+struct gpp_atomtype;
+struct gpp_bond_atomtype;
+struct t_atoms;
+struct t_block;
+struct t_molinfo;
+struct t_nbparam;
+struct t_param;
+struct t_params;
+struct t_restp;
+struct warninp;
 
 namespace gmx
 {
@@ -49,62 +58,66 @@ struct ExclusionBlocks;
 } // namespace gmx
 
 void generate_nbparams(int comb, int funct, t_params plist[],
-                       gpp_atomtype_t atype,
-                       warninp_t wi);
+                       gpp_atomtype *atype,
+                       warninp *wi);
 
-void push_at (struct t_symtab *symtab, gpp_atomtype_t at,
-              t_bond_atomtype bat, char *line, int nb_funct,
+void push_at (struct t_symtab *symtab, gpp_atomtype *at,
+              gpp_bond_atomtype *bat, char *line, int nb_funct,
               t_nbparam ***nbparam, t_nbparam ***pair,
-              warninp_t wi);
+              warninp *wi);
 
-void push_bt(directive d, t_params bt[], int nral,
-             gpp_atomtype_t at, t_bond_atomtype bat, char *line,
-             warninp_t wi);
+void push_bt(Directive d, t_params bt[], int nral,
+             gpp_atomtype *at, gpp_bond_atomtype *bat, char *line,
+             warninp *wi);
 
-void push_dihedraltype(directive d, t_params bt[],
-                       t_bond_atomtype bat, char *line,
-                       warninp_t wi);
+void push_dihedraltype(Directive d, t_params bt[],
+                       gpp_bond_atomtype *bat, char *line,
+                       warninp *wi);
 
-void push_cmaptype(directive d, t_params bt[], int nral, gpp_atomtype_t at,
-                   t_bond_atomtype bat, char *line,
-                   warninp_t wi);
+void push_cmaptype(Directive d, t_params bt[], int nral, gpp_atomtype *at,
+                   gpp_bond_atomtype *bat, char *line,
+                   warninp *wi);
 
-void push_nbt(directive d, t_nbparam **nbt, gpp_atomtype_t atype,
+void push_nbt(Directive d, t_nbparam **nbt, gpp_atomtype *atype,
               char *plines, int nb_funct,
-              warninp_t wi);
+              warninp *wi);
 
 void push_atom(struct t_symtab *symtab,
                t_block         *cgs,
                t_atoms         *at,
-               gpp_atomtype_t   atype,
+               gpp_atomtype    *atype,
                char            *line,
                int             *lastcg,
-               warninp_t        wi);
+               warninp         *wi);
 
-void push_bond(directive d, t_params bondtype[], t_params bond[],
-               t_atoms *at, gpp_atomtype_t atype, char *line,
+void push_bond(Directive d, t_params bondtype[], t_params bond[],
+               t_atoms *at, gpp_atomtype *atype, char *line,
                bool bBonded, bool bGenPairs, real fudgeQQ,
                bool bZero, bool *bWarn_copy_A_B,
-               warninp_t wi);
+               warninp *wi);
 
-void push_cmap(directive d, t_params bondtype[], t_params bond[],
-               t_atoms *at, gpp_atomtype_t atype, char *line,
-               warninp_t wi);
+void push_cmap(Directive d, t_params bondtype[], t_params bond[],
+               t_atoms *at, gpp_atomtype *atype, char *line,
+               warninp *wi);
 
-void push_vsitesn(directive d, t_params bond[],
+void push_vsitesn(Directive d, t_params bond[],
                   t_atoms *at, char *line,
-                  warninp_t wi);
+                  warninp *wi);
 
 void push_mol(int nrmols, t_molinfo mols[], char *pline,
               int *whichmol, int *nrcopies,
-              warninp_t wi);
+              warninp *wi);
 
 void push_molt(struct t_symtab *symtab, int *nmol, t_molinfo **mol, char *line,
-               warninp_t wi);
+               warninp *wi);
+
+void push_excl(char *line, gmx::ExclusionBlocks *b2, warninp *wi);
+
+int copy_nbparams(t_nbparam **param, int ftype, t_params *plist, int nr);
 
-void push_excl(char *line, gmx::ExclusionBlocks *b2, warninp_t wi);
+void free_nbparam(t_nbparam **param, int nr);
 
-int add_atomtype_decoupled(struct t_symtab *symtab, gpp_atomtype_t at,
+int add_atomtype_decoupled(struct t_symtab *symtab, gpp_atomtype *at,
                            t_nbparam ***nbparam, t_nbparam ***pair);
 /* Add an atom type with all parameters set to zero (no interactions).
  * Returns the atom type number.
@@ -115,7 +128,7 @@ void convert_moltype_couple(t_molinfo *mol, int atomtype_decouple,
                             int couple_lam0, int couple_lam1,
                             bool bCoupleIntra,
                             int nb_funct, t_params *nbp,
-                            warninp_t wi);
+                            warninp *wi);
 /* Setup mol such that the B-state has no interaction with the rest
  * of the system, but full interaction with itself.
  */
index cf48da1d8a85c6ac6e23df7959759edaec85fbba..93ae99953cd9df4b5d3a0bbc7773a30f04b85f0d 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2018,2019, 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.
@@ -42,6 +42,7 @@
 #include <cctype>
 #include <cmath>
 
+#include "gromacs/gmxpreprocess/grompp-impl.h"
 #include "gromacs/gmxpreprocess/notset.h"
 #include "gromacs/gmxpreprocess/readir.h"
 #include "gromacs/gmxpreprocess/topdirs.h"
index f232d5620698eb7cfc526a19be37c029e69adbe4..6573aed28c2563eae3495566efe75357eed565a2 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2019, 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.
@@ -38,7 +38,8 @@
 #ifndef GMX_GMXPREPROCESS_TOPSHAKE_H
 #define GMX_GMXPREPROCESS_TOPSHAKE_H
 
-#include "gromacs/gmxpreprocess/topio.h"
+struct t_atoms;
+struct t_params;
 
 void make_shake (t_params plist[], t_atoms *atoms, int nshake);
 
index 96a183e863eb8864db1d9d72eaf47e1d900670f9..facc152e5a684eeedcf898f3669581f1f3dc03ba 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2012,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2014,2015,2017,2018,2019, 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.
@@ -45,6 +45,7 @@
 #include <algorithm>
 
 #include "gromacs/gmxpreprocess/gpp_atomtype.h"
+#include "gromacs/gmxpreprocess/grompp-impl.h"
 #include "gromacs/gmxpreprocess/notset.h"
 #include "gromacs/gmxpreprocess/topdirs.h"
 #include "gromacs/topology/block.h"
@@ -202,7 +203,7 @@ void done_mi(t_molinfo *mi)
 
 /* PRINTING STRUCTURES */
 
-static void print_bt(FILE *out, directive d, gpp_atomtype_t at,
+static void print_bt(FILE *out, Directive d, gpp_atomtype *at,
                      int ftype, int fsubtype, t_params plist[],
                      bool bFullDih)
 {
@@ -395,7 +396,7 @@ void print_excl(FILE *out, int natoms, t_excls excls[])
 
     if (have_excl)
     {
-        fprintf (out, "[ %s ]\n", dir2str(d_exclusions));
+        fprintf (out, "[ %s ]\n", dir2str(Directive::d_exclusions));
         fprintf (out, "; %4s    %s\n", "i", "excluded from i");
         for (i = 0; i < natoms; i++)
         {
@@ -430,7 +431,7 @@ static double get_residue_charge(const t_atoms *atoms, int at)
     return q;
 }
 
-void print_atoms(FILE *out, gpp_atomtype_t atype, t_atoms *at, int *cgnr,
+void print_atoms(FILE *out, gpp_atomtype *atype, t_atoms *at, int *cgnr,
                  bool bRTPresname)
 {
     int         i, ri;
@@ -439,7 +440,7 @@ void print_atoms(FILE *out, gpp_atomtype_t atype, t_atoms *at, int *cgnr,
     char       *tpnmA, *tpnmB;
     double      qres, qtot;
 
-    as = dir2str(d_atoms);
+    as = dir2str(Directive::d_atoms);
     fprintf(out, "[ %s ]\n", as);
     fprintf(out, "; %4s %10s %6s %7s%6s %6s %10s %10s %6s %10s %10s\n",
             "nr", "type", "resnr", "residue", "atom", "cgnr", "charge", "mass", "typeB", "chargeB", "massB");
@@ -522,11 +523,11 @@ void print_atoms(FILE *out, gpp_atomtype_t atype, t_atoms *at, int *cgnr,
     fflush(out);
 }
 
-void print_bondeds(FILE *out, int natoms, directive d,
+void print_bondeds(FILE *out, int natoms, Directive d,
                    int ftype, int fsubtype, t_params plist[])
 {
     t_symtab       stab;
-    gpp_atomtype_t atype;
+    gpp_atomtype  *atype;
     t_param       *param;
     t_atom        *a;
     int            i;
index 7c859fba5e83a3c9faeffe46c5f2b6747c9f1055..e581c812728fc8e9b6a0a96dd8558e3d17ded134 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2012,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2014,2015,2018,2019, 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.
 #ifndef GMX_GMXPREPROCESS_TOPUTIL_H
 #define GMX_GMXPREPROCESS_TOPUTIL_H
 
-#include "gromacs/gmxpreprocess/gpp_atomtype.h"
-#include "gromacs/gmxpreprocess/grompp-impl.h"
+#include <cstdio>
+
+enum class Directive : int;
+struct gpp_atomtype;
+struct t_atoms;
+struct t_blocka;
+struct t_excls;
+struct t_molinfo;
+struct t_param;
+struct t_params;
 
 /* UTILITIES */
 
@@ -68,10 +76,10 @@ void done_mi(t_molinfo *mi);
 void print_blocka(FILE *out, const char *szName, const char *szIndex,
                   const char *szA, t_blocka *block);
 
-void print_atoms(FILE *out, gpp_atomtype_t atype, t_atoms *at, int *cgnr,
+void print_atoms(FILE *out, gpp_atomtype *atype, t_atoms *at, int *cgnr,
                  bool bRTPresname);
 
-void print_bondeds(FILE *out, int natoms, directive d,
+void print_bondeds(FILE *out, int natoms, Directive d,
                    int ftype, int fsubtype, t_params plist[]);
 
 void print_excl(FILE *out, int natoms, t_excls excls[]);
index 5caf15877da4e39969dd18ff7a594573ba03265b..9917af8b912eea1bf6b44bae60e687643e911a43 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2018,2019, 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.
@@ -45,6 +45,8 @@
 #include <algorithm>
 
 #include "gromacs/gmxpreprocess/add_par.h"
+#include "gromacs/gmxpreprocess/gpp_atomtype.h"
+#include "gromacs/gmxpreprocess/grompp-impl.h"
 #include "gromacs/gmxpreprocess/notset.h"
 #include "gromacs/gmxpreprocess/resall.h"
 #include "gromacs/gmxpreprocess/toputil.h"
@@ -390,7 +392,7 @@ static real get_angle(int nrang, t_mybonded angles[],
     return angle;
 }
 
-static char *get_atomtype_name_AB(t_atom *atom, gpp_atomtype_t atype)
+static char *get_atomtype_name_AB(t_atom *atom, gpp_atomtype *atype)
 {
     char *name;
 
@@ -414,7 +416,7 @@ static char *get_atomtype_name_AB(t_atom *atom, gpp_atomtype_t atype)
     return name;
 }
 
-static bool calc_vsite3_param(gpp_atomtype_t atype,
+static bool calc_vsite3_param(gpp_atomtype *atype,
                               t_param *param, t_atoms *at,
                               int nrbond, t_mybonded *bonds,
                               int nrang,  t_mybonded *angles )
@@ -552,7 +554,7 @@ static bool calc_vsite3fad_param(t_param *param,
     return bError;
 }
 
-static bool calc_vsite3out_param(gpp_atomtype_t atype,
+static bool calc_vsite3out_param(gpp_atomtype *atype,
                                  t_param *param, t_atoms *at,
                                  int nrbond, t_mybonded *bonds,
                                  int nrang,  t_mybonded *angles)
@@ -764,7 +766,7 @@ calc_vsite4fdn_param(t_param *param,
 
 
 
-int set_vsites(bool bVerbose, t_atoms *atoms, gpp_atomtype_t atype,
+int set_vsites(bool bVerbose, t_atoms *atoms, gpp_atomtype *atype,
                t_params plist[])
 {
     int             i, j, ftype;
index 682f97a54d314321c1c24a573a51487bef4f610b..986908ebaf363013bc9c4ee75740369bab8e6677 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2018,2019, 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.
 #ifndef GMX_GMXPREPROCESS_VSITE_PARM_H
 #define GMX_GMXPREPROCESS_VSITE_PARM_H
 
-#include "gromacs/gmxpreprocess/gpp_atomtype.h"
-#include "gromacs/gmxpreprocess/grompp-impl.h"
-
+struct gpp_atomtype;
 struct gmx_moltype_t;
+struct t_atoms;
+struct t_params;
 
-int set_vsites(bool bVerbose, t_atoms *atoms,  gpp_atomtype_t atype,
+int set_vsites(bool bVerbose, t_atoms *atoms,  gpp_atomtype *atype,
                t_params plist[]);
 /* set parameters for virtual sites, return number of virtual sites */
 
index 44d90618613e6d2250c21102a0e319b002c1c367..568f88540ec4763f1fe647dc6ea64b44ee93b742 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2008, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
 #include "gromacs/fileio/confio.h"
 #include "gromacs/fileio/gmxfio.h"
 #include "gromacs/gmxpreprocess/gen_ad.h"
+#include "gromacs/gmxpreprocess/gpp_atomtype.h"
 #include "gromacs/gmxpreprocess/gpp_nextnb.h"
+#include "gromacs/gmxpreprocess/grompp-impl.h"
 #include "gromacs/gmxpreprocess/hackblock.h"
 #include "gromacs/gmxpreprocess/nm2type.h"
 #include "gromacs/gmxpreprocess/notset.h"
 #include "gromacs/gmxpreprocess/pdb2top.h"
 #include "gromacs/gmxpreprocess/toppush.h"
+#include "gromacs/gmxpreprocess/toputil.h"
 #include "gromacs/listed-forces/bonded.h"
 #include "gromacs/math/units.h"
 #include "gromacs/math/utilities.h"
@@ -174,10 +177,10 @@ static int *set_cgnr(t_atoms *atoms, bool bUsePDBcharge, real *qtot, real *mtot)
     return cgnr;
 }
 
-static gpp_atomtype_t set_atom_type(t_symtab *tab, t_atoms *atoms, t_params *bonds,
-                                    int *nbonds, int nnm, t_nm2type nm2t[])
+static gpp_atomtype *set_atom_type(t_symtab *tab, t_atoms *atoms, t_params *bonds,
+                                   int *nbonds, int nnm, t_nm2type nm2t[])
 {
-    gpp_atomtype_t atype;
+    gpp_atomtype  *atype;
     int            nresolved;
 
     atype = init_atomtype();
@@ -333,7 +336,7 @@ static void print_pl(FILE *fp, t_params plist[], int ftp, const char *name,
 }
 
 static void print_rtp(const char *filenm, const char *title, t_atoms *atoms,
-                      t_params plist[], gpp_atomtype_t atype, int cgnr[])
+                      t_params plist[], gpp_atomtype *atype, int cgnr[])
 {
     FILE *fp;
     int   i, tp;
@@ -396,7 +399,7 @@ int gmx_x2top(int argc, char *argv[])
     FILE              *fp;
     t_params           plist[F_NRE];
     t_excls           *excls;
-    gpp_atomtype_t     atype;
+    gpp_atomtype      *atype;
     t_nextnb           nnb;
     t_nm2type         *nm2t;
     t_mols             mymol;
index 4897e89f45b6d1e81380213c6349b72f609e22f9..be603334b5c77f4650da1d0acbb981d8b7d30f41 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2018,2019, 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.
@@ -45,6 +45,7 @@
 #include <vector>
 
 #include "gromacs/gmxpreprocess/fflibutil.h"
+#include "gromacs/gmxpreprocess/grompp-impl.h"
 #include "gromacs/gmxpreprocess/hackblock.h"
 #include "gromacs/topology/residuetypes.h"
 #include "gromacs/topology/symtab.h"
@@ -138,7 +139,7 @@ static void done_xlatom(int nxlate, t_xlate_atom *xlatom)
 
 void rename_atoms(const char* xlfile, const char *ffdir,
                   t_atoms *atoms, t_symtab *symtab, const t_restp *restp,
-                  bool bResname, gmx_residuetype_t *rt, bool bReorderNum,
+                  bool bResname, ResidueType *rt, bool bReorderNum,
                   bool bVerbose)
 {
     int           nxlate, a, i, resind;
@@ -206,15 +207,15 @@ void rename_atoms(const char* xlfile, const char *ffdir,
                 /* Match the residue name */
                 bMatch = (xlatom[i].res == nullptr ||
                           (gmx_strcasecmp("protein-nterm", xlatom[i].res) == 0 &&
-                           gmx_residuetype_is_protein(rt, rnm) && bStartTerm) ||
+                           rt->namedResidueHasType(rnm, "Protein") && bStartTerm) ||
                           (gmx_strcasecmp("protein-cterm", xlatom[i].res) == 0 &&
-                           gmx_residuetype_is_protein(rt, rnm) && bEndTerm) ||
+                           rt->namedResidueHasType(rnm, "Protein") && bEndTerm) ||
                           (gmx_strcasecmp("protein", xlatom[i].res) == 0 &&
-                           gmx_residuetype_is_protein(rt, rnm)) ||
+                           rt->namedResidueHasType(rnm, "Protein")) ||
                           (gmx_strcasecmp("DNA", xlatom[i].res) == 0 &&
-                           gmx_residuetype_is_dna(rt, rnm)) ||
+                           rt->namedResidueHasType(rnm, "DNA")) ||
                           (gmx_strcasecmp("RNA", xlatom[i].res) == 0 &&
-                           gmx_residuetype_is_rna(rt, rnm)));
+                           rt->namedResidueHasType(rnm, "RNA")));
                 if (!bMatch)
                 {
                     ptr0 = rnm;
index f11c17caee9537712f36de6f9dc57be224e12033..43bfe6816c8b3a1e22472bcf4f7d624a1fc247c6 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2018,2019, 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.
 #ifndef GMX_GMXPREPROCESS_XLATE_H
 #define GMX_GMXPREPROCESS_XLATE_H
 
-#include "gromacs/gmxpreprocess/hackblock.h"
-#include "gromacs/utility/basedefinitions.h"
-
-struct gmx_residuetype_t;
+class ResidueType;
 struct t_atoms;
+struct t_restp;
 struct t_symtab;
 
 /* If bResname is true renames atoms based on residue names,
  * otherwise renames atoms based on rtp entry names.
  */
 void rename_atoms(const char* xlfile, const char *ffdir,
-                  struct t_atoms *atoms, struct t_symtab *symtab, const t_restp *restp,
-                  bool bResname, struct gmx_residuetype_t *rt, bool bReorderNum,
+                  t_atoms *atoms, t_symtab *symtab, const t_restp *restp,
+                  bool bResname, ResidueType *rt, bool bReorderNum,
                   bool bVerbose);
 
 #endif
index fda0e9bb90dba20e56a72ea1cd8e72120d7790eb..bda125511b7a50f99f3df3bb30b77dee73359c6e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2014,2015,2016,2017,2018,2019, 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.
@@ -91,7 +91,7 @@ int cu_copy_D2H_async(void * h_dest, void * d_src, size_t bytes, cudaStream_t s
 }
 
 // TODO: template on transferKind to avoid runtime conditionals
-int cu_copy_H2D(void *d_dest, void *h_src, size_t bytes,
+int cu_copy_H2D(void *d_dest, const void *h_src, size_t bytes,
                 GpuApiCallBehavior transferKind, cudaStream_t s = nullptr)
 {
     cudaError_t stat;
@@ -121,7 +121,7 @@ int cu_copy_H2D(void *d_dest, void *h_src, size_t bytes,
     return 0;
 }
 
-int cu_copy_H2D_sync(void * d_dest, void * h_src, size_t bytes)
+int cu_copy_H2D_sync(void * d_dest, const void * h_src, size_t bytes)
 {
     return cu_copy_H2D(d_dest, h_src, bytes, GpuApiCallBehavior::Sync);
 }
@@ -129,7 +129,7 @@ int cu_copy_H2D_sync(void * d_dest, void * h_src, size_t bytes)
 /*!
  *  The copy is launched in stream s or if not specified, in stream 0.
  */
-int cu_copy_H2D_async(void * d_dest, void * h_src, size_t bytes, cudaStream_t s = nullptr)
+int cu_copy_H2D_async(void * d_dest, const void * h_src, size_t bytes, cudaStream_t s = nullptr)
 {
     return cu_copy_H2D(d_dest, h_src, bytes, GpuApiCallBehavior::Async, s);
 }
index 1116d6667406df78c3f030364f08e17f05ca7a6c..35ab3d875346b302c0926a938bee155d3976aab6 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2014,2015,2016,2017,2018,2019, 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.
@@ -157,13 +157,13 @@ int cu_copy_D2H_async(void * /*h_dest*/, void * /*d_src*/, size_t /*bytes*/, cud
  *
  *  The copy is launched in stream s or if not specified, in stream 0.
  */
-int cu_copy_H2D(void *d_dest, void *h_src, size_t bytes, GpuApiCallBehavior transferKind, cudaStream_t /*s = nullptr*/);
+int cu_copy_H2D(void *d_dest, const void *h_src, size_t bytes, GpuApiCallBehavior transferKind, cudaStream_t /*s = nullptr*/);
 
 /*! Launches synchronous host to device memory copy. */
-int cu_copy_H2D_sync(void * /*d_dest*/, void * /*h_src*/, size_t /*bytes*/);
+int cu_copy_H2D_sync(void * /*d_dest*/, const void * /*h_src*/, size_t /*bytes*/);
 
 /*! Launches asynchronous host to device memory copy in stream s. */
-int cu_copy_H2D_async(void * /*d_dest*/, void * /*h_src*/, size_t /*bytes*/, cudaStream_t /*s = nullptr*/);
+int cu_copy_H2D_async(void * /*d_dest*/, const void * /*h_src*/, size_t /*bytes*/, cudaStream_t /*s = nullptr*/);
 
 // TODO: the 2 functions below are pretty much a constructor/destructor of a simple
 // GPU table object. There is also almost self-contained fetchFromParamLookupTable()
index 905de06b728ce30fa7a2f511ed92f5fab6bb7dbc..81778c01117dab175d108695b609017c04d32b09 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2014,2015,2017,2018,2019, 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.
 #include "gromacs/utility/stringutil.h"
 
 #if !GMX_GPU
-/*! \brief Set allocation functions used by the GPU host
- *
- * Since GPU support is not configured, there is no host memory to
- * allocate. */
-void gpu_set_host_malloc_and_free(bool /*unused*/,
-                                  gmx_host_alloc_t **nb_alloc,
-                                  gmx_host_free_t  **nb_free)
-{
-    *nb_alloc = nullptr;
-    *nb_free  = nullptr;
-}
-
 int gpu_info_get_stat(const gmx_gpu_info_t & /*unused*/, int /*unused*/)
 {
     return egpuNonexistent;
index 56047d32c2ac78a04c91b9bd20368d8bc250fc81..17288e9bfb80045c4d5eceb4588cc09ca40402d7 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2018,2019, 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.
@@ -498,22 +498,6 @@ size_t sizeof_gpu_dev_info(void)
     return sizeof(gmx_device_info_t);
 }
 
-void gpu_set_host_malloc_and_free(bool               bUseGpuKernels,
-                                  gmx_host_alloc_t **nb_alloc,
-                                  gmx_host_free_t  **nb_free)
-{
-    if (bUseGpuKernels)
-    {
-        *nb_alloc = &pmalloc;
-        *nb_free  = &pfree;
-    }
-    else
-    {
-        *nb_alloc = nullptr;
-        *nb_free  = nullptr;
-    }
-}
-
 void startGpuProfiler(void)
 {
     /* The NVPROF_ID environment variable is set by nvprof and indicates that
index 88058dba56b38a065d5edd1e9aae7172561136f1..8869338e47e4aad1e06b23a0a65fedc3a30c68f6 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2010, The GROMACS development team.
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, 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.
@@ -227,25 +227,6 @@ OPENCL_FUNC_TERM_WITH_RETURN(false)
 GPU_FUNC_QUALIFIER
 size_t sizeof_gpu_dev_info() GPU_FUNC_TERM_WITH_RETURN(0)
 
-/*! \brief Returns a pointer *ptr to page-locked memory of size nbytes.
- *
- * The allocated memory is suitable to be used for data transfers between host
- * and GPU.
- * Error handling should be done within this function.
- */
-typedef void gmx_host_alloc_t (void **ptr, size_t nbytes);
-
-/*! \brief Frees page-locked memory pointed to by *ptr.
- *
- * NULL should not be passed to this function.
- */
-typedef void gmx_host_free_t (void *ptr);
-
-/*! \brief Set page-locked memory allocation functions used by the GPU host. */
-void gpu_set_host_malloc_and_free(bool               bUseGpuKernels,
-                                  gmx_host_alloc_t **nb_alloc,
-                                  gmx_host_free_t  **nb_free);
-
 //! Get status of device with specified index
 int gpu_info_get_stat(const gmx_gpu_info_t &info, int index);
 
index 3efe5d40dbc350589ade552eaaff6de078ddc753..d5dc3a9d90271d642cd6b3d00da2ff0041f52d88 100644 (file)
@@ -600,22 +600,6 @@ size_t sizeof_gpu_dev_info()
     return sizeof(gmx_device_info_t);
 }
 
-void gpu_set_host_malloc_and_free(bool               bUseGpuKernels,
-                                  gmx_host_alloc_t **nb_alloc,
-                                  gmx_host_free_t  **nb_free)
-{
-    if (bUseGpuKernels)
-    {
-        *nb_alloc = &pmalloc;
-        *nb_free  = &pfree;
-    }
-    else
-    {
-        *nb_alloc = nullptr;
-        *nb_free  = nullptr;
-    }
-}
-
 int gpu_info_get_stat(const gmx_gpu_info_t &info, int index)
 {
     return info.gpu_dev[index].stat;
index 6e47af81a794402c40ffb64cde081810f1c6b695..89e9b0de49808e9745645db8c33425d7eadcb020 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2017,2018,2019, 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.
@@ -33,9 +33,9 @@
  * the research papers on the package. Check out http://www.gromacs.org.
  */
 /*! \file
- * \brief Declares gmx::HostAllocationPolicy, gmx::HostAllocator, and
- * gmx::HostVector, which are used to make/be standard library
- * containers that can allocate memory suitable for transfers.
+ * \brief Declares gmx::HostAllocationPolicy, gmx::HostAllocator,
+ * gmx::HostVector and gmx::PaddedHostVector, which are used to make/be
+ * standard library containers that can allocate memory suitable for transfers.
  * Currently the only supported transfers using pinned memory are
  * to CUDA GPUs, but other possibilities exist in future.
  *
@@ -93,13 +93,13 @@ class HostAllocationPolicy;
 template <class T>
 using HostAllocator = Allocator<T, HostAllocationPolicy>;
 
-//! Convenience alias for PaddedVector that uses HostAllocator.
+//! Convenience alias for std::vector that uses HostAllocator.
 template <class T>
-using HostVector = PaddedVector<T, HostAllocator<T> >;
+using HostVector = std::vector<T, HostAllocator<T> >;
 
-//! Convenience alias for std::vector that uses HostAllocator.
+//! Convenience alias for PaddedVector that uses HostAllocator.
 template <class T>
-using HostStdVector = std::vector<T, HostAllocator<T> >;
+using PaddedHostVector = PaddedVector<T, HostAllocator<T> >;
 
 /*! \libinternal
  * \brief Policy class for configuring gmx::Allocator, to manage
@@ -207,7 +207,7 @@ bool operator==(const Allocator<T1, HostAllocationPolicy> &a,
     return a.pinningPolicy() == b.pinningPolicy();
 }
 
-/*! \brief Helper function for changing the pinning policy of a HostVector.
+/*! \brief Helper function for changing the pinning policy of a pinnable vector.
  *
  * If the vector has contents, then a full reallocation and buffer
  * copy are needed if the policy change requires tighter restrictions,
@@ -215,12 +215,14 @@ bool operator==(const Allocator<T1, HostAllocationPolicy> &a,
  * restrictions. That cost is OK, because GROMACS will do this
  * operation very rarely (e.g. when auto-tuning and deciding to switch
  * whether a task will run on a GPU, or not). */
-template <class T>
-void changePinningPolicy(HostVector<T> *v, PinningPolicy pinningPolicy)
+template <typename PinnableVector>
+void changePinningPolicy(PinnableVector *v,
+                         PinningPolicy   pinningPolicy)
 {
-    //Force reallocation by element-wise move (because policy is different
-    //container is forced to realloc). Does nothing if policy is the same.
-    *v = HostVector<T>(std::move(*v), {pinningPolicy});
+    // Force reallocation by element-wise move (because policy is
+    // different container is forced to realloc). Does nothing if
+    // policy is the same.
+    *v = PinnableVector(std::move(*v), {pinningPolicy});
 }
 
 }      // namespace gmx
index c541623217f740852ef737942784646438cb6c24..227ba844e536cd541ff12cfaf993538aa4c409f4 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2018, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019, 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.
index 26e750a2e44f9657ee0c692da27219f28cc9dad5..b5efc4397e8059c6e85828c58898bcad058d85b9 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2014,2015,2016,2017,2018,2019, 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.
@@ -52,7 +52,7 @@
 #include "gromacs/utility/fatalerror.h"
 #include "gromacs/utility/smalloc.h"
 
-int ocl_copy_H2D(cl_mem d_dest, void* h_src,
+int ocl_copy_H2D(cl_mem d_dest, const void* h_src,
                  size_t offset, size_t bytes,
                  GpuApiCallBehavior transferKind,
                  cl_command_queue command_queue,
@@ -92,7 +92,7 @@ int ocl_copy_H2D(cl_mem d_dest, void* h_src,
  *  identifying this particular host to device operation. The event can further
  *  be used to queue a wait for this operation or to query profiling information.
  */
-int ocl_copy_H2D_async(cl_mem d_dest, void * h_src,
+int ocl_copy_H2D_async(cl_mem d_dest, const void * h_src,
                        size_t offset, size_t bytes,
                        cl_command_queue command_queue,
                        cl_event *copy_event)
@@ -102,7 +102,7 @@ int ocl_copy_H2D_async(cl_mem d_dest, void * h_src,
 
 /*! \brief Launches synchronous host to device memory copy.
  */
-int ocl_copy_H2D_sync(cl_mem d_dest, void * h_src,
+int ocl_copy_H2D_sync(cl_mem d_dest, const void * h_src,
                       size_t offset, size_t bytes,
                       cl_command_queue command_queue)
 {
index 78cd747f7b4d6fbe2b10f57884834f7eb1666742..0cbb7a46aa95b03ee31e75a888f7b683b48811f4 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2014,2015,2016,2017,2018,2019, 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.
@@ -132,20 +132,20 @@ int ocl_copy_D2H_async(void * h_dest, cl_mem d_src,
  *  identifying this particular host to device operation. The event can further
  *  be used to queue a wait for this operation or to query profiling information.
  */
-int ocl_copy_H2D(cl_mem d_dest, void* h_src,
+int ocl_copy_H2D(cl_mem d_dest, const void* h_src,
                  size_t offset, size_t bytes,
                  GpuApiCallBehavior transferKind,
                  cl_command_queue command_queue,
                  cl_event *copy_event);
 
 /*! \brief Launches asynchronous host to device memory copy. */
-int ocl_copy_H2D_async(cl_mem d_dest, void * h_src,
+int ocl_copy_H2D_async(cl_mem d_dest, const void * h_src,
                        size_t offset, size_t bytes,
                        cl_command_queue command_queue,
                        cl_event *copy_event);
 
 /*! \brief Launches synchronous host to device memory copy. */
-int ocl_copy_H2D_sync(cl_mem d_dest, void * h_src,
+int ocl_copy_H2D_sync(cl_mem d_dest, const void * h_src,
                       size_t offset, size_t bytes,
                       cl_command_queue command_queue);
 
index 71e7f75c5f2fd850bd72f87d23f2b30c02e60de9..203fac342238d1ca6b6cf919fccde782b1413166 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2017,2018,2019, 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.
@@ -145,7 +145,7 @@ typedef ::testing::Types<int32_t, real, RVec, test::MoveOnly> TestTypes;
 template <typename T>
 struct HostAllocatorTest : HostMemoryTest<T>
 {
-    using VectorType = HostVector<T>; //!< HostVector of type tested
+    using VectorType = PaddedHostVector<T>; //!< PaddedHostVector of type tested
 };
 TYPED_TEST_CASE(HostAllocatorTest, TestTypes);
 
@@ -153,7 +153,7 @@ TYPED_TEST_CASE(HostAllocatorTest, TestTypes);
 template <typename T>
 struct HostAllocatorTestNoMem : ::testing::Test
 {
-    using VectorType = HostVector<T>; //!< HostVector of type tested
+    using VectorType = PaddedHostVector<T>; //!< PaddedHostVector of type tested
 };
 TYPED_TEST_CASE(HostAllocatorTestNoMem, TestTypes);
 
index 33c13d0143f15a2cf75ca5e6f67857b68ab16bb9..3720fe23fa7bf01f4c3a0f9ceb6350bc0c489557 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2018, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019, 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.
@@ -70,7 +70,7 @@ struct HostInteractionList
     }
 
     //! List of interactions, see \c HostInteractionLists
-    HostStdVector<int> iatoms = {{}, gmx::HostAllocationPolicy(gmx::PinningPolicy::PinnedIfSupported)};
+    HostVector<int> iatoms = {{}, gmx::HostAllocationPolicy(gmx::PinningPolicy::PinnedIfSupported)};
 };
 
 /*! \internal \brief Implements GPU bondeds */
@@ -130,7 +130,7 @@ class GpuBonded::Impl
         //! Shift force vector on the device.
         fvec                 *fshiftDevice = nullptr;
         //! \brief Host-side virial buffer
-        HostStdVector <float> vtot = {{}, gmx::HostAllocationPolicy(gmx::PinningPolicy::PinnedIfSupported)};
+        HostVector <float>    vtot = {{}, gmx::HostAllocationPolicy(gmx::PinningPolicy::PinnedIfSupported)};
         //! \brief Device-side total virial
         float                *vtotDevice   = nullptr;
 
index 87f7197255306523fb50a1aff5b2eaea0b4493be..01b11aa255b53c35c5c20d3fc5450544a55682b0 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2014,2015,2016,2018,2019, 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.
@@ -78,7 +78,7 @@ struct bonded_threading_t
 {
     /* Thread local force and energy data */
     int            nthreads;     /**< Number of threads to be used for bondeds */
-    f_thread_t    *f_t;          /**< Force/enegry data per thread, size nthreads */
+    f_thread_t    *f_t;          /**< Force/energy data per thread, size nthreads */
     int            nblock_used;  /**< The number of force blocks to reduce */
     int           *block_index;  /**< Index of size nblock_used into mask */
     gmx_bitmask_t *mask;         /**< Mask array, one element corresponds to a block of reduction_block_size atoms of the force array, bit corresponding to thread indices set if a thread writes to that block */
index 3a2e54e3c32d399df7ef3b3c7c3d3e47b7859a67..c1fc232fc8f2f4ef6e377a5a9bca3c0ca585b782 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -497,7 +497,10 @@ void tear_down_bonded_threading(bonded_threading_t *bt)
 {
     for (int th = 0; th < bt->nthreads; th++)
     {
+        sfree(bt->f_t[th].mask);
         sfree(bt->f_t[th].fshift);
+        sfree(bt->f_t[th].block_index);
+        sfree_aligned(bt->f_t[th].f);
         for (int i = 0; i < egNR; i++)
         {
             sfree(bt->f_t[th].grpp.ener[i]);
index 93d1c5772977dcec939fb6381976f4bfaa2f1b44..3701cfc481cd4610bddfd9d24325d431591bc271 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -202,7 +202,7 @@ void init_orires(FILE                 *fplog,
     od->nref = 0;
     for (int i = 0; i < mtop->natoms; i++)
     {
-        if (getGroupType(&mtop->groups, egcORFIT, i) == 0)
+        if (getGroupType(mtop->groups, egcORFIT, i) == 0)
         {
             od->nref++;
         }
@@ -217,20 +217,19 @@ void init_orires(FILE                 *fplog,
      * Copy it to the other nodes after checking multi compatibility,
      * so we are sure the subsystems match before copying.
      */
-    auto                     x     = makeArrayRef(globalState->x);
-    rvec                     com   = { 0, 0, 0 };
-    double                   mtot  = 0.0;
-    int                      j     = 0;
-    gmx_mtop_atomloop_all_t  aloop = gmx_mtop_atomloop_all_init(mtop);
-    int                      i     = -1;
-    const t_atom            *atom;
-    while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
-    {
+    auto                        x     = makeArrayRef(globalState->x);
+    rvec                        com   = { 0, 0, 0 };
+    double                      mtot  = 0.0;
+    int                         j     = 0;
+    for (const AtomProxy &atomP : AtomRange(*mtop))
+    {
+        const t_atom &local = atomP.atom();
+        int           i     = atomP.globalAtomNumber();
         if (mtop->groups.grpnr[egcORFIT] == nullptr ||
             mtop->groups.grpnr[egcORFIT][i] == 0)
         {
             /* Not correct for free-energy with changing masses */
-            od->mref[j] = atom->m;
+            od->mref[j] = local.m;
             // Note that only one rank per sim is supported.
             if (isMasterSim(ms))
             {
index 2f24690bbad0fd9968ce3a8b855c88c66a9275a3..21130615a20bb6e169b45e5e73ea2b37423457f6 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2018,2019, 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.
 #include "gromacs/listed-forces/listed-forces.h"
 #include "gromacs/math/units.h"
 #include "gromacs/math/vec.h"
+#include "gromacs/math/vectypes.h"
 #include "gromacs/pbcutil/ishift.h"
 #include "gromacs/pbcutil/pbc.h"
 #include "gromacs/topology/idef.h"
+#include "gromacs/utility/strconvert.h"
 
 #include "testutils/refdata.h"
 #include "testutils/testasserts.h"
-#include "testutils/testfilemanager.h"
 
 namespace gmx
 {
@@ -66,38 +67,72 @@ namespace
 {
 
 //! Number of atoms used in these tests.
-#define NATOMS 4
+constexpr int c_numAtoms = 4;
 
-class BondedTest : public ::testing::Test
+/*! \brief Output from bonded kernels
+ *
+ * \todo Later this might turn into the actual output struct. */
+struct OutputQuantities
+{
+    //! Energy of this interaction
+    real  energy         = 0;
+    //! Derivative with respect to lambda
+    real  dvdlambda      = 0;
+    //! Shift vectors
+    rvec  fshift[N_IVEC] = {{0}};
+    //! Forces
+    rvec4 f[c_numAtoms]  = {{0}};
+};
+
+/*! \brief Utility to check the output from bonded tests
+ *
+ * \param[in] checker Reference checker
+ * \param[in] output  The output from the test to check
+ */
+void checkOutput(test::TestReferenceChecker *checker,
+                 const OutputQuantities     &output)
+{
+    checker->checkReal(output.energy, "Epot ");
+    // Should still be zero if not doing FEP, so may as well test it.
+    checker->checkReal(output.dvdlambda, "dVdlambda ");
+    // TODO This is pretty inefficient, perhaps we should just check
+    // whether the central box fields have their values.
+    checker->checkSequence(std::begin(output.fshift), std::end(output.fshift), "ShiftForces");
+    checker->checkSequence(std::begin(output.f), std::end(output.f), "Forces");
+}
+
+class BondedTest : public ::testing::TestWithParam<std::tuple<std::vector<gmx::RVec>, int> >
 {
     protected:
-        rvec   x[NATOMS];
-        matrix box;
-        test::TestReferenceData           refData_;
-        test::TestReferenceChecker        checker_;
+        matrix                     box_;
+        t_pbc                      pbc_;
+        std::vector<gmx::RVec>     x_;
+        int                        epbc_;
+        test::TestReferenceData    refData_;
+        test::TestReferenceChecker checker_;
         BondedTest( ) :
             checker_(refData_.rootChecker())
         {
-            test::FloatingPointTolerance tolerance(test::relativeToleranceAsFloatingPoint(1.0, 1e-6));
+            // We need quite specific tolerances here since angle functions
+            // etc. are not very precise and reproducible.
+            test::FloatingPointTolerance tolerance(test::FloatingPointTolerance(1.0e-4, 2.0e-7,
+                                                                                1.0e-6, 1.0e-12,
+                                                                                1000000000, 10000, false));
             checker_.setDefaultTolerance(tolerance);
-            clear_rvecs(NATOMS, x);
-            x[1][2] = 1;
-            x[2][1] = x[2][2] = 1;
-            x[3][0] = x[3][1] = x[3][2] = 1;
-
-            clear_mat(box);
-            box[0][0] = box[1][1] = box[2][2] = 1.5;
+            x_ = std::get<0>(GetParam());
+            clear_mat(box_);
+            box_[0][0] = box_[1][1] = box_[2][2] = 1.5;
+            epbc_      = std::get<1>(GetParam());
+            set_pbc(&pbc_, epbc_, box_);
         }
 
-        void testBondAngle(int epbc)
+        void testBondAngle()
         {
             rvec  r_ij, r_kj;
             real  cosine_angle, angle;
             int   t1, t2;
-            t_pbc pbc;
 
-            set_pbc(&pbc, epbc, box);
-            angle = bond_angle(x[0], x[1], x[2], &pbc,
+            angle = bond_angle(x_[0], x_[1], x_[2], &pbc_,
                                r_ij, r_kj, &cosine_angle,
                                &t1, &t2);
             checker_.checkReal(angle, "angle");
@@ -106,15 +141,13 @@ class BondedTest : public ::testing::Test
             checker_.checkInteger(t2, "t2");
         }
 
-        void testDihedralAngle(int epbc)
+        void testDihedralAngle()
         {
             rvec  r_ij, r_kj, r_kl, m, n;
             real  angle;
             int   t1, t2, t3;
-            t_pbc pbc;
 
-            set_pbc(&pbc, epbc, box);
-            angle = dih_angle(x[0], x[1], x[2], x[3], &pbc,
+            angle = dih_angle(x_[0], x_[1], x_[2], x_[3], &pbc_,
                               r_ij, r_kj, r_kl, m, n,
                               &t1, &t2, &t3);
 
@@ -123,159 +156,113 @@ class BondedTest : public ::testing::Test
             checker_.checkInteger(t2, "t2");
             checker_.checkInteger(t3, "t3");
         }
-
-        void testIfunc(int                         ftype,
+        void testIfunc(test::TestReferenceChecker *checker,
+                       const int                   ftype,
                        const std::vector<t_iatom> &iatoms,
-                       const t_iparams             iparams[],
-                       int                         epbc)
+                       const t_iparams            &iparams,
+                       const real                  lambda)
         {
-            real  lambda    = 0;
-            real  dvdlambda = 0;
-            rvec4 f[NATOMS];
-            for (int i = 0; i < NATOMS; i++)
-            {
-                for (int j = 0; j < 4; j++)
-                {
-                    f[i][j] = 0;
-                }
-            }
-            rvec  fshift[N_IVEC];
-            clear_rvecs(N_IVEC, fshift);
-            t_pbc pbc;
-            set_pbc(&pbc, epbc, box);
-            int   ddgatindex = 0;
-            real  energy     = bondedFunction(ftype)(iatoms.size(),
-                                                     iatoms.data(),
-                                                     iparams,
-                                                     x, f, fshift,
-                                                     &pbc,
-                                                     /* const struct t_graph *g */ nullptr,
-                                                     lambda, &dvdlambda,
-                                                     /* const struct t_mdatoms *md */ nullptr,
-                                                     /* struct t_fcdata *fcd */ nullptr,
-                                                     &ddgatindex);
-            checker_.checkReal(energy, interaction_function[ftype].longname);
+            SCOPED_TRACE(std::string("Testing PBC ") + epbc_names[epbc_]);
+
+            int                           ddgatindex = 0;
+            OutputQuantities              output;
+            output.energy = bondedFunction(ftype)(iatoms.size(),
+                                                  iatoms.data(),
+                                                  &iparams,
+                                                  as_rvec_array(x_.data()),
+                                                  output.f, output.fshift,
+                                                  &pbc_,
+                                                  /* const struct t_graph *g */ nullptr,
+                                                  lambda, &output.dvdlambda,
+                                                  /* const struct t_mdatoms *md */ nullptr,
+                                                  /* struct t_fcdata *fcd */ nullptr,
+                                                  &ddgatindex);
+            checkOutput(checker, output);
         }
-
 };
 
-TEST_F (BondedTest, BondAnglePbcNone)
-{
-    testBondAngle(epbcNONE);
-}
-
-TEST_F (BondedTest, BondAnglePbcXy)
-{
-    testBondAngle(epbcXY);
-}
-
-TEST_F (BondedTest, BondAnglePbcXyz)
-{
-    testBondAngle(epbcXYZ);
-}
-
-TEST_F (BondedTest, DihedralAnglePbcNone)
-{
-    testDihedralAngle(epbcNONE);
-}
-
-TEST_F (BondedTest, DihedralAnglePbcXy)
-{
-    testDihedralAngle(epbcXY);
-}
-
-TEST_F (BondedTest, DihedralAnglePbcXyz)
+TEST_P (BondedTest, BondAngle)
 {
-    testDihedralAngle(epbcXYZ);
+    testBondAngle();
 }
 
-TEST_F (BondedTest, IfuncBondsPbcNo)
+TEST_P (BondedTest, DihedralAngle)
 {
-    std::vector<t_iatom> iatoms = { 0, 0, 1, 0, 1, 2, 0, 2, 3 };
-    t_iparams            iparams;
-    iparams.harmonic.rA  = iparams.harmonic.rB  = 0.8;
-    iparams.harmonic.krA = iparams.harmonic.krB = 50;
-    testIfunc(F_BONDS, iatoms, &iparams, epbcNONE);
+    testDihedralAngle();
 }
 
-TEST_F (BondedTest, IfuncBondsPbcXy)
+TEST_P (BondedTest, IfuncBonds)
 {
     std::vector<t_iatom> iatoms = { 0, 0, 1, 0, 1, 2, 0, 2, 3 };
     t_iparams            iparams;
     iparams.harmonic.rA  = iparams.harmonic.rB  = 0.8;
-    iparams.harmonic.krA = iparams.harmonic.krB = 50;
-    testIfunc(F_BONDS, iatoms, &iparams, epbcXY);
+    iparams.harmonic.krA = iparams.harmonic.krB = 50.0;
+    const real lambda = 0.0;
+    testIfunc(&checker_, F_BONDS, iatoms, iparams, lambda);
 }
 
-TEST_F (BondedTest, IfuncBondsPbcXyz)
-{
-    std::vector<t_iatom> iatoms = { 0, 0, 1, 0, 1, 2, 0, 2, 3 };
-    t_iparams            iparams;
-    iparams.harmonic.rA  = iparams.harmonic.rB  = 0.8;
-    iparams.harmonic.krA = iparams.harmonic.krB = 50;
-    testIfunc(F_BONDS, iatoms, &iparams, epbcXYZ);
-}
-
-TEST_F (BondedTest, IfuncAnglesPbcNo)
+TEST_P (BondedTest, IfuncAngles)
 {
     std::vector<t_iatom> iatoms = { 0, 0, 1, 2, 0, 1, 2, 3 };
     t_iparams            iparams;
-    real                 k = 50;
-    iparams.harmonic.rA  = iparams.harmonic.rB  = 100;
-    iparams.harmonic.krA = iparams.harmonic.krB = k;
-    testIfunc(F_ANGLES, iatoms, &iparams, epbcNONE);
-}
-
-TEST_F (BondedTest, IfuncAnglesPbcXy)
-{
-    std::vector<t_iatom> iatoms  = { 0, 0, 1, 2, 0, 1, 2, 3 };
-    t_iparams            iparams;
-    real                 k = 50;
-    iparams.harmonic.rA  = iparams.harmonic.rB  = 100;
+    real                 k = 50.0;
+    iparams.harmonic.rA  = iparams.harmonic.rB  = 100.0;
     iparams.harmonic.krA = iparams.harmonic.krB = k;
-    testIfunc(F_ANGLES, iatoms, &iparams, epbcXY);
+    const real lambda = 0.0;
+    testIfunc(&checker_, F_ANGLES, iatoms, iparams, lambda);
 }
 
-TEST_F (BondedTest, IfuncAnglesPbcXYZ)
+TEST_P (BondedTest, IfuncProperDihedrals)
 {
-    std::vector<t_iatom> iatoms = { 0, 0, 1, 2, 0, 1, 2, 3 };
+    std::vector<t_iatom> iatoms = { 0, 0, 1, 2, 3 };
     t_iparams            iparams;
-    real                 k = 50;
-    iparams.harmonic.rA  = iparams.harmonic.rB  = 100;
-    iparams.harmonic.krA = iparams.harmonic.krB = k;
-    testIfunc(F_ANGLES, iatoms, &iparams, epbcXYZ);
+    iparams.pdihs.phiA = iparams.pdihs.phiB = -100.0;
+    iparams.pdihs.cpA  = iparams.pdihs.cpB  = 10.0;
+    iparams.pdihs.mult = 1;
+    const real lambda = 0.0;
+    testIfunc(&checker_, F_PDIHS, iatoms, iparams, lambda);
 }
 
-TEST_F (BondedTest, IfuncProperDihedralsPbcNo)
+TEST_P (BondedTest, IfuncImproperDihedrals)
 {
     std::vector<t_iatom> iatoms = { 0, 0, 1, 2, 3 };
     t_iparams            iparams;
-    iparams.pdihs.phiA = iparams.pdihs.phiB = -100;
-    iparams.pdihs.cpA  = iparams.pdihs.cpB  = 10;
-    iparams.pdihs.mult = 1;
-    testIfunc(F_PDIHS, iatoms, &iparams, epbcNONE);
+    iparams.harmonic.rA  = iparams.harmonic.rB  = 0.0;
+    iparams.harmonic.krA = iparams.harmonic.krB = 5.0;
+    const real lambda = 0.0;
+    testIfunc(&checker_, F_IDIHS, iatoms, iparams, lambda);
 }
 
-TEST_F (BondedTest, IfuncProperDihedralsPbcXy)
+TEST_P (BondedTest, IfuncImproperDihedralsFEP)
 {
     std::vector<t_iatom> iatoms = { 0, 0, 1, 2, 3 };
     t_iparams            iparams;
-    iparams.pdihs.phiA = iparams.pdihs.phiB = -100;
-    iparams.pdihs.cpA  = iparams.pdihs.cpB  = 10;
-    iparams.pdihs.mult = 1;
-    testIfunc(F_PDIHS, iatoms, &iparams, epbcXY);
+    iparams.harmonic.rA  = iparams.harmonic.rB  = 0.0;
+    iparams.harmonic.krA = iparams.harmonic.krB = 5.0;
+    iparams.harmonic.rB  = 35.5;
+    iparams.harmonic.krB = 10.0;
+
+    const int numLambdas = 3;
+    for (int i = 0; i < numLambdas; ++i)
+    {
+        const real lambda       = i / (numLambdas - 1.0);
+        auto       valueChecker = checker_.checkCompound("Lambda", toString(lambda));
+        testIfunc(&valueChecker, F_IDIHS, iatoms, iparams, lambda);
+    }
 }
 
-TEST_F (BondedTest, IfuncProperDihedralsPbcXyz)
+//! Coordinates for testing
+std::vector<std::vector<gmx::RVec> > c_coordinatesForTests =
 {
-    std::vector<t_iatom> iatoms  = { 0, 0, 1, 2, 3 };
-    t_iparams            iparams;
-    iparams.pdihs.phiA = iparams.pdihs.phiB = -100;
-    iparams.pdihs.cpA  = iparams.pdihs.cpB  = 10;
-    iparams.pdihs.mult = 1;
-    testIfunc(F_PDIHS, iatoms, &iparams, epbcXYZ);
-}
+    {{  0.0, 0.0, 0.0 }, { 0.0, 0.0, 1.0 }, { 0.0, 1.0, 1.0 }, { 1.0, 1.0, 1.0 }},
+    {{  0.5, 0.0, 0.0 }, { 0.5, 0.0, 0.15 }, { 0.5, 0.07, 0.22 }, { 0.5, 0.18, 0.22 }},
+    {{ -0.1143, -0.0282, 0.0 }, { 0.0, 0.0434, 0.0 }, { 0.1185, -0.0138, 0.0 }, { -0.0195, 0.1498, 0.0 }}
+};
+
+//! PBC values for testing
+std::vector<int> c_pbcForTests = { epbcNONE, epbcXY, epbcXYZ };
 
+INSTANTIATE_TEST_CASE_P(ForPbcValues, BondedTest, ::testing::Combine(::testing::ValuesIn(c_coordinatesForTests), ::testing::ValuesIn(c_pbcForTests)));
 }  // namespace
 
 }  // namespace gmx
diff --git a/src/gromacs/listed-forces/tests/refdata/BondedTest_IfuncAnglesPbcNo.xml b/src/gromacs/listed-forces/tests/refdata/BondedTest_IfuncAnglesPbcNo.xml
deleted file mode 100644 (file)
index 0bf9b85..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0"?>
-<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
-<ReferenceData>
-  <Real Name="Angle">1.5230865</Real>
-</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/BondedTest_IfuncAnglesPbcXYZ.xml b/src/gromacs/listed-forces/tests/refdata/BondedTest_IfuncAnglesPbcXYZ.xml
deleted file mode 100644 (file)
index 0bf9b85..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0"?>
-<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
-<ReferenceData>
-  <Real Name="Angle">1.5230865</Real>
-</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/BondedTest_IfuncAnglesPbcXy.xml b/src/gromacs/listed-forces/tests/refdata/BondedTest_IfuncAnglesPbcXy.xml
deleted file mode 100644 (file)
index 0bf9b85..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0"?>
-<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
-<ReferenceData>
-  <Real Name="Angle">1.5230865</Real>
-</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/BondedTest_IfuncBondsPbcNo.xml b/src/gromacs/listed-forces/tests/refdata/BondedTest_IfuncBondsPbcNo.xml
deleted file mode 100644 (file)
index 71c61f3..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0"?>
-<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
-<ReferenceData>
-  <Real Name="Bond">2.9999995</Real>
-</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/BondedTest_IfuncBondsPbcXy.xml b/src/gromacs/listed-forces/tests/refdata/BondedTest_IfuncBondsPbcXy.xml
deleted file mode 100644 (file)
index 8582d6a..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0"?>
-<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
-<ReferenceData>
-  <Real Name="Bond">5.5</Real>
-</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/BondedTest_IfuncBondsPbcXyz.xml b/src/gromacs/listed-forces/tests/refdata/BondedTest_IfuncBondsPbcXyz.xml
deleted file mode 100644 (file)
index 2d98ef2..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0"?>
-<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
-<ReferenceData>
-  <Real Name="Bond">6.75</Real>
-</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/BondedTest_IfuncProperDihedralsPbcNo.xml b/src/gromacs/listed-forces/tests/refdata/BondedTest_IfuncProperDihedralsPbcNo.xml
deleted file mode 100644 (file)
index 47d7e15..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0"?>
-<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
-<ReferenceData>
-  <Real Name="Proper Dih.">19.848078</Real>
-</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/BondedTest_IfuncProperDihedralsPbcXy.xml b/src/gromacs/listed-forces/tests/refdata/BondedTest_IfuncProperDihedralsPbcXy.xml
deleted file mode 100644 (file)
index 47d7e15..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0"?>
-<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
-<ReferenceData>
-  <Real Name="Proper Dih.">19.848078</Real>
-</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/BondedTest_IfuncProperDihedralsPbcXyz.xml b/src/gromacs/listed-forces/tests/refdata/BondedTest_IfuncProperDihedralsPbcXyz.xml
deleted file mode 100644 (file)
index f8dc6c0..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0"?>
-<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
-<ReferenceData>
-  <Real Name="Proper Dih.">0.1519227</Real>
-</ReferenceData>
similarity index 81%
rename from src/gromacs/listed-forces/tests/refdata/BondedTest_BondAnglePbcNone.xml
rename to src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_BondAngle_0.xml
index d84a3e1aecec312092829b2c1b431539a6cc3a19..6926f305196cd05d0dc0ea0d2bb52eef76493f1e 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0"?>
 <?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
 <ReferenceData>
-  <Real Name="angle">1.5707964</Real>
+  <Real Name="angle">1.5707963267948966</Real>
   <Real Name="cosine_angle">0</Real>
   <Int Name="t1">22</Int>
   <Int Name="t2">22</Int>
similarity index 81%
rename from src/gromacs/listed-forces/tests/refdata/BondedTest_BondAnglePbcXy.xml
rename to src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_BondAngle_1.xml
index 0f7474a0ebedaa23d7a80a1ce92ee4038e22d34f..ef3714bba125939b8686e8300f5f9ba77e5e33d6 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0"?>
 <?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
 <ReferenceData>
-  <Real Name="angle">1.5707964</Real>
+  <Real Name="angle">1.5707963267948966</Real>
   <Real Name="cosine_angle">0</Real>
   <Int Name="t1">22</Int>
   <Int Name="t2">17</Int>
similarity index 81%
rename from src/gromacs/listed-forces/tests/refdata/BondedTest_BondAnglePbcXyz.xml
rename to src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_BondAngle_2.xml
index 5d778a1e07df318a65a0f2549723e999034a14ed..78c0cb2d2e5fad2a50af1a91293cbaa0765e9080 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0"?>
 <?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
 <ReferenceData>
-  <Real Name="angle">1.5707964</Real>
+  <Real Name="angle">1.5707963267948966</Real>
   <Real Name="cosine_angle">0</Real>
   <Int Name="t1">37</Int>
   <Int Name="t2">17</Int>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_BondAngle_3.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_BondAngle_3.xml
new file mode 100644 (file)
index 0000000..c44bc42
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="angle">2.3561944901923448</Real>
+  <Real Name="cosine_angle">-0.70710678118654757</Real>
+  <Int Name="t1">22</Int>
+  <Int Name="t2">22</Int>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_BondAngle_4.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_BondAngle_4.xml
new file mode 100644 (file)
index 0000000..c44bc42
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="angle">2.3561944901923448</Real>
+  <Real Name="cosine_angle">-0.70710678118654757</Real>
+  <Int Name="t1">22</Int>
+  <Int Name="t2">22</Int>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_BondAngle_5.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_BondAngle_5.xml
new file mode 100644 (file)
index 0000000..c44bc42
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="angle">2.3561944901923448</Real>
+  <Real Name="cosine_angle">-0.70710678118654757</Real>
+  <Int Name="t1">22</Int>
+  <Int Name="t2">22</Int>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_BondAngle_6.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_BondAngle_6.xml
new file mode 100644 (file)
index 0000000..44b90ba
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="angle">2.1322592341076487</Real>
+  <Real Name="cosine_angle">-0.53242508478135198</Real>
+  <Int Name="t1">22</Int>
+  <Int Name="t2">22</Int>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_BondAngle_7.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_BondAngle_7.xml
new file mode 100644 (file)
index 0000000..44b90ba
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="angle">2.1322592341076487</Real>
+  <Real Name="cosine_angle">-0.53242508478135198</Real>
+  <Int Name="t1">22</Int>
+  <Int Name="t2">22</Int>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_BondAngle_8.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_BondAngle_8.xml
new file mode 100644 (file)
index 0000000..44b90ba
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="angle">2.1322592341076487</Real>
+  <Real Name="cosine_angle">-0.53242508478135198</Real>
+  <Int Name="t1">22</Int>
+  <Int Name="t2">22</Int>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_DihedralAngle_0.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_DihedralAngle_0.xml
new file mode 100644 (file)
index 0000000..aa82202
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="angle">-1.5707963267948966</Real>
+  <Int Name="t1">22</Int>
+  <Int Name="t2">22</Int>
+  <Int Name="t3">22</Int>
+</ReferenceData>
similarity index 80%
rename from src/gromacs/listed-forces/tests/refdata/BondedTest_DihedralAnglePbcXy.xml
rename to src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_DihedralAngle_1.xml
index 36301d1e061418a794b900a4045852d37bebeb10..baf5fadd13624132f07b5b4470fcdc10f260c6c9 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0"?>
 <?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
 <ReferenceData>
-  <Real Name="angle">-1.5707964</Real>
+  <Real Name="angle">-1.5707963267948966</Real>
   <Int Name="t1">22</Int>
   <Int Name="t2">17</Int>
   <Int Name="t3">23</Int>
similarity index 80%
rename from src/gromacs/listed-forces/tests/refdata/BondedTest_DihedralAnglePbcXyz.xml
rename to src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_DihedralAngle_2.xml
index 2852780783ad416d58cde8ac6139d458b97ed661..ac28a1a59a904c81caf7cb474970475f3af8ec05 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0"?>
 <?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
 <ReferenceData>
-  <Real Name="angle">1.5707964</Real>
+  <Real Name="angle">1.5707963267948966</Real>
   <Int Name="t1">37</Int>
   <Int Name="t2">17</Int>
   <Int Name="t3">23</Int>
similarity index 83%
rename from src/gromacs/listed-forces/tests/refdata/BondedTest_DihedralAnglePbcNone.xml
rename to src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_DihedralAngle_3.xml
index 4cbb82d0f65099f1d9ec3ffa8d6ac3c4f9251810..37393051320e8bc024c5fce3721088b9452f8be2 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0"?>
 <?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
 <ReferenceData>
-  <Real Name="angle">-1.5707964</Real>
+  <Real Name="angle">0</Real>
   <Int Name="t1">22</Int>
   <Int Name="t2">22</Int>
   <Int Name="t3">22</Int>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_DihedralAngle_4.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_DihedralAngle_4.xml
new file mode 100644 (file)
index 0000000..3739305
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="angle">0</Real>
+  <Int Name="t1">22</Int>
+  <Int Name="t2">22</Int>
+  <Int Name="t3">22</Int>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_DihedralAngle_5.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_DihedralAngle_5.xml
new file mode 100644 (file)
index 0000000..3739305
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="angle">0</Real>
+  <Int Name="t1">22</Int>
+  <Int Name="t2">22</Int>
+  <Int Name="t3">22</Int>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_DihedralAngle_6.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_DihedralAngle_6.xml
new file mode 100644 (file)
index 0000000..5532eb3
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="angle">3.1415926535897931</Real>
+  <Int Name="t1">22</Int>
+  <Int Name="t2">22</Int>
+  <Int Name="t3">22</Int>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_DihedralAngle_7.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_DihedralAngle_7.xml
new file mode 100644 (file)
index 0000000..5532eb3
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="angle">3.1415926535897931</Real>
+  <Int Name="t1">22</Int>
+  <Int Name="t2">22</Int>
+  <Int Name="t3">22</Int>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_DihedralAngle_8.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_DihedralAngle_8.xml
new file mode 100644 (file)
index 0000000..5532eb3
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="angle">3.1415926535897931</Real>
+  <Int Name="t1">22</Int>
+  <Int Name="t2">22</Int>
+  <Int Name="t3">22</Int>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncAngles_0.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncAngles_0.xml
new file mode 100644 (file)
index 0000000..2a5ac08
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">1.5230870989335434</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">-8.7266462599716483</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-8.7266462599716483</Real>
+      <Real Name="Y">8.7266462599716483</Real>
+      <Real Name="Z">-8.7266462599716483</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">8.7266462599716483</Real>
+      <Real Name="Y">-8.7266462599716483</Real>
+      <Real Name="Z">8.7266462599716483</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">8.7266462599716483</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncAngles_1.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncAngles_1.xml
new file mode 100644 (file)
index 0000000..5497c35
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">1.5230870989335434</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">17.453292519943297</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">-17.453292519943297</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-17.453292519943297</Real>
+      <Real Name="Y">17.453292519943297</Real>
+      <Real Name="Z">-17.453292519943297</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">17.453292519943297</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">8.7266462599716483</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">17.453292519943297</Real>
+      <Real Name="Y">-8.7266462599716483</Real>
+      <Real Name="Z">-17.453292519943297</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-17.453292519943297</Real>
+      <Real Name="Y">17.453292519943297</Real>
+      <Real Name="Z">17.453292519943297</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">-17.453292519943297</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncAngles_2.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncAngles_2.xml
new file mode 100644 (file)
index 0000000..8109f80
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">1.5230870989335434</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">-17.453292519943297</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">-17.453292519943297</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-17.453292519943297</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">17.453292519943297</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">17.453292519943297</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">17.453292519943297</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">17.453292519943297</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">17.453292519943297</Real>
+      <Real Name="Y">-17.453292519943297</Real>
+      <Real Name="Z">17.453292519943297</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-17.453292519943297</Real>
+      <Real Name="Y">17.453292519943297</Real>
+      <Real Name="Z">-17.453292519943297</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">-17.453292519943297</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncAngles_3.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncAngles_3.xml
new file mode 100644 (file)
index 0000000..4e2f0cf
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">18.6578169619359</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">2.8421709430404007e-14</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">203.62174606600516</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">-203.62174606600516</Real>
+      <Real Name="Z">8.5265128291212022e-14</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">8.5265128291212022e-14</Real>
+      <Real Name="Z">277.66601736273412</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">-5.6843418860808015e-14</Real>
+      <Real Name="Z">-277.66601736273424</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncAngles_4.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncAngles_4.xml
new file mode 100644 (file)
index 0000000..4e2f0cf
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">18.6578169619359</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">2.8421709430404007e-14</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">203.62174606600516</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">-203.62174606600516</Real>
+      <Real Name="Z">8.5265128291212022e-14</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">8.5265128291212022e-14</Real>
+      <Real Name="Z">277.66601736273412</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">-5.6843418860808015e-14</Real>
+      <Real Name="Z">-277.66601736273424</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncAngles_5.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncAngles_5.xml
new file mode 100644 (file)
index 0000000..4e2f0cf
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">18.6578169619359</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">2.8421709430404007e-14</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">203.62174606600516</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">-203.62174606600516</Real>
+      <Real Name="Z">8.5265128291212022e-14</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">8.5265128291212022e-14</Real>
+      <Real Name="Z">277.66601736273412</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">-5.6843418860808015e-14</Real>
+      <Real Name="Z">-277.66601736273424</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncAngles_6.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncAngles_6.xml
new file mode 100644 (file)
index 0000000..c1a4754
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">47.631231917431272</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">76.147849407575862</Real>
+      <Real Name="Y">-121.56004451516648</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-231.09578724977212</Real>
+      <Real Name="Y">-199.44223930127089</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-81.648145884981545</Real>
+      <Real Name="Y">121.42857015903795</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">236.59608372717781</Real>
+      <Real Name="Y">199.57371365739942</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncAngles_7.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncAngles_7.xml
new file mode 100644 (file)
index 0000000..c1a4754
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">47.631231917431272</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">76.147849407575862</Real>
+      <Real Name="Y">-121.56004451516648</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-231.09578724977212</Real>
+      <Real Name="Y">-199.44223930127089</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-81.648145884981545</Real>
+      <Real Name="Y">121.42857015903795</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">236.59608372717781</Real>
+      <Real Name="Y">199.57371365739942</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncAngles_8.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncAngles_8.xml
new file mode 100644 (file)
index 0000000..c1a4754
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">47.631231917431272</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">76.147849407575862</Real>
+      <Real Name="Y">-121.56004451516648</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-231.09578724977212</Real>
+      <Real Name="Y">-199.44223930127089</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-81.648145884981545</Real>
+      <Real Name="Y">121.42857015903795</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">236.59608372717781</Real>
+      <Real Name="Y">199.57371365739942</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncBonds_0.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncBonds_0.xml
new file mode 100644 (file)
index 0000000..a22dd85
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">2.9999999999999987</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">9.9999999999999982</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">9.9999999999999982</Real>
+      <Real Name="Z">-9.9999999999999982</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">9.9999999999999982</Real>
+      <Real Name="Y">-9.9999999999999982</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-9.9999999999999982</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncBonds_1.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncBonds_1.xml
new file mode 100644 (file)
index 0000000..79833e2
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">5.5</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-15.000000000000002</Real>
+      <Real Name="Y">-15.000000000000002</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">15.000000000000002</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">15.000000000000002</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">9.9999999999999982</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">15.000000000000002</Real>
+      <Real Name="Z">-9.9999999999999982</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">15.000000000000002</Real>
+      <Real Name="Y">-15.000000000000002</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-15.000000000000002</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncBonds_2.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncBonds_2.xml
new file mode 100644 (file)
index 0000000..0c5b3d1
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">6.7500000000000018</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-15.000000000000002</Real>
+      <Real Name="Y">-15.000000000000002</Real>
+      <Real Name="Z">-15.000000000000002</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">15.000000000000002</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">15.000000000000002</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">15.000000000000002</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">15.000000000000002</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">15.000000000000002</Real>
+      <Real Name="Z">-15.000000000000002</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">15.000000000000002</Real>
+      <Real Name="Y">-15.000000000000002</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-15.000000000000002</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncBonds_3.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncBonds_3.xml
new file mode 100644 (file)
index 0000000..13f107a
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">34.750202025355343</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">-32.5</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">-24.784271247461906</Real>
+      <Real Name="Z">7.7157287525380944</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">-9.7157287525380944</Real>
+      <Real Name="Z">24.784271247461906</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">34.5</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncBonds_4.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncBonds_4.xml
new file mode 100644 (file)
index 0000000..13f107a
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">34.750202025355343</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">-32.5</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">-24.784271247461906</Real>
+      <Real Name="Z">7.7157287525380944</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">-9.7157287525380944</Real>
+      <Real Name="Z">24.784271247461906</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">34.5</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncBonds_5.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncBonds_5.xml
new file mode 100644 (file)
index 0000000..13f107a
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">34.750202025355343</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">-32.5</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">-24.784271247461906</Real>
+      <Real Name="Z">7.7157287525380944</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">-9.7157287525380944</Real>
+      <Real Name="Z">24.784271247461906</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">34.5</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncBonds_6.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncBonds_6.xml
new file mode 100644 (file)
index 0000000..dbcebb1
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">30.813352720018372</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">-28.183254655737294</Real>
+      <Real Name="Y">-17.654602216542347</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-1.914631562657501</Real>
+      <Real Name="Y">32.182864593691562</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">48.98862968517011</Real>
+      <Real Name="Y">-36.923375646456762</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-18.890743466775312</Real>
+      <Real Name="Y">22.395113269307547</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncBonds_7.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncBonds_7.xml
new file mode 100644 (file)
index 0000000..dbcebb1
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">30.813352720018372</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">-28.183254655737294</Real>
+      <Real Name="Y">-17.654602216542347</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-1.914631562657501</Real>
+      <Real Name="Y">32.182864593691562</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">48.98862968517011</Real>
+      <Real Name="Y">-36.923375646456762</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-18.890743466775312</Real>
+      <Real Name="Y">22.395113269307547</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncBonds_8.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncBonds_8.xml
new file mode 100644 (file)
index 0000000..dbcebb1
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">30.813352720018372</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">-28.183254655737294</Real>
+      <Real Name="Y">-17.654602216542347</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-1.914631562657501</Real>
+      <Real Name="Y">32.182864593691562</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">48.98862968517011</Real>
+      <Real Name="Y">-36.923375646456762</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-18.890743466775312</Real>
+      <Real Name="Y">22.395113269307547</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedralsFEP_0.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedralsFEP_0.xml
new file mode 100644 (file)
index 0000000..ccfac1d
--- /dev/null
@@ -0,0 +1,769 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Lambda Name="0">
+    <Real Name="Epot ">6.1685027506808492</Real>
+    <Real Name="dVdlambda ">11.034766031773518</Real>
+    <Sequence Name="ShiftForces">
+      <Int Name="Length">45</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+    <Sequence Name="Forces">
+      <Int Name="Length">4</Int>
+      <Vector>
+        <Real Name="X">7.8539816339744828</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">-7.8539816339744828</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">7.8539816339744828</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-7.8539816339744828</Real>
+      </Vector>
+    </Sequence>
+  </Lambda>
+  <Lambda Name="0.5">
+    <Real Name="Epot ">13.262352308671588</Real>
+    <Real Name="dVdlambda ">17.580566014743312</Real>
+    <Sequence Name="ShiftForces">
+      <Int Name="Length">45</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+    <Sequence Name="Forces">
+      <Int Name="Length">4</Int>
+      <Vector>
+        <Real Name="X">14.104442017679176</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">-14.104442017679176</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">14.104442017679176</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-14.104442017679176</Real>
+      </Vector>
+    </Sequence>
+  </Lambda>
+  <Lambda Name="1">
+    <Real Name="Epot ">23.989002579978035</Real>
+    <Real Name="dVdlambda ">25.565968885036352</Real>
+    <Sequence Name="ShiftForces">
+      <Int Name="Length">45</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+    <Sequence Name="Forces">
+      <Int Name="Length">4</Int>
+      <Vector>
+        <Real Name="X">21.903882112528837</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">-21.903882112528837</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">21.903882112528837</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-21.903882112528837</Real>
+      </Vector>
+    </Sequence>
+  </Lambda>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedralsFEP_1.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedralsFEP_1.xml
new file mode 100644 (file)
index 0000000..4532b40
--- /dev/null
@@ -0,0 +1,769 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Lambda Name="0">
+    <Real Name="Epot ">6.1685027506808492</Real>
+    <Real Name="dVdlambda ">11.034766031773518</Real>
+    <Sequence Name="ShiftForces">
+      <Int Name="Length">45</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-15.707963267948966</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">15.707963267948966</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+    <Sequence Name="Forces">
+      <Int Name="Length">4</Int>
+      <Vector>
+        <Real Name="X">-7.8539816339744828</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">7.8539816339744828</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">15.707963267948966</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-15.707963267948966</Real>
+      </Vector>
+    </Sequence>
+  </Lambda>
+  <Lambda Name="0.5">
+    <Real Name="Epot ">13.262352308671588</Real>
+    <Real Name="dVdlambda ">17.580566014743312</Real>
+    <Sequence Name="ShiftForces">
+      <Int Name="Length">45</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-28.208884035358352</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">28.208884035358352</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+    <Sequence Name="Forces">
+      <Int Name="Length">4</Int>
+      <Vector>
+        <Real Name="X">-14.104442017679176</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">14.104442017679176</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">28.208884035358352</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-28.208884035358352</Real>
+      </Vector>
+    </Sequence>
+  </Lambda>
+  <Lambda Name="1">
+    <Real Name="Epot ">23.989002579978035</Real>
+    <Real Name="dVdlambda ">25.565968885036352</Real>
+    <Sequence Name="ShiftForces">
+      <Int Name="Length">45</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-43.807764225057674</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">43.807764225057674</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+    <Sequence Name="Forces">
+      <Int Name="Length">4</Int>
+      <Vector>
+        <Real Name="X">-21.903882112528837</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">21.903882112528837</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">43.807764225057674</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-43.807764225057674</Real>
+      </Vector>
+    </Sequence>
+  </Lambda>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedralsFEP_2.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedralsFEP_2.xml
new file mode 100644 (file)
index 0000000..d0b5376
--- /dev/null
@@ -0,0 +1,769 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Lambda Name="0">
+    <Real Name="Epot ">6.1685027506808492</Real>
+    <Real Name="dVdlambda ">1.30223946958818</Real>
+    <Sequence Name="ShiftForces">
+      <Int Name="Length">45</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">15.707963267948966</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-15.707963267948966</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">15.707963267948966</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">-15.707963267948966</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+    <Sequence Name="Forces">
+      <Int Name="Length">4</Int>
+      <Vector>
+        <Real Name="X">-15.707963267948966</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">15.707963267948966</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-15.707963267948966</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">15.707963267948966</Real>
+      </Vector>
+    </Sequence>
+  </Lambda>
+  <Lambda Name="0.5">
+    <Real Name="Epot ">5.9629573870325823</Real>
+    <Real Name="dVdlambda ">-1.8844871096273672</Real>
+    <Sequence Name="ShiftForces">
+      <Int Name="Length">45</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">18.915005768488545</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-18.915005768488545</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">18.915005768488545</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">-18.915005768488545</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+    <Sequence Name="Forces">
+      <Int Name="Length">4</Int>
+      <Vector>
+        <Real Name="X">-18.915005768488545</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">18.915005768488545</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-18.915005768488545</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">18.915005768488545</Real>
+      </Vector>
+    </Sequence>
+  </Lambda>
+  <Lambda Name="1">
+    <Real Name="Epot ">4.5239494556073554</Real>
+    <Real Name="dVdlambda ">-3.6316108015196664</Real>
+    <Sequence Name="ShiftForces">
+      <Int Name="Length">45</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">19.024088846738191</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-19.024088846738191</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">19.024088846738191</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">-19.024088846738191</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+    <Sequence Name="Forces">
+      <Int Name="Length">4</Int>
+      <Vector>
+        <Real Name="X">-19.024088846738191</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">19.024088846738191</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-19.024088846738191</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">19.024088846738191</Real>
+      </Vector>
+    </Sequence>
+  </Lambda>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedralsFEP_3.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedralsFEP_3.xml
new file mode 100644 (file)
index 0000000..71dded7
--- /dev/null
@@ -0,0 +1,769 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Lambda Name="0">
+    <Real Name="Epot ">0</Real>
+    <Real Name="dVdlambda ">0</Real>
+    <Sequence Name="ShiftForces">
+      <Int Name="Length">45</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+    <Sequence Name="Forces">
+      <Int Name="Length">4</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+  </Lambda>
+  <Lambda Name="0.5">
+    <Real Name="Epot ">0.35990072183081195</Real>
+    <Real Name="dVdlambda ">1.6795367018771223</Real>
+    <Sequence Name="ShiftForces">
+      <Int Name="Length">45</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">3.5527136788005009e-15</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+    <Sequence Name="Forces">
+      <Int Name="Length">4</Int>
+      <Vector>
+        <Real Name="X">21.905881153419724</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">-68.847055053604848</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">76.812830018484746</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">-29.871656118299622</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+  </Lambda>
+  <Lambda Name="1">
+    <Real Name="Epot ">1.9194705164309971</Real>
+    <Real Name="dVdlambda ">4.7986762910774932</Real>
+    <Sequence Name="ShiftForces">
+      <Int Name="Length">45</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">1.4210854715202004e-14</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+    <Sequence Name="Forces">
+      <Int Name="Length">4</Int>
+      <Vector>
+        <Real Name="X">58.415683075785935</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">-183.59214680961293</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">204.83421338262602</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">-79.657749648799012</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+  </Lambda>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedralsFEP_4.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedralsFEP_4.xml
new file mode 100644 (file)
index 0000000..71dded7
--- /dev/null
@@ -0,0 +1,769 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Lambda Name="0">
+    <Real Name="Epot ">0</Real>
+    <Real Name="dVdlambda ">0</Real>
+    <Sequence Name="ShiftForces">
+      <Int Name="Length">45</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+    <Sequence Name="Forces">
+      <Int Name="Length">4</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+  </Lambda>
+  <Lambda Name="0.5">
+    <Real Name="Epot ">0.35990072183081195</Real>
+    <Real Name="dVdlambda ">1.6795367018771223</Real>
+    <Sequence Name="ShiftForces">
+      <Int Name="Length">45</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">3.5527136788005009e-15</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+    <Sequence Name="Forces">
+      <Int Name="Length">4</Int>
+      <Vector>
+        <Real Name="X">21.905881153419724</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">-68.847055053604848</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">76.812830018484746</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">-29.871656118299622</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+  </Lambda>
+  <Lambda Name="1">
+    <Real Name="Epot ">1.9194705164309971</Real>
+    <Real Name="dVdlambda ">4.7986762910774932</Real>
+    <Sequence Name="ShiftForces">
+      <Int Name="Length">45</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">1.4210854715202004e-14</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+    <Sequence Name="Forces">
+      <Int Name="Length">4</Int>
+      <Vector>
+        <Real Name="X">58.415683075785935</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">-183.59214680961293</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">204.83421338262602</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">-79.657749648799012</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+  </Lambda>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedralsFEP_5.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedralsFEP_5.xml
new file mode 100644 (file)
index 0000000..71dded7
--- /dev/null
@@ -0,0 +1,769 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Lambda Name="0">
+    <Real Name="Epot ">0</Real>
+    <Real Name="dVdlambda ">0</Real>
+    <Sequence Name="ShiftForces">
+      <Int Name="Length">45</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+    <Sequence Name="Forces">
+      <Int Name="Length">4</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+  </Lambda>
+  <Lambda Name="0.5">
+    <Real Name="Epot ">0.35990072183081195</Real>
+    <Real Name="dVdlambda ">1.6795367018771223</Real>
+    <Sequence Name="ShiftForces">
+      <Int Name="Length">45</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">3.5527136788005009e-15</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+    <Sequence Name="Forces">
+      <Int Name="Length">4</Int>
+      <Vector>
+        <Real Name="X">21.905881153419724</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">-68.847055053604848</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">76.812830018484746</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">-29.871656118299622</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+  </Lambda>
+  <Lambda Name="1">
+    <Real Name="Epot ">1.9194705164309971</Real>
+    <Real Name="dVdlambda ">4.7986762910774932</Real>
+    <Sequence Name="ShiftForces">
+      <Int Name="Length">45</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">1.4210854715202004e-14</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+    <Sequence Name="Forces">
+      <Int Name="Length">4</Int>
+      <Vector>
+        <Real Name="X">58.415683075785935</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">-183.59214680961293</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">204.83421338262602</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">-79.657749648799012</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+  </Lambda>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedralsFEP_6.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedralsFEP_6.xml
new file mode 100644 (file)
index 0000000..23ec87e
--- /dev/null
@@ -0,0 +1,769 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Lambda Name="0">
+    <Real Name="Epot ">24.674011002723397</Real>
+    <Real Name="dVdlambda ">34.406537564908731</Real>
+    <Sequence Name="ShiftForces">
+      <Int Name="Length">45</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+    <Sequence Name="Forces">
+      <Int Name="Length">4</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">137.58648166927725</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-479.73041017556898</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">162.30392362805125</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">179.84000487824048</Real>
+      </Vector>
+    </Sequence>
+  </Lambda>
+  <Lambda Name="0.5">
+    <Real Name="Epot ">30.0715223042769</Real>
+    <Real Name="dVdlambda ">6.8884945802298407</Real>
+    <Sequence Name="ShiftForces">
+      <Int Name="Length">45</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+    <Sequence Name="Forces">
+      <Int Name="Length">4</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-186.02838875700192</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">648.63549209155053</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-219.44843007209428</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-243.1586732624543</Real>
+      </Vector>
+    </Sequence>
+  </Lambda>
+  <Lambda Name="1">
+    <Real Name="Epot ">31.802439397507104</Real>
+    <Real Name="dVdlambda ">0.27510760724486971</Real>
+    <Sequence Name="ShiftForces">
+      <Int Name="Length">45</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+    <Sequence Name="Forces">
+      <Int Name="Length">4</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-220.90274001345065</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">770.23382522633005</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-260.58796626948225</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-288.74311894339718</Real>
+      </Vector>
+    </Sequence>
+  </Lambda>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedralsFEP_7.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedralsFEP_7.xml
new file mode 100644 (file)
index 0000000..23ec87e
--- /dev/null
@@ -0,0 +1,769 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Lambda Name="0">
+    <Real Name="Epot ">24.674011002723397</Real>
+    <Real Name="dVdlambda ">34.406537564908731</Real>
+    <Sequence Name="ShiftForces">
+      <Int Name="Length">45</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+    <Sequence Name="Forces">
+      <Int Name="Length">4</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">137.58648166927725</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-479.73041017556898</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">162.30392362805125</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">179.84000487824048</Real>
+      </Vector>
+    </Sequence>
+  </Lambda>
+  <Lambda Name="0.5">
+    <Real Name="Epot ">30.0715223042769</Real>
+    <Real Name="dVdlambda ">6.8884945802298407</Real>
+    <Sequence Name="ShiftForces">
+      <Int Name="Length">45</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+    <Sequence Name="Forces">
+      <Int Name="Length">4</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-186.02838875700192</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">648.63549209155053</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-219.44843007209428</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-243.1586732624543</Real>
+      </Vector>
+    </Sequence>
+  </Lambda>
+  <Lambda Name="1">
+    <Real Name="Epot ">31.802439397507104</Real>
+    <Real Name="dVdlambda ">0.27510760724486971</Real>
+    <Sequence Name="ShiftForces">
+      <Int Name="Length">45</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+    <Sequence Name="Forces">
+      <Int Name="Length">4</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-220.90274001345065</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">770.23382522633005</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-260.58796626948225</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-288.74311894339718</Real>
+      </Vector>
+    </Sequence>
+  </Lambda>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedralsFEP_8.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedralsFEP_8.xml
new file mode 100644 (file)
index 0000000..23ec87e
--- /dev/null
@@ -0,0 +1,769 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Lambda Name="0">
+    <Real Name="Epot ">24.674011002723397</Real>
+    <Real Name="dVdlambda ">34.406537564908731</Real>
+    <Sequence Name="ShiftForces">
+      <Int Name="Length">45</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+    <Sequence Name="Forces">
+      <Int Name="Length">4</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">137.58648166927725</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-479.73041017556898</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">162.30392362805125</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">179.84000487824048</Real>
+      </Vector>
+    </Sequence>
+  </Lambda>
+  <Lambda Name="0.5">
+    <Real Name="Epot ">30.0715223042769</Real>
+    <Real Name="dVdlambda ">6.8884945802298407</Real>
+    <Sequence Name="ShiftForces">
+      <Int Name="Length">45</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+    <Sequence Name="Forces">
+      <Int Name="Length">4</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-186.02838875700192</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">648.63549209155053</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-219.44843007209428</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-243.1586732624543</Real>
+      </Vector>
+    </Sequence>
+  </Lambda>
+  <Lambda Name="1">
+    <Real Name="Epot ">31.802439397507104</Real>
+    <Real Name="dVdlambda ">0.27510760724486971</Real>
+    <Sequence Name="ShiftForces">
+      <Int Name="Length">45</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">0</Real>
+      </Vector>
+    </Sequence>
+    <Sequence Name="Forces">
+      <Int Name="Length">4</Int>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-220.90274001345065</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">770.23382522633005</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-260.58796626948225</Real>
+      </Vector>
+      <Vector>
+        <Real Name="X">0</Real>
+        <Real Name="Y">0</Real>
+        <Real Name="Z">-288.74311894339718</Real>
+      </Vector>
+    </Sequence>
+  </Lambda>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedrals_0.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedrals_0.xml
new file mode 100644 (file)
index 0000000..67dc645
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">6.1685027506808492</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">7.8539816339744828</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-7.8539816339744828</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">7.8539816339744828</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">-7.8539816339744828</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedrals_1.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedrals_1.xml
new file mode 100644 (file)
index 0000000..b630977
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">6.1685027506808492</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">-15.707963267948966</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">15.707963267948966</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">-7.8539816339744828</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">7.8539816339744828</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">15.707963267948966</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">-15.707963267948966</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedrals_2.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedrals_2.xml
new file mode 100644 (file)
index 0000000..c0d5e6f
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">6.1685027506808492</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">15.707963267948966</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">-15.707963267948966</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">15.707963267948966</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-15.707963267948966</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">-15.707963267948966</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">15.707963267948966</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">-15.707963267948966</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">15.707963267948966</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedrals_3.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedrals_3.xml
new file mode 100644 (file)
index 0000000..1ff9125
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">0</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedrals_4.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedrals_4.xml
new file mode 100644 (file)
index 0000000..1ff9125
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">0</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedrals_5.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedrals_5.xml
new file mode 100644 (file)
index 0000000..1ff9125
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">0</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedrals_6.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedrals_6.xml
new file mode 100644 (file)
index 0000000..bb04f0a
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">24.674011002723397</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">137.58648166927725</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">-479.73041017556898</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">162.30392362805125</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">179.84000487824048</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedrals_7.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedrals_7.xml
new file mode 100644 (file)
index 0000000..bb04f0a
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">24.674011002723397</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">137.58648166927725</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">-479.73041017556898</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">162.30392362805125</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">179.84000487824048</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedrals_8.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncImproperDihedrals_8.xml
new file mode 100644 (file)
index 0000000..bb04f0a
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">24.674011002723397</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">137.58648166927725</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">-479.73041017556898</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">162.30392362805125</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">179.84000487824048</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncProperDihedrals_0.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncProperDihedrals_0.xml
new file mode 100644 (file)
index 0000000..78ab416
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">19.848077530122083</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">1.7364817766693035</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-1.7364817766693035</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">1.7364817766693035</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">-1.7364817766693035</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncProperDihedrals_1.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncProperDihedrals_1.xml
new file mode 100644 (file)
index 0000000..f11785b
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">19.848077530122083</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">-3.472963553338607</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">3.472963553338607</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">-1.7364817766693035</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">1.7364817766693035</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">3.472963553338607</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">-3.472963553338607</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncProperDihedrals_2.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncProperDihedrals_2.xml
new file mode 100644 (file)
index 0000000..804fbdd
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">0.15192246987791869</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">3.4729635533386007</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">-3.4729635533386007</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">3.4729635533386007</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-3.4729635533386007</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">-3.4729635533386007</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">3.4729635533386007</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">-3.4729635533386007</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">3.4729635533386007</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncProperDihedrals_3.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncProperDihedrals_3.xml
new file mode 100644 (file)
index 0000000..edd1f43
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">8.2635182233306974</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">1.4210854715202004e-14</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">92.848565376002526</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-291.80977689600792</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">325.57289157819071</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-126.61168005818529</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncProperDihedrals_4.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncProperDihedrals_4.xml
new file mode 100644 (file)
index 0000000..edd1f43
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">8.2635182233306974</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">1.4210854715202004e-14</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">92.848565376002526</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-291.80977689600792</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">325.57289157819071</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-126.61168005818529</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncProperDihedrals_5.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncProperDihedrals_5.xml
new file mode 100644 (file)
index 0000000..edd1f43
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">8.2635182233306974</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">1.4210854715202004e-14</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">92.848565376002526</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-291.80977689600792</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">325.57289157819071</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">-126.61168005818529</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncProperDihedrals_6.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncProperDihedrals_6.xml
new file mode 100644 (file)
index 0000000..d25334e
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">11.736481776669301</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">-86.259581555074774</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">300.76606319841176</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">-101.75613452021821</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">-112.75034712311879</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncProperDihedrals_7.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncProperDihedrals_7.xml
new file mode 100644 (file)
index 0000000..d25334e
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">11.736481776669301</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">-86.259581555074774</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">300.76606319841176</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">-101.75613452021821</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">-112.75034712311879</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncProperDihedrals_8.xml b/src/gromacs/listed-forces/tests/refdata/ForPbcValues_BondedTest_IfuncProperDihedrals_8.xml
new file mode 100644 (file)
index 0000000..d25334e
--- /dev/null
@@ -0,0 +1,257 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Real Name="Epot ">11.736481776669301</Real>
+  <Real Name="dVdlambda ">0</Real>
+  <Sequence Name="ShiftForces">
+    <Int Name="Length">45</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">0</Real>
+    </Vector>
+  </Sequence>
+  <Sequence Name="Forces">
+    <Int Name="Length">4</Int>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">-86.259581555074774</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">300.76606319841176</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">-101.75613452021821</Real>
+    </Vector>
+    <Vector>
+      <Real Name="X">0</Real>
+      <Real Name="Y">0</Real>
+      <Real Name="Z">-112.75034712311879</Real>
+    </Vector>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/math/multidimarray.h b/src/gromacs/math/multidimarray.h
new file mode 100644 (file)
index 0000000..cc7f030
--- /dev/null
@@ -0,0 +1,320 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2019, 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.
+ */
+/*! \libinternal
+ * \file
+ * \brief Declares MultiDimArray.
+ *
+ * \author Christian Blau <cblau@gwdg.de>
+ * \ingroup module_math
+ * \ingroup module_mdspan
+ */
+
+#ifndef GMX_MATH_MULTIDIMARRAY_H_
+#define GMX_MATH_MULTIDIMARRAY_H_
+
+#include "gromacs/mdspan/mdspan.h"
+#include "gromacs/utility/arrayref.h"
+
+namespace gmx
+{
+
+namespace detail
+{
+/*! \libinternal \brief
+ * Determine static array size at compile time.
+ * Statically evaluates the product of static array extents.
+ * \tparam Extents Extents of an multidimensional array as in module_mdspan
+ * \returns the product of the static extents
+ */
+template <typename Extents>
+constexpr typename Extents::index_type staticExtentsProduct(size_t const i = 0)
+{
+    return (i < Extents::rank()) ? Extents::static_extent(i) * staticExtentsProduct<Extents>(i + 1) : 1;
+}
+}   // namespace detail
+/*! \libinternal \brief
+ * Multidimensional array that manages its own memory.
+ *
+ * \note No bounds checking when accessing memory
+ *
+ * \note That the view holds a valid pointer to the data is a class invariant.
+ *
+ * The Container type that stores the data may be resizable (std::vector or similar)
+ * or static (std::array or similar). Copy and move assignment routines as well as
+ * swapping are designed to yield good performances in both cases, notably
+ * foregoing the copy-swap idiom due to the bad performance in swapping std::array.
+ *
+ * This class avoids throwing exeptions, apart from the ones that might be thrown
+ * from the containers during resizing an allocation. (bad_malloc from std::vector
+ * is a likely candidate)
+ *
+ *
+ * Holds as many elements as required by a multidimensional view.
+ * \tparam TContainer   Data type container for the data to be stored
+ *                      as MultiDimArray with random element access and
+ *                      value_type, refence and const_reference exposed
+ * \tparam Extents      An extents class describing the array dimensions
+ *                      as used in module_mdspan
+ * \tparam LayoutPolicy The data layout as in module_mdspan describes
+ *                      translation of indices to memory offset.
+ *                      Defaults to right aligned, so that the right-most index
+ *                      is contiguous in memory.
+ */
+template <class TContainer, class Extents, class LayoutPolicy = layout_right>
+class MultiDimArray
+{
+    public:
+        //! the type of values that are stored
+        using value_type = typename TContainer::value_type;
+        //! reference type to the stored values
+        using reference = typename TContainer::reference;
+        //! const reference type to the stored values
+        using const_reference = typename TContainer::const_reference;
+        //! the view used to access the data
+        using view_type = basic_mdspan<value_type, Extents, LayoutPolicy>;
+        /*! \brief Iterator type for contiguous iteration over the stored data.
+         * Used, e.g., in free begin and end functions
+         */
+        using iterator = typename ArrayRef<value_type>::iterator;
+        /*! \brief Const iterator type for contiguous iteration over the stored data.
+         *  used, e.g., in free begin and end functions
+         */
+        using const_iterator = const typename ArrayRef<const value_type>::const_iterator;
+        /*! \brief
+         * Allocate dynamic array data and set view with the dynamic extents.
+         *
+         * \param[in] dynamicExtent A parameter pack that describes the dynamic
+         *                          size of the array. Empty if purely static.
+         *
+         * \tparam IndexType        Parameter pack type holding the dynamic
+         *                          extents of the multidimensional array
+         */
+        template <class ... IndexType>
+        MultiDimArray(IndexType... dynamicExtent)
+        {
+            static_assert(Extents::rank_dynamic() != 0,
+                          "Resizable container type not allowed in a static MultiDimArray.");
+            resize(dynamicExtent ...);
+        }
+        /*! \brief
+         * Construction with fixed sized array for storage if MultiDimArray size
+         * is static and layout policy allows compile time determination of the
+         * container size.
+         *
+         * Exampe use is MultiDimArray<std::array<float, 9>, extents<3,3>>
+         * \tparam StaticSizeAndLayout Template parameter for activation via SFINAE.
+         */
+        template <bool StaticSizeAndLayoutRight = Extents::rank_dynamic() == 0 &&
+                      std::is_same<LayoutPolicy, layout_right>::value,
+                  typename std::enable_if<StaticSizeAndLayoutRight, int>::type = 0>
+        constexpr MultiDimArray() noexcept : view_(data_.data())
+        {
+            // \todo replace staticExtentsProduct by the required_span_size
+            // of the LayoutPolicy, once required_span_size is a constexpr
+            // with C++14
+            // using tuple_size allows constexpr for this constructor (data_.size() is not available then)
+            static_assert(std::tuple_size<TContainer>() ==
+                          detail::staticExtentsProduct<Extents>(),
+                          "Non-resizable container type size must match static MultiDimArray size.");
+        }
+        /*! \brief
+         * Construction from fixed sized arrays if the array size is static and
+         * layout policy allows compile time determination of the container size.
+         *
+         * Enables the expected initialization
+         * MultiDimArray<std::array<float, 9>, extents<3,3>> arr = {{1,2...}}
+         * \tparam StaticSizeAndLayout Template parameter for activation via SFINAE.
+         */
+        template <bool StaticSizeAndLayoutRight = Extents::rank_dynamic() == 0 &&
+                      std::is_same<LayoutPolicy, layout_right>::value,
+                  typename std::enable_if<StaticSizeAndLayoutRight, int>::type = 0>
+        constexpr MultiDimArray(const TContainer &data) noexcept : data_(data), view_(data_.data())
+        {
+            // \todo replace staticExtentsProduct by the required_span_size
+            // of the LayoutPolicy, once required_span_size is a constexpr
+            // with C++14
+            // using tuple_size allows constexpr for this constructor (data_.size() is not available then)
+            static_assert(std::tuple_size<TContainer>() ==
+                          detail::staticExtentsProduct<Extents>(),
+                          "Non-resizable container type size must match static MultiDimArray size.");
+        }
+        //! Copy constructor
+        constexpr MultiDimArray(const MultiDimArray &o) :
+            data_(o.data_),
+            view_(data_.data(), o.view_.extents())
+        {}
+        //! Move constructor
+        MultiDimArray(MultiDimArray &&o) noexcept : data_(std::move(o.data_)),
+                                                    view_(data_.data(), o.view_.extents())
+        {}
+        //! Copy assignment
+        MultiDimArray &operator=(const MultiDimArray &o) noexcept
+        {
+            data_ = o.data_;
+            view_ = view_type(data_.data(), o.view_.extents());
+            return *this;
+        }
+        //! Move assignment
+        MultiDimArray &operator=(MultiDimArray &&o) noexcept
+        {
+            data_ = std::move(o.data_);
+            view_ = view_type(data_.data(), o.view_.extents());
+            return *this;
+        }
+        //! Swaps content with other
+        void swap(MultiDimArray &o)
+        {
+            using std::swap;
+            swap(data_, o.data_);
+            swap(view_, o.view_);
+        }
+        /*! \brief
+         * Resize the dynamic extents of the array if any and set container size
+         * accordingly.
+         *
+         * Invalidates data and views of this array.
+         *
+         * \param[in] dynamicExtent A parameter pack that describes the dynamic
+         *                          size of the array. Empty if purely static.
+         * \tparam IndexType        Parameter pack type holding the dynamic
+         *                          extents of the multidimensional array
+         */
+        template <class ... IndexType>
+        void resize(IndexType... dynamicExtent)
+        {
+            // use a mapping object to determine the required span size;
+            layout_right::mapping<Extents> map {Extents {dynamicExtent ...}};
+            data_.resize(map.required_span_size());
+            // to construct a valid view on the data, the container has to be resized before
+            // the assignment, so that data_.data() is valid
+            view_ = view_type(data_.data(), dynamicExtent ...);
+        }
+        /*! \brief Data access via multidimensional indices.
+         * This allows referencing rank R array elements as array(x_0,x_1,x_2, .., x_R)
+         *
+         * \param[in] index multidimensional indices as parameter pack
+         *                  the number of parameters must match the rank of the array.
+         *
+         * \returns reference to array element
+         */
+        template< class... IndexType>
+        reference operator()(IndexType ... index) noexcept
+        {
+            return view_(index ...);
+        }
+        /*! \brief Const data access via multidimensional indices.
+         * This allows referencing rank R array elements as array(x_0,x_1,x_2, .., x_R)
+         *
+         * \param[in] index multidimensional indices as parameter pack
+         *                  the number of parameters must match the rank of the array.
+         *
+         * \returns const reference to array element
+         */
+        template <class... IndexType>
+        constexpr const_reference operator()(IndexType... index) const noexcept
+        {
+            return view_(index ...);
+        }
+        /*! \brief Contiguous access to the data.
+         * \returns ArrayRef to stored data.
+         */
+        ArrayRef<value_type> toArrayRef()
+        {
+            return {data_.data(), data_.data()+data_.size()};
+        }
+        /*! \brief Contiguous const access to the data.
+         * \returns ArrayRef to stored data.
+         */
+        constexpr ArrayRef<const value_type> toArrayRef() const
+        {
+            return {data_.data(), data_.data()+data_.size()};
+        }
+        /*! \brief Return the extent.
+         * \param[in] k dimension to query for extent
+         * \returns extent along specified dimension
+         */
+        constexpr typename view_type::index_type extent(int k) const noexcept
+        {
+            return view_.extent(k);
+        }
+    private:
+        //! The contiguous data that is equipped with multidimensional indexing in this class
+        TContainer data_;
+        //! Multidimensional view into data_.
+        view_type  view_;
+};
+
+//! Free MultiDimArray begin function addressing its contiguous memory.
+template <class TContainer, class Extents>
+constexpr typename MultiDimArray<TContainer, Extents>::const_iterator
+begin(const MultiDimArray<TContainer, Extents> &multiDimArray)
+{
+    return multiDimArray.toArrayRef().begin();
+}
+
+//! Free MultiDimArray begin function addressing its contiguous memory.
+template <class TContainer, class Extents>
+constexpr typename MultiDimArray<TContainer, Extents>::iterator
+begin(MultiDimArray<TContainer, Extents> &multiDimArray)
+{
+    return multiDimArray.toArrayRef().begin();
+}
+
+//! Free MultiDimArray end function addressing its contiguous memory.
+template <class TContainer, class Extents>
+constexpr typename MultiDimArray<TContainer, Extents>::const_iterator
+end(const MultiDimArray<TContainer, Extents> &multiDimArray)
+{
+    return multiDimArray.toArrayRef().end();
+}
+
+//! Free MultiDimArray end function addressing its contiguous memory.
+template <class TContainer, class Extents>
+constexpr typename MultiDimArray<TContainer, Extents>::iterator
+end(MultiDimArray<TContainer, Extents> &multiDimArray)
+{
+    return multiDimArray.toArrayRef().end();
+}
+
+//! Swap function
+template <class TContainer, class Extents>
+void swap(MultiDimArray<TContainer, Extents> &a, MultiDimArray<TContainer, Extents > &b) noexcept
+{
+    a.swap(b);
+}
+
+}      // namespace gmx
+
+#endif // GMX_MATH_MULTIDIMARRAY_H_
index d9011f73b7b30ac66fe84eb05eda14873cc056a5..0b8900886f0a5552ffd5a1d429cd2bbaa1b0ca90 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2014,2015,2018, by the GROMACS development team, led by
+# Copyright (c) 2014,2015,2018,2019, 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.
@@ -37,6 +37,7 @@ gmx_add_unit_test(MathUnitTests math-test
                   dofit.cpp
                   functions.cpp
                   invertmatrix.cpp
+                  multidimarray.cpp
                   paddedvector.cpp
                   vectypes.cpp
                   )
diff --git a/src/gromacs/math/tests/multidimarray.cpp b/src/gromacs/math/tests/multidimarray.cpp
new file mode 100644 (file)
index 0000000..0692e6a
--- /dev/null
@@ -0,0 +1,264 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2019, 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
+ * Tests multidimensional arrays
+ *
+ * \author Christian Blau <cblau@gwdg.de>
+ * \ingroup module_math
+ */
+#include "gmxpre.h"
+
+#include "gromacs/math/multidimarray.h"
+
+#include <string>
+#include <vector>
+
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+#include "testutils/testasserts.h"
+
+namespace gmx
+{
+
+namespace test
+{
+
+namespace
+{
+
+class MultiDimArrayTest : public ::testing::Test
+{
+    public:
+        MultiDimArrayTest()
+        {
+            std::fill(begin(staticArray_), end(staticArray_), testNumber_ - 1);
+            std::fill(begin(dynamicArray_), end(dynamicArray_), testNumber_ - 1);
+        }
+    protected:
+
+        using static_container_type = std::array<float, 3*3>;
+        using static_extents_type   = extents<3, 3>;
+        using static_array_type     = MultiDimArray<static_container_type, static_extents_type>;
+
+        using dynamic_container_type = std::vector<float>;
+        using dynamic_extents_type   = extents<dynamic_extent, dynamic_extent>;
+        using dynamic_array_type     = MultiDimArray<dynamic_container_type, dynamic_extents_type>;
+
+        static_array_type  staticArray_;
+        dynamic_array_type dynamicArray_ {2, 2};
+
+        float              testNumber_      = 42;
+};
+
+
+TEST_F(MultiDimArrayTest, canConstructAndFillStatic)
+{
+    for (const auto &x : staticArray_)
+    {
+        EXPECT_EQ(testNumber_ - 1, x);
+    }
+}
+
+TEST_F(MultiDimArrayTest, canConstructAndFillDynamic)
+{
+    for (const auto &x : dynamicArray_)
+    {
+        EXPECT_EQ(testNumber_ - 1, x);
+    }
+}
+
+TEST_F(MultiDimArrayTest, canSetValuesInStatic)
+{
+    staticArray_(1, 1) = testNumber_;
+    EXPECT_EQ(testNumber_, staticArray_(1, 1) );
+}
+
+TEST_F(MultiDimArrayTest, canSetValuesInDynamic)
+{
+    dynamicArray_(1, 1) = testNumber_;
+    EXPECT_EQ(testNumber_, dynamicArray_(1, 1));
+}
+
+TEST_F(MultiDimArrayTest, canMoveConstructStatic)
+{
+    auto other(std::move(staticArray_));
+    for (const auto &x : other)
+    {
+        EXPECT_EQ(testNumber_ - 1, x);
+    }
+}
+
+TEST_F(MultiDimArrayTest, canMoveConstructDynamic)
+{
+    auto other(std::move(dynamicArray_));
+    for (const auto &x : other)
+    {
+        EXPECT_EQ(testNumber_ - 1, x);
+    }
+}
+
+TEST_F(MultiDimArrayTest, canMoveAssignStatic)
+{
+    static_array_type other;
+    other = std::move(staticArray_);
+    for (const auto &x : other)
+    {
+        EXPECT_EQ(testNumber_ - 1, x);
+    }
+}
+
+TEST_F(MultiDimArrayTest, canMoveAssignDynamic)
+{
+    dynamic_array_type other;
+    other = std::move(dynamicArray_);
+    for (const auto &x : other)
+    {
+        EXPECT_EQ(testNumber_ - 1, x);
+    }
+}
+
+TEST_F(MultiDimArrayTest, canCopyConstructStatic)
+{
+    auto other       = staticArray_;
+    auto twoDArrayIt = begin(staticArray_);
+    for (const auto &x : other)
+    {
+        EXPECT_EQ(*twoDArrayIt, x);
+        ++twoDArrayIt;
+    }
+}
+
+TEST_F(MultiDimArrayTest, canCopyConstructDynamic)
+{
+    auto other       = dynamicArray_;
+    auto twoDArrayIt = begin(dynamicArray_);
+    for (const auto &x : other)
+    {
+        EXPECT_EQ(*twoDArrayIt, x);
+        ++twoDArrayIt;
+    }
+}
+
+TEST_F(MultiDimArrayTest, canCopyAssignStatic)
+{
+    static_array_type other;
+    other = staticArray_;
+    auto              twoDArrayIt = begin(staticArray_);
+    for (const auto &x : other)
+    {
+        EXPECT_EQ(*twoDArrayIt, x);
+        ++twoDArrayIt;
+    }
+}
+
+TEST_F(MultiDimArrayTest, canCopyAssignDynamic)
+{
+    dynamic_array_type other;
+    other = dynamicArray_;
+    auto               twoDArrayIt = begin(dynamicArray_);
+    for (const auto &x : other)
+    {
+        EXPECT_EQ(*twoDArrayIt, x);
+        ++twoDArrayIt;
+    }
+}
+
+TEST_F(MultiDimArrayTest, canSwapStatic)
+{
+    static_array_type other;
+    other.swap(staticArray_);
+    for (const auto &x : other)
+    {
+        EXPECT_EQ(testNumber_ - 1, x);
+    }
+}
+
+TEST_F(MultiDimArrayTest, canSwapDynamic)
+{
+    dynamic_array_type other;
+    other.swap(dynamicArray_);
+    for (const auto &x : other)
+    {
+        EXPECT_EQ(testNumber_ - 1, x);
+    }
+}
+
+TEST_F(MultiDimArrayTest, staticMultiDimArrayExtent)
+{
+    EXPECT_EQ(staticArray_.extent(0), 3);
+    EXPECT_EQ(staticArray_.extent(1), 3);
+}
+
+TEST_F(MultiDimArrayTest, dynamicMultiDimArrayExtent)
+{
+    EXPECT_EQ(dynamicArray_.extent(0), 2);
+    EXPECT_EQ(dynamicArray_.extent(1), 2);
+}
+
+TEST_F(MultiDimArrayTest, dynamicMultiDimArrayResizesToCorrectExtent)
+{
+    dynamicArray_.resize(5, 4);
+    EXPECT_EQ(dynamicArray_.extent(0), 5);
+    EXPECT_EQ(dynamicArray_.extent(1), 4);
+}
+
+TEST_F(MultiDimArrayTest, dynamicMultiDimArrayResizeAndSetValue)
+{
+    dynamicArray_.resize(5, 4);
+    dynamicArray_(4, 3) = testNumber_;
+    EXPECT_EQ(dynamicArray_(4, 3), testNumber_);
+}
+
+TEST_F(MultiDimArrayTest, staticMultiDimArrayFromArray)
+{
+    static_array_type arr = {{1, 2, 3, 4, 5, 6, 7, 8, 9}};
+    EXPECT_EQ(arr(0, 0), 1);
+    EXPECT_EQ(arr(0, 1), 2);
+    EXPECT_EQ(arr(0, 2), 3);
+    EXPECT_EQ(arr(1, 0), 4);
+    EXPECT_EQ(arr(1, 1), 5);
+    EXPECT_EQ(arr(1, 2), 6);
+    EXPECT_EQ(arr(2, 0), 7);
+    EXPECT_EQ(arr(2, 1), 8);
+    EXPECT_EQ(arr(2, 2), 9);
+}
+
+} // namespace
+
+} // namespace test
+
+} // namespace gmx
index 0a20f8baaf0941ce8a5ab94ffc72e4afcbab6393..785d315c99d092680e2dba575b90c468c010d755 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -1122,6 +1122,22 @@ Constraints::Impl::Impl(const gmx_mtop_t     &mtop_p,
 
 Constraints::Impl::~Impl()
 {
+    for (auto blocka : at2con_mt)
+    {
+        done_blocka(&blocka);
+    }
+    if (bSettleErrorHasOccurred != nullptr)
+    {
+        sfree(bSettleErrorHasOccurred);
+    }
+    if (vir_r_m_dr_th != nullptr)
+    {
+        sfree(vir_r_m_dr_th);
+    }
+    if (settled != nullptr)
+    {
+        settle_free(settled);
+    }
     done_lincs(lincsd);
 }
 
index 5927ace6335fc33b0d02acd5fc9d91f7e64e4823..1112359096193a8322d62924558a1d7596bf325d 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -66,6 +66,7 @@
 #include "gromacs/random/uniformrealdistribution.h"
 #include "gromacs/utility/cstringutil.h"
 #include "gromacs/utility/fatalerror.h"
+#include "gromacs/utility/pleasecite.h"
 #include "gromacs/utility/smalloc.h"
 
 #define NTROTTERPARTS 3
@@ -111,9 +112,7 @@ static void NHC_trotter(const t_grpopts *opts, int nvar, const gmx_ekindata_t *e
     int           i, j, mi, mj;
     double        Ekin, Efac, reft, kT, nd;
     double        dt;
-    t_grp_tcstat *tcstat;
     double       *ivxi, *ixi;
-    double       *iQinv;
     double       *GQ;
     gmx_bool      bBarostat;
     int           mstepsi, mstepsj;
@@ -139,17 +138,18 @@ static void NHC_trotter(const t_grpopts *opts, int nvar, const gmx_ekindata_t *e
 
         ivxi = &vxi[i*nh];
         ixi  = &xi[i*nh];
+        gmx::ArrayRef<const double> iQinv;
         if (bBarostat)
         {
-            iQinv = &(MassQ->QPinv[i*nh]);
+            iQinv = gmx::arrayRefFromArray(&MassQ->QPinv[i*nh], nh);
             nd    = 1.0; /* THIS WILL CHANGE IF NOT ISOTROPIC */
             reft  = std::max<real>(0, opts->ref_t[0]);
             Ekin  = gmx::square(*veta)/MassQ->Winv;
         }
         else
         {
-            iQinv  = &(MassQ->Qinv[i*nh]);
-            tcstat = &ekind->tcstat[i];
+            iQinv  = gmx::arrayRefFromArray(&MassQ->Qinv[i*nh], nh);
+            const t_grp_tcstat *tcstat = &ekind->tcstat[i];
             nd     = opts->nrdf[i];
             reft   = std::max<real>(0, opts->ref_t[i]);
             if (bEkinAveVel)
@@ -736,7 +736,7 @@ void berendsen_pscale(const t_inputrec *ir, const matrix mu,
     inc_nrnb(nrnb, eNR_PCOUPL, nr_atoms);
 }
 
-void berendsen_tcoupl(const t_inputrec *ir, const gmx_ekindata_t *ekind, real dt,
+void berendsen_tcoupl(const t_inputrec *ir, gmx_ekindata_t *ekind, real dt,
                       std::vector<double> &therm_integral)
 {
     const t_grpopts *opts = &ir->opts;
@@ -781,7 +781,8 @@ void berendsen_tcoupl(const t_inputrec *ir, const gmx_ekindata_t *ekind, real dt
 void andersen_tcoupl(const t_inputrec *ir, int64_t step,
                      const t_commrec *cr, const t_mdatoms *md,
                      gmx::ArrayRef<gmx::RVec> v,
-                     real rate, const gmx_bool *randomize, const real *boltzfac)
+                     real rate, const std::vector<bool> &randomize,
+                     gmx::ArrayRef<const real> boltzfac)
 {
     const int                                 *gatindex = (DOMAINDECOMP(cr) ? cr->dd->globalAtomIndices.data() : nullptr);
     int                                        i;
@@ -855,7 +856,8 @@ void nosehoover_tcoupl(const t_grpopts *opts, const gmx_ekindata_t *ekind, real
 void trotter_update(const t_inputrec *ir, int64_t step, gmx_ekindata_t *ekind,
                     const gmx_enerdata_t *enerd, t_state *state,
                     const tensor vir, const t_mdatoms *md,
-                    const t_extmass *MassQ, const int * const *trotter_seqlist, int trotter_seqno)
+                    const t_extmass *MassQ, gmx::ArrayRef < std::vector < int>> trotter_seqlist,
+                    int trotter_seqno)
 {
 
     int              n, i, d, ngtc, gc = 0, t;
@@ -864,7 +866,6 @@ void trotter_update(const t_inputrec *ir, int64_t step, gmx_ekindata_t *ekind,
     int64_t          step_eff;
     real             dt;
     double          *scalefac, dtc;
-    const int       *trotter_seq;
     rvec             sumv = {0, 0, 0};
     gmx_bool         bCouple;
 
@@ -883,7 +884,7 @@ void trotter_update(const t_inputrec *ir, int64_t step, gmx_ekindata_t *ekind,
     bCouple = (ir->nsttcouple == 1 ||
                do_per_step(step_eff+ir->nsttcouple, ir->nsttcouple));
 
-    trotter_seq = trotter_seqlist[trotter_seqno];
+    const gmx::ArrayRef<const int> trotter_seq = trotter_seqlist[trotter_seqno];
 
     if ((trotter_seq[0] == etrtSKIPALL) || (!bCouple))
     {
@@ -987,7 +988,7 @@ extern void init_npt_masses(const t_inputrec *ir, t_state *state, t_extmass *Mas
     {
         if (bInit)
         {
-            snew(MassQ->Qinv, ngtc);
+            MassQ->Qinv.resize(ngtc);
         }
         for (i = 0; (i < ngtc); i++)
         {
@@ -1033,7 +1034,7 @@ extern void init_npt_masses(const t_inputrec *ir, t_state *state, t_extmass *Mas
         /* Allocate space for thermostat variables */
         if (bInit)
         {
-            snew(MassQ->Qinv, ngtc*nh);
+            MassQ->Qinv.resize(ngtc * nh);
         }
 
         /* now, set temperature variables */
@@ -1068,12 +1069,12 @@ extern void init_npt_masses(const t_inputrec *ir, t_state *state, t_extmass *Mas
     }
 }
 
-int **init_npt_vars(const t_inputrec *ir, t_state *state, t_extmass *MassQ, gmx_bool bTrotter)
+std::array < std::vector < int>, ettTSEQMAX> init_npt_vars(const t_inputrec *ir, t_state *state,
+                                                           t_extmass *MassQ, gmx_bool bTrotter)
 {
     int              i, j, nnhpres, nh;
     const t_grpopts *opts;
     real             bmass, qmass, reft, kT;
-    int            **trotter_seq;
 
     opts    = &(ir->opts); /* just for ease of referencing */
     nnhpres = state->nnhpres;
@@ -1087,14 +1088,10 @@ int **init_npt_vars(const t_inputrec *ir, t_state *state, t_extmass *MassQ, gmx_
     init_npt_masses(ir, state, MassQ, TRUE);
 
     /* first, initialize clear all the trotter calls */
-    snew(trotter_seq, ettTSEQMAX);
+    std::array < std::vector < int>, ettTSEQMAX> trotter_seq;
     for (i = 0; i < ettTSEQMAX; i++)
     {
-        snew(trotter_seq[i], NTROTTERPARTS);
-        for (j = 0; j < NTROTTERPARTS; j++)
-        {
-            trotter_seq[i][j] = etrtNONE;
-        }
+        trotter_seq[i].resize(NTROTTERPARTS, etrtNONE);
         trotter_seq[i][0] = etrtSKIPALL;
     }
 
@@ -1220,7 +1217,7 @@ int **init_npt_vars(const t_inputrec *ir, t_state *state, t_extmass *MassQ, gmx_
             bmass = DIM*DIM; /* recommended mass parameters for isotropic barostat */
     }
 
-    snew(MassQ->QPinv, nnhpres*opts->nhchainlength);
+    MassQ->QPinv.resize(nnhpres*opts->nhchainlength);
 
     /* barostat temperature */
     if ((ir->tau_p > 0) && (opts->ref_t[0] > 0))
@@ -1568,19 +1565,18 @@ void vrescale_tcoupl(const t_inputrec *ir, int64_t step,
 void rescale_velocities(const gmx_ekindata_t *ekind, const t_mdatoms *mdatoms,
                         int start, int end, rvec v[])
 {
-    t_grp_acc      *gstat;
-    t_grp_tcstat   *tcstat;
     unsigned short *cACC, *cTC;
     int             ga, gt, n, d;
     real            lg;
     rvec            vrel;
 
-    tcstat = ekind->tcstat;
     cTC    = mdatoms->cTC;
 
+    gmx::ArrayRef<const t_grp_tcstat> tcstat = ekind->tcstat;
+
     if (ekind->bNEMD)
     {
-        gstat  = ekind->grpstat;
+        gmx::ArrayRef<const t_grp_acc> gstat = ekind->grpstat;
         cACC   = mdatoms->cACC;
 
         ga = 0;
@@ -1622,9 +1618,29 @@ void rescale_velocities(const gmx_ekindata_t *ekind, const t_mdatoms *mdatoms,
     }
 }
 
+// TODO If we keep simulated annealing, make a proper module that
+// does not rely on changing inputrec.
+bool initSimulatedAnnealing(t_inputrec  *ir,
+                            gmx::Update *upd)
+{
+    bool doSimulatedAnnealing = false;
+    for (int i = 0; i < ir->opts.ngtc; i++)
+    {
+        /* set bSimAnn if any group is being annealed */
+        if (ir->opts.annealing[i] != eannNO)
+        {
+            doSimulatedAnnealing = true;
+        }
+    }
+    if (doSimulatedAnnealing)
+    {
+        update_annealing_target_temp(ir, ir->init_t, upd);
+    }
+    return doSimulatedAnnealing;
+}
 
 /* set target temperatures if we are annealing */
-void update_annealing_target_temp(t_inputrec *ir, real t, gmx_update_t *upd)
+void update_annealing_target_temp(t_inputrec *ir, real t, gmx::Update *upd)
 {
     int  i, j, n, npoints;
     real pert, thist = 0, x;
@@ -1684,5 +1700,26 @@ void update_annealing_target_temp(t_inputrec *ir, real t, gmx_update_t *upd)
         }
     }
 
-    update_temperature_constants(upd, ir);
+    update_temperature_constants(upd->sd(), ir);
+}
+
+void pleaseCiteCouplingAlgorithms(FILE             *fplog,
+                                  const t_inputrec &ir)
+{
+    if (EI_DYNAMICS(ir.eI))
+    {
+        if (ir.etc == etcBERENDSEN)
+        {
+            please_cite(fplog, "Berendsen84a");
+        }
+        if (ir.etc == etcVRESCALE)
+        {
+            please_cite(fplog, "Bussi2007a");
+        }
+        // TODO this is actually an integrator, not a coupling algorithm
+        if (ir.eI == eiSD1)
+        {
+            please_cite(fplog, "Goga2012");
+        }
+    }
 }
index 6475581325ad4de78ec3e9c3d06f211b16b4e038..f3a44de6659d7bd9dcd1c4df6fb744c8f74e1109 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -675,8 +675,8 @@ static cginfo_mb_t *init_cginfo_mb(FILE *fplog, const gmx_mtop_t *mtop,
             {
                 a0 = cgs->index[cg];
                 a1 = cgs->index[cg+1];
-                if (getGroupType(&mtop->groups, egcENER, a_offset+am+a0) !=
-                    getGroupType(&mtop->groups, egcENER, a_offset   +a0))
+                if (getGroupType(mtop->groups, egcENER, a_offset+am+a0) !=
+                    getGroupType(mtop->groups, egcENER, a_offset   +a0))
                 {
                     bId = FALSE;
                 }
@@ -732,7 +732,7 @@ static cginfo_mb_t *init_cginfo_mb(FILE *fplog, const gmx_mtop_t *mtop,
                 a1 = cgs->index[cg+1];
 
                 /* Store the energy group in cginfo */
-                gid = getGroupType(&mtop->groups, egcENER, a_offset+am+a0);
+                gid = getGroupType(mtop->groups, egcENER, a_offset+am+a0);
                 SET_CGINFO_GID(cginfo[cgm+cg], gid);
 
                 /* Check the intra/inter charge group exclusions */
@@ -1516,45 +1516,6 @@ static real cutoff_inf(real cutoff)
     return cutoff;
 }
 
-gmx_bool can_use_allvsall(const t_inputrec *ir, gmx_bool bPrintNote, const t_commrec *cr, FILE *fp)
-{
-    gmx_bool bAllvsAll;
-
-    bAllvsAll =
-        (
-            ir->rlist == 0            &&
-            ir->rcoulomb == 0         &&
-            ir->rvdw == 0             &&
-            ir->ePBC == epbcNONE      &&
-            ir->vdwtype == evdwCUT    &&
-            ir->coulombtype == eelCUT &&
-            ir->efep == efepNO        &&
-            getenv("GMX_NO_ALLVSALL") == nullptr
-        );
-
-    if (bAllvsAll && ir->opts.ngener > 1)
-    {
-        const char *note = "NOTE: Can not use all-vs-all force loops, because there are multiple energy monitor groups; you might get significantly higher performance when using only a single energy monitor group.\n";
-
-        if (bPrintNote)
-        {
-            if (fp != nullptr)
-            {
-                fprintf(fp, "\n%s\n", note);
-            }
-        }
-        bAllvsAll = FALSE;
-    }
-
-    if (bAllvsAll && fp && MASTER(cr))
-    {
-        fprintf(fp, "\nUsing SIMD all-vs-all kernels.\n\n");
-    }
-
-    return bAllvsAll;
-}
-
-
 gmx_bool nbnxn_simd_supported(const gmx::MDLogger &mdlog,
                               const t_inputrec    *ir)
 {
@@ -2152,9 +2113,6 @@ static void init_nb_verlet(const gmx::MDLogger     &mdlog,
     nonbonded_verlet_t *nbv;
     char               *env;
 
-    nbnxn_alloc_t      *nb_alloc;
-    nbnxn_free_t       *nb_free;
-
     nbv = new nonbonded_verlet_t();
 
     nbv->emulateGpu = ((getenv("GMX_EMULATE_GPU") != nullptr) ? EmulateGpuNonbonded::Yes : EmulateGpuNonbonded::No);
@@ -2196,16 +2154,12 @@ static void init_nb_verlet(const gmx::MDLogger     &mdlog,
                                                       bFEP_NonBonded,
                                                       gmx_omp_nthreads_get(emntPairsearch));
 
-    gpu_set_host_malloc_and_free(nbv->grp[0].kernel_type == nbnxnk8x8x8_GPU,
-                                 &nb_alloc, &nb_free);
-
     for (int i = 0; i < nbv->ngrp; i++)
     {
         nbnxn_init_pairlist_set(&nbv->grp[i].nbl_lists,
                                 nbnxn_kernel_pairlist_simple(nbv->grp[i].kernel_type),
                                 /* 8x8x8 "non-simple" lists are ATM always combined */
-                                !nbnxn_kernel_pairlist_simple(nbv->grp[i].kernel_type),
-                                nb_alloc, nb_free);
+                                !nbnxn_kernel_pairlist_simple(nbv->grp[i].kernel_type));
     }
 
     int      enbnxninitcombrule;
@@ -2235,7 +2189,7 @@ static void init_nb_verlet(const gmx::MDLogger     &mdlog,
         enbnxninitcombrule = enbnxninitcombruleNONE;
     }
 
-    snew(nbv->nbat, 1);
+    nbv->nbat = new nbnxn_atomdata_t(nbv->bUseGPU ? gmx::PinningPolicy::PinnedIfSupported : gmx::PinningPolicy::CannotBePinned);
     int mimimumNumEnergyGroupNonbonded = ir->opts.ngener;
     if (ir->opts.ngener - ir->nwall == 1)
     {
@@ -2252,8 +2206,7 @@ static void init_nb_verlet(const gmx::MDLogger     &mdlog,
                         enbnxninitcombrule,
                         fr->ntype, fr->nbfp,
                         mimimumNumEnergyGroupNonbonded,
-                        bSimpleList ? gmx_omp_nthreads_get(emntNonbonded) : 1,
-                        nb_alloc, nb_free);
+                        bSimpleList ? gmx_omp_nthreads_get(emntNonbonded) : 1);
 
     if (nbv->bUseGPU)
     {
@@ -2461,25 +2414,6 @@ void init_forcerec(FILE                             *fp,
 
     fr->bBHAM = (mtop->ffparams.functype[0] == F_BHAM);
 
-    /* Check if we can/should do all-vs-all kernels */
-    fr->bAllvsAll       = can_use_allvsall(ir, FALSE, nullptr, nullptr);
-    fr->AllvsAll_work   = nullptr;
-
-    /* All-vs-all kernels have not been implemented in 4.6 and later.
-     * See Redmine #1249. */
-    if (fr->bAllvsAll)
-    {
-        fr->bAllvsAll            = FALSE;
-        if (fp != nullptr)
-        {
-            fprintf(fp,
-                    "\nYour simulation settings would have triggered the efficient all-vs-all\n"
-                    "kernels in GROMACS 4.5, but these have not been implemented in GROMACS\n"
-                    "4.6 and 5.x. If performance is important, please use GROMACS 4.5.7\n"
-                    "or try cutoff-scheme = Verlet.\n\n");
-        }
-    }
-
     /* Neighbour searching stuff */
     fr->cutoff_scheme = ir->cutoff_scheme;
     fr->bGrid         = (ir->ns_type == ensGRID);
@@ -3159,6 +3093,11 @@ void done_forcerec(t_forcerec *fr, int numMolBlocks, int numEnergyGroups)
         // PME-only ranks don't have a forcerec
         return;
     }
+    // cginfo is dynamically allocated if no domain decomposition
+    if (fr->cginfo != nullptr)
+    {
+        sfree(fr->cginfo);
+    }
     done_cginfo_mb(fr->cginfo_mb, numMolBlocks);
     sfree(fr->nbfp);
     done_interaction_const(fr->ic);
index 643b8997cfc5507d914c135e6089d29829c9d54f..1316e872ff3f23f5f13c63334b9e536887e696fa 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -160,13 +160,6 @@ gmx_bool uses_simple_tables(int                 cutoff_scheme,
  * with the type of kernel indicated.
  */
 
-gmx_bool can_use_allvsall(const t_inputrec *ir,
-                          gmx_bool bPrintNote, const t_commrec *cr, FILE *fp);
-/* Returns if we can use all-vs-all loops.
- * If bPrintNote==TRUE, prints a note, if necessary, to stderr
- * and fp (if !=NULL) on the master node.
- */
-
 gmx_bool nbnxn_simd_supported(const gmx::MDLogger &mdlog,
                               const t_inputrec    *ir);
 /* Return if CPU SIMD support exists for the given inputrec
index e6e6a33b6667604a1395a5ec78a6501ead4ff6a1..760bc6a2121f124e2d6d1084ccb440d6bce4611e 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -58,6 +58,7 @@
 #include "gromacs/domdec/domdec_struct.h"
 #include "gromacs/gmxlib/nrnb.h"
 #include "gromacs/math/functions.h"
+#include "gromacs/math/paddedvector.h"
 #include "gromacs/math/units.h"
 #include "gromacs/math/vec.h"
 #include "gromacs/mdlib/constr.h"
@@ -74,6 +75,7 @@
 #include "gromacs/simd/vector_operations.h"
 #include "gromacs/topology/block.h"
 #include "gromacs/topology/mtop_util.h"
+#include "gromacs/utility/alignedallocator.h"
 #include "gromacs/utility/arrayref.h"
 #include "gromacs/utility/basedefinitions.h"
 #include "gromacs/utility/bitmask.h"
 #include "gromacs/utility/fatalerror.h"
 #include "gromacs/utility/gmxomp.h"
 #include "gromacs/utility/pleasecite.h"
-#include "gromacs/utility/smalloc.h"
 
 using namespace gmx; // TODO: Remove when this file is moved into gmx namespace
 
 namespace gmx
 {
 
+//! Indices of the two atoms involved in a single constraint
+struct AtomPair
+{
+    //! \brief Constructor, does not initialize to catch bugs and faster construction
+    AtomPair()
+    {
+    }
+
+    //! Index of atom 1
+    int index1;
+    //! Index of atom 2
+    int index2;
+};
+
 //! Unit of work within LINCS.
 struct Task
 {
     //! First constraint for this task.
-    int    b0 = 0;
+    int              b0 = 0;
     //! b1-1 is the last constraint for this task.
-    int    b1 = 0;
+    int              b1 = 0;
     //! The number of constraints in triangles.
-    int    ntriangle = 0;
+    int              ntriangle = 0;
     //! The list of triangle constraints.
-    int   *triangle = nullptr;
+    std::vector<int> triangle;
     //! The bits tell if the matrix element should be used.
-    int   *tri_bits = nullptr;
-    //! Allocation size of triangle and tri_bits.
-    int    tri_alloc = 0;
-    //! Number of indices.
-    int    nind = 0;
+    std::vector<int> tri_bits;
     //! Constraint index for updating atom data.
-    int   *ind = nullptr;
-    //! Number of indices.
-    int    nind_r = 0;
+    std::vector<int> ind;
     //! Constraint index for updating atom data.
-    int   *ind_r = nullptr;
-    //! Allocation size of ind and ind_r.
-    int    ind_nalloc = 0;
+    std::vector<int> ind_r;
     //! Temporary variable for virial calculation.
-    tensor vir_r_m_dr = {{0}};
+    tensor           vir_r_m_dr = {{0}};
     //! Temporary variable for lambda derivative.
-    real   dhdlambda;
+    real             dhdlambda;
 };
 
 /*! \brief Data for LINCS algorithm.
@@ -139,47 +146,43 @@ class Lincs
         int             max_connect = 0;
 
         //! The number of real constraints.
-        int             nc_real = 0;
+        int              nc_real = 0;
         //! The number of constraints including padding for SIMD.
-        int             nc = 0;
-        //! The number we allocated memory for.
-        int             nc_alloc = 0;
+        int              nc = 0;
         //! The number of constraint connections.
-        int             ncc = 0;
-        //! The number we allocated memory for.
-        int             ncc_alloc = 0;
+        int              ncc = 0;
         //! The FE lambda value used for filling blc and blmf.
-        real            matlam = 0;
+        real             matlam = 0;
         //! mapping from topology to LINCS constraints.
-        int            *con_index = nullptr;
+        std::vector<int> con_index;
         //! The reference distance in topology A.
-        real           *bllen0 = nullptr;
+        std::vector < real, AlignedAllocator < real>> bllen0;
         //! The reference distance in top B - the r.d. in top A.
-        real           *ddist = nullptr;
+        std::vector < real, AlignedAllocator < real>> ddist;
         //! The atom pairs involved in the constraints.
-        int            *bla = nullptr;
+        std::vector<AtomPair> atoms;
         //! 1/sqrt(invmass1  invmass2).
-        real           *blc = nullptr;
+        std::vector < real, AlignedAllocator < real>> blc;
         //! As blc, but with all masses 1.
-        real           *blc1 = nullptr;
+        std::vector < real, AlignedAllocator < real>> blc1;
         //! Index into blbnb and blmf.
-        int            *blnr = nullptr;
+        std::vector<int>  blnr;
         //! List of constraint connections.
-        int            *blbnb = nullptr;
+        std::vector<int>  blbnb;
         //! The local number of constraints in triangles.
-        int             ntriangle = 0;
+        int               ntriangle = 0;
         //! The number of constraint connections in triangles.
-        int             ncc_triangle = 0;
+        int               ncc_triangle = 0;
         //! Communicate before each LINCS interation.
-        bool            bCommIter = false;
+        bool              bCommIter = false;
         //! Matrix of mass factors for constraint connections.
-        real           *blmf = nullptr;
+        std::vector<real> blmf;
         //! As blmf, but with all masses 1.
-        real           *blmf1 = nullptr;
+        std::vector<real> blmf1;
         //! The reference bond length.
-        real           *bllen = nullptr;
+        std::vector < real, AlignedAllocator < real>> bllen;
         //! The local atom count per constraint, can be NULL.
-        int            *nlocat = nullptr;
+        std::vector<int>  nlocat;
 
         /*! \brief The number of tasks used for LINCS work.
          *
@@ -188,28 +191,26 @@ class Lincs
          * index is used for constructing bit masks and organizing the
          * virial output buffer, so other things need to change,
          * first. */
-        int               ntask = 0;
+        int                        ntask = 0;
         /*! \brief LINCS thread division */
-        std::vector<Task> task;
+        std::vector<Task>          task;
         //! Atom flags for thread parallelization.
-        gmx_bitmask_t    *atf = nullptr;
-        //! Allocation size of atf
-        int               atf_nalloc = 0;
+        std::vector<gmx_bitmask_t> atf;
         //! Are the LINCS tasks interdependent?
-        bool              bTaskDep = false;
+        bool                       bTaskDep = false;
         //! Are there triangle constraints that cross task borders?
-        bool              bTaskDepTri = false;
+        bool                       bTaskDepTri = false;
         //! Arrays for temporary storage in the LINCS algorithm.
         /*! @{ */
-        rvec           *tmpv   = nullptr;
-        real           *tmpncc = nullptr;
-        real           *tmp1   = nullptr;
-        real           *tmp2   = nullptr;
-        real           *tmp3   = nullptr;
-        real           *tmp4   = nullptr;
+        PaddedVector<gmx::RVec>                   tmpv;
+        std::vector<real>                         tmpncc;
+        std::vector < real, AlignedAllocator < real>> tmp1;
+        std::vector < real, AlignedAllocator < real>> tmp2;
+        std::vector < real, AlignedAllocator < real>> tmp3;
+        std::vector < real, AlignedAllocator < real>> tmp4;
         /*! @} */
         //! The Lagrange multipliers times -1.
-        real               *mlambda = nullptr;
+        std::vector < real, AlignedAllocator < real>> mlambda;
         //! Storage for the constraint RMS relative deviation output.
         std::array<real, 2> rmsdData = {{0}};
 };
@@ -221,10 +222,6 @@ static const int simd_width = GMX_SIMD_REAL_WIDTH;
 static const int simd_width = 1;
 #endif
 
-/*! \brief Align to 128 bytes, consistent with the current implementation of
-   AlignedAllocator, which currently forces 128 byte alignment. */
-static const int align_bytes = 128;
-
 ArrayRef<real> lincs_rmsdData(Lincs *lincsd)
 {
     return lincsd->rmsdData;
@@ -247,28 +244,27 @@ real lincs_rmsd(const Lincs *lincsd)
  * This function will return with up to date thread-local
  * constraint data, without an OpenMP barrier.
  */
-static void lincs_matrix_expand(const Lincs *lincsd,
-                                const Task *li_task,
-                                const real *blcc,
-                                real *rhs1, real *rhs2, real *sol)
+static void lincs_matrix_expand(const Lincs               &lincsd,
+                                const Task                &li_task,
+                                gmx::ArrayRef<const real>  blcc,
+                                gmx::ArrayRef<real>        rhs1,
+                                gmx::ArrayRef<real>        rhs2,
+                                gmx::ArrayRef<real>        sol)
 {
-    int        b0, b1, nrec, rec;
-    const int *blnr  = lincsd->blnr;
-    const int *blbnb = lincsd->blbnb;
+    gmx::ArrayRef<const int> blnr  = lincsd.blnr;
+    gmx::ArrayRef<const int> blbnb = lincsd.blbnb;
 
-    b0   = li_task->b0;
-    b1   = li_task->b1;
-    nrec = lincsd->nOrder;
+    const int                b0   = li_task.b0;
+    const int                b1   = li_task.b1;
+    const int                nrec = lincsd.nOrder;
 
-    for (rec = 0; rec < nrec; rec++)
+    for (int rec = 0; rec < nrec; rec++)
     {
-        int b;
-
-        if (lincsd->bTaskDep)
+        if (lincsd.bTaskDep)
         {
 #pragma omp barrier
         }
-        for (b = b0; b < b1; b++)
+        for (int b = b0; b < b1; b++)
         {
             real mvb;
             int  n;
@@ -282,14 +278,10 @@ static void lincs_matrix_expand(const Lincs *lincsd,
             sol[b]  = sol[b] + mvb;
         }
 
-        real *swap;
-
-        swap = rhs1;
-        rhs1 = rhs2;
-        rhs2 = swap;
+        std::swap(rhs1, rhs2);
     }   /* nrec*(ncons+2*nrtot) flops */
 
-    if (lincsd->ntriangle > 0)
+    if (lincsd.ntriangle > 0)
     {
         /* Perform an extra nrec recursions for only the constraints
          * involved in rigid triangles.
@@ -299,7 +291,7 @@ static void lincs_matrix_expand(const Lincs *lincsd,
          * is around 0.4 (and 0.7*0.7=0.5).
          */
 
-        if (lincsd->bTaskDep)
+        if (lincsd.bTaskDep)
         {
             /* We need a barrier here, since other threads might still be
              * reading the contents of rhs1 and/o rhs2.
@@ -313,14 +305,12 @@ static void lincs_matrix_expand(const Lincs *lincsd,
          * LINCS task. This means no barriers are required during the extra
          * iterations for the triangle constraints.
          */
-        const int *triangle = li_task->triangle;
-        const int *tri_bits = li_task->tri_bits;
+        gmx::ArrayRef<const int> triangle = li_task.triangle;
+        gmx::ArrayRef<const int> tri_bits = li_task.tri_bits;
 
-        for (rec = 0; rec < nrec; rec++)
+        for (int rec = 0; rec < nrec; rec++)
         {
-            int tb;
-
-            for (tb = 0; tb < li_task->ntriangle; tb++)
+            for (int tb = 0; tb < li_task.ntriangle; tb++)
             {
                 int  b, bits, nr0, nr1, n;
                 real mvb;
@@ -341,14 +331,10 @@ static void lincs_matrix_expand(const Lincs *lincsd,
                 sol[b]  = sol[b] + mvb;
             }
 
-            real *swap;
-
-            swap = rhs1;
-            rhs1 = rhs2;
-            rhs2 = swap;
+            std::swap(rhs1, rhs2);
         }   /* nrec*(ntriangle + ncc_triangle*2) flops */
 
-        if (lincsd->bTaskDepTri)
+        if (lincsd.bTaskDepTri)
         {
             /* The constraints triangles are decoupled from each other,
              * but constraints in one triangle cross thread task borders.
@@ -360,119 +346,120 @@ static void lincs_matrix_expand(const Lincs *lincsd,
 }
 
 //! Update atomic coordinates when an index is not required.
-static void lincs_update_atoms_noind(int ncons, const int *bla,
-                                     real prefac,
-                                     const real *fac, rvec *r,
-                                     const real *invmass,
-                                     rvec *x)
+static void
+lincs_update_atoms_noind(int                             ncons,
+                         gmx::ArrayRef<const AtomPair>   atoms,
+                         real                            preFactor,
+                         gmx::ArrayRef<const real>       fac,
+                         gmx::ArrayRef<const gmx::RVec>  r,
+                         const real                     *invmass,
+                         rvec                           *x)
 {
-    int  b, i, j;
-    real mvb, im1, im2, tmp0, tmp1, tmp2;
-
     if (invmass != nullptr)
     {
-        for (b = 0; b < ncons; b++)
-        {
-            i        = bla[2*b];
-            j        = bla[2*b+1];
-            mvb      = prefac*fac[b];
-            im1      = invmass[i];
-            im2      = invmass[j];
-            tmp0     = r[b][0]*mvb;
-            tmp1     = r[b][1]*mvb;
-            tmp2     = r[b][2]*mvb;
-            x[i][0] -= tmp0*im1;
-            x[i][1] -= tmp1*im1;
-            x[i][2] -= tmp2*im1;
-            x[j][0] += tmp0*im2;
-            x[j][1] += tmp1*im2;
-            x[j][2] += tmp2*im2;
+        for (int b = 0; b < ncons; b++)
+        {
+            int  i     = atoms[b].index1;
+            int  j     = atoms[b].index2;
+            real mvb   = preFactor*fac[b];
+            real im1   = invmass[i];
+            real im2   = invmass[j];
+            real tmp0  = r[b][0]*mvb;
+            real tmp1  = r[b][1]*mvb;
+            real tmp2  = r[b][2]*mvb;
+            x[i][0]   -= tmp0*im1;
+            x[i][1]   -= tmp1*im1;
+            x[i][2]   -= tmp2*im1;
+            x[j][0]   += tmp0*im2;
+            x[j][1]   += tmp1*im2;
+            x[j][2]   += tmp2*im2;
         }   /* 16 ncons flops */
     }
     else
     {
-        for (b = 0; b < ncons; b++)
+        for (int b = 0; b < ncons; b++)
         {
-            i        = bla[2*b];
-            j        = bla[2*b+1];
-            mvb      = prefac*fac[b];
-            tmp0     = r[b][0]*mvb;
-            tmp1     = r[b][1]*mvb;
-            tmp2     = r[b][2]*mvb;
-            x[i][0] -= tmp0;
-            x[i][1] -= tmp1;
-            x[i][2] -= tmp2;
-            x[j][0] += tmp0;
-            x[j][1] += tmp1;
-            x[j][2] += tmp2;
+            int  i     = atoms[b].index1;
+            int  j     = atoms[b].index2;
+            real mvb   = preFactor*fac[b];
+            real tmp0  = r[b][0]*mvb;
+            real tmp1  = r[b][1]*mvb;
+            real tmp2  = r[b][2]*mvb;
+            x[i][0]   -= tmp0;
+            x[i][1]   -= tmp1;
+            x[i][2]   -= tmp2;
+            x[j][0]   += tmp0;
+            x[j][1]   += tmp1;
+            x[j][2]   += tmp2;
         }
     }
 }
 
 //! Update atomic coordinates when an index is required.
-static void lincs_update_atoms_ind(int ncons, const int *ind, const int *bla,
-                                   real prefac,
-                                   const real *fac, rvec *r,
-                                   const real *invmass,
-                                   rvec *x)
+static void
+lincs_update_atoms_ind(gmx::ArrayRef<const int>        ind,
+                       gmx::ArrayRef<const AtomPair>   atoms,
+                       real                            preFactor,
+                       gmx::ArrayRef<const real>       fac,
+                       gmx::ArrayRef<const gmx::RVec>  r,
+                       const real                     *invmass,
+                       rvec                           *x)
 {
-    int  bi, b, i, j;
-    real mvb, im1, im2, tmp0, tmp1, tmp2;
-
     if (invmass != nullptr)
     {
-        for (bi = 0; bi < ncons; bi++)
-        {
-            b        = ind[bi];
-            i        = bla[2*b];
-            j        = bla[2*b+1];
-            mvb      = prefac*fac[b];
-            im1      = invmass[i];
-            im2      = invmass[j];
-            tmp0     = r[b][0]*mvb;
-            tmp1     = r[b][1]*mvb;
-            tmp2     = r[b][2]*mvb;
-            x[i][0] -= tmp0*im1;
-            x[i][1] -= tmp1*im1;
-            x[i][2] -= tmp2*im1;
-            x[j][0] += tmp0*im2;
-            x[j][1] += tmp1*im2;
-            x[j][2] += tmp2*im2;
+        for (int b : ind)
+        {
+            int  i     = atoms[b].index1;
+            int  j     = atoms[b].index2;
+            real mvb   = preFactor*fac[b];
+            real im1   = invmass[i];
+            real im2   = invmass[j];
+            real tmp0  = r[b][0]*mvb;
+            real tmp1  = r[b][1]*mvb;
+            real tmp2  = r[b][2]*mvb;
+            x[i][0]   -= tmp0*im1;
+            x[i][1]   -= tmp1*im1;
+            x[i][2]   -= tmp2*im1;
+            x[j][0]   += tmp0*im2;
+            x[j][1]   += tmp1*im2;
+            x[j][2]   += tmp2*im2;
         }   /* 16 ncons flops */
     }
     else
     {
-        for (bi = 0; bi < ncons; bi++)
-        {
-            b        = ind[bi];
-            i        = bla[2*b];
-            j        = bla[2*b+1];
-            mvb      = prefac*fac[b];
-            tmp0     = r[b][0]*mvb;
-            tmp1     = r[b][1]*mvb;
-            tmp2     = r[b][2]*mvb;
-            x[i][0] -= tmp0;
-            x[i][1] -= tmp1;
-            x[i][2] -= tmp2;
-            x[j][0] += tmp0;
-            x[j][1] += tmp1;
-            x[j][2] += tmp2;
+        for (int b : ind)
+        {
+            int  i     = atoms[b].index1;
+            int  j     = atoms[b].index2;
+            real mvb   = preFactor*fac[b];
+            real tmp0  = r[b][0]*mvb;
+            real tmp1  = r[b][1]*mvb;
+            real tmp2  = r[b][2]*mvb;
+            x[i][0]   -= tmp0;
+            x[i][1]   -= tmp1;
+            x[i][2]   -= tmp2;
+            x[j][0]   += tmp0;
+            x[j][1]   += tmp1;
+            x[j][2]   += tmp2;
         }   /* 16 ncons flops */
     }
 }
 
 //! Update coordinates for atoms.
-static void lincs_update_atoms(Lincs *li, int th,
-                               real prefac,
-                               const real *fac, rvec *r,
-                               const real *invmass,
-                               rvec *x)
+static void
+lincs_update_atoms(Lincs                          *li,
+                   int                             th,
+                   real                            preFactor,
+                   gmx::ArrayRef<const real>       fac,
+                   gmx::ArrayRef<const gmx::RVec>  r,
+                   const real                     *invmass,
+                   rvec                           *x)
 {
     if (li->ntask == 1)
     {
         /* Single thread, we simply update for all constraints */
         lincs_update_atoms_noind(li->nc_real,
-                                 li->bla, prefac, fac, r, invmass, x);
+                                 li->atoms, preFactor, fac, r, invmass, x);
     }
     else
     {
@@ -480,10 +467,10 @@ static void lincs_update_atoms(Lincs *li, int th,
          * constraints that only access our local atom range.
          * This can be done without a barrier.
          */
-        lincs_update_atoms_ind(li->task[th].nind, li->task[th].ind,
-                               li->bla, prefac, fac, r, invmass, x);
+        lincs_update_atoms_ind(li->task[th].ind,
+                               li->atoms, preFactor, fac, r, invmass, x);
 
-        if (li->task[li->ntask].nind > 0)
+        if (!li->task[li->ntask].ind.empty())
         {
             /* Update the constraints that operate on atoms
              * in multiple thread atom blocks on the master thread.
@@ -491,9 +478,8 @@ static void lincs_update_atoms(Lincs *li, int th,
 #pragma omp barrier
 #pragma omp master
             {
-                lincs_update_atoms_ind(li->task[li->ntask].nind,
-                                       li->task[li->ntask].ind,
-                                       li->bla, prefac, fac, r, invmass, x);
+                lincs_update_atoms_ind(li->task[li->ntask].ind,
+                                       li->atoms, preFactor, fac, r, invmass, x);
             }
         }
     }
@@ -523,16 +509,16 @@ gatherLoadUTransposeTSANSafe(const real         *base,
  * This function only differs from calc_dr_x_xp_simd below in that
  * no constraint length is subtracted and no PBC is used for f. */
 static void gmx_simdcall
-calc_dr_x_f_simd(int                       b0,
-                 int                       b1,
-                 const int *               bla,
-                 const rvec * gmx_restrict x,
-                 const rvec * gmx_restrict f,
-                 const real * gmx_restrict blc,
-                 const real *              pbc_simd,
-                 rvec * gmx_restrict       r,
-                 real * gmx_restrict       rhs,
-                 real * gmx_restrict       sol)
+calc_dr_x_f_simd(int                            b0,
+                 int                            b1,
+                 gmx::ArrayRef<const AtomPair>  atoms,
+                 const rvec * gmx_restrict      x,
+                 const rvec * gmx_restrict      f,
+                 const real * gmx_restrict      blc,
+                 const real *                   pbc_simd,
+                 rvec * gmx_restrict            r,
+                 real * gmx_restrict            rhs,
+                 real * gmx_restrict            sol)
 {
     assert(b0 % GMX_SIMD_REAL_WIDTH == 0);
 
@@ -554,8 +540,8 @@ calc_dr_x_f_simd(int                       b0,
 
         for (int i = 0; i < GMX_SIMD_REAL_WIDTH; i++)
         {
-            offset0[i] = bla[bs*2 + i*2];
-            offset1[i] = bla[bs*2 + i*2 + 1];
+            offset0[i] = atoms[bs + i].index1;
+            offset1[i] = atoms[bs + i].index2;
         }
 
         gatherLoadUTransposeTSANSafe<3>(reinterpret_cast<const real *>(x), offset0, &x0_S, &y0_S, &z0_S);
@@ -598,18 +584,16 @@ static void do_lincsp(const rvec *x, rvec *f, rvec *fp, t_pbc *pbc,
                       ConstraintVariable econq, bool bCalcDHDL,
                       bool bCalcVir, tensor rmdf)
 {
-    int      b0, b1, b;
-    int     *bla, *blnr, *blbnb;
-    rvec    *r;
-    real    *blc, *blmf, *blcc, *rhs1, *rhs2, *sol;
-
-    b0 = lincsd->task[th].b0;
-    b1 = lincsd->task[th].b1;
-
-    bla    = lincsd->bla;
-    r      = lincsd->tmpv;
-    blnr   = lincsd->blnr;
-    blbnb  = lincsd->blbnb;
+    const int                     b0 = lincsd->task[th].b0;
+    const int                     b1 = lincsd->task[th].b1;
+
+    gmx::ArrayRef<const AtomPair> atoms = lincsd->atoms;
+    gmx::ArrayRef<gmx::RVec>      r     = lincsd->tmpv;
+    gmx::ArrayRef<const int>      blnr  = lincsd->blnr;
+    gmx::ArrayRef<const int>      blbnb = lincsd->blbnb;
+
+    gmx::ArrayRef<const real>     blc;
+    gmx::ArrayRef<const real>     blmf;
     if (econq != ConstraintVariable::Force)
     {
         /* Use mass-weighted parameters */
@@ -622,10 +606,10 @@ static void do_lincsp(const rvec *x, rvec *f, rvec *fp, t_pbc *pbc,
         blc  = lincsd->blc1;
         blmf = lincsd->blmf1;
     }
-    blcc   = lincsd->tmpncc;
-    rhs1   = lincsd->tmp1;
-    rhs2   = lincsd->tmp2;
-    sol    = lincsd->tmp3;
+    gmx::ArrayRef<real> blcc = lincsd->tmpncc;
+    gmx::ArrayRef<real> rhs1 = lincsd->tmp1;
+    gmx::ArrayRef<real> rhs2 = lincsd->tmp2;
+    gmx::ArrayRef<real> sol  = lincsd->tmp3;
 
 #if GMX_SIMD_HAVE_REAL
     /* This SIMD code does the same as the plain-C code after the #else.
@@ -640,44 +624,41 @@ static void do_lincsp(const rvec *x, rvec *f, rvec *fp, t_pbc *pbc,
     /* Compute normalized x i-j vectors, store in r.
      * Compute the inner product of r and xp i-j and store in rhs1.
      */
-    calc_dr_x_f_simd(b0, b1, bla, x, f, blc,
+    calc_dr_x_f_simd(b0, b1, atoms, x, f, blc.data(),
                      pbc_simd,
-                     r, rhs1, sol);
+                     as_rvec_array(r.data()), rhs1.data(), sol.data());
 
 #else   // GMX_SIMD_HAVE_REAL
 
     /* Compute normalized i-j vectors */
     if (pbc)
     {
-        for (b = b0; b < b1; b++)
+        for (int b = b0; b < b1; b++)
         {
             rvec dx;
 
-            pbc_dx_aiuc(pbc, x[bla[2*b]], x[bla[2*b+1]], dx);
+            pbc_dx_aiuc(pbc, x[atoms[b].index1], x[atoms[b].index2], dx);
             unitv(dx, r[b]);
         }
     }
     else
     {
-        for (b = b0; b < b1; b++)
+        for (int b = b0; b < b1; b++)
         {
             rvec dx;
 
-            rvec_sub(x[bla[2*b]], x[bla[2*b+1]], dx);
+            rvec_sub(x[atoms[b].index1], x[atoms[b].index2], dx);
             unitv(dx, r[b]);
         }   /* 16 ncons flops */
     }
 
-    for (b = b0; b < b1; b++)
+    for (int b = b0; b < b1; b++)
     {
-        int  i, j;
-        real mvb;
-
-        i       = bla[2*b];
-        j       = bla[2*b+1];
-        mvb     = blc[b]*(r[b][0]*(f[i][0] - f[j][0]) +
-                          r[b][1]*(f[i][1] - f[j][1]) +
-                          r[b][2]*(f[i][2] - f[j][2]));
+        int  i   = atoms[b].index1;
+        int  j   = atoms[b].index2;
+        real mvb = blc[b]*(r[b][0]*(f[i][0] - f[j][0]) +
+                           r[b][1]*(f[i][1] - f[j][1]) +
+                           r[b][2]*(f[i][2] - f[j][2]));
         rhs1[b] = mvb;
         sol[b]  = mvb;
         /* 7 flops */
@@ -694,18 +675,16 @@ static void do_lincsp(const rvec *x, rvec *f, rvec *fp, t_pbc *pbc,
     }
 
     /* Construct the (sparse) LINCS matrix */
-    for (b = b0; b < b1; b++)
+    for (int b = b0; b < b1; b++)
     {
-        int n;
-
-        for (n = blnr[b]; n < blnr[b+1]; n++)
+        for (int n = blnr[b]; n < blnr[b+1]; n++)
         {
             blcc[n] = blmf[n]*::iprod(r[b], r[blbnb[n]]);
         }   /* 6 nr flops */
     }
     /* Together: 23*ncons + 6*nrtot flops */
 
-    lincs_matrix_expand(lincsd, &lincsd->task[th], blcc, rhs1, rhs2, sol);
+    lincs_matrix_expand(*lincsd, lincsd->task[th], blcc, rhs1, rhs2, sol);
     /* nrec*(ncons+2*nrtot) flops */
 
     if (econq == ConstraintVariable::Deriv_FlexCon)
@@ -713,7 +692,7 @@ static void do_lincsp(const rvec *x, rvec *f, rvec *fp, t_pbc *pbc,
         /* We only want to constraint the flexible constraints,
          * so we mask out the normal ones by setting sol to 0.
          */
-        for (b = b0; b < b1; b++)
+        for (int b = b0; b < b1; b++)
         {
             if (!(lincsd->bllen0[b] == 0 && lincsd->ddist[b] == 0))
             {
@@ -723,7 +702,7 @@ static void do_lincsp(const rvec *x, rvec *f, rvec *fp, t_pbc *pbc,
     }
 
     /* We multiply sol by blc, so we can use lincs_update_atoms for OpenMP */
-    for (b = b0; b < b1; b++)
+    for (int b = b0; b < b1; b++)
     {
         sol[b] *= blc[b];
     }
@@ -736,10 +715,8 @@ static void do_lincsp(const rvec *x, rvec *f, rvec *fp, t_pbc *pbc,
 
     if (bCalcDHDL)
     {
-        real dhdlambda;
-
-        dhdlambda = 0;
-        for (b = b0; b < b1; b++)
+        real dhdlambda = 0;
+        for (int b = b0; b < b1; b++)
         {
             dhdlambda -= sol[b]*lincsd->ddist[b];
         }
@@ -754,16 +731,13 @@ static void do_lincsp(const rvec *x, rvec *f, rvec *fp, t_pbc *pbc,
          * where delta f is the constraint correction
          * of the quantity that is being constrained.
          */
-        for (b = b0; b < b1; b++)
+        for (int b = b0; b < b1; b++)
         {
-            real mvb, tmp1;
-            int  i, j;
-
-            mvb = lincsd->bllen[b]*sol[b];
-            for (i = 0; i < DIM; i++)
+            const real mvb = lincsd->bllen[b]*sol[b];
+            for (int i = 0; i < DIM; i++)
             {
-                tmp1 = mvb*r[b][i];
-                for (j = 0; j < DIM; j++)
+                const real tmp1 = mvb*r[b][i];
+                for (int j = 0; j < DIM; j++)
                 {
                     rmdf[i][j] += tmp1*r[b][j];
                 }
@@ -778,17 +752,17 @@ static void do_lincsp(const rvec *x, rvec *f, rvec *fp, t_pbc *pbc,
  *
  * Determine the right-hand side of the matrix equation using coordinates xp. */
 static void gmx_simdcall
-calc_dr_x_xp_simd(int                       b0,
-                  int                       b1,
-                  const int *               bla,
-                  const rvec * gmx_restrict x,
-                  const rvec * gmx_restrict xp,
-                  const real * gmx_restrict bllen,
-                  const real * gmx_restrict blc,
-                  const real *              pbc_simd,
-                  rvec * gmx_restrict       r,
-                  real * gmx_restrict       rhs,
-                  real * gmx_restrict       sol)
+calc_dr_x_xp_simd(int                            b0,
+                  int                            b1,
+                  gmx::ArrayRef<const AtomPair>  atoms,
+                  const rvec * gmx_restrict      x,
+                  const rvec * gmx_restrict      xp,
+                  const real * gmx_restrict      bllen,
+                  const real * gmx_restrict      blc,
+                  const real *                   pbc_simd,
+                  rvec * gmx_restrict            r,
+                  real * gmx_restrict            rhs,
+                  real * gmx_restrict            sol)
 {
     assert(b0 % GMX_SIMD_REAL_WIDTH == 0);
     alignas(GMX_SIMD_ALIGNMENT) std::int32_t offset2[GMX_SIMD_REAL_WIDTH];
@@ -809,8 +783,8 @@ calc_dr_x_xp_simd(int                       b0,
 
         for (int i = 0; i < GMX_SIMD_REAL_WIDTH; i++)
         {
-            offset0[i] = bla[bs*2 + i*2];
-            offset1[i] = bla[bs*2 + i*2 + 1];
+            offset0[i] = atoms[bs + i].index1;
+            offset1[i] = atoms[bs + i].index2;
         }
 
         gatherLoadUTransposeTSANSafe<3>(reinterpret_cast<const real *>(x), offset0, &x0_S, &y0_S, &z0_S);
@@ -851,41 +825,38 @@ calc_dr_x_xp_simd(int                       b0,
 
 /*! \brief Determine the distances and right-hand side for the next iteration. */
 gmx_unused static void calc_dist_iter(
-        int                       b0,
-        int                       b1,
-        const int *               bla,
-        const rvec * gmx_restrict xp,
-        const real * gmx_restrict bllen,
-        const real * gmx_restrict blc,
-        const t_pbc *             pbc,
-        real                      wfac,
-        real * gmx_restrict       rhs,
-        real * gmx_restrict       sol,
-        bool *                    bWarn)
+        int                           b0,
+        int                           b1,
+        gmx::ArrayRef<const AtomPair> atoms,
+        const rvec * gmx_restrict     xp,
+        const real * gmx_restrict     bllen,
+        const real * gmx_restrict     blc,
+        const t_pbc *                 pbc,
+        real                          wfac,
+        real * gmx_restrict           rhs,
+        real * gmx_restrict           sol,
+        bool *                        bWarn)
 {
-    int b;
-
-    for (b = b0; b < b1; b++)
+    for (int b = b0; b < b1; b++)
     {
-        real len, len2, dlen2, mvb;
+        real len = bllen[b];
         rvec dx;
-
-        len = bllen[b];
         if (pbc)
         {
-            pbc_dx_aiuc(pbc, xp[bla[2*b]], xp[bla[2*b+1]], dx);
+            pbc_dx_aiuc(pbc, xp[atoms[b].index1], xp[atoms[b].index2], dx);
         }
         else
         {
-            rvec_sub(xp[bla[2*b]], xp[bla[2*b+1]], dx);
+            rvec_sub(xp[atoms[b].index1], xp[atoms[b].index2], dx);
         }
-        len2  = len*len;
-        dlen2 = 2*len2 - ::norm2(dx);
+        real len2  = len*len;
+        real dlen2 = 2*len2 - ::norm2(dx);
         if (dlen2 < wfac*len2)
         {
             /* not race free - see detailed comment in caller */
             *bWarn = TRUE;
         }
+        real mvb;
         if (dlen2 > 0)
         {
             mvb = blc[b]*(len - dlen2*gmx::invsqrt(dlen2));
@@ -902,31 +873,29 @@ gmx_unused static void calc_dist_iter(
 #if GMX_SIMD_HAVE_REAL
 /*! \brief As calc_dist_iter(), but using SIMD intrinsics. */
 static void gmx_simdcall
-calc_dist_iter_simd(int                       b0,
-                    int                       b1,
-                    const int *               bla,
-                    const rvec * gmx_restrict x,
-                    const real * gmx_restrict bllen,
-                    const real * gmx_restrict blc,
-                    const real *              pbc_simd,
-                    real                      wfac,
-                    real * gmx_restrict       rhs,
-                    real * gmx_restrict       sol,
-                    bool *                    bWarn)
+calc_dist_iter_simd(int                           b0,
+                    int                           b1,
+                    gmx::ArrayRef<const AtomPair> atoms,
+                    const rvec * gmx_restrict     x,
+                    const real * gmx_restrict     bllen,
+                    const real * gmx_restrict     blc,
+                    const real *                  pbc_simd,
+                    real                          wfac,
+                    real * gmx_restrict           rhs,
+                    real * gmx_restrict           sol,
+                    bool *                        bWarn)
 {
     SimdReal        min_S(GMX_REAL_MIN);
     SimdReal        two_S(2.0);
     SimdReal        wfac_S(wfac);
     SimdBool        warn_S;
 
-    int             bs;
-
     assert(b0 % GMX_SIMD_REAL_WIDTH == 0);
 
     /* Initialize all to FALSE */
     warn_S = (two_S < setZero());
 
-    for (bs = b0; bs < b1; bs += GMX_SIMD_REAL_WIDTH)
+    for (int bs = b0; bs < b1; bs += GMX_SIMD_REAL_WIDTH)
     {
         SimdReal x0_S, y0_S, z0_S;
         SimdReal x1_S, y1_S, z1_S;
@@ -937,8 +906,8 @@ calc_dist_iter_simd(int                       b0,
 
         for (int i = 0; i < GMX_SIMD_REAL_WIDTH; i++)
         {
-            offset0[i] = bla[bs*2 + i*2];
-            offset1[i] = bla[bs*2 + i*2 + 1];
+            offset0[i] = atoms[bs + i].index1;
+            offset1[i] = atoms[bs + i].index2;
         }
 
         gatherLoadUTransposeTSANSafe<3>(reinterpret_cast<const real *>(x), offset0, &x0_S, &y0_S, &z0_S);
@@ -992,29 +961,23 @@ static void do_lincs(const rvec *x, rvec *xp, matrix box, t_pbc *pbc,
                      real invdt, rvec * gmx_restrict v,
                      bool bCalcVir, tensor vir_r_m_dr)
 {
-    int      b0, b1, b, i, j, n, iter;
-    int     *bla, *blnr, *blbnb;
-    rvec    *r;
-    real    *blc, *blmf, *bllen, *blcc, *rhs1, *rhs2, *sol, *blc_sol, *mlambda;
-    int     *nlocat;
-
-    b0 = lincsd->task[th].b0;
-    b1 = lincsd->task[th].b1;
-
-    bla     = lincsd->bla;
-    r       = lincsd->tmpv;
-    blnr    = lincsd->blnr;
-    blbnb   = lincsd->blbnb;
-    blc     = lincsd->blc;
-    blmf    = lincsd->blmf;
-    bllen   = lincsd->bllen;
-    blcc    = lincsd->tmpncc;
-    rhs1    = lincsd->tmp1;
-    rhs2    = lincsd->tmp2;
-    sol     = lincsd->tmp3;
-    blc_sol = lincsd->tmp4;
-    mlambda = lincsd->mlambda;
-    nlocat  = lincsd->nlocat;
+    const int                     b0 = lincsd->task[th].b0;
+    const int                     b1 = lincsd->task[th].b1;
+
+    gmx::ArrayRef<const AtomPair> atoms   = lincsd->atoms;
+    gmx::ArrayRef<gmx::RVec>      r       = lincsd->tmpv;
+    gmx::ArrayRef<const int>      blnr    = lincsd->blnr;
+    gmx::ArrayRef<const int>      blbnb   = lincsd->blbnb;
+    gmx::ArrayRef<const real>     blc     = lincsd->blc;
+    gmx::ArrayRef<const real>     blmf    = lincsd->blmf;
+    gmx::ArrayRef<const real>     bllen   = lincsd->bllen;
+    gmx::ArrayRef<real>           blcc    = lincsd->tmpncc;
+    gmx::ArrayRef<real>           rhs1    = lincsd->tmp1;
+    gmx::ArrayRef<real>           rhs2    = lincsd->tmp2;
+    gmx::ArrayRef<real>           sol     = lincsd->tmp3;
+    gmx::ArrayRef<real>           blc_sol = lincsd->tmp4;
+    gmx::ArrayRef<real>           mlambda = lincsd->mlambda;
+    gmx::ArrayRef<const int>      nlocat  = lincsd->nlocat;
 
 #if GMX_SIMD_HAVE_REAL
 
@@ -1030,54 +993,48 @@ static void do_lincs(const rvec *x, rvec *xp, matrix box, t_pbc *pbc,
     /* Compute normalized x i-j vectors, store in r.
      * Compute the inner product of r and xp i-j and store in rhs1.
      */
-    calc_dr_x_xp_simd(b0, b1, bla, x, xp, bllen, blc,
+    calc_dr_x_xp_simd(b0, b1, atoms, x, xp, bllen.data(), blc.data(),
                       pbc_simd,
-                      r, rhs1, sol);
+                      as_rvec_array(r.data()), rhs1.data(), sol.data());
 
 #else   // GMX_SIMD_HAVE_REAL
 
     if (pbc)
     {
         /* Compute normalized i-j vectors */
-        for (b = b0; b < b1; b++)
+        for (int b = b0; b < b1; b++)
         {
             rvec dx;
-            real mvb;
-
-            pbc_dx_aiuc(pbc, x[bla[2*b]], x[bla[2*b+1]], dx);
+            pbc_dx_aiuc(pbc, x[atoms[b].index1], x[atoms[b].index2], dx);
             unitv(dx, r[b]);
 
-            pbc_dx_aiuc(pbc, xp[bla[2*b]], xp[bla[2*b+1]], dx);
-            mvb     = blc[b]*(::iprod(r[b], dx) - bllen[b]);
-            rhs1[b] = mvb;
-            sol[b]  = mvb;
+            pbc_dx_aiuc(pbc, xp[atoms[b].index1], xp[atoms[b].index2], dx);
+            real mvb  = blc[b]*(::iprod(r[b], dx) - bllen[b]);
+            rhs1[b]   = mvb;
+            sol[b]    = mvb;
         }
     }
     else
     {
         /* Compute normalized i-j vectors */
-        for (b = b0; b < b1; b++)
-        {
-            real tmp0, tmp1, tmp2, rlen, mvb;
-
-            i       = bla[2*b];
-            j       = bla[2*b+1];
-            tmp0    = x[i][0] - x[j][0];
-            tmp1    = x[i][1] - x[j][1];
-            tmp2    = x[i][2] - x[j][2];
-            rlen    = gmx::invsqrt(tmp0*tmp0 + tmp1*tmp1 + tmp2*tmp2);
-            r[b][0] = rlen*tmp0;
-            r[b][1] = rlen*tmp1;
-            r[b][2] = rlen*tmp2;
+        for (int b = b0; b < b1; b++)
+        {
+            int  i    = atoms[b].index1;
+            int  j    = atoms[b].index2;
+            real tmp0 = x[i][0] - x[j][0];
+            real tmp1 = x[i][1] - x[j][1];
+            real tmp2 = x[i][2] - x[j][2];
+            real rlen = gmx::invsqrt(tmp0*tmp0 + tmp1*tmp1 + tmp2*tmp2);
+            r[b][0]   = rlen*tmp0;
+            r[b][1]   = rlen*tmp1;
+            r[b][2]   = rlen*tmp2;
             /* 16 ncons flops */
 
-            i       = bla[2*b];
-            j       = bla[2*b+1];
-            mvb     = blc[b]*(r[b][0]*(xp[i][0] - xp[j][0]) +
-                              r[b][1]*(xp[i][1] - xp[j][1]) +
-                              r[b][2]*(xp[i][2] - xp[j][2]) - bllen[b]);
-            rhs1[b] = mvb;
-            sol[b]  = mvb;
+            real mvb  = blc[b]*(r[b][0]*(xp[i][0] - xp[j][0]) +
+                                r[b][1]*(xp[i][1] - xp[j][1]) +
+                                r[b][2]*(xp[i][2] - xp[j][2]) - bllen[b]);
+            rhs1[b]   = mvb;
+            sol[b]    = mvb;
             /* 10 flops */
         }
         /* Together: 26*ncons + 6*nrtot flops */
@@ -1094,27 +1051,27 @@ static void do_lincs(const rvec *x, rvec *xp, matrix box, t_pbc *pbc,
     }
 
     /* Construct the (sparse) LINCS matrix */
-    for (b = b0; b < b1; b++)
+    for (int b = b0; b < b1; b++)
     {
-        for (n = blnr[b]; n < blnr[b+1]; n++)
+        for (int n = blnr[b]; n < blnr[b+1]; n++)
         {
-            blcc[n] = blmf[n]*::iprod(r[b], r[blbnb[n]]);
+            blcc[n] = blmf[n]*gmx::dot(r[b], r[blbnb[n]]);
         }
     }
     /* Together: 26*ncons + 6*nrtot flops */
 
-    lincs_matrix_expand(lincsd, &lincsd->task[th], blcc, rhs1, rhs2, sol);
+    lincs_matrix_expand(*lincsd, lincsd->task[th], blcc, rhs1, rhs2, sol);
     /* nrec*(ncons+2*nrtot) flops */
 
 #if GMX_SIMD_HAVE_REAL
-    for (b = b0; b < b1; b += GMX_SIMD_REAL_WIDTH)
+    for (int b = b0; b < b1; b += GMX_SIMD_REAL_WIDTH)
     {
-        SimdReal t1 = load<SimdReal>(blc + b);
-        SimdReal t2 = load<SimdReal>(sol + b);
-        store(mlambda + b, t1 * t2);
+        SimdReal t1 = load<SimdReal>(blc.data() + b);
+        SimdReal t2 = load<SimdReal>(sol.data() + b);
+        store(mlambda.data() + b, t1 * t2);
     }
 #else
-    for (b = b0; b < b1; b++)
+    for (int b = b0; b < b1; b++)
     {
         mlambda[b] = blc[b]*sol[b];
     }
@@ -1132,7 +1089,7 @@ static void do_lincs(const rvec *x, rvec *xp, matrix box, t_pbc *pbc,
     wfac = std::cos(DEG2RAD*wangle);
     wfac = wfac*wfac;
 
-    for (iter = 0; iter < lincsd->nIter; iter++)
+    for (int iter = 0; iter < lincsd->nIter; iter++)
     {
         if ((lincsd->bCommIter && DOMAINDECOMP(cr) && cr->dd->constraints))
         {
@@ -1153,32 +1110,32 @@ static void do_lincs(const rvec *x, rvec *xp, matrix box, t_pbc *pbc,
         }
 
 #if GMX_SIMD_HAVE_REAL
-        calc_dist_iter_simd(b0, b1, bla, xp, bllen, blc, pbc_simd, wfac,
-                            rhs1, sol, bWarn);
+        calc_dist_iter_simd(b0, b1, atoms,
+                            xp, bllen.data(), blc.data(), pbc_simd, wfac,
+                            rhs1.data(), sol.data(), bWarn);
 #else
-        calc_dist_iter(b0, b1, bla, xp, bllen, blc, pbc, wfac,
-                       rhs1, sol, bWarn);
+        calc_dist_iter(b0, b1, atoms, xp,
+                       bllen.data(), blc.data(), pbc, wfac,
+                       rhs1.data(), sol.data(), bWarn);
         /* 20*ncons flops */
 #endif      // GMX_SIMD_HAVE_REAL
 
-        lincs_matrix_expand(lincsd, &lincsd->task[th], blcc, rhs1, rhs2, sol);
+        lincs_matrix_expand(*lincsd, lincsd->task[th], blcc, rhs1, rhs2, sol);
         /* nrec*(ncons+2*nrtot) flops */
 
 #if GMX_SIMD_HAVE_REAL
-        for (b = b0; b < b1; b += GMX_SIMD_REAL_WIDTH)
+        for (int b = b0; b < b1; b += GMX_SIMD_REAL_WIDTH)
         {
-            SimdReal t1  = load<SimdReal>(blc + b);
-            SimdReal t2  = load<SimdReal>(sol + b);
+            SimdReal t1  = load<SimdReal>(blc.data() + b);
+            SimdReal t2  = load<SimdReal>(sol.data() + b);
             SimdReal mvb = t1 * t2;
-            store(blc_sol + b, mvb);
-            store(mlambda + b, load<SimdReal>(mlambda + b) + mvb);
+            store(blc_sol.data() + b, mvb);
+            store(mlambda.data() + b, load<SimdReal>(mlambda.data() + b) + mvb);
         }
 #else
-        for (b = b0; b < b1; b++)
+        for (int b = b0; b < b1; b++)
         {
-            real mvb;
-
-            mvb         = blc[b]*sol[b];
+            real mvb    = blc[b]*sol[b];
             blc_sol[b]  = mvb;
             mlambda[b] += mvb;
         }
@@ -1196,7 +1153,7 @@ static void do_lincs(const rvec *x, rvec *xp, matrix box, t_pbc *pbc,
         /* 16 ncons flops */
     }
 
-    if (nlocat != nullptr && (bCalcDHDL || bCalcVir))
+    if (!nlocat.empty() && (bCalcDHDL || bCalcVir))
     {
         if (lincsd->bTaskDep)
         {
@@ -1205,7 +1162,7 @@ static void do_lincs(const rvec *x, rvec *xp, matrix box, t_pbc *pbc,
         }
 
         /* Only account for local atoms */
-        for (b = b0; b < b1; b++)
+        for (int b = b0; b < b1; b++)
         {
             mlambda[b] *= 0.5*nlocat[b];
         }
@@ -1213,10 +1170,8 @@ static void do_lincs(const rvec *x, rvec *xp, matrix box, t_pbc *pbc,
 
     if (bCalcDHDL)
     {
-        real dhdl;
-
-        dhdl = 0;
-        for (b = b0; b < b1; b++)
+        real dhdl = 0;
+        for (int b = b0; b < b1; b++)
         {
             /* Note that this this is dhdl*dt^2, the dt^2 factor is corrected
              * later after the contributions are reduced over the threads.
@@ -1229,15 +1184,13 @@ static void do_lincs(const rvec *x, rvec *xp, matrix box, t_pbc *pbc,
     if (bCalcVir)
     {
         /* Constraint virial */
-        for (b = b0; b < b1; b++)
+        for (int b = b0; b < b1; b++)
         {
-            real tmp0, tmp1;
-
-            tmp0 = -bllen[b]*mlambda[b];
-            for (i = 0; i < DIM; i++)
+            real tmp0 = -bllen[b]*mlambda[b];
+            for (int i = 0; i < DIM; i++)
             {
-                tmp1 = tmp0*r[b][i];
-                for (j = 0; j < DIM; j++)
+                real tmp1 = tmp0*r[b][i];
+                for (int j = 0; j < DIM; j++)
                 {
                     vir_r_m_dr[i][j] -= tmp1*r[b][j];
                 }
@@ -1263,23 +1216,17 @@ static void set_lincs_matrix_task(Lincs                *li,
                                   int                  *ncc_triangle,
                                   int                  *nCrossTaskTriangles)
 {
-    int        i;
-
     /* Construct the coupling coefficient matrix blmf */
     li_task->ntriangle   = 0;
     *ncc_triangle        = 0;
     *nCrossTaskTriangles = 0;
-    for (i = li_task->b0; i < li_task->b1; i++)
+    for (int i = li_task->b0; i < li_task->b1; i++)
     {
-        int a1, a2, n;
-
-        a1 = li->bla[2*i];
-        a2 = li->bla[2*i+1];
-        for (n = li->blnr[i]; (n < li->blnr[i+1]); n++)
+        const int a1 = li->atoms[i].index1;
+        const int a2 = li->atoms[i].index2;
+        for (int n = li->blnr[i]; n < li->blnr[i + 1]; n++)
         {
-            int k, sign, center, end;
-
-            k = li->blbnb[n];
+            const int k = li->blbnb[n];
 
             /* If we are using multiple, independent tasks for LINCS,
              * the calls to check_assign_connected should have
@@ -1287,7 +1234,8 @@ static void set_lincs_matrix_task(Lincs                *li,
              */
             assert(li->bTaskDep || (k >= li_task->b0 && k < li_task->b1));
 
-            if (a1 == li->bla[2*k] || a2 == li->bla[2*k+1])
+            int sign;
+            if (a1 == li->atoms[k].index1 || a2 == li->atoms[k].index2)
             {
                 sign = -1;
             }
@@ -1295,7 +1243,9 @@ static void set_lincs_matrix_task(Lincs                *li,
             {
                 sign = 1;
             }
-            if (a1 == li->bla[2*k] || a1 == li->bla[2*k+1])
+            int center;
+            int end;
+            if (a1 == li->atoms[k].index1 || a1 == li->atoms[k].index2)
             {
                 center = a1;
                 end    = a2;
@@ -1309,14 +1259,13 @@ static void set_lincs_matrix_task(Lincs                *li,
             li->blmf1[n] = sign*0.5;
             if (li->ncg_triangle > 0)
             {
-                int nk, kk;
-
                 /* Look for constraint triangles */
-                for (nk = li->blnr[k]; (nk < li->blnr[k+1]); nk++)
+                for (int nk = li->blnr[k]; nk < li->blnr[k + 1]; nk++)
                 {
-                    kk = li->blbnb[nk];
+                    const int kk = li->blbnb[nk];
                     if (kk != i && kk != k &&
-                        (li->bla[2*kk] == end || li->bla[2*kk+1] == end))
+                        (li->atoms[kk].index1 == end ||
+                         li->atoms[kk].index2 == end))
                     {
                         /* Check if the constraints in this triangle actually
                          * belong to a different task. We still assign them
@@ -1355,23 +1304,20 @@ static void set_lincs_matrix_task(Lincs                *li,
 /*! \brief Sets the elements in the LINCS matrix. */
 static void set_lincs_matrix(Lincs *li, real *invmass, real lambda)
 {
-    int        i;
     const real invsqrt2 = 0.7071067811865475244;
 
-    for (i = 0; (i < li->nc); i++)
+    for (int i = 0; (i < li->nc); i++)
     {
-        int a1, a2;
-
-        a1          = li->bla[2*i];
-        a2          = li->bla[2*i+1];
-        li->blc[i]  = gmx::invsqrt(invmass[a1] + invmass[a2]);
-        li->blc1[i] = invsqrt2;
+        const int a1 = li->atoms[i].index1;
+        const int a2 = li->atoms[i].index2;
+        li->blc[i]   = gmx::invsqrt(invmass[a1] + invmass[a2]);
+        li->blc1[i]  = invsqrt2;
     }
 
     /* Construct the coupling coefficient matrix blmf */
-    int th, ntriangle = 0, ncc_triangle = 0, nCrossTaskTriangles = 0;
+    int ntriangle = 0, ncc_triangle = 0, nCrossTaskTriangles = 0;
 #pragma omp parallel for reduction(+: ntriangle, ncc_triangle, nCrossTaskTriangles) num_threads(li->ntask) schedule(static)
-    for (th = 0; th < li->ntask; th++)
+    for (int th = 0; th < li->ntask; th++)
     {
         try
         {
@@ -1623,22 +1569,14 @@ void done_lincs(Lincs *li)
 /*! \brief Sets up the work division over the threads. */
 static void lincs_thread_setup(Lincs *li, int natoms)
 {
-    Task           *li_m;
-    int             th;
-    gmx_bitmask_t  *atf;
-    int             a;
+    li->atf.resize(natoms);
 
-    if (natoms > li->atf_nalloc)
-    {
-        li->atf_nalloc = over_alloc_large(natoms);
-        srenew(li->atf, li->atf_nalloc);
-    }
+    gmx::ArrayRef<gmx_bitmask_t> atf = li->atf;
 
-    atf = li->atf;
     /* Clear the atom flags */
-    for (a = 0; a < natoms; a++)
+    for (gmx_bitmask_t &mask : atf)
     {
-        bitmask_clear(&atf[a]);
+        bitmask_clear(&mask);
     }
 
     if (li->ntask > BITMASK_SIZE)
@@ -1646,23 +1584,20 @@ static void lincs_thread_setup(Lincs *li, int natoms)
         gmx_fatal(FARGS, "More than %d threads is not supported for LINCS.", BITMASK_SIZE);
     }
 
-    for (th = 0; th < li->ntask; th++)
+    for (int th = 0; th < li->ntask; th++)
     {
-        Task         *li_task;
-        int           b;
-
-        li_task = &li->task[th];
+        const Task *li_task = &li->task[th];
 
         /* For each atom set a flag for constraints from each */
-        for (b = li_task->b0; b < li_task->b1; b++)
+        for (int b = li_task->b0; b < li_task->b1; b++)
         {
-            bitmask_set_bit(&atf[li->bla[b*2    ]], th);
-            bitmask_set_bit(&atf[li->bla[b*2 + 1]], th);
+            bitmask_set_bit(&atf[li->atoms[b].index1], th);
+            bitmask_set_bit(&atf[li->atoms[b].index2], th);
         }
     }
 
 #pragma omp parallel for num_threads(li->ntask) schedule(static)
-    for (th = 0; th < li->ntask; th++)
+    for (int th = 0; th < li->ntask; th++)
     {
         try
         {
@@ -1672,32 +1607,25 @@ static void lincs_thread_setup(Lincs *li, int natoms)
 
             li_task = &li->task[th];
 
-            if (li_task->b1 - li_task->b0 > li_task->ind_nalloc)
-            {
-                li_task->ind_nalloc = over_alloc_large(li_task->b1-li_task->b0);
-                srenew(li_task->ind, li_task->ind_nalloc);
-                srenew(li_task->ind_r, li_task->ind_nalloc);
-            }
-
             bitmask_init_low_bits(&mask, th);
 
-            li_task->nind   = 0;
-            li_task->nind_r = 0;
+            li_task->ind.clear();
+            li_task->ind_r.clear();
             for (b = li_task->b0; b < li_task->b1; b++)
             {
                 /* We let the constraint with the lowest thread index
                  * operate on atoms with constraints from multiple threads.
                  */
-                if (bitmask_is_disjoint(atf[li->bla[b*2]], mask) &&
-                    bitmask_is_disjoint(atf[li->bla[b*2+1]], mask))
+                if (bitmask_is_disjoint(atf[li->atoms[b].index1], mask) &&
+                    bitmask_is_disjoint(atf[li->atoms[b].index2], mask))
                 {
                     /* Add the constraint to the local atom update index */
-                    li_task->ind[li_task->nind++] = b;
+                    li_task->ind.push_back(b);
                 }
                 else
                 {
                     /* Add the constraint to the rest block */
-                    li_task->ind_r[li_task->nind_r++] = b;
+                    li_task->ind_r.push_back(b);
                 }
             }
         }
@@ -1707,50 +1635,32 @@ static void lincs_thread_setup(Lincs *li, int natoms)
     /* We need to copy all constraints which have not be assigned
      * to a thread to a separate list which will be handled by one thread.
      */
-    li_m = &li->task[li->ntask];
+    Task *li_m = &li->task[li->ntask];
 
-    li_m->nind = 0;
-    for (th = 0; th < li->ntask; th++)
+    li_m->ind.clear();
+    for (int th = 0; th < li->ntask; th++)
     {
-        Task         *li_task;
-        int           b;
-
-        li_task   = &li->task[th];
+        const Task &li_task = li->task[th];
 
-        if (li_m->nind + li_task->nind_r > li_m->ind_nalloc)
+        for (int ind_r : li_task.ind_r)
         {
-            li_m->ind_nalloc = over_alloc_large(li_m->nind+li_task->nind_r);
-            srenew(li_m->ind, li_m->ind_nalloc);
-        }
-
-        for (b = 0; b < li_task->nind_r; b++)
-        {
-            li_m->ind[li_m->nind++] = li_task->ind_r[b];
+            li_m->ind.push_back(ind_r);
         }
 
         if (debug)
         {
-            fprintf(debug, "LINCS thread %d: %d constraints\n",
-                    th, li_task->nind);
+            fprintf(debug, "LINCS thread %d: %zu constraints\n",
+                    th, li_task.ind.size());
         }
     }
 
     if (debug)
     {
-        fprintf(debug, "LINCS thread r: %d constraints\n",
-                li_m->nind);
+        fprintf(debug, "LINCS thread r: %zu constraints\n",
+                li_m->ind.size());
     }
 }
 
-/*! \brief There is no realloc with alignment, so here we make one for reals.
- * Note that this function does not preserve the contents of the memory.
- */
-static void resize_real_aligned(real **ptr, int nelem)
-{
-    sfree_aligned(*ptr);
-    snew_aligned(*ptr, nelem, align_bytes);
-}
-
 //! Assign a constraint.
 static void assign_constraint(Lincs *li,
                               int constraint_index,
@@ -1765,12 +1675,12 @@ static void assign_constraint(Lincs *li,
     /* Make an mapping of local topology constraint index to LINCS index */
     li->con_index[constraint_index] = con;
 
-    li->bllen0[con]  = lenA;
-    li->ddist[con]   = lenB - lenA;
+    li->bllen0[con]       = lenA;
+    li->ddist[con]        = lenB - lenA;
     /* Set the length to the topology A length */
-    li->bllen[con]   = lenA;
-    li->bla[2*con]   = a1;
-    li->bla[2*con+1] = a2;
+    li->bllen[con]        = lenA;
+    li->atoms[con].index1 = a1;
+    li->atoms[con].index2 = a2;
 
     /* Make space in the constraint connection matrix for constraints
      * connected to both end of the current constraint.
@@ -1938,35 +1848,27 @@ static void check_assign_triangle(Lincs *li,
 
 //! Sets matrix indices.
 static void set_matrix_indices(Lincs                *li,
-                               const Task           *li_task,
+                               const Task           &li_task,
                                const t_blocka       *at2con,
                                bool                  bSortMatrix)
 {
-    int b;
-
-    for (b = li_task->b0; b < li_task->b1; b++)
+    for (int b = li_task.b0; b < li_task.b1; b++)
     {
-        int a1, a2, i, k;
-
-        a1 = li->bla[b*2];
-        a2 = li->bla[b*2 + 1];
+        const int a1 = li->atoms[b].index1;
+        const int a2 = li->atoms[b].index2;
 
-        i = li->blnr[b];
-        for (k = at2con->index[a1]; k < at2con->index[a1 + 1]; k++)
+        int       i = li->blnr[b];
+        for (int k = at2con->index[a1]; k < at2con->index[a1 + 1]; k++)
         {
-            int concon;
-
-            concon = li->con_index[at2con->a[k]];
+            int concon = li->con_index[at2con->a[k]];
             if (concon != b)
             {
                 li->blbnb[i++] = concon;
             }
         }
-        for (k = at2con->index[a2]; k < at2con->index[a2 + 1]; k++)
+        for (int k = at2con->index[a2]; k < at2con->index[a2 + 1]; k++)
         {
-            int concon;
-
-            concon = li->con_index[at2con->a[k]];
+            int concon = li->con_index[at2con->a[k]];
             if (concon != b)
             {
                 li->blbnb[i++] = concon;
@@ -1990,7 +1892,6 @@ void set_lincs(const t_idef         &idef,
     int          natoms;
     t_blocka     at2con;
     t_iatom     *iatom;
-    int          i, ncc_alloc_old, ncon_tot;
 
     li->nc_real = 0;
     li->nc      = 0;
@@ -1998,15 +1899,15 @@ void set_lincs(const t_idef         &idef,
     /* Zero the thread index ranges.
      * Otherwise without local constraints we could return with old ranges.
      */
-    for (i = 0; i < li->ntask; i++)
+    for (int i = 0; i < li->ntask; i++)
     {
         li->task[i].b0   = 0;
         li->task[i].b1   = 0;
-        li->task[i].nind = 0;
+        li->task[i].ind.clear();
     }
     if (li->ntask > 1)
     {
-        li->task[li->ntask].nind = 0;
+        li->task[li->ntask].ind.clear();
     }
 
     /* This is the local topology, so there are only F_CONSTR constraints */
@@ -2044,41 +1945,31 @@ void set_lincs(const t_idef         &idef,
     at2con = make_at2con(natoms, idef.il, idef.iparams,
                          flexibleConstraintTreatment(bDynamics));
 
-    ncon_tot = idef.il[F_CONSTR].nr/3;
+    const int ncon_tot = idef.il[F_CONSTR].nr/3;
 
     /* Ensure we have enough padding for aligned loads for each thread */
-    if (ncon_tot + li->ntask*simd_width > li->nc_alloc || li->nc_alloc == 0)
+    const int numEntries = ncon_tot + li->ntask*simd_width;
+    li->con_index.resize(numEntries);
+    li->bllen0.resize(numEntries);
+    li->ddist.resize(numEntries);
+    li->atoms.resize(numEntries);
+    li->blc.resize(numEntries);
+    li->blc1.resize(numEntries);
+    li->blnr.resize(numEntries);
+    li->bllen.resize(numEntries);
+    li->tmpv.resizeWithPadding(numEntries);
+    if (DOMAINDECOMP(cr))
     {
-        int old_alloc = li->nc_alloc;
-        li->nc_alloc = over_alloc_dd(ncon_tot + li->ntask*simd_width);
-        srenew(li->con_index, li->nc_alloc);
-        resize_real_aligned(&li->bllen0, li->nc_alloc);
-        resize_real_aligned(&li->ddist, li->nc_alloc);
-        srenew(li->bla, 2*li->nc_alloc);
-        resize_real_aligned(&li->blc, li->nc_alloc);
-        resize_real_aligned(&li->blc1, li->nc_alloc);
-        srenew(li->blnr, li->nc_alloc + 1);
-        resize_real_aligned(&li->bllen, li->nc_alloc);
-        srenew(li->tmpv, li->nc_alloc);
-        /* Need to clear the SIMD padding */
-        for (int i = old_alloc; i < li->nc_alloc; i++)
-        {
-            clear_rvec(li->tmpv[i]);
-        }
-        if (DOMAINDECOMP(cr))
-        {
-            srenew(li->nlocat, li->nc_alloc);
-        }
-        resize_real_aligned(&li->tmp1, li->nc_alloc);
-        resize_real_aligned(&li->tmp2, li->nc_alloc);
-        resize_real_aligned(&li->tmp3, li->nc_alloc);
-        resize_real_aligned(&li->tmp4, li->nc_alloc);
-        resize_real_aligned(&li->mlambda, li->nc_alloc);
+        li->nlocat.resize(numEntries);
     }
+    li->tmp1.resize(numEntries);
+    li->tmp2.resize(numEntries);
+    li->tmp3.resize(numEntries);
+    li->tmp4.resize(numEntries);
+    li->mlambda.resize(numEntries);
 
     iatom = idef.il[F_CONSTR].iatoms;
 
-    ncc_alloc_old = li->ncc_alloc;
     li->blnr[0]   = li->ncc;
 
     /* Assign the constraints for li->ntask LINCS tasks.
@@ -2087,10 +1978,9 @@ void set_lincs(const t_idef         &idef,
      * (e.g. because we are doing EM) we get imbalance, but since that doesn't
      * happen during normal MD, that's ok.
      */
-    int ncon_assign, ncon_target, con, th;
 
     /* Determine the number of constraints we need to assign here */
-    ncon_assign      = ncon_tot;
+    int ncon_assign = ncon_tot;
     if (!bDynamics)
     {
         /* With energy minimization, flexible constraints are ignored
@@ -2102,16 +1992,16 @@ void set_lincs(const t_idef         &idef,
     /* Set the target constraint count per task to exactly uniform,
      * this might be overridden below.
      */
-    ncon_target = (ncon_assign + li->ntask - 1)/li->ntask;
+    int ncon_target = (ncon_assign + li->ntask - 1)/li->ntask;
 
     /* Mark all constraints as unassigned by setting their index to -1 */
-    for (con = 0; con < ncon_tot; con++)
+    for (int con = 0; con < ncon_tot; con++)
     {
         li->con_index[con] = -1;
     }
 
-    con = 0;
-    for (th = 0; th < li->ntask; th++)
+    int con = 0;
+    for (int th = 0; th < li->ntask; th++)
     {
         Task *li_task;
 
@@ -2193,8 +2083,7 @@ void set_lincs(const t_idef         &idef,
             last   = li_task->b1 - 1;
             for (i = li_task->b1; i < li->nc; i++)
             {
-                li->bla[i*2    ] = li->bla[last*2    ];
-                li->bla[i*2 + 1] = li->bla[last*2 + 1];
+                li->atoms[i]     = li->atoms[last];
                 li->bllen0[i]    = li->bllen0[last];
                 li->ddist[i]     = li->ddist[last];
                 li->bllen[i]     = li->bllen[last];
@@ -2221,28 +2110,20 @@ void set_lincs(const t_idef         &idef,
      */
     bSortMatrix = !DOMAINDECOMP(cr);
 
-    if (li->ncc > li->ncc_alloc)
-    {
-        li->ncc_alloc = over_alloc_small(li->ncc);
-        srenew(li->blbnb, li->ncc_alloc);
-    }
+    li->blbnb.resize(li->ncc);
 
 #pragma omp parallel for num_threads(li->ntask) schedule(static)
-    for (th = 0; th < li->ntask; th++)
+    for (int th = 0; th < li->ntask; th++)
     {
         try
         {
-            Task *li_task;
-
-            li_task = &li->task[th];
+            Task &li_task = li->task[th];
 
-            if (li->ncg_triangle > 0 &&
-                li_task->b1 - li_task->b0 > li_task->tri_alloc)
+            if (li->ncg_triangle > 0)
             {
                 /* This is allocating too much, but it is difficult to improve */
-                li_task->tri_alloc = over_alloc_dd(li_task->b1 - li_task->b0);
-                srenew(li_task->triangle, li_task->tri_alloc);
-                srenew(li_task->tri_bits, li_task->tri_alloc);
+                li_task.triangle.resize(li_task.b1 - li_task.b0);
+                li_task.tri_bits.resize(li_task.b1 - li_task.b0);
             }
 
             set_matrix_indices(li, li_task, &at2con, bSortMatrix);
@@ -2255,16 +2136,12 @@ void set_lincs(const t_idef         &idef,
     if (cr->dd == nullptr)
     {
         /* Since the matrix is static, we should free some memory */
-        li->ncc_alloc = li->ncc;
-        srenew(li->blbnb, li->ncc_alloc);
+        li->blbnb.resize(li->ncc);
     }
 
-    if (li->ncc_alloc > ncc_alloc_old)
-    {
-        srenew(li->blmf, li->ncc_alloc);
-        srenew(li->blmf1, li->ncc_alloc);
-        srenew(li->tmpncc, li->ncc_alloc);
-    }
+    li->blmf.resize(li->ncc);
+    li->blmf1.resize(li->ncc);
+    li->tmpncc.resize(li->ncc);
 
     gmx::ArrayRef<const int> nlocat_dd = dd_constraints_nlocalatoms(cr->dd);
     if (!nlocat_dd.empty())
@@ -2277,7 +2154,7 @@ void set_lincs(const t_idef         &idef,
     }
     else
     {
-        li->nlocat = nullptr;
+        li->nlocat.clear();
     }
 
     if (debug)
@@ -2296,24 +2173,23 @@ void set_lincs(const t_idef         &idef,
 
 //! Issues a warning when LINCS constraints cannot be satisfied.
 static void lincs_warning(gmx_domdec_t *dd, const rvec *x, rvec *xprime, t_pbc *pbc,
-                          int ncons, const int *bla, real *bllen, real wangle,
+                          int ncons, gmx::ArrayRef<const AtomPair> atoms,
+                          gmx::ArrayRef<const real> bllen, real wangle,
                           int maxwarn, int *warncount)
 {
-    int  b, i, j;
-    rvec v0, v1;
-    real wfac, d0, d1, cosine;
-
-    wfac = std::cos(DEG2RAD*wangle);
+    real wfac = std::cos(DEG2RAD*wangle);
 
     fprintf(stderr,
             "bonds that rotated more than %g degrees:\n"
             " atom 1 atom 2  angle  previous, current, constraint length\n",
             wangle);
 
-    for (b = 0; b < ncons; b++)
+    for (int b = 0; b < ncons; b++)
     {
-        i = bla[2*b];
-        j = bla[2*b+1];
+        const int i = atoms[b].index1;
+        const int j = atoms[b].index2;
+        rvec      v0;
+        rvec      v1;
         if (pbc)
         {
             pbc_dx_aiuc(pbc, x[i], x[j], v0);
@@ -2324,9 +2200,9 @@ static void lincs_warning(gmx_domdec_t *dd, const rvec *x, rvec *xprime, t_pbc *
             rvec_sub(x[i], x[j], v0);
             rvec_sub(xprime[i], xprime[j], v1);
         }
-        d0     = norm(v0);
-        d1     = norm(v1);
-        cosine = ::iprod(v0, v1)/(d0*d1);
+        real d0     = norm(v0);
+        real d1     = norm(v1);
+        real cosine = ::iprod(v0, v1)/(d0*d1);
         if (cosine < wfac)
         {
             fprintf(stderr,
@@ -2348,49 +2224,40 @@ static void lincs_warning(gmx_domdec_t *dd, const rvec *x, rvec *xprime, t_pbc *
 }
 
 //! Determine how well the constraints have been satisfied.
-static void cconerr(const Lincs *lincsd,
-                    rvec *x, t_pbc *pbc,
+static void cconerr(const Lincs &lincsd,
+                    const rvec *x, const t_pbc *pbc,
                     real *ncons_loc, real *ssd, real *max, int *imax)
 {
-    const int  *bla, *nlocat;
-    const real *bllen;
-    real        ma, ssd2;
-    int         count, im, task;
+    gmx::ArrayRef<const AtomPair>  atoms  = lincsd.atoms;
+    gmx::ArrayRef<const real>      bllen  = lincsd.bllen;
+    gmx::ArrayRef<const int>       nlocat = lincsd.nlocat;
 
-    bla    = lincsd->bla;
-    bllen  = lincsd->bllen;
-    nlocat = lincsd->nlocat;
-
-    ma    = 0;
-    ssd2  = 0;
-    im    = 0;
-    count = 0;
-    for (task = 0; task < lincsd->ntask; task++)
+    real ma    = 0;
+    real ssd2  = 0;
+    int  im    = 0;
+    int  count = 0;
+    for (int task = 0; task < lincsd.ntask; task++)
     {
-        int b;
-
-        for (b = lincsd->task[task].b0; b < lincsd->task[task].b1; b++)
+        for (int b = lincsd.task[task].b0; b < lincsd.task[task].b1; b++)
         {
-            real len, d, r2;
             rvec dx;
-
             if (pbc)
             {
-                pbc_dx_aiuc(pbc, x[bla[2*b]], x[bla[2*b+1]], dx);
+                pbc_dx_aiuc(pbc, x[atoms[b].index1], x[atoms[b].index2], dx);
             }
             else
             {
-                rvec_sub(x[bla[2*b]], x[bla[2*b+1]], dx);
+                rvec_sub(x[atoms[b].index1], x[atoms[b].index2], dx);
             }
-            r2  = ::norm2(dx);
-            len = r2*gmx::invsqrt(r2);
-            d   = std::abs(len/bllen[b]-1);
-            if (d > ma && (nlocat == nullptr || nlocat[b]))
+            real r2  = ::norm2(dx);
+            real len = r2*gmx::invsqrt(r2);
+            real d   = std::abs(len/bllen[b]-1);
+            if (d > ma && (nlocat.empty() || nlocat[b]))
             {
                 ma = d;
                 im = b;
             }
-            if (nlocat == nullptr)
+            if (nlocat.empty())
             {
                 ssd2 += d*d;
                 count++;
@@ -2403,8 +2270,8 @@ static void cconerr(const Lincs *lincsd,
         }
     }
 
-    *ncons_loc = (nlocat ? 0.5 : 1)*count;
-    *ssd       = (nlocat ? 0.5 : 1)*ssd2;
+    *ncons_loc = (nlocat.empty() ? 1 : 0.5)*count;
+    *ssd       = (nlocat.empty() ? 1 : 0.5)*ssd2;
     *max       = ma;
     *imax      = im;
 }
@@ -2424,20 +2291,13 @@ bool constrain_lincs(bool computeRmsd,
                      t_nrnb *nrnb,
                      int maxwarn, int *warncount)
 {
-    gmx_bool  bCalcDHDL;
-    char      buf2[22], buf3[STRLEN];
-    int       i, p_imax;
-    real      ncons_loc, p_ssd, p_max = 0;
-    rvec      dx;
-    bool      bOK, bWarn;
-
-    bOK = TRUE;
+    bool bOK = TRUE;
 
     /* This boolean should be set by a flag passed to this routine.
      * We can also easily check if any constraint length is changed,
      * if not dH/dlambda=0 and we can also set the boolean to FALSE.
      */
-    bCalcDHDL = (ir.efep != efepNO && dvdlambda != nullptr);
+    bool bCalcDHDL = (ir.efep != efepNO && dvdlambda != nullptr);
 
     if (lincsd->nc == 0 && cr->dd == nullptr)
     {
@@ -2461,7 +2321,7 @@ bool constrain_lincs(bool computeRmsd,
                 set_lincs_matrix(lincsd, md.invmass, md.lambda);
             }
 
-            for (i = 0; i < lincsd->nc; i++)
+            for (int i = 0; i < lincsd->nc; i++)
             {
                 lincsd->bllen[i] = lincsd->bllen0[i] + lambda*lincsd->ddist[i];
             }
@@ -2472,32 +2332,37 @@ bool constrain_lincs(bool computeRmsd,
             /* Set the flexible constraint lengths to the old lengths */
             if (pbc != nullptr)
             {
-                for (i = 0; i < lincsd->nc; i++)
+                for (int i = 0; i < lincsd->nc; i++)
                 {
                     if (lincsd->bllen[i] == 0)
                     {
-                        pbc_dx_aiuc(pbc, x[lincsd->bla[2*i]], x[lincsd->bla[2*i+1]], dx);
+                        rvec dx;
+                        pbc_dx_aiuc(pbc, x[lincsd->atoms[i].index1], x[lincsd->atoms[i].index2], dx);
                         lincsd->bllen[i] = norm(dx);
                     }
                 }
             }
             else
             {
-                for (i = 0; i < lincsd->nc; i++)
+                for (int i = 0; i < lincsd->nc; i++)
                 {
                     if (lincsd->bllen[i] == 0)
                     {
                         lincsd->bllen[i] =
-                            std::sqrt(distance2(x[lincsd->bla[2*i]],
-                                                x[lincsd->bla[2*i+1]]));
+                            std::sqrt(distance2(x[lincsd->atoms[i].index1],
+                                                x[lincsd->atoms[i].index2]));
                     }
                 }
             }
         }
 
+        int  p_imax;
+        real ncons_loc;
+        real p_ssd;
+        real p_max = 0;
         if (debug)
         {
-            cconerr(lincsd, xprime, pbc,
+            cconerr(*lincsd, xprime, pbc,
                     &ncons_loc, &p_ssd, &p_max, &p_imax);
         }
 
@@ -2505,7 +2370,7 @@ bool constrain_lincs(bool computeRmsd,
          * at the same time. But as we only need to detect
          * if a warning occurred or not, this is not an issue.
          */
-        bWarn = FALSE;
+        bool bWarn = FALSE;
 
         /* The OpenMP parallel region of constrain_lincs for coords */
 #pragma omp parallel num_threads(lincsd->ntask)
@@ -2531,12 +2396,12 @@ bool constrain_lincs(bool computeRmsd,
             fprintf(debug, "   Rel. Constraint Deviation:  RMS         MAX     between atoms\n");
             fprintf(debug, "       Before LINCS          %.6f    %.6f %6d %6d\n",
                     std::sqrt(p_ssd/ncons_loc), p_max,
-                    ddglatnr(cr->dd, lincsd->bla[2*p_imax]),
-                    ddglatnr(cr->dd, lincsd->bla[2*p_imax+1]));
+                    ddglatnr(cr->dd, lincsd->atoms[p_imax].index1),
+                    ddglatnr(cr->dd, lincsd->atoms[p_imax].index2));
         }
         if (computeRmsd || debug)
         {
-            cconerr(lincsd, xprime, pbc,
+            cconerr(*lincsd, xprime, pbc,
                     &ncons_loc, &p_ssd, &p_max, &p_imax);
             lincsd->rmsdData[0] = ncons_loc;
             lincsd->rmsdData[1] = p_ssd;
@@ -2550,36 +2415,33 @@ bool constrain_lincs(bool computeRmsd,
             fprintf(debug,
                     "        After LINCS          %.6f    %.6f %6d %6d\n\n",
                     std::sqrt(p_ssd/ncons_loc), p_max,
-                    ddglatnr(cr->dd, lincsd->bla[2*p_imax]),
-                    ddglatnr(cr->dd, lincsd->bla[2*p_imax+1]));
+                    ddglatnr(cr->dd, lincsd->atoms[p_imax].index1),
+                    ddglatnr(cr->dd, lincsd->atoms[p_imax].index2));
         }
 
         if (bWarn)
         {
             if (maxwarn < INT_MAX)
             {
-                cconerr(lincsd, xprime, pbc,
+                cconerr(*lincsd, xprime, pbc,
                         &ncons_loc, &p_ssd, &p_max, &p_imax);
+                std::string simMesg;
                 if (isMultiSim(ms))
                 {
-                    sprintf(buf3, " in simulation %d", ms->sim);
-                }
-                else
-                {
-                    buf3[0] = 0;
+                    simMesg += gmx::formatString(" in simulation %d", ms->sim);
                 }
                 fprintf(stderr,
-                        "\nStep %s, time %g (ps)  LINCS WARNING%s\n"
+                        "\nStep %" PRId64 ", time %g (ps)  LINCS WARNING%s\n"
                         "relative constraint deviation after LINCS:\n"
                         "rms %.6f, max %.6f (between atoms %d and %d)\n",
-                        gmx_step_str(step, buf2), ir.init_t+step*ir.delta_t,
-                        buf3,
+                        step, ir.init_t+step*ir.delta_t,
+                        simMesg.c_str(),
                         std::sqrt(p_ssd/ncons_loc), p_max,
-                        ddglatnr(cr->dd, lincsd->bla[2*p_imax]),
-                        ddglatnr(cr->dd, lincsd->bla[2*p_imax+1]));
+                        ddglatnr(cr->dd, lincsd->atoms[p_imax].index1),
+                        ddglatnr(cr->dd, lincsd->atoms[p_imax].index2));
 
                 lincs_warning(cr->dd, x, xprime, pbc,
-                              lincsd->nc, lincsd->bla, lincsd->bllen,
+                              lincsd->nc, lincsd->atoms, lincsd->bllen,
                               ir.LincsWarnAngle, maxwarn, warncount);
             }
             bOK = (p_max < 0.5);
@@ -2587,7 +2449,7 @@ bool constrain_lincs(bool computeRmsd,
 
         if (lincsd->ncg_flex)
         {
-            for (i = 0; (i < lincsd->nc); i++)
+            for (int i = 0; (i < lincsd->nc); i++)
             {
                 if (lincsd->bllen0[i] == 0 && lincsd->ddist[i] == 0)
                 {
@@ -2635,7 +2497,7 @@ bool constrain_lincs(bool computeRmsd,
 
     if (bCalcVir && lincsd->ntask > 1)
     {
-        for (i = 1; i < lincsd->ntask; i++)
+        for (int i = 1; i < lincsd->ntask; i++)
         {
             m_add(vir_r_m_dr, lincsd->task[i].vir_r_m_dr, vir_r_m_dr);
         }
index 2069668f825ad96a769946eb973f127b6ca77281..f87fe607c78bb4a3e948d70e9fd10fdcae56a969 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
index b45012de168ee48eb9d001805d8ad4e06ca90389..eb6c45d615ceeef5f7d98b885a33a65458b6a4fe 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
index 10a6359521792c896ad79016d812f400cd7777e6..6c015cc6eaae22cf7e20491c93e50f6be6339ee3 100644 (file)
@@ -129,7 +129,7 @@ makeMDAtoms(FILE *fp, const gmx_mtop_t &mtop, const t_inputrec &ir,
     md->bVCMgrps = FALSE;
     for (int i = 0; i < mtop.natoms; i++)
     {
-        if (getGroupType(&mtop.groups, egcVCM, i) > 0)
+        if (getGroupType(mtop.groups, egcVCM, i) > 0)
         {
             md->bVCMgrps = TRUE;
         }
@@ -207,16 +207,15 @@ void atoms2md(const gmx_mtop_t *mtop, const t_inputrec *ir,
 {
     gmx_bool              bLJPME;
     const t_grpopts      *opts;
-    const gmx_groups_t   *groups;
     int                   nthreads gmx_unused;
 
     bLJPME = EVDW_PME(ir->vdwtype);
 
     opts = &ir->opts;
 
-    groups = &mtop->groups;
+    const gmx_groups_t &groups = mtop->groups;
 
-    auto md = mdAtoms->mdatoms();
+    auto                md = mdAtoms->mdatoms();
     /* nindex>=0 indicates DD where we use an index */
     if (nindex >= 0)
     {
@@ -369,7 +368,7 @@ void atoms2md(const gmx_mtop_t *mtop, const t_inputrec *ir,
                 else
                 {
                     /* The friction coefficient is mass/tau_t */
-                    fac = ir->delta_t/opts->tau_t[md->cTC ? groups->grpnr[egcTC][ag] : 0];
+                    fac = ir->delta_t/opts->tau_t[md->cTC ? groups.grpnr[egcTC][ag] : 0];
                     mA  = 0.5*atom.m*fac;
                     mB  = 0.5*atom.mB*fac;
                 }
@@ -466,16 +465,16 @@ void atoms2md(const gmx_mtop_t *mtop, const t_inputrec *ir,
             md->ptype[i]    = atom.ptype;
             if (md->cTC)
             {
-                md->cTC[i]    = groups->grpnr[egcTC][ag];
+                md->cTC[i]    = groups.grpnr[egcTC][ag];
             }
             md->cENER[i]    = getGroupType(groups, egcENER, ag);
             if (md->cACC)
             {
-                md->cACC[i]   = groups->grpnr[egcACC][ag];
+                md->cACC[i]   = groups.grpnr[egcACC][ag];
             }
             if (md->cVCM)
             {
-                md->cVCM[i]       = groups->grpnr[egcVCM][ag];
+                md->cVCM[i]       = groups.grpnr[egcVCM][ag];
             }
             if (md->cORF)
             {
@@ -484,17 +483,17 @@ void atoms2md(const gmx_mtop_t *mtop, const t_inputrec *ir,
 
             if (md->cU1)
             {
-                md->cU1[i]        = groups->grpnr[egcUser1][ag];
+                md->cU1[i]        = groups.grpnr[egcUser1][ag];
             }
             if (md->cU2)
             {
-                md->cU2[i]        = groups->grpnr[egcUser2][ag];
+                md->cU2[i]        = groups.grpnr[egcUser2][ag];
             }
 
             if (ir->bQMMM)
             {
-                if (groups->grpnr[egcQMMM] == nullptr ||
-                    groups->grpnr[egcQMMM][ag] < groups->grps[egcQMMM].nr-1)
+                if (groups.grpnr[egcQMMM] == nullptr ||
+                    groups.grpnr[egcQMMM][ag] < groups.grps[egcQMMM].nr-1)
                 {
                     md->bQM[i]      = TRUE;
                 }
index 76a5d072f82dc4a5e786aea75247507fb2c6f0fb..c5e431304163ca5222b75ed267725adb6534f82d 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2010,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2014,2015,2016,2017,2018,2019, 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.
@@ -67,9 +67,9 @@ namespace gmx
 class MDAtoms
 {
     //! C-style mdatoms struct.
-    unique_cptr<t_mdatoms> mdatoms_;
+    unique_cptr<t_mdatoms>      mdatoms_;
     //! Memory for chargeA that can be set up for efficient GPU transfer.
-    HostVector<real>       chargeA_;
+    gmx::PaddedHostVector<real> chargeA_;
     public:
         // TODO make this private
         MDAtoms();
index cc3b26b5e0e367d52e8d352509a0990e1fec00b4..3ff4978346434052a89ea11589679d2eedc1daf2 100644 (file)
@@ -621,6 +621,7 @@ void done_mdebin(t_mdebin *mdebin)
     done_mde_delta_h_coll(mdebin->dhc);
     sfree(mdebin->dE);
     sfree(mdebin->temperatures);
+    sfree(mdebin->ebin);
     sfree(mdebin);
 }
 
index 2e4286624a8bc9fb98928c5b9be4919d63bc3499..e706c35ae9fa03505f6228266a012f88e53a1f86 100644 (file)
@@ -209,7 +209,7 @@ gmx_mdoutf_t init_mdoutf(FILE *fplog, int nfile, const t_filenm fnm[],
         of->natoms_x_compressed = 0;
         for (i = 0; (i < top_global->natoms); i++)
         {
-            if (getGroupType(of->groups, egcCompressedX, i) == 0)
+            if (getGroupType(*of->groups, egcCompressedX, i) == 0)
             {
                 of->natoms_x_compressed++;
             }
@@ -361,7 +361,7 @@ void mdoutf_write_to_trajectory_files(FILE *fplog, const t_commrec *cr,
                 auto x = makeArrayRef(state_global->x);
                 for (i = 0, j = 0; (i < of->natoms_global); i++)
                 {
-                    if (getGroupType(of->groups, egcCompressedX, i) == 0)
+                    if (getGroupType(*of->groups, egcCompressedX, i) == 0)
                     {
                         copy_rvec(x[i], xxtc[j++]);
                     }
@@ -446,7 +446,7 @@ void done_mdoutf(gmx_mdoutf_t of)
 {
     if (of->fp_ene != nullptr)
     {
-        close_enx(of->fp_ene);
+        done_ener_file(of->fp_ene);
     }
     if (of->fp_xtc)
     {
index 3f9e5a2246ed6cd13214caf8a4e12b2faed67284..62558c8552c112e101a3a318939c062a2d00212d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2018,2019, 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.
  * The final solution should be an MD algorithm base class with methods
  * for initialization and atom-data setup.
  */
-
-void mdAlgorithmsSetupAtomData(const t_commrec   *cr,
-                               const t_inputrec  *ir,
-                               const gmx_mtop_t  *top_global,
-                               gmx_localtop_t    *top,
-                               t_forcerec        *fr,
-                               t_graph          **graph,
-                               gmx::MDAtoms      *mdAtoms,
-                               gmx::Constraints  *constr,
-                               gmx_vsite_t       *vsite,
-                               gmx_shellfc_t     *shellfc)
+void mdAlgorithmsSetupAtomData(const t_commrec  *cr,
+                               const t_inputrec *ir,
+                               const gmx_mtop_t &top_global,
+                               gmx_localtop_t   *top,
+                               t_forcerec       *fr,
+                               t_graph         **graph,
+                               gmx::MDAtoms     *mdAtoms,
+                               gmx::Constraints *constr,
+                               gmx_vsite_t      *vsite,
+                               gmx_shellfc_t    *shellfc)
 {
     bool  usingDomDec = DOMAINDECOMP(cr);
 
@@ -86,9 +85,9 @@ void mdAlgorithmsSetupAtomData(const t_commrec   *cr,
     {
         numAtomIndex = -1;
         atomIndex    = nullptr;
-        numHomeAtoms = top_global->natoms;
+        numHomeAtoms = top_global.natoms;
     }
-    atoms2md(top_global, ir, numAtomIndex, atomIndex, numHomeAtoms, mdAtoms);
+    atoms2md(&top_global, ir, numAtomIndex, atomIndex, numHomeAtoms, mdAtoms);
 
     auto mdatoms = mdAtoms->mdatoms();
     if (usingDomDec)
@@ -97,14 +96,7 @@ void mdAlgorithmsSetupAtomData(const t_commrec   *cr,
     }
     else
     {
-        /* Currently gmx_generate_local_top allocates and returns a pointer.
-         * We should implement a more elegant solution.
-         */
-        gmx_localtop_t *tmpTop;
-
-        tmpTop = gmx_mtop_generate_local_top(top_global, ir->efep != efepNO);
-        *top   = *tmpTop;
-        sfree(tmpTop);
+        gmx_mtop_generate_local_top(top_global, top, ir->efep != efepNO);
     }
 
     if (vsite)
@@ -127,7 +119,7 @@ void mdAlgorithmsSetupAtomData(const t_commrec   *cr,
     {
         GMX_ASSERT(graph != nullptr, "We use a graph with PBC (no periodic mols) and without DD");
 
-        *graph = mk_graph(nullptr, &(top->idef), 0, top_global->natoms, FALSE, FALSE);
+        *graph = mk_graph(nullptr, &(top->idef), 0, top_global.natoms, FALSE, FALSE);
     }
     else if (graph != nullptr)
     {
index 84f3e5ab1fe08ff4b66ffe820cc706534ee47324..195905169156caa8f7ba249973146aadca593205 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2018,2019, 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.
@@ -69,15 +69,15 @@ class MDAtoms;
  * \param[in,out] vsite      The virtual site data, can be NULL
  * \param[in,out] shellfc    The shell/flexible-constraint data, can be NULL
  */
-void mdAlgorithmsSetupAtomData(const t_commrec   *cr,
-                               const t_inputrec  *ir,
-                               const gmx_mtop_t  *top_global,
-                               gmx_localtop_t    *top,
-                               t_forcerec        *fr,
-                               t_graph          **graph,
-                               gmx::MDAtoms      *mdAtoms,
-                               gmx::Constraints  *constr,
-                               gmx_vsite_t       *vsite,
-                               gmx_shellfc_t     *shellfc);
+void mdAlgorithmsSetupAtomData(const t_commrec                 *cr,
+                               const t_inputrec                *ir,
+                               const gmx_mtop_t                &top_global,
+                               gmx_localtop_t                  *top,
+                               t_forcerec                      *fr,
+                               t_graph                        **graph,
+                               gmx::MDAtoms                    *mdAtoms,
+                               gmx::Constraints                *constr,
+                               gmx_vsite_t                     *vsite,
+                               gmx_shellfc_t                   *shellfc);
 
 #endif
index 08eab170922cae82a95e5e398e27708dfdf48fa3..9238c07b234ad2a5ac294d52d5fbdcbc5df530db 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, 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.
 
 using namespace gmx; // TODO: Remove when this file is moved into gmx namespace
 
-/* Default nbnxn allocation routine, allocates NBNXN_MEM_ALIGN byte aligned */
-void nbnxn_alloc_aligned(void **ptr, size_t nbytes)
-{
-    *ptr = save_malloc_aligned("ptr", __FILE__, __LINE__, nbytes, 1, NBNXN_MEM_ALIGN);
-}
-
-/* Free function for memory allocated with nbnxn_alloc_aligned */
-void nbnxn_free_aligned(void *ptr)
-{
-    sfree_aligned(ptr);
-}
 
-/* Reallocation wrapper function for nbnxn data structures */
-void nbnxn_realloc_void(void **ptr,
-                        int nbytes_copy, int nbytes_new,
-                        nbnxn_alloc_t *ma,
-                        nbnxn_free_t  *mf)
+void nbnxn_atomdata_t::resizeCoordinateBuffer(int numAtoms)
 {
-    void *ptr_new;
-
-    ma(&ptr_new, nbytes_new);
+    numAtoms_ = numAtoms;
 
-    if (nbytes_new > 0 && ptr_new == nullptr)
-    {
-        gmx_fatal(FARGS, "Allocation of %d bytes failed", nbytes_new);
-    }
-
-    if (nbytes_copy > 0)
-    {
-        if (nbytes_new < nbytes_copy)
-        {
-            gmx_incons("In nbnxn_realloc_void: new size less than copy size");
-        }
-        memcpy(ptr_new, *ptr, nbytes_copy);
-    }
-    if (*ptr != nullptr)
-    {
-        mf(*ptr);
-    }
-    *ptr = ptr_new;
+    x_.resize(numAtoms*xstride);
 }
 
-/* Reallocate the nbnxn_atomdata_t for a size of n atoms */
-void nbnxn_atomdata_realloc(nbnxn_atomdata_t *nbat, int n)
+void nbnxn_atomdata_t::resizeForceBuffers()
 {
-    GMX_ASSERT(nbat->nalloc >= nbat->natoms, "We should have at least as many elelements allocated as there are set");
-
-    int t;
-
-    nbnxn_realloc_void(reinterpret_cast<void **>(&nbat->type),
-                       nbat->natoms*sizeof(*nbat->type),
-                       n*sizeof(*nbat->type),
-                       nbat->alloc, nbat->free);
-    nbnxn_realloc_void(reinterpret_cast<void **>(&nbat->lj_comb),
-                       nbat->natoms*2*sizeof(*nbat->lj_comb),
-                       n*2*sizeof(*nbat->lj_comb),
-                       nbat->alloc, nbat->free);
-    if (nbat->XFormat != nbatXYZQ)
-    {
-        nbnxn_realloc_void(reinterpret_cast<void **>(&nbat->q),
-                           nbat->natoms*sizeof(*nbat->q),
-                           n*sizeof(*nbat->q),
-                           nbat->alloc, nbat->free);
-    }
-    if (nbat->nenergrp > 1)
-    {
-        nbnxn_realloc_void(reinterpret_cast<void **>(&nbat->energrp),
-                           nbat->natoms/nbat->na_c*sizeof(*nbat->energrp),
-                           n/nbat->na_c*sizeof(*nbat->energrp),
-                           nbat->alloc, nbat->free);
-    }
-    nbnxn_realloc_void(reinterpret_cast<void **>(&nbat->x),
-                       nbat->natoms*nbat->xstride*sizeof(*nbat->x),
-                       n*nbat->xstride*sizeof(*nbat->x),
-                       nbat->alloc, nbat->free);
-    for (t = 0; t < nbat->nout; t++)
+    /* Force buffers need padding up to a multiple of the buffer flag size */
+    const int paddedSize = (numAtoms() + NBNXN_BUFFERFLAG_SIZE - 1)/NBNXN_BUFFERFLAG_SIZE*NBNXN_BUFFERFLAG_SIZE;
+
+    /* Should we let each thread allocate it's own data instead? */
+    for (nbnxn_atomdata_output_t &outBuffer : out)
     {
-        /* Allocate one element extra for possible signaling with GPUs */
-        nbnxn_realloc_void(reinterpret_cast<void **>(&nbat->out[t].f),
-                           nbat->natoms*nbat->fstride*sizeof(*nbat->out[t].f),
-                           n*nbat->fstride*sizeof(*nbat->out[t].f),
-                           nbat->alloc, nbat->free);
+        outBuffer.f.resize(paddedSize*fstride);
     }
-    nbat->nalloc = n;
 }
 
 /* Initializes an nbnxn_atomdata_output_t data structure */
-static void nbnxn_atomdata_output_init(nbnxn_atomdata_output_t *out,
-                                       int nb_kernel_type,
-                                       int nenergrp, int stride,
-                                       nbnxn_alloc_t *ma)
+nbnxn_atomdata_output_t::nbnxn_atomdata_output_t(int                nb_kernel_type,
+                                                 int                numEnergyGroups,
+                                                 int                simdEnergyBufferStride,
+                                                 gmx::PinningPolicy pinningPolicy) :
+    f({}, {pinningPolicy}),
+    fshift({}, {pinningPolicy}),
+    Vvdw({}, {pinningPolicy}),
+    Vc({}, {pinningPolicy})
 {
-    out->f = nullptr;
-    ma(reinterpret_cast<void **>(&out->fshift), SHIFTS*DIM*sizeof(*out->fshift));
-    out->nV = nenergrp*nenergrp;
-    ma(reinterpret_cast<void **>(&out->Vvdw), out->nV*sizeof(*out->Vvdw));
-    ma(reinterpret_cast<void **>(&out->Vc), out->nV*sizeof(*out->Vc  ));
+    fshift.resize(SHIFTS*DIM);
+    Vvdw.resize(numEnergyGroups*numEnergyGroups);
+    Vc.resize(numEnergyGroups*numEnergyGroups);
 
     if (nb_kernel_type == nbnxnk4xN_SIMD_4xN ||
         nb_kernel_type == nbnxnk4xN_SIMD_2xNN)
     {
-        int cj_size  = nbnxn_kernel_to_cluster_j_size(nb_kernel_type);
-        out->nVS = nenergrp*nenergrp*stride*(cj_size>>1)*cj_size;
-        ma(reinterpret_cast<void **>(&out->VSvdw), out->nVS*sizeof(*out->VSvdw));
-        ma(reinterpret_cast<void **>(&out->VSc), out->nVS*sizeof(*out->VSc  ));
-    }
-    else
-    {
-        out->nVS = 0;
+        int cj_size     = nbnxn_kernel_to_cluster_j_size(nb_kernel_type);
+        int numElements = numEnergyGroups*numEnergyGroups*simdEnergyBufferStride*(cj_size/2)*cj_size;
+        VSvdw.resize(numElements);
+        VSc.resize(numElements);
     }
 }
 
@@ -321,11 +253,9 @@ void copy_rvec_to_nbat_real(const int *a, int na, int na_round,
 }
 
 /* Stores the LJ parameter data in a format convenient for different kernels */
-static void set_lj_parameter_data(nbnxn_atomdata_t *nbat, gmx_bool bSIMD)
+static void set_lj_parameter_data(nbnxn_atomdata_t::Params *params, gmx_bool bSIMD)
 {
-    real c6, c12;
-
-    int  nt = nbat->ntype;
+    int  nt = params->numTypes;
 
     if (bSIMD)
     {
@@ -337,16 +267,16 @@ static void set_lj_parameter_data(nbnxn_atomdata_t *nbat, gmx_bool bSIMD)
          * when it might not be used, but introducing the conditional code is not
          * really worth it.
          */
-        nbat->alloc(reinterpret_cast<void **>(&nbat->nbfp_aligned),
-                    nt*nt*c_simdBestPairAlignment*sizeof(*nbat->nbfp_aligned));
+        params->nbfp_aligned.resize(nt*nt*c_simdBestPairAlignment);
+
         for (int i = 0; i < nt; i++)
         {
             for (int j = 0; j < nt; j++)
             {
-                nbat->nbfp_aligned[(i*nt+j)*c_simdBestPairAlignment+0] = nbat->nbfp[(i*nt+j)*2+0];
-                nbat->nbfp_aligned[(i*nt+j)*c_simdBestPairAlignment+1] = nbat->nbfp[(i*nt+j)*2+1];
-                nbat->nbfp_aligned[(i*nt+j)*c_simdBestPairAlignment+2] = 0;
-                nbat->nbfp_aligned[(i*nt+j)*c_simdBestPairAlignment+3] = 0;
+                params->nbfp_aligned[(i*nt+j)*c_simdBestPairAlignment+0] = params->nbfp[(i*nt+j)*2+0];
+                params->nbfp_aligned[(i*nt+j)*c_simdBestPairAlignment+1] = params->nbfp[(i*nt+j)*2+1];
+                params->nbfp_aligned[(i*nt+j)*c_simdBestPairAlignment+2] = 0;
+                params->nbfp_aligned[(i*nt+j)*c_simdBestPairAlignment+3] = 0;
             }
         }
 #endif
@@ -356,36 +286,37 @@ static void set_lj_parameter_data(nbnxn_atomdata_t *nbat, gmx_bool bSIMD)
      * and with LJ-PME kernels. We then only need parameters per atom type,
      * not per pair of atom types.
      */
-    switch (nbat->comb_rule)
+    params->nbfp_comb.resize(nt*2);
+    switch (params->comb_rule)
     {
         case ljcrGEOM:
-            nbat->comb_rule = ljcrGEOM;
+            params->comb_rule = ljcrGEOM;
 
             for (int i = 0; i < nt; i++)
             {
                 /* Store the sqrt of the diagonal from the nbfp matrix */
-                nbat->nbfp_comb[i*2  ] = std::sqrt(nbat->nbfp[(i*nt+i)*2  ]);
-                nbat->nbfp_comb[i*2+1] = std::sqrt(nbat->nbfp[(i*nt+i)*2+1]);
+                params->nbfp_comb[i*2  ] = std::sqrt(params->nbfp[(i*nt+i)*2  ]);
+                params->nbfp_comb[i*2+1] = std::sqrt(params->nbfp[(i*nt+i)*2+1]);
             }
             break;
         case ljcrLB:
             for (int i = 0; i < nt; i++)
             {
                 /* Get 6*C6 and 12*C12 from the diagonal of the nbfp matrix */
-                c6  = nbat->nbfp[(i*nt+i)*2  ];
-                c12 = nbat->nbfp[(i*nt+i)*2+1];
+                const real c6  = params->nbfp[(i*nt+i)*2  ];
+                const real c12 = params->nbfp[(i*nt+i)*2+1];
                 if (c6 > 0 && c12 > 0)
                 {
                     /* We store 0.5*2^1/6*sigma and sqrt(4*3*eps),
                      * so we get 6*C6 and 12*C12 after combining.
                      */
-                    nbat->nbfp_comb[i*2  ] = 0.5*gmx::sixthroot(c12/c6);
-                    nbat->nbfp_comb[i*2+1] = std::sqrt(c6*c6/c12);
+                    params->nbfp_comb[i*2  ] = 0.5*gmx::sixthroot(c12/c6);
+                    params->nbfp_comb[i*2+1] = std::sqrt(c6*c6/c12);
                 }
                 else
                 {
-                    nbat->nbfp_comb[i*2  ] = 0;
-                    nbat->nbfp_comb[i*2+1] = 0;
+                    params->nbfp_comb[i*2  ] = 0;
+                    params->nbfp_comb[i*2+1] = 0;
                 }
             }
             break;
@@ -397,34 +328,30 @@ static void set_lj_parameter_data(nbnxn_atomdata_t *nbat, gmx_bool bSIMD)
     }
 }
 
-#if GMX_SIMD
-static void
-nbnxn_atomdata_init_simple_exclusion_masks(nbnxn_atomdata_t *nbat)
+nbnxn_atomdata_t::SimdMasks::SimdMasks()
 {
-    const int simd_width = GMX_SIMD_REAL_WIDTH;
-    int       simd_excl_size;
+#if GMX_SIMD
+    constexpr int simd_width = GMX_SIMD_REAL_WIDTH;
     /* Set the diagonal cluster pair exclusion mask setup data.
      * In the kernel we check 0 < j - i to generate the masks.
      * Here we store j - i for generating the mask for the first i,
      * we substract 0.5 to avoid rounding issues.
      * In the kernel we can subtract 1 to generate the subsequent mask.
      */
-    int        simd_4xn_diag_size;
-
-    simd_4xn_diag_size = std::max(NBNXN_CPU_CLUSTER_I_SIZE, simd_width);
-    snew_aligned(nbat->simd_4xn_diagonal_j_minus_i, simd_4xn_diag_size, NBNXN_MEM_ALIGN);
+    const int simd_4xn_diag_size = std::max(c_nbnxnCpuIClusterSize, simd_width);
+    diagonal_4xn_j_minus_i.resize(simd_4xn_diag_size);
     for (int j = 0; j < simd_4xn_diag_size; j++)
     {
-        nbat->simd_4xn_diagonal_j_minus_i[j] = j - 0.5;
+        diagonal_4xn_j_minus_i[j] = j - 0.5;
     }
 
-    snew_aligned(nbat->simd_2xnn_diagonal_j_minus_i, simd_width, NBNXN_MEM_ALIGN);
+    diagonal_2xnn_j_minus_i.resize(simd_width);
     for (int j = 0; j < simd_width/2; j++)
     {
         /* The j-cluster size is half the SIMD width */
-        nbat->simd_2xnn_diagonal_j_minus_i[j]              = j - 0.5;
+        diagonal_2xnn_j_minus_i[j]                = j - 0.5;
         /* The next half of the SIMD width is for i + 1 */
-        nbat->simd_2xnn_diagonal_j_minus_i[simd_width/2+j] = j - 1 - 0.5;
+        diagonal_2xnn_j_minus_i[simd_width/2 + j] = j - 1 - 0.5;
     }
 
     /* We use up to 32 bits for exclusion masking.
@@ -434,97 +361,99 @@ nbnxn_atomdata_init_simple_exclusion_masks(nbnxn_atomdata_t *nbat)
      * In single precision this means the real and integer SIMD registers
      * are of equal size.
      */
-    simd_excl_size = NBNXN_CPU_CLUSTER_I_SIZE*simd_width;
+    const int simd_excl_size = c_nbnxnCpuIClusterSize*simd_width;
 #if GMX_DOUBLE && !GMX_SIMD_HAVE_INT32_LOGICAL
-    snew_aligned(nbat->simd_exclusion_filter64, simd_excl_size,   NBNXN_MEM_ALIGN);
+    exclusion_filter64.resize(simd_excl_size);
 #else
-    snew_aligned(nbat->simd_exclusion_filter, simd_excl_size,   NBNXN_MEM_ALIGN);
+    exclusion_filter.resize(simd_excl_size);
 #endif
 
     for (int j = 0; j < simd_excl_size; j++)
     {
         /* Set the consecutive bits for masking pair exclusions */
 #if GMX_DOUBLE && !GMX_SIMD_HAVE_INT32_LOGICAL
-        nbat->simd_exclusion_filter64[j]     = (1U << j);
+        exclusion_filter64[j] = (1U << j);
 #else
-        nbat->simd_exclusion_filter[j]       = (1U << j);
+        exclusion_filter[j]   = (1U << j);
 #endif
     }
 
-#if !GMX_SIMD_HAVE_LOGICAL && !GMX_SIMD_HAVE_INT32_LOGICAL
-    // If the SIMD implementation has no bitwise logical operation support
-    // whatsoever we cannot use the normal masking. Instead,
-    // we generate a vector of all 2^4 possible ways an i atom
-    // interacts with its 4 j atoms. Each array entry contains
-    // GMX_SIMD_REAL_WIDTH values that are read with a single aligned SIMD load.
-    // Since there is no logical value representation in this case, we use
-    // any nonzero value to indicate 'true', while zero mean 'false'.
-    // This can then be converted to a SIMD boolean internally in the SIMD
-    // module by comparing to zero.
-    // Each array entry encodes how this i atom will interact with the 4 j atoms.
-    // Matching code exists in set_ci_top_excls() to generate indices into this array.
-    // Those indices are used in the kernels.
-
-    simd_excl_size = NBNXN_CPU_CLUSTER_I_SIZE*NBNXN_CPU_CLUSTER_I_SIZE;
-    const real simdFalse =  0.0;
-    const real simdTrue  =  1.0;
-    real      *simd_interaction_array;
-
-    snew_aligned(simd_interaction_array, simd_excl_size * GMX_SIMD_REAL_WIDTH, NBNXN_MEM_ALIGN);
-    for (int j = 0; j < simd_excl_size; j++)
+    if (!GMX_SIMD_HAVE_LOGICAL && !GMX_SIMD_HAVE_INT32_LOGICAL)
     {
-        int index = j * GMX_SIMD_REAL_WIDTH;
-        for (int i = 0; i < GMX_SIMD_REAL_WIDTH; i++)
+        // If the SIMD implementation has no bitwise logical operation support
+        // whatsoever we cannot use the normal masking. Instead,
+        // we generate a vector of all 2^4 possible ways an i atom
+        // interacts with its 4 j atoms. Each array entry contains
+        // GMX_SIMD_REAL_WIDTH values that are read with a single aligned SIMD load.
+        // Since there is no logical value representation in this case, we use
+        // any nonzero value to indicate 'true', while zero mean 'false'.
+        // This can then be converted to a SIMD boolean internally in the SIMD
+        // module by comparing to zero.
+        // Each array entry encodes how this i atom will interact with the 4 j atoms.
+        // Matching code exists in set_ci_top_excls() to generate indices into this array.
+        // Those indices are used in the kernels.
+
+        const int  simd_excl_size = c_nbnxnCpuIClusterSize*c_nbnxnCpuIClusterSize;
+        const real simdFalse      = 0.0;
+        const real simdTrue       = 1.0;
+
+        interaction_array.resize(simd_excl_size * GMX_SIMD_REAL_WIDTH);
+        for (int j = 0; j < simd_excl_size; j++)
         {
-            simd_interaction_array[index + i] = (j & (1 << i)) ? simdTrue : simdFalse;
+            const int index = j * GMX_SIMD_REAL_WIDTH;
+            for (int i = 0; i < GMX_SIMD_REAL_WIDTH; i++)
+            {
+                interaction_array[index + i] = (j & (1 << i)) ? simdTrue : simdFalse;
+            }
         }
     }
-    nbat->simd_interaction_array = simd_interaction_array;
 #endif
 }
-#endif
 
-/* Initializes an nbnxn_atomdata_t data structure */
-void nbnxn_atomdata_init(const gmx::MDLogger &mdlog,
-                         nbnxn_atomdata_t *nbat,
-                         int nb_kernel_type,
-                         int enbnxninitcombrule,
-                         int ntype, const real *nbfp,
-                         int n_energygroups,
-                         int nout,
-                         nbnxn_alloc_t *alloc,
-                         nbnxn_free_t  *free)
+nbnxn_atomdata_t::Params::Params(gmx::PinningPolicy pinningPolicy) :
+    numTypes(0),
+    nbfp({}, {pinningPolicy}),
+    nbfp_comb({}, {pinningPolicy}),
+    type({}, {pinningPolicy}),
+    lj_comb({}, {pinningPolicy}),
+    q({}, {pinningPolicy}),
+    nenergrp(0),
+    neg_2log(0),
+    energrp({}, {pinningPolicy})
+{
+}
+
+nbnxn_atomdata_t::nbnxn_atomdata_t(gmx::PinningPolicy pinningPolicy) :
+    params_(pinningPolicy),
+    numAtoms_(0),
+    natoms_local(0),
+    shift_vec({}, {pinningPolicy}),
+    x_({}, {pinningPolicy}),
+    simdMasks(),
+    bUseBufferFlags(FALSE),
+    bUseTreeReduce(FALSE)
+{
+}
+
+/* Initializes an nbnxn_atomdata_t::Params data structure */
+static void nbnxn_atomdata_params_init(const gmx::MDLogger &mdlog,
+                                       nbnxn_atomdata_t::Params *params,
+                                       int nb_kernel_type,
+                                       int enbnxninitcombrule,
+                                       int ntype, const real *nbfp,
+                                       int n_energygroups)
 {
-    int      nth;
     real     c6, c12, tol;
     char    *ptr;
     gmx_bool simple, bCombGeom, bCombLB, bSIMD;
 
-    if (alloc == nullptr)
-    {
-        nbat->alloc = nbnxn_alloc_aligned;
-    }
-    else
-    {
-        nbat->alloc = alloc;
-    }
-    if (free == nullptr)
-    {
-        nbat->free = nbnxn_free_aligned;
-    }
-    else
-    {
-        nbat->free = free;
-    }
-
     if (debug)
     {
         fprintf(debug, "There are %d atom types in the system, adding one for nbnxn_atomdata_t\n", ntype);
     }
-    nbat->ntype = ntype + 1;
-    nbat->alloc(reinterpret_cast<void **>(&nbat->nbfp),
-                nbat->ntype*nbat->ntype*2*sizeof(*nbat->nbfp));
-    nbat->alloc(reinterpret_cast<void **>(&nbat->nbfp_comb), nbat->ntype*2*sizeof(*nbat->nbfp_comb));
+    params->numTypes = ntype + 1;
+    params->nbfp.resize(params->numTypes*params->numTypes*2);
+    params->nbfp_comb.resize(params->numTypes*2);
 
     /* A tolerance of 1e-5 seems reasonable for (possibly hand-typed)
      * force-field floating point parameters.
@@ -541,22 +470,22 @@ void nbnxn_atomdata_init(const gmx::MDLogger &mdlog,
     bCombGeom = TRUE;
     bCombLB   = TRUE;
 
-    /* Temporarily fill nbat->nbfp_comb with sigma and epsilon
+    /* Temporarily fill params->nbfp_comb with sigma and epsilon
      * to check for the LB rule.
      */
     for (int i = 0; i < ntype; i++)
     {
-        c6  = nbfp[(i*ntype+i)*2  ]/6.0;
-        c12 = nbfp[(i*ntype+i)*2+1]/12.0;
+        c6  = nbfp[(i*ntype+i)*2    ]/6.0;
+        c12 = nbfp[(i*ntype+i)*2 + 1]/12.0;
         if (c6 > 0 && c12 > 0)
         {
-            nbat->nbfp_comb[i*2  ] = gmx::sixthroot(c12/c6);
-            nbat->nbfp_comb[i*2+1] = 0.25*c6*c6/c12;
+            params->nbfp_comb[i*2    ] = gmx::sixthroot(c12/c6);
+            params->nbfp_comb[i*2 + 1] = 0.25*c6*c6/c12;
         }
         else if (c6 == 0 && c12 == 0)
         {
-            nbat->nbfp_comb[i*2  ] = 0;
-            nbat->nbfp_comb[i*2+1] = 0;
+            params->nbfp_comb[i*2    ] = 0;
+            params->nbfp_comb[i*2 + 1] = 0;
         }
         else
         {
@@ -565,41 +494,41 @@ void nbnxn_atomdata_init(const gmx::MDLogger &mdlog,
         }
     }
 
-    for (int i = 0; i < nbat->ntype; i++)
+    for (int i = 0; i < params->numTypes; i++)
     {
-        for (int j = 0; j < nbat->ntype; j++)
+        for (int j = 0; j < params->numTypes; j++)
         {
             if (i < ntype && j < ntype)
             {
                 /* fr->nbfp has been updated, so that array too now stores c6/c12 including
                  * the 6.0/12.0 prefactors to save 2 flops in the most common case (force-only).
                  */
-                c6  = nbfp[(i*ntype+j)*2  ];
-                c12 = nbfp[(i*ntype+j)*2+1];
-                nbat->nbfp[(i*nbat->ntype+j)*2  ] = c6;
-                nbat->nbfp[(i*nbat->ntype+j)*2+1] = c12;
+                c6  = nbfp[(i*ntype+j)*2    ];
+                c12 = nbfp[(i*ntype+j)*2 + 1];
+                params->nbfp[(i*params->numTypes+j)*2    ] = c6;
+                params->nbfp[(i*params->numTypes+j)*2 + 1] = c12;
 
                 /* Compare 6*C6 and 12*C12 for geometric cobination rule */
                 bCombGeom = bCombGeom &&
                     gmx_within_tol(c6*c6, nbfp[(i*ntype+i)*2  ]*nbfp[(j*ntype+j)*2  ], tol) &&
-                    gmx_within_tol(c12*c12, nbfp[(i*ntype+i)*2+1]*nbfp[(j*ntype+j)*2+1], tol);
+                    gmx_within_tol(c12*c12, nbfp[(i*ntype+i)*2 + 1]*nbfp[(j*ntype+j)*2 + 1], tol);
 
                 /* Compare C6 and C12 for Lorentz-Berthelot combination rule */
                 c6     /= 6.0;
                 c12    /= 12.0;
                 bCombLB = bCombLB &&
                     ((c6 == 0 && c12 == 0 &&
-                      (nbat->nbfp_comb[i*2+1] == 0 || nbat->nbfp_comb[j*2+1] == 0)) ||
+                      (params->nbfp_comb[i*2 + 1] == 0 || params->nbfp_comb[j*2 + 1] == 0)) ||
                      (c6 > 0 && c12 > 0 &&
                       gmx_within_tol(gmx::sixthroot(c12/c6),
-                                     0.5*(nbat->nbfp_comb[i*2]+nbat->nbfp_comb[j*2]), tol) &&
-                      gmx_within_tol(0.25*c6*c6/c12, std::sqrt(nbat->nbfp_comb[i*2+1]*nbat->nbfp_comb[j*2+1]), tol)));
+                                     0.5*(params->nbfp_comb[i*2]+params->nbfp_comb[j*2]), tol) &&
+                      gmx_within_tol(0.25*c6*c6/c12, std::sqrt(params->nbfp_comb[i*2 + 1]*params->nbfp_comb[j*2 + 1]), tol)));
             }
             else
             {
                 /* Add zero parameters for the additional dummy atom type */
-                nbat->nbfp[(i*nbat->ntype+j)*2  ] = 0;
-                nbat->nbfp[(i*nbat->ntype+j)*2+1] = 0;
+                params->nbfp[(i*params->numTypes + j)*2  ] = 0;
+                params->nbfp[(i*params->numTypes + j)*2+1] = 0;
             }
         }
     }
@@ -619,43 +548,43 @@ void nbnxn_atomdata_init(const gmx::MDLogger &mdlog,
              */
             if (bCombGeom)
             {
-                nbat->comb_rule = ljcrGEOM;
+                params->comb_rule = ljcrGEOM;
             }
             else if (bCombLB)
             {
-                nbat->comb_rule = ljcrLB;
+                params->comb_rule = ljcrLB;
             }
             else
             {
-                nbat->comb_rule = ljcrNONE;
+                params->comb_rule = ljcrNONE;
 
-                nbat->free(nbat->nbfp_comb);
+                params->nbfp_comb.clear();
             }
 
             {
                 std::string mesg;
-                if (nbat->comb_rule == ljcrNONE)
+                if (params->comb_rule == ljcrNONE)
                 {
                     mesg = "Using full Lennard-Jones parameter combination matrix";
                 }
                 else
                 {
                     mesg = gmx::formatString("Using %s Lennard-Jones combination rule",
-                                             nbat->comb_rule == ljcrGEOM ? "geometric" : "Lorentz-Berthelot");
+                                             params->comb_rule == ljcrGEOM ? "geometric" : "Lorentz-Berthelot");
                 }
                 GMX_LOG(mdlog.info).asParagraph().appendText(mesg);
             }
             break;
         case enbnxninitcombruleGEOM:
-            nbat->comb_rule = ljcrGEOM;
+            params->comb_rule = ljcrGEOM;
             break;
         case enbnxninitcombruleLB:
-            nbat->comb_rule = ljcrLB;
+            params->comb_rule = ljcrLB;
             break;
         case enbnxninitcombruleNONE:
-            nbat->comb_rule = ljcrNONE;
+            params->comb_rule = ljcrNONE;
 
-            nbat->free(nbat->nbfp_comb);
+            params->nbfp_comb.clear();
             break;
         default:
             gmx_incons("Unknown enbnxninitcombrule");
@@ -664,18 +593,49 @@ void nbnxn_atomdata_init(const gmx::MDLogger &mdlog,
     bSIMD = (nb_kernel_type == nbnxnk4xN_SIMD_4xN ||
              nb_kernel_type == nbnxnk4xN_SIMD_2xNN);
 
-    set_lj_parameter_data(nbat, bSIMD);
+    set_lj_parameter_data(params, bSIMD);
+
+    params->nenergrp = n_energygroups;
+    if (!simple)
+    {
+        // We now check for energy groups already when starting mdrun
+        GMX_RELEASE_ASSERT(n_energygroups == 1, "GPU kernels do not support energy groups");
+    }
+    /* Temporary storage goes as #grp^3*simd_width^2/2, so limit to 64 */
+    if (params->nenergrp > 64)
+    {
+        gmx_fatal(FARGS, "With NxN kernels not more than 64 energy groups are supported\n");
+    }
+    params->neg_2log = 1;
+    while (params->nenergrp > (1<<params->neg_2log))
+    {
+        params->neg_2log++;
+    }
+}
+
+/* Initializes an nbnxn_atomdata_t data structure */
+void nbnxn_atomdata_init(const gmx::MDLogger &mdlog,
+                         nbnxn_atomdata_t *nbat,
+                         int nb_kernel_type,
+                         int enbnxninitcombrule,
+                         int ntype, const real *nbfp,
+                         int n_energygroups,
+                         int nout)
+{
+    nbnxn_atomdata_params_init(mdlog, &nbat->paramsDeprecated(), nb_kernel_type,
+                               enbnxninitcombrule, ntype, nbfp, n_energygroups);
+
+    const gmx_bool simple = nbnxn_kernel_pairlist_simple(nb_kernel_type);
+    const gmx_bool bSIMD  = (nb_kernel_type == nbnxnk4xN_SIMD_4xN ||
+                             nb_kernel_type == nbnxnk4xN_SIMD_2xNN);
 
-    nbat->natoms  = 0;
-    nbat->type    = nullptr;
-    nbat->lj_comb = nullptr;
     if (simple)
     {
         int pack_x;
 
         if (bSIMD)
         {
-            pack_x = std::max(NBNXN_CPU_CLUSTER_I_SIZE,
+            pack_x = std::max(c_nbnxnCpuIClusterSize,
                               nbnxn_kernel_to_cluster_j_size(nb_kernel_type));
             switch (pack_x)
             {
@@ -701,53 +661,26 @@ void nbnxn_atomdata_init(const gmx::MDLogger &mdlog,
         nbat->XFormat = nbatXYZQ;
         nbat->FFormat = nbatXYZ;
     }
-    nbat->q        = nullptr;
-    nbat->nenergrp = n_energygroups;
-    if (!simple)
-    {
-        // We now check for energy groups already when starting mdrun
-        GMX_RELEASE_ASSERT(n_energygroups == 1, "GPU kernels do not support energy groups");
-    }
-    /* Temporary storage goes as #grp^3*simd_width^2/2, so limit to 64 */
-    if (nbat->nenergrp > 64)
-    {
-        gmx_fatal(FARGS, "With NxN kernels not more than 64 energy groups are supported\n");
-    }
-    nbat->neg_2log = 1;
-    while (nbat->nenergrp > (1<<nbat->neg_2log))
-    {
-        nbat->neg_2log++;
-    }
-    nbat->energrp = nullptr;
-    nbat->alloc(reinterpret_cast<void **>(&nbat->shift_vec), SHIFTS*sizeof(*nbat->shift_vec));
+
+    nbat->shift_vec.resize(SHIFTS);
+
     nbat->xstride = (nbat->XFormat == nbatXYZQ ? STRIDE_XYZQ : DIM);
     nbat->fstride = (nbat->FFormat == nbatXYZQ ? STRIDE_XYZQ : DIM);
-    nbat->x       = nullptr;
-
-#if GMX_SIMD
-    if (simple)
-    {
-        nbnxn_atomdata_init_simple_exclusion_masks(nbat);
-    }
-#endif
 
     /* Initialize the output data structures */
-    nbat->nout    = nout;
-    snew(nbat->out, nbat->nout);
-    nbat->nalloc  = 0;
-    for (int i = 0; i < nbat->nout; i++)
+    for (int i = 0; i < nout; i++)
     {
-        nbnxn_atomdata_output_init(&nbat->out[i],
-                                   nb_kernel_type,
-                                   nbat->nenergrp, 1<<nbat->neg_2log,
-                                   nbat->alloc);
+        const auto &pinningPolicy = nbat->params().type.get_allocator().pinningPolicy();
+        nbat->out.emplace_back(nb_kernel_type, nbat->params().nenergrp, 1 << nbat->params().neg_2log,
+                               pinningPolicy);
     }
+
     nbat->buffer_flags.flag        = nullptr;
     nbat->buffer_flags.flag_nalloc = 0;
 
-    nth = gmx_omp_nthreads_get(emntNonbonded);
+    const int   nth = gmx_omp_nthreads_get(emntNonbonded);
 
-    ptr = getenv("GMX_USE_TREEREDUCE");
+    const char *ptr = getenv("GMX_USE_TREEREDUCE");
     if (ptr != nullptr)
     {
         nbat->bUseTreeReduce = (strtol(ptr, nullptr, 10) != 0);
@@ -771,7 +704,7 @@ void nbnxn_atomdata_init(const gmx::MDLogger &mdlog,
 }
 
 template<int packSize>
-static void copy_lj_to_nbat_lj_comb(const real *ljparam_type,
+static void copy_lj_to_nbat_lj_comb(gmx::ArrayRef<const real> ljparam_type,
                                     const int *type, int na,
                                     real *ljparam_at)
 {
@@ -789,11 +722,20 @@ static void copy_lj_to_nbat_lj_comb(const real *ljparam_type,
     }
 }
 
+static int numAtomsFromGrids(const nbnxn_search &nbs)
+{
+    const nbnxn_grid_t &lastGrid = nbs.grid.back();
+
+    return (lastGrid.cell0 + lastGrid.nc)*lastGrid.na_sc;
+}
+
 /* Sets the atom type in nbnxn_atomdata_t */
-static void nbnxn_atomdata_set_atomtypes(nbnxn_atomdata_t    *nbat,
-                                         const nbnxn_search  *nbs,
-                                         const int           *type)
+static void nbnxn_atomdata_set_atomtypes(nbnxn_atomdata_t::Params *params,
+                                         const nbnxn_search       *nbs,
+                                         const int                *type)
 {
+    params->type.resize(numAtomsFromGrids(*nbs));
+
     for (const nbnxn_grid_t &grid : nbs->grid)
     {
         /* Loop over all columns and copy and fill */
@@ -803,16 +745,19 @@ static void nbnxn_atomdata_set_atomtypes(nbnxn_atomdata_t    *nbat,
             int ash = (grid.cell0 + grid.cxy_ind[i])*grid.na_sc;
 
             copy_int_to_nbat_int(nbs->a.data() + ash, grid.cxy_na[i], ncz*grid.na_sc,
-                                 type, nbat->ntype-1, nbat->type+ash);
+                                 type, params->numTypes - 1, params->type.data() + ash);
         }
     }
 }
 
 /* Sets the LJ combination rule parameters in nbnxn_atomdata_t */
-static void nbnxn_atomdata_set_ljcombparams(nbnxn_atomdata_t    *nbat,
-                                            const nbnxn_search  *nbs)
+static void nbnxn_atomdata_set_ljcombparams(nbnxn_atomdata_t::Params *params,
+                                            const int                 XFormat,
+                                            const nbnxn_search       *nbs)
 {
-    if (nbat->comb_rule != ljcrNONE)
+    params->lj_comb.resize(numAtomsFromGrids(*nbs)*2);
+
+    if (params->comb_rule != ljcrNONE)
     {
         for (const nbnxn_grid_t &grid : nbs->grid)
         {
@@ -822,26 +767,26 @@ static void nbnxn_atomdata_set_ljcombparams(nbnxn_atomdata_t    *nbat,
                 int ncz = grid.cxy_ind[i+1] - grid.cxy_ind[i];
                 int ash = (grid.cell0 + grid.cxy_ind[i])*grid.na_sc;
 
-                if (nbat->XFormat == nbatX4)
+                if (XFormat == nbatX4)
                 {
-                    copy_lj_to_nbat_lj_comb<c_packX4>(nbat->nbfp_comb,
-                                                      nbat->type + ash,
+                    copy_lj_to_nbat_lj_comb<c_packX4>(params->nbfp_comb,
+                                                      params->type.data() + ash,
                                                       ncz*grid.na_sc,
-                                                      nbat->lj_comb + ash*2);
+                                                      params->lj_comb.data() + ash*2);
                 }
-                else if (nbat->XFormat == nbatX8)
+                else if (XFormat == nbatX8)
                 {
-                    copy_lj_to_nbat_lj_comb<c_packX8>(nbat->nbfp_comb,
-                                                      nbat->type + ash,
+                    copy_lj_to_nbat_lj_comb<c_packX8>(params->nbfp_comb,
+                                                      params->type.data() + ash,
                                                       ncz*grid.na_sc,
-                                                      nbat->lj_comb + ash*2);
+                                                      params->lj_comb.data() + ash*2);
                 }
-                else if (nbat->XFormat == nbatXYZQ)
+                else if (XFormat == nbatXYZQ)
                 {
-                    copy_lj_to_nbat_lj_comb<1>(nbat->nbfp_comb,
-                                               nbat->type + ash,
+                    copy_lj_to_nbat_lj_comb<1>(params->nbfp_comb,
+                                               params->type.data() + ash,
                                                ncz*grid.na_sc,
-                                               nbat->lj_comb + ash*2);
+                                               params->lj_comb.data() + ash*2);
                 }
             }
         }
@@ -853,6 +798,11 @@ static void nbnxn_atomdata_set_charges(nbnxn_atomdata_t    *nbat,
                                        const nbnxn_search  *nbs,
                                        const real          *charge)
 {
+    if (nbat->XFormat != nbatXYZQ)
+    {
+        nbat->paramsDeprecated().q.resize(nbat->numAtoms());
+    }
+
     for (const nbnxn_grid_t &grid : nbs->grid)
     {
         /* Loop over all columns and copy and fill */
@@ -864,7 +814,7 @@ static void nbnxn_atomdata_set_charges(nbnxn_atomdata_t    *nbat,
 
             if (nbat->XFormat == nbatXYZQ)
             {
-                real *q = nbat->x + ash*STRIDE_XYZQ + ZZ + 1;
+                real *q = nbat->x().data() + ash*STRIDE_XYZQ + ZZ + 1;
                 int   i;
                 for (i = 0; i < na; i++)
                 {
@@ -880,7 +830,7 @@ static void nbnxn_atomdata_set_charges(nbnxn_atomdata_t    *nbat,
             }
             else
             {
-                real *q = nbat->q + ash;
+                real *q = nbat->paramsDeprecated().q.data() + ash;
                 int   i;
                 for (i = 0; i < na; i++)
                 {
@@ -907,22 +857,24 @@ static void nbnxn_atomdata_set_charges(nbnxn_atomdata_t    *nbat,
 static void nbnxn_atomdata_mask_fep(nbnxn_atomdata_t    *nbat,
                                     const nbnxn_search  *nbs)
 {
-    real               *q;
-    int                 stride_q, nsubc;
+    nbnxn_atomdata_t::Params &params = nbat->paramsDeprecated();
+    real                     *q;
+    int                       stride_q;
 
     if (nbat->XFormat == nbatXYZQ)
     {
-        q        = nbat->x + ZZ + 1;
+        q        = nbat->x().data() + ZZ + 1;
         stride_q = STRIDE_XYZQ;
     }
     else
     {
-        q        = nbat->q;
+        q        = params.q.data();
         stride_q = 1;
     }
 
     for (const nbnxn_grid_t &grid : nbs->grid)
     {
+        int nsubc;
         if (grid.bSimple)
         {
             nsubc = 1;
@@ -947,8 +899,8 @@ static void nbnxn_atomdata_mask_fep(nbnxn_atomdata_t    *nbat,
                     {
                         int ind = c_offset + c*grid.na_c + i;
                         /* Set atom type and charge to non-interacting */
-                        nbat->type[ind] = nbat->ntype - 1;
-                        q[ind*stride_q] = 0;
+                        params.type[ind] = params.numTypes - 1;
+                        q[ind*stride_q]  = 0;
                     }
                 }
             }
@@ -987,15 +939,17 @@ static void copy_egp_to_nbat_egps(const int *a, int na, int na_round,
 }
 
 /* Set the energy group indices for atoms in nbnxn_atomdata_t */
-static void nbnxn_atomdata_set_energygroups(nbnxn_atomdata_t    *nbat,
-                                            const nbnxn_search  *nbs,
-                                            const int           *atinfo)
+static void nbnxn_atomdata_set_energygroups(nbnxn_atomdata_t::Params *params,
+                                            const nbnxn_search       *nbs,
+                                            const int                *atinfo)
 {
-    if (nbat->nenergrp == 1)
+    if (params->nenergrp == 1)
     {
         return;
     }
 
+    params->energrp.resize(numAtomsFromGrids(*nbs));
+
     for (const nbnxn_grid_t &grid : nbs->grid)
     {
         /* Loop over all columns and copy and fill */
@@ -1005,8 +959,9 @@ static void nbnxn_atomdata_set_energygroups(nbnxn_atomdata_t    *nbat,
             int ash = (grid.cell0 + grid.cxy_ind[i])*grid.na_sc;
 
             copy_egp_to_nbat_egps(nbs->a.data() + ash, grid.cxy_na[i], ncz*grid.na_sc,
-                                  nbat->na_c, nbat->neg_2log,
-                                  atinfo, nbat->energrp+(ash>>grid.na_c_2log));
+                                  c_nbnxnCpuIClusterSize, params->neg_2log,
+                                  atinfo,
+                                  params->energrp.data() + (ash >> grid.na_c_2log));
         }
     }
 }
@@ -1017,7 +972,9 @@ void nbnxn_atomdata_set(nbnxn_atomdata_t    *nbat,
                         const t_mdatoms     *mdatoms,
                         const int           *atinfo)
 {
-    nbnxn_atomdata_set_atomtypes(nbat, nbs, mdatoms->typeA);
+    nbnxn_atomdata_t::Params &params = nbat->paramsDeprecated();
+
+    nbnxn_atomdata_set_atomtypes(&params, nbs, mdatoms->typeA);
 
     nbnxn_atomdata_set_charges(nbat, nbs, mdatoms->chargeA);
 
@@ -1027,9 +984,9 @@ void nbnxn_atomdata_set(nbnxn_atomdata_t    *nbat,
     }
 
     /* This must be done after masking types for FEP */
-    nbnxn_atomdata_set_ljcombparams(nbat, nbs);
+    nbnxn_atomdata_set_ljcombparams(&params, nbat->XFormat, nbs);
 
-    nbnxn_atomdata_set_energygroups(nbat, nbs, atinfo);
+    nbnxn_atomdata_set_energygroups(&params, nbs, atinfo);
 }
 
 /* Copies the shift vector array to nbnxn_atomdata_t */
@@ -1117,7 +1074,7 @@ void nbnxn_atomdata_copy_x_to_nbat_x(const nbnxn_search  *nbs,
                         na_fill = na;
                     }
                     copy_rvec_to_nbat_real(nbs->a.data() + ash, na, na_fill, x,
-                                           nbat->XFormat, nbat->x, ash);
+                                           nbat->XFormat, nbat->x().data(), ash);
                 }
             }
         }
@@ -1129,7 +1086,7 @@ void nbnxn_atomdata_copy_x_to_nbat_x(const nbnxn_search  *nbs,
 }
 
 static void
-nbnxn_atomdata_clear_reals(real * gmx_restrict dest,
+nbnxn_atomdata_clear_reals(gmx::ArrayRef<real> dest,
                            int i0, int i1)
 {
     for (int i = i0; i < i1; i++)
@@ -1141,7 +1098,7 @@ nbnxn_atomdata_clear_reals(real * gmx_restrict dest,
 gmx_unused static void
 nbnxn_atomdata_reduce_reals(real * gmx_restrict dest,
                             gmx_bool bDestSet,
-                            real ** gmx_restrict src,
+                            const real ** gmx_restrict src,
                             int nsrc,
                             int i0, int i1)
 {
@@ -1173,7 +1130,7 @@ nbnxn_atomdata_reduce_reals(real * gmx_restrict dest,
 gmx_unused static void
 nbnxn_atomdata_reduce_reals_simd(real gmx_unused * gmx_restrict dest,
                                  gmx_bool gmx_unused bDestSet,
-                                 real gmx_unused ** gmx_restrict src,
+                                 const gmx_unused real ** gmx_restrict src,
                                  int gmx_unused nsrc,
                                  int gmx_unused i0, int gmx_unused i1)
 {
@@ -1216,7 +1173,7 @@ nbnxn_atomdata_reduce_reals_simd(real gmx_unused * gmx_restrict dest,
 static void
 nbnxn_atomdata_add_nbat_f_to_f_part(const nbnxn_search *nbs,
                                     const nbnxn_atomdata_t *nbat,
-                                    nbnxn_atomdata_output_t *out,
+                                    gmx::ArrayRef<nbnxn_atomdata_output_t> out,
                                     int nfa,
                                     int a0, int a1,
                                     rvec *f)
@@ -1230,7 +1187,7 @@ nbnxn_atomdata_add_nbat_f_to_f_part(const nbnxn_search *nbs,
         case nbatXYZQ:
             if (nfa == 1)
             {
-                const real *fnb = out[0].f;
+                const real *fnb = out[0].f.data();
 
                 for (int a = a0; a < a1; a++)
                 {
@@ -1259,7 +1216,7 @@ nbnxn_atomdata_add_nbat_f_to_f_part(const nbnxn_search *nbs,
         case nbatX4:
             if (nfa == 1)
             {
-                const real *fnb = out[0].f;
+                const real *fnb = out[0].f.data();
 
                 for (int a = a0; a < a1; a++)
                 {
@@ -1288,7 +1245,7 @@ nbnxn_atomdata_add_nbat_f_to_f_part(const nbnxn_search *nbs,
         case nbatX8:
             if (nfa == 1)
             {
-                const real *fnb = out[0].f;
+                const real *fnb = out[0].f.data();
 
                 for (int a = a0; a < a1; a++)
                 {
@@ -1325,14 +1282,16 @@ static inline unsigned char reverse_bits(unsigned char b)
     return (b * 0x0202020202ULL & 0x010884422010ULL) % 1023;
 }
 
-static void nbnxn_atomdata_add_nbat_f_to_f_treereduce(const nbnxn_atomdata_t *nbat,
-                                                      int                     nth)
+static void nbnxn_atomdata_add_nbat_f_to_f_treereduce(nbnxn_atomdata_t *nbat,
+                                                      int               nth)
 {
     const nbnxn_buffer_flags_t *flags = &nbat->buffer_flags;
 
-    int next_pow2 = 1<<(gmx::log2I(nth-1)+1);
+    int                         next_pow2 = 1<<(gmx::log2I(nth-1)+1);
 
-    assert(nbat->nout == nth); /* tree-reduce currently only works for nout==nth */
+    const int                   numOutputBuffers = nbat->out.size();
+    GMX_ASSERT(numOutputBuffers == nth,
+               "tree-reduce currently only works for numOutputBuffers==nth");
 
     memset(nbat->syncStep, 0, sizeof(*(nbat->syncStep))*nth);
 
@@ -1386,7 +1345,7 @@ static void nbnxn_atomdata_add_nbat_f_to_f_treereduce(const nbnxn_atomdata_t *nb
                 index[1]  = index[0] + group_size/2;
 
                 /* If no second buffer, nothing to do */
-                if (index[1] >= nbat->nout && group_size > 2)
+                if (index[1] >= numOutputBuffers && group_size > 2)
                 {
                     continue;
                 }
@@ -1428,14 +1387,15 @@ static void nbnxn_atomdata_add_nbat_f_to_f_treereduce(const nbnxn_atomdata_t *nb
 
                         if (bitmask_is_set(flags->flag[b], index[1]) || group_size > 2)
                         {
+                            const real *fIndex1 = nbat->out[index[1]].f.data();
 #if GMX_SIMD
                             nbnxn_atomdata_reduce_reals_simd
 #else
                             nbnxn_atomdata_reduce_reals
 #endif
-                                (nbat->out[index[0]].f,
+                                (nbat->out[index[0]].f.data(),
                                 bitmask_is_set(flags->flag[b], index[0]) || group_size > 2,
-                                &(nbat->out[index[1]].f), 1, i0, i1);
+                                &fIndex1, 1, i0, i1);
 
                         }
                         else if (!bitmask_is_set(flags->flag[b], index[0]))
@@ -1452,8 +1412,8 @@ static void nbnxn_atomdata_add_nbat_f_to_f_treereduce(const nbnxn_atomdata_t *nb
 }
 
 
-static void nbnxn_atomdata_add_nbat_f_to_f_stdreduce(const nbnxn_atomdata_t *nbat,
-                                                     int                     nth)
+static void nbnxn_atomdata_add_nbat_f_to_f_stdreduce(nbnxn_atomdata_t *nbat,
+                                                     int               nth)
 {
 #pragma omp parallel for num_threads(nth) schedule(static)
     for (int th = 0; th < nth; th++)
@@ -1461,8 +1421,8 @@ static void nbnxn_atomdata_add_nbat_f_to_f_stdreduce(const nbnxn_atomdata_t *nba
         try
         {
             const nbnxn_buffer_flags_t *flags;
-            int   nfptr;
-            real *fptr[NBNXN_BUFFERFLAG_MAX_THREADS];
+            int                         nfptr;
+            const real                 *fptr[NBNXN_BUFFERFLAG_MAX_THREADS];
 
             flags = &nbat->buffer_flags;
 
@@ -1476,11 +1436,11 @@ static void nbnxn_atomdata_add_nbat_f_to_f_stdreduce(const nbnxn_atomdata_t *nba
                 int i1 = (b+1)*NBNXN_BUFFERFLAG_SIZE*nbat->fstride;
 
                 nfptr = 0;
-                for (int out = 1; out < nbat->nout; out++)
+                for (int out = 1; out < static_cast<gmx::index>(nbat->out.size()); out++)
                 {
                     if (bitmask_is_set(flags->flag[b], out))
                     {
-                        fptr[nfptr++] = nbat->out[out].f;
+                        fptr[nfptr++] = nbat->out[out].f.data();
                     }
                 }
                 if (nfptr > 0)
@@ -1490,7 +1450,7 @@ static void nbnxn_atomdata_add_nbat_f_to_f_stdreduce(const nbnxn_atomdata_t *nba
 #else
                     nbnxn_atomdata_reduce_reals
 #endif
-                        (nbat->out[0].f,
+                        (nbat->out[0].f.data(),
                         bitmask_is_set(flags->flag[b], 0),
                         fptr, nfptr,
                         i0, i1);
@@ -1509,7 +1469,7 @@ static void nbnxn_atomdata_add_nbat_f_to_f_stdreduce(const nbnxn_atomdata_t *nba
 /* Add the force array(s) from nbnxn_atomdata_t to f */
 void nbnxn_atomdata_add_nbat_f_to_f(nbnxn_search           *nbs,
                                     int                     locality,
-                                    const nbnxn_atomdata_t *nbat,
+                                    nbnxn_atomdata_t       *nbat,
                                     rvec                   *f,
                                     gmx_wallcycle          *wcycle)
 {
@@ -1538,7 +1498,7 @@ void nbnxn_atomdata_add_nbat_f_to_f(nbnxn_search           *nbs,
 
     int nth = gmx_omp_nthreads_get(emntNonbonded);
 
-    if (nbat->nout > 1)
+    if (nbat->out.size() > 1)
     {
         if (locality != eatAll)
         {
@@ -1582,17 +1542,17 @@ void nbnxn_atomdata_add_nbat_f_to_f(nbnxn_search           *nbs,
 void nbnxn_atomdata_add_nbat_fshift_to_fshift(const nbnxn_atomdata_t *nbat,
                                               rvec                   *fshift)
 {
-    const nbnxn_atomdata_output_t * out = nbat->out;
+    gmx::ArrayRef<const nbnxn_atomdata_output_t> outputBuffers = nbat->out;
 
     for (int s = 0; s < SHIFTS; s++)
     {
         rvec sum;
         clear_rvec(sum);
-        for (int th = 0; th < nbat->nout; th++)
+        for (const nbnxn_atomdata_output_t &out : outputBuffers)
         {
-            sum[XX] += out[th].fshift[s*DIM+XX];
-            sum[YY] += out[th].fshift[s*DIM+YY];
-            sum[ZZ] += out[th].fshift[s*DIM+ZZ];
+            sum[XX] += out.fshift[s*DIM+XX];
+            sum[YY] += out.fshift[s*DIM+YY];
+            sum[ZZ] += out.fshift[s*DIM+ZZ];
         }
         rvec_inc(fshift[s], sum);
     }
index d336d4b54616aa5baef590d78ff07619a92a86cb..09c1042efa3b96486f3f9c3908ecb6485eaa354c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, 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.
@@ -51,20 +51,6 @@ class MDLogger;
 struct t_mdatoms;
 struct gmx_wallcycle;
 
-/* Default nbnxn allocation routine, allocates 32 byte aligned,
- * which works for plain C and aligned SSE and AVX loads/stores.
- */
-void nbnxn_alloc_aligned(void **ptr, size_t nbytes);
-
-/* Free function for memory allocated with nbnxn_alloc_aligned */
-void nbnxn_free_aligned(void *ptr);
-
-/* Reallocation wrapper function for nbnxn data structures */
-void nbnxn_realloc_void(void **ptr,
-                        int nbytes_copy, int nbytes_new,
-                        nbnxn_alloc_t *ma,
-                        nbnxn_free_t  *mf);
-
 /* Reallocate the nbnxn_atomdata_t for a size of n atoms */
 void nbnxn_atomdata_realloc(nbnxn_atomdata_t *nbat, int n);
 
@@ -91,11 +77,8 @@ void nbnxn_atomdata_init(const gmx::MDLogger &mdlog,
                          int enbnxninitcombrule,
                          int ntype, const real *nbfp,
                          int n_energygroups,
-                         int nout,
-                         nbnxn_alloc_t *alloc,
-                         nbnxn_free_t  *free);
+                         int nout);
 
-/* Copy the atom data to the non-bonded atom data structure */
 void nbnxn_atomdata_set(nbnxn_atomdata_t    *nbat,
                         const nbnxn_search  *nbs,
                         const t_mdatoms     *mdatoms,
@@ -119,7 +102,7 @@ void nbnxn_atomdata_copy_x_to_nbat_x(const nbnxn_search  *nbs,
 /* Add the forces stored in nbat to f, zeros the forces in nbat */
 void nbnxn_atomdata_add_nbat_f_to_f(nbnxn_search           *nbs,
                                     int                     locality,
-                                    const nbnxn_atomdata_t *nbat,
+                                    nbnxn_atomdata_t       *nbat,
                                     rvec                   *f,
                                     gmx_wallcycle          *wcycle);
 
index 24ffbb94ad890716edd43353a0654020b25e6bfa..c2475e826f322894d6022f6ea8adbc0e41947308 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2018,2019, 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.
 #ifndef _nbnxn_consts_h
 #define _nbnxn_consts_h
 
-/* With CPU kernels the i-cluster size is always 4 atoms.
- * With x86 SIMD the j-cluster size can be 2, 4 or 8, otherwise 4.
- */
-#define NBNXN_CPU_CLUSTER_I_SIZE       4
-
-#define NBNXN_CPU_CLUSTER_I_SIZE_2LOG  2
-
 // Lower limit for square interaction distances in nonbonded kernels.
 // For smaller values we will overflow when calculating r^-1 or r^-12, but
 // to keep it simple we always apply the limit from the tougher r^-12 condition.
 #endif
 
 
-/* Cluster-pair Interaction masks for 4xN and 2xNN kernels.
- * Bit i*CJ_SIZE + j tells if atom i and j interact.
- */
-/* All interaction mask is the same for all kernels */
-#define NBNXN_INTERACTION_MASK_ALL        0xffffffffU
-/* 4x4 kernel diagonal mask */
-#define NBNXN_INTERACTION_MASK_DIAG       0x08ceU
-/* 4x2 kernel diagonal masks */
-#define NBNXN_INTERACTION_MASK_DIAG_J2_0  0x0002U
-#define NBNXN_INTERACTION_MASK_DIAG_J2_1  0x002fU
-/* 4x8 kernel diagonal masks */
-#define NBNXN_INTERACTION_MASK_DIAG_J8_0  0xf0f8fcfeU
-#define NBNXN_INTERACTION_MASK_DIAG_J8_1  0x0080c0e0U
-
 /* The number of clusters in a super-cluster, used for GPU */
 #define c_nbnxnGpuNumClusterPerSupercluster  8
 
index 22e8eee3fd66141594a11f8d559f1b64b8b02ac6..7a78dda1097b29ce66909b46563004edd9c07d05 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, 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.
@@ -318,7 +318,8 @@ void nbnxn_gpu_copy_xq_to_gpu(gmx_nbnxn_cuda_t       *nb,
     }
 
     /* HtoD x, q */
-    cu_copy_H2D_async(adat->xq + adat_begin, nbatom->x + adat_begin * 4,
+    cu_copy_H2D_async(adat->xq + adat_begin,
+                      static_cast<const void *>(nbatom->x().data() + adat_begin * 4),
                       adat_len * sizeof(*adat->xq), stream);
 
     if (bDoTime)
@@ -612,7 +613,7 @@ void nbnxn_gpu_launch_kernel_pruneonly(gmx_nbnxn_cuda_t       *nb,
 }
 
 void nbnxn_gpu_launch_cpyback(gmx_nbnxn_cuda_t       *nb,
-                              const nbnxn_atomdata_t *nbatom,
+                              nbnxn_atomdata_t       *nbatom,
                               int                     flags,
                               int                     aloc,
                               bool                    haveOtherWork)
@@ -654,7 +655,7 @@ void nbnxn_gpu_launch_cpyback(gmx_nbnxn_cuda_t       *nb,
     }
 
     /* DtoH f */
-    cu_copy_D2H_async(nbatom->out[0].f + adat_begin * 3, adat->f + adat_begin,
+    cu_copy_D2H_async(nbatom->out[0].f.data() + adat_begin * 3, adat->f + adat_begin,
                       (adat_len)*sizeof(*adat->f), stream);
 
     /* After the non-local D2H is launched the nonlocal_done event can be
index 56ddfc71470c0b0edf47530c6fd2640e64e4e3c3..d91efb1e7721b46f9a8c86fb96195724c16cb115 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, 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.
@@ -219,14 +219,14 @@ static void set_cutoff_parameters(cu_nbparam_t              *nbp,
 }
 
 /*! Initializes the nonbonded parameter data structure. */
-static void init_nbparam(cu_nbparam_t              *nbp,
-                         const interaction_const_t *ic,
-                         const NbnxnListParameters *listParams,
-                         const nbnxn_atomdata_t    *nbat)
+static void init_nbparam(cu_nbparam_t                   *nbp,
+                         const interaction_const_t      *ic,
+                         const NbnxnListParameters      *listParams,
+                         const nbnxn_atomdata_t::Params &nbatParams)
 {
     int         ntypes;
 
-    ntypes  = nbat->ntype;
+    ntypes  = nbatParams.numTypes;
 
     set_cutoff_parameters(nbp, ic, listParams);
 
@@ -245,7 +245,7 @@ static void init_nbparam(cu_nbparam_t              *nbp,
         {
             case eintmodNONE:
             case eintmodPOTSHIFT:
-                switch (nbat->comb_rule)
+                switch (nbatParams.comb_rule)
                 {
                     case ljcrNONE:
                         nbp->vdwtype = evdwCuCUT;
@@ -274,12 +274,12 @@ static void init_nbparam(cu_nbparam_t              *nbp,
     {
         if (ic->ljpme_comb_rule == ljcrGEOM)
         {
-            assert(nbat->comb_rule == ljcrGEOM);
+            assert(nbatParams.comb_rule == ljcrGEOM);
             nbp->vdwtype = evdwCuEWALDGEOM;
         }
         else
         {
-            assert(nbat->comb_rule == ljcrLB);
+            assert(nbatParams.comb_rule == ljcrLB);
             nbp->vdwtype = evdwCuEWALDLB;
         }
     }
@@ -318,14 +318,14 @@ static void init_nbparam(cu_nbparam_t              *nbp,
     if (!useLjCombRule(nbp))
     {
         initParamLookupTable(nbp->nbfp, nbp->nbfp_texobj,
-                             nbat->nbfp, 2*ntypes*ntypes);
+                             nbatParams.nbfp.data(), 2*ntypes*ntypes);
     }
 
     /* set up LJ-PME parameter lookup table */
     if (ic->vdwtype == evdwPME)
     {
         initParamLookupTable(nbp->nbfp_comb, nbp->nbfp_comb_texobj,
-                             nbat->nbfp_comb, 2*ntypes);
+                             nbatParams.nbfp_comb.data(), 2*ntypes);
     }
 }
 
@@ -412,10 +412,10 @@ static void init_timings(gmx_wallclock_gpu_nbnxn_t *t)
 static void nbnxn_cuda_init_const(gmx_nbnxn_cuda_t               *nb,
                                   const interaction_const_t      *ic,
                                   const NbnxnListParameters      *listParams,
-                                  const nbnxn_atomdata_t         *nbat)
+                                  const nbnxn_atomdata_t::Params &nbatParams)
 {
-    init_atomdata_first(nb->atdat, nbat->ntype);
-    init_nbparam(nb->nbparam, ic, listParams, nbat);
+    init_atomdata_first(nb->atdat, nbatParams.numTypes);
+    init_nbparam(nb->nbparam, ic, listParams, nbatParams);
 
     /* clear energy and shift force outputs */
     nbnxn_cuda_clear_e_fshift(nb);
@@ -504,7 +504,7 @@ void nbnxn_gpu_init(gmx_nbnxn_cuda_t         **p_nb,
     /* pick L1 cache configuration */
     nbnxn_cuda_set_cacheconfig();
 
-    nbnxn_cuda_init_const(nb, ic, listParams, nbat);
+    nbnxn_cuda_init_const(nb, ic, listParams, nbat->params());
 
     *p_nb = nb;
 
@@ -515,11 +515,11 @@ void nbnxn_gpu_init(gmx_nbnxn_cuda_t         **p_nb,
 }
 
 void nbnxn_gpu_init_pairlist(gmx_nbnxn_cuda_t       *nb,
-                             const nbnxn_pairlist_t *h_plist,
+                             const NbnxnPairlistGpu *h_plist,
                              int                     iloc)
 {
     char          sbuf[STRLEN];
-    bool          bDoTime    =  (nb->bDoTime && h_plist->nsci > 0);
+    bool          bDoTime    =  (nb->bDoTime && !h_plist->sci.empty());
     cudaStream_t  stream     = nb->stream[iloc];
     cu_plist_t   *d_plist    = nb->plist[iloc];
 
@@ -545,24 +545,24 @@ void nbnxn_gpu_init_pairlist(gmx_nbnxn_cuda_t       *nb,
 
     Context context = nullptr;
 
-    reallocateDeviceBuffer(&d_plist->sci, h_plist->nsci,
+    reallocateDeviceBuffer(&d_plist->sci, h_plist->sci.size(),
                            &d_plist->nsci, &d_plist->sci_nalloc, context);
-    copyToDeviceBuffer(&d_plist->sci, h_plist->sci, 0, h_plist->nsci,
+    copyToDeviceBuffer(&d_plist->sci, h_plist->sci.data(), 0, h_plist->sci.size(),
                        stream, GpuApiCallBehavior::Async,
                        bDoTime ? nb->timers->pl_h2d[iloc].fetchNextEvent() : nullptr);
 
-    reallocateDeviceBuffer(&d_plist->cj4, h_plist->ncj4,
+    reallocateDeviceBuffer(&d_plist->cj4, h_plist->cj4.size(),
                            &d_plist->ncj4, &d_plist->cj4_nalloc, context);
-    copyToDeviceBuffer(&d_plist->cj4, h_plist->cj4, 0, h_plist->ncj4,
+    copyToDeviceBuffer(&d_plist->cj4, h_plist->cj4.data(), 0, h_plist->cj4.size(),
                        stream, GpuApiCallBehavior::Async,
                        bDoTime ? nb->timers->pl_h2d[iloc].fetchNextEvent() : nullptr);
 
-    reallocateDeviceBuffer(&d_plist->imask, h_plist->ncj4*c_nbnxnGpuClusterpairSplit,
+    reallocateDeviceBuffer(&d_plist->imask, h_plist->cj4.size()*c_nbnxnGpuClusterpairSplit,
                            &d_plist->nimask, &d_plist->imask_nalloc, context);
 
-    reallocateDeviceBuffer(&d_plist->excl, h_plist->nexcl,
+    reallocateDeviceBuffer(&d_plist->excl, h_plist->excl.size(),
                            &d_plist->nexcl, &d_plist->excl_nalloc, context);
-    copyToDeviceBuffer(&d_plist->excl, h_plist->excl, 0, h_plist->nexcl,
+    copyToDeviceBuffer(&d_plist->excl, h_plist->excl.data(), 0, h_plist->excl.size(),
                        stream, GpuApiCallBehavior::Async,
                        bDoTime ? nb->timers->pl_h2d[iloc].fetchNextEvent() : nullptr);
 
@@ -584,7 +584,7 @@ void nbnxn_gpu_upload_shiftvec(gmx_nbnxn_cuda_t       *nb,
     /* only if we have a dynamic box */
     if (nbatom->bDynamicBox || !adat->bShiftVecUploaded)
     {
-        cu_copy_H2D_async(adat->shift_vec, nbatom->shift_vec,
+        cu_copy_H2D_async(adat->shift_vec, nbatom->shift_vec.data(),
                           SHIFTS * sizeof(*adat->shift_vec), ls);
         adat->bShiftVecUploaded = true;
     }
@@ -638,7 +638,7 @@ void nbnxn_gpu_init_atomdata(gmx_nbnxn_cuda_t              *nb,
     cu_atomdata_t *d_atdat   = nb->atdat;
     cudaStream_t   ls        = nb->stream[eintLocal];
 
-    natoms    = nbat->natoms;
+    natoms    = nbat->numAtoms();
     realloced = false;
 
     if (bDoTime)
@@ -692,12 +692,12 @@ void nbnxn_gpu_init_atomdata(gmx_nbnxn_cuda_t              *nb,
 
     if (useLjCombRule(nb->nbparam))
     {
-        cu_copy_H2D_async(d_atdat->lj_comb, nbat->lj_comb,
+        cu_copy_H2D_async(d_atdat->lj_comb, nbat->params().lj_comb.data(),
                           natoms*sizeof(*d_atdat->lj_comb), ls);
     }
     else
     {
-        cu_copy_H2D_async(d_atdat->atom_types, nbat->type,
+        cu_copy_H2D_async(d_atdat->atom_types, nbat->params().type.data(),
                           natoms*sizeof(*d_atdat->atom_types), ls);
     }
 
index fcc7888515f453e6305569251e69881a523201f0..b23347b6c51b53adc8fe8571ec4cf8dc8c9e0345 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2017,2018,2019, 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.
@@ -132,7 +132,7 @@ void nbnxn_gpu_launch_kernel_pruneonly(gmx_nbnxn_gpu_t gmx_unused *nb,
  */
 GPU_FUNC_QUALIFIER
 void nbnxn_gpu_launch_cpyback(gmx_nbnxn_gpu_t  gmx_unused              *nb,
-                              const struct nbnxn_atomdata_t gmx_unused *nbatom,
+                              struct nbnxn_atomdata_t gmx_unused       *nbatom,
                               int                    gmx_unused         flags,
                               int                    gmx_unused         aloc,
                               bool                   gmx_unused         haveOtherWork) GPU_FUNC_TERM
index f83fe3609bca54d7db0d72a106ab56a45172dc4e..5226038469aadf992a05348105dc21fb767be6c4 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2014,2015,2017,2018,2019, 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.
@@ -48,7 +48,7 @@
 #include "gromacs/mdtypes/interaction_const.h"
 
 struct nonbonded_verlet_group_t;
-struct nbnxn_pairlist_t;
+struct NbnxnPairlistGpu;
 struct nbnxn_atomdata_t;
 struct NbnxnListParameters;
 struct gmx_wallclock_gpu_nbnxn_t;
@@ -69,7 +69,7 @@ void nbnxn_gpu_init(gmx_nbnxn_gpu_t gmx_unused            **p_nb,
 /** Initializes pair-list data for GPU, called at every pair search step. */
 GPU_FUNC_QUALIFIER
 void nbnxn_gpu_init_pairlist(gmx_nbnxn_gpu_t gmx_unused               *nb,
-                             const struct nbnxn_pairlist_t gmx_unused *h_nblist,
+                             const struct NbnxnPairlistGpu gmx_unused *h_nblist,
                              int                    gmx_unused         iloc) GPU_FUNC_TERM
 
 /** Initializes atom-data on the GPU, called at every pair search step. */
index f33a958d0bf63e59b0544d7697db6aa75d80ba62..93a93fbb64c092c11821a37dffda22417d4e7b75 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, 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.
@@ -841,7 +841,7 @@ static void fill_cell(nbnxn_search                  *nbs,
 
     copy_rvec_to_nbat_real(nbs->a.data() + atomStart, numAtoms, grid->na_c,
                            as_rvec_array(x.data()),
-                           nbat->XFormat, nbat->x, atomStart);
+                           nbat->XFormat, nbat->x().data(), atomStart);
 
     if (nbat->XFormat == nbatX4)
     {
@@ -852,13 +852,13 @@ static void fill_cell(nbnxn_search                  *nbs,
 #if GMX_SIMD && GMX_SIMD_REAL_WIDTH == 2
         if (2*grid->na_cj == grid->na_c)
         {
-            calc_bounding_box_x_x4_halves(numAtoms, nbat->x + atom_to_x_index<c_packX4>(atomStart), bb_ptr,
+            calc_bounding_box_x_x4_halves(numAtoms, nbat->x().data() + atom_to_x_index<c_packX4>(atomStart), bb_ptr,
                                           grid->bbj.data() + offset*2);
         }
         else
 #endif
         {
-            calc_bounding_box_x_x4(numAtoms, nbat->x + atom_to_x_index<c_packX4>(atomStart), bb_ptr);
+            calc_bounding_box_x_x4(numAtoms, nbat->x().data() + atom_to_x_index<c_packX4>(atomStart), bb_ptr);
         }
     }
     else if (nbat->XFormat == nbatX8)
@@ -867,7 +867,7 @@ static void fill_cell(nbnxn_search                  *nbs,
         size_t      offset = (atomStart - grid->cell0*grid->na_sc) >> grid->na_c_2log;
         nbnxn_bb_t *bb_ptr = grid->bb.data() + offset;
 
-        calc_bounding_box_x_x8(numAtoms, nbat->x +  atom_to_x_index<c_packX8>(atomStart), bb_ptr);
+        calc_bounding_box_x_x8(numAtoms, nbat->x().data() + atom_to_x_index<c_packX8>(atomStart), bb_ptr);
     }
 #if NBNXN_BBXXXX
     else if (!grid->bSimple)
@@ -883,13 +883,13 @@ static void fill_cell(nbnxn_search                  *nbs,
 #if NBNXN_SEARCH_SIMD4_FLOAT_X_BB
         if (nbat->XFormat == nbatXYZQ)
         {
-            calc_bounding_box_xxxx_simd4(numAtoms, nbat->x + atomStart*nbat->xstride,
+            calc_bounding_box_xxxx_simd4(numAtoms, nbat->x().data() + atomStart*nbat->xstride,
                                          bb_work_aligned, pbb_ptr);
         }
         else
 #endif
         {
-            calc_bounding_box_xxxx(numAtoms, nbat->xstride, nbat->x + atomStart*nbat->xstride,
+            calc_bounding_box_xxxx(numAtoms, nbat->xstride, nbat->x().data() + atomStart*nbat->xstride,
                                    pbb_ptr);
         }
         if (gmx_debug_at)
@@ -907,7 +907,7 @@ static void fill_cell(nbnxn_search                  *nbs,
         /* Store the bounding boxes as xyz.xyz. */
         nbnxn_bb_t *bb_ptr = grid->bb.data() + ((atomStart - grid->cell0*grid->na_sc) >> grid->na_c_2log);
 
-        calc_bounding_box(numAtoms, nbat->xstride, nbat->x + atomStart*nbat->xstride,
+        calc_bounding_box(numAtoms, nbat->xstride, nbat->x().data() + atomStart*nbat->xstride,
                           bb_ptr);
 
         if (gmx_debug_at)
@@ -1226,13 +1226,8 @@ static void resizeForNumberOfCells(const nbnxn_grid_t &grid,
      */
     nbs->a.resize(numNbnxnAtoms + numAtomsMoved);
 
-    /* We need padding up to a multiple of the buffer flag size: simply add */
-    if (numNbnxnAtoms + NBNXN_BUFFERFLAG_SIZE > nbat->nalloc)
-    {
-        nbnxn_atomdata_realloc(nbat, numNbnxnAtoms + NBNXN_BUFFERFLAG_SIZE);
-    }
-
-    nbat->natoms = numNbnxnAtoms;
+    /* Make space in nbat for storing the atom coordinates */
+    nbat->resizeCoordinateBuffer(numNbnxnAtoms);
 }
 
 /* Determine in which grid cells the atoms should go */
@@ -1441,8 +1436,6 @@ void nbnxn_put_on_grid(nbnxn_search_t                  nbs,
     grid->na_sc     = (grid->bSimple ? 1 : c_gpuNumClusterPerCell)*grid->na_c;
     grid->na_c_2log = get_2log(grid->na_c);
 
-    nbat->na_c = grid->na_c;
-
     if (ddZone == 0)
     {
         grid->cell0 = 0;
@@ -1510,7 +1503,12 @@ void nbnxn_put_on_grid(nbnxn_search_t                  nbs,
 
     if (ddZone == 0)
     {
-        nbat->natoms_local = nbat->natoms;
+        nbat->natoms_local = nbat->numAtoms();
+    }
+    if (ddZone == static_cast<int>(nbs->grid.size()) - 1)
+    {
+        /* We are done setting up all grids, we can resize the force buffers */
+        nbat->resizeForceBuffers();
     }
 
     nbs_cycle_stop(&nbs->cc[enbsCCgrid]);
index 45eec7745e024130cfb23e9e4b9937c95f280b06..7ea0ef061de7c89e9bda8e249058a3b34c622b92 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, 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.
 struct gmx_domdec_zones_t;
 
 
-/* The number of clusters in a pair-search cell, used for GPU */
-static const int c_gpuNumClusterPerCellZ = 2;
-static const int c_gpuNumClusterPerCellY = 2;
-static const int c_gpuNumClusterPerCellX = 2;
-static const int c_gpuNumClusterPerCell  = c_gpuNumClusterPerCellZ*c_gpuNumClusterPerCellY*c_gpuNumClusterPerCellX;
-
-
 /* Strides for x/f with xyz and xyzq coordinate (and charge) storage */
 #define STRIDE_XYZ         3
 #define STRIDE_XYZQ        4
@@ -141,6 +134,10 @@ template<int packSize> static inline int atom_to_x_index(int a)
 #endif /* NBNXN_SEARCH_BB_SIMD4 */
 
 
+template <class T>
+using AlignedVector = std::vector < T, gmx::AlignedAllocator < T>>;
+
+
 /* Bounding box for a nbnxn atom cluster */
 typedef struct {
     float lower[NNBSBB_C];
@@ -202,39 +199,95 @@ struct nbnxn_grid_t
 };
 
 /* Working data for the actual i-supercell during pair search */
-typedef struct nbnxn_list_work {
-    gmx_cache_protect_t     cp0;             /* Protect cache between threads               */
-
-    nbnxn_bb_t             *bb_ci;           /* The bounding boxes, pbc shifted, for each cluster */
-    float                  *pbb_ci;          /* As bb_ci, but in xxxx packed format               */
-    real                   *x_ci;            /* The coordinates, pbc shifted, for each atom       */
-    real                   *x_ci_simd;       /* aligned pointer to 4*DIM*GMX_SIMD_REAL_WIDTH floats */
-    int                     cj_ind;          /* The current cj_ind index for the current list     */
-    int                     cj4_init;        /* The first unitialized cj4 block                   */
-
-    float                  *d2;              /* Bounding box distance work array                  */
-
-    nbnxn_cj_t             *cj;              /* The j-cell list                                   */
-    int                     cj_nalloc;       /* Allocation size of cj                             */
-
-    int                     ncj_noq;         /* Nr. of cluster pairs without Coul for flop count  */
-    int                     ncj_hlj;         /* Nr. of cluster pairs with 1/2 LJ for flop count   */
-
-    int                    *sort;            /* Sort index                    */
-    int                     sort_nalloc;     /* Allocation size of sort       */
-
-    nbnxn_sci_t            *sci_sort;        /* Second sci array, for sorting */
-    int                     sci_sort_nalloc; /* Allocation size of sci_sort   */
-
-    gmx_cache_protect_t     cp1;             /* Protect cache between threads               */
-} nbnxn_list_work_t;
+struct NbnxnPairlistCpuWork
+{
+    // Struct for storing coordinats and bounding box for an i-entry during search
+    struct IClusterData
+    {
+        IClusterData() :
+            bb(1),
+            x(c_nbnxnCpuIClusterSize*DIM),
+            xSimd(c_nbnxnCpuIClusterSize*DIM*GMX_REAL_MAX_SIMD_WIDTH)
+        {
+        }
+
+        // The bounding boxes, pbc shifted, for each cluster
+        AlignedVector<nbnxn_bb_t> bb;
+        // The coordinates, pbc shifted, for each atom
+        std::vector<real>         x;
+        // Aligned list for storing 4*DIM*GMX_SIMD_REAL_WIDTH reals
+        AlignedVector<real>       xSimd;
+    };
+
+    // Protect data from cache pollution between threads
+    gmx_cache_protect_t       cp0;
+
+    // Work data for generating an IEntry in the pairlist
+    IClusterData              iClusterData;
+    // The current cj_ind index for the current list
+    int                       cj_ind;
+    // Temporary j-cluster list, used for sorting on exclusions
+    std::vector<nbnxn_cj_t>   cj;
+
+    // Nr. of cluster pairs without Coulomb for flop counting
+    int                       ncj_noq;
+    // Nr. of cluster pairs with 1/2 LJ for flop count
+    int                       ncj_hlj;
+
+    // Protect data from cache pollution between threads
+    gmx_cache_protect_t       cp1;
+};
 
-/* Function type for setting the i-atom coordinate working data */
-typedef void
-    gmx_icell_set_x_t (int ci,
-                       real shx, real shy, real shz,
-                       int stride, const real *x,
-                       nbnxn_list_work_t *work);
+/* Working data for the actual i-supercell during pair search */
+struct NbnxnPairlistGpuWork
+{
+    struct ISuperClusterData
+    {
+        ISuperClusterData() :
+            bb(c_gpuNumClusterPerCell),
+#if NBNXN_SEARCH_BB_SIMD4
+            bbPacked(c_gpuNumClusterPerCell/STRIDE_PBB*NNBSBB_XXXX),
+#endif
+            x(c_gpuNumClusterPerCell*c_nbnxnGpuClusterSize*DIM),
+            xSimd(c_gpuNumClusterPerCell*c_nbnxnGpuClusterSize*DIM)
+        {
+        }
+
+        // The bounding boxes, pbc shifted, for each cluster
+        AlignedVector<nbnxn_bb_t> bb;
+        // As bb, but in packed xxxx format
+        AlignedVector<float>      bbPacked;
+        // The coordinates, pbc shifted, for each atom
+        AlignedVector<real>       x;
+        // Aligned coordinate list used for 4*DIM*GMX_SIMD_REAL_WIDTH floats
+        AlignedVector<real>       xSimd;
+    };
+
+    NbnxnPairlistGpuWork() :
+        distanceBuffer(c_gpuNumClusterPerCell),
+        sci_sort({}, {gmx::PinningPolicy::PinnedIfSupported})
+    {
+    }
+
+    // Protect data from cache pollution between threads
+    gmx_cache_protect_t       cp0;
+
+    // Work data for generating an i-entry in the pairlist
+    ISuperClusterData         iSuperClusterData;
+    // The current j-cluster index for the current list
+    int                       cj_ind;
+    // Bounding box distance work array
+    AlignedVector<float>      distanceBuffer;
+
+    // Buffer for sorting list entries
+    std::vector<int>          sortBuffer;
+
+    // Second sci array, for sorting
+    gmx::HostVector<nbnxn_sci_t> sci_sort;
+
+    // Protect data from cache pollution between threads
+    gmx_cache_protect_t       cp1;
+};
 
 /* Local cycle count struct for profiling */
 typedef struct {
@@ -309,8 +362,6 @@ struct nbnxn_search
     int                  search_count;
     nbnxn_cycle_t        cc[enbsCCnr];
 
-    gmx_icell_set_x_t   *icell_set_x; /* Function for setting i-coords    */
-
     /* Thread-local work data */
     mutable std::vector<nbnxn_search_work_t> work; /* Work array, one entry for each thread */
 };
index 7a009dc2c138df2824655d65dd4af5d89ce3ea5e..b4a3f1327fcabd45e3def92d72e9cb9a140e4749 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2017, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2017,2019, 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.
@@ -42,9 +42,7 @@
 static void
 clear_f_all(const nbnxn_atomdata_t *nbat, real *f)
 {
-    int i;
-
-    for (i = 0; i < nbat->natoms*nbat->fstride; i++)
+    for (int i = 0; i < nbat->numAtoms()*nbat->fstride; i++)
     {
         f[i] = 0;
     }
@@ -103,24 +101,23 @@ reduce_energies_over_lists(const nbnxn_atomdata_t     *nbat,
                            real                       *Vvdw,
                            real                       *Vc)
 {
-    int nb;
-    int i, j, ind, indr;
+    const int nenergrp = nbat->params().nenergrp;
 
-    for (nb = 0; nb < nlist; nb++)
+    for (int nb = 0; nb < nlist; nb++)
     {
-        for (i = 0; i < nbat->nenergrp; i++)
+        for (int i = 0; i < nenergrp; i++)
         {
             /* Reduce the diagonal terms */
-            ind        = i*nbat->nenergrp + i;
+            int ind    = i*nenergrp + i;
             Vvdw[ind] += nbat->out[nb].Vvdw[ind];
             Vc[ind]   += nbat->out[nb].Vc[ind];
 
             /* Reduce the off-diagonal terms */
-            for (j = i+1; j < nbat->nenergrp; j++)
+            for (int j = i + 1; j < nenergrp; j++)
             {
                 /* The output should contain only one off-diagonal part */
-                ind        = i*nbat->nenergrp + j;
-                indr       = j*nbat->nenergrp + i;
+                int ind    = i*nenergrp + j;
+                int indr   = j*nenergrp + i;
                 Vvdw[ind] += nbat->out[nb].Vvdw[ind] + nbat->out[nb].Vvdw[indr];
                 Vc[ind]   += nbat->out[nb].Vc[ind]   + nbat->out[nb].Vc[indr];
             }
index 4edc4c2495684c1c87166ddafba07127f522b53d..430ff644d559fa546c1bd025460ebb33ce57328b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2017, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2017,2018,2019, 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.
@@ -54,7 +54,7 @@ struct interaction_const_t;
 
 /*! \brief Pair-interaction kernel type that also calculates energies.
  */
-typedef void (nbk_func_ener)(const nbnxn_pairlist_t     *nbl,
+typedef void (nbk_func_ener)(const NbnxnPairlistCpu     *nbl,
                              const nbnxn_atomdata_t     *nbat,
                              const interaction_const_t  *ic,
                              rvec                       *shift_vec,
@@ -69,7 +69,7 @@ typedef nbk_func_ener *p_nbk_func_ener;
 
 /*! \brief Pair-interaction kernel type that does not calculates energies.
  */
-typedef void (nbk_func_noener)(const nbnxn_pairlist_t     *nbl,
+typedef void (nbk_func_noener)(const NbnxnPairlistCpu     *nbl,
                                const nbnxn_atomdata_t     *nbat,
                                const interaction_const_t  *ic,
                                rvec                       *shift_vec,
index e6abb2fd198970c07531b9b9f0390db43b161054..3f47f2d0b795a9ccb72d95637a3fb8c85029ddaa 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, 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.
  */
 static void clearGroupEnergies(nbnxn_atomdata_output_t *out)
 {
-    for (int i = 0; i < out->nV; i++)
-    {
-        out->Vvdw[i] = 0;
-        out->Vc[i]   = 0;
-    }
-
-    for (int i = 0; i < out->nVS; i++)
-    {
-        out->VSvdw[i] = 0;
-    }
-    for (int i = 0; i < out->nVS; i++)
-    {
-        out->VSc[i] = 0;
-    }
+    std::fill(out->Vvdw.begin(), out->Vvdw.end(), 0.0_real);
+    std::fill(out->Vc.begin(), out->Vc.end(), 0.0_real);
+    std::fill(out->VSvdw.begin(), out->VSvdw.end(), 0.0_real);
+    std::fill(out->VSc.begin(), out->VSc.end(), 0.0_real);
 }
 
 /*! \brief Reduce the group-pair energy buffers produced by a SIMD kernel
@@ -91,22 +81,21 @@ static void clearGroupEnergies(nbnxn_atomdata_output_t *out)
  * \tparam        unrollj         The unroll size for j-particles in the SIMD kernel
  * \param[in]     numGroups       The number of energy groups
  * \param[in]     numGroups_2log  Log2 of numGroups, rounded up
- * \param[in]     vVdwSimd        SIMD Van der Waals energy buffers
- * \param[in]     vCoulombSimd    SIMD Coulomb energy buffers
- * \param[in,out] vVdw            Van der Waals energy output buffer
- * \param[in,out] vCoulomb        Coulomb energy output buffer
+ * \param[in,out] out             Struct with energy buffers
  */
 template <int unrollj> static void
 reduceGroupEnergySimdBuffers(int                       numGroups,
                              int                       numGroups_2log,
-                             const real * gmx_restrict vVdwSimd,
-                             const real * gmx_restrict vCoulombSimd,
-                             real * gmx_restrict       vVdw,
-                             real * gmx_restrict       vCoulomb)
+                             nbnxn_atomdata_output_t  *out)
 {
-    const int unrollj_half     = unrollj/2;
+    const int                 unrollj_half     = unrollj/2;
     /* Energies are stored in SIMD registers with size 2^numGroups_2log */
-    const int numGroupsStorage = (1 << numGroups_2log);
+    const int                 numGroupsStorage = (1 << numGroups_2log);
+
+    const real * gmx_restrict vVdwSimd     = out->VSvdw.data();
+    const real * gmx_restrict vCoulombSimd = out->VSc.data();
+    real * gmx_restrict       vVdw         = out->Vvdw.data();
+    real * gmx_restrict       vCoulomb     = out->Vc.data();
 
     /* The size of the SIMD energy group buffer array is:
      * numGroups*numGroups*numGroupsStorage*unrollj_half*simd_width
@@ -133,7 +122,7 @@ reduceGroupEnergySimdBuffers(int                       numGroups,
 
 void
 nbnxn_kernel_cpu(nonbonded_verlet_group_t  *nbvg,
-                 const nbnxn_atomdata_t    *nbat,
+                 nbnxn_atomdata_t          *nbat,
                  const interaction_const_t *ic,
                  rvec                      *shiftVectors,
                  int                        forceFlags,
@@ -174,6 +163,8 @@ nbnxn_kernel_cpu(nonbonded_verlet_group_t  *nbvg,
         }
     }
 
+    const nbnxn_atomdata_t::Params &nbatParams = nbat->params();
+
     int vdwkt = 0;
     if (ic->vdwtype == evdwCUT)
     {
@@ -181,7 +172,7 @@ nbnxn_kernel_cpu(nonbonded_verlet_group_t  *nbvg,
         {
             case eintmodNONE:
             case eintmodPOTSHIFT:
-                switch (nbat->comb_rule)
+                switch (nbatParams.comb_rule)
                 {
                     case ljcrGEOM: vdwkt = vdwktLJCUT_COMBGEOM; break;
                     case ljcrLB:   vdwkt = vdwktLJCUT_COMBLB;   break;
@@ -219,11 +210,9 @@ nbnxn_kernel_cpu(nonbonded_verlet_group_t  *nbvg,
     }
 
     int                nnbl = nbvg->nbl_lists.nnbl;
-    nbnxn_pairlist_t **nbl  = nbvg->nbl_lists.nbl;
-
-    GMX_ASSERT(nbl[0]->nci >= 0, "nci<0, which signals an invalid pair-list");
+    NbnxnPairlistCpu **nbl  = nbvg->nbl_lists.nbl;
 
-    int gmx_unused nthreads = gmx_omp_nthreads_get(emntNonbonded);
+    int gmx_unused     nthreads = gmx_omp_nthreads_get(emntNonbonded);
 #pragma omp parallel for schedule(static) num_threads(nthreads)
     for (int nb = 0; nb < nnbl; nb++)
     {
@@ -233,7 +222,7 @@ nbnxn_kernel_cpu(nonbonded_verlet_group_t  *nbvg,
 
         if (clearF == enbvClearFYes)
         {
-            clear_f(nbat, nb, out->f);
+            clear_f(nbat, nb, out->f.data());
         }
 
         real *fshift_p;
@@ -243,7 +232,7 @@ nbnxn_kernel_cpu(nonbonded_verlet_group_t  *nbvg,
         }
         else
         {
-            fshift_p = out->fshift;
+            fshift_p = out->fshift.data();
 
             if (clearF == enbvClearFYes)
             {
@@ -260,7 +249,7 @@ nbnxn_kernel_cpu(nonbonded_verlet_group_t  *nbvg,
                     nbnxn_kernel_noener_ref[coulkt][vdwkt](nbl[nb], nbat,
                                                            ic,
                                                            shiftVectors,
-                                                           out->f,
+                                                           out->f.data(),
                                                            fshift_p);
                     break;
 #ifdef GMX_NBNXN_SIMD_2XNN
@@ -268,7 +257,7 @@ nbnxn_kernel_cpu(nonbonded_verlet_group_t  *nbvg,
                     nbnxn_kernel_noener_simd_2xnn[coulkt][vdwkt](nbl[nb], nbat,
                                                                  ic,
                                                                  shiftVectors,
-                                                                 out->f,
+                                                                 out->f.data(),
                                                                  fshift_p);
                     break;
 #endif
@@ -277,7 +266,7 @@ nbnxn_kernel_cpu(nonbonded_verlet_group_t  *nbvg,
                     nbnxn_kernel_noener_simd_4xn[coulkt][vdwkt](nbl[nb], nbat,
                                                                 ic,
                                                                 shiftVectors,
-                                                                out->f,
+                                                                out->f.data(),
                                                                 fshift_p);
                     break;
 #endif
@@ -285,7 +274,7 @@ nbnxn_kernel_cpu(nonbonded_verlet_group_t  *nbvg,
                     GMX_RELEASE_ASSERT(false, "Unsupported kernel architecture");
             }
         }
-        else if (out->nV == 1)
+        else if (out->Vvdw.size() == 1)
         {
             /* A single energy group (pair) */
             out->Vvdw[0] = 0;
@@ -297,20 +286,20 @@ nbnxn_kernel_cpu(nonbonded_verlet_group_t  *nbvg,
                     nbnxn_kernel_ener_ref[coulkt][vdwkt](nbl[nb], nbat,
                                                          ic,
                                                          shiftVectors,
-                                                         out->f,
+                                                         out->f.data(),
                                                          fshift_p,
-                                                         out->Vvdw,
-                                                         out->Vc);
+                                                         out->Vvdw.data(),
+                                                         out->Vc.data());
                     break;
 #ifdef GMX_NBNXN_SIMD_2XNN
                 case nbnxnk4xN_SIMD_2xNN:
                     nbnxn_kernel_ener_simd_2xnn[coulkt][vdwkt](nbl[nb], nbat,
                                                                ic,
                                                                shiftVectors,
-                                                               out->f,
+                                                               out->f.data(),
                                                                fshift_p,
-                                                               out->Vvdw,
-                                                               out->Vc);
+                                                               out->Vvdw.data(),
+                                                               out->Vc.data());
                     break;
 #endif
 #ifdef GMX_NBNXN_SIMD_4XN
@@ -318,10 +307,10 @@ nbnxn_kernel_cpu(nonbonded_verlet_group_t  *nbvg,
                     nbnxn_kernel_ener_simd_4xn[coulkt][vdwkt](nbl[nb], nbat,
                                                               ic,
                                                               shiftVectors,
-                                                              out->f,
+                                                              out->f.data(),
                                                               fshift_p,
-                                                              out->Vvdw,
-                                                              out->Vc);
+                                                              out->Vvdw.data(),
+                                                              out->Vc.data());
                     break;
 #endif
                 default:
@@ -338,14 +327,14 @@ nbnxn_kernel_cpu(nonbonded_verlet_group_t  *nbvg,
             switch (nbvg->kernel_type)
             {
                 case nbnxnk4x4_PlainC:
-                    unrollj = NBNXN_CPU_CLUSTER_I_SIZE;
+                    unrollj = c_nbnxnCpuIClusterSize;
                     nbnxn_kernel_energrp_ref[coulkt][vdwkt](nbl[nb], nbat,
                                                             ic,
                                                             shiftVectors,
-                                                            out->f,
+                                                            out->f.data(),
                                                             fshift_p,
-                                                            out->Vvdw,
-                                                            out->Vc);
+                                                            out->Vvdw.data(),
+                                                            out->Vc.data());
                     break;
 #ifdef GMX_NBNXN_SIMD_2XNN
                 case nbnxnk4xN_SIMD_2xNN:
@@ -353,10 +342,10 @@ nbnxn_kernel_cpu(nonbonded_verlet_group_t  *nbvg,
                     nbnxn_kernel_energrp_simd_2xnn[coulkt][vdwkt](nbl[nb], nbat,
                                                                   ic,
                                                                   shiftVectors,
-                                                                  out->f,
+                                                                  out->f.data(),
                                                                   fshift_p,
-                                                                  out->VSvdw,
-                                                                  out->VSc);
+                                                                  out->VSvdw.data(),
+                                                                  out->VSc.data());
                     break;
 #endif
 #ifdef GMX_NBNXN_SIMD_4XN
@@ -365,10 +354,10 @@ nbnxn_kernel_cpu(nonbonded_verlet_group_t  *nbvg,
                     nbnxn_kernel_energrp_simd_4xn[coulkt][vdwkt](nbl[nb], nbat,
                                                                  ic,
                                                                  shiftVectors,
-                                                                 out->f,
+                                                                 out->f.data(),
                                                                  fshift_p,
-                                                                 out->VSvdw,
-                                                                 out->VSc);
+                                                                 out->VSvdw.data(),
+                                                                 out->VSc.data());
                     break;
 #endif
                 default:
@@ -380,22 +369,19 @@ nbnxn_kernel_cpu(nonbonded_verlet_group_t  *nbvg,
                 switch (unrollj)
                 {
                     case 2:
-                        reduceGroupEnergySimdBuffers<2>(nbat->nenergrp,
-                                                        nbat->neg_2log,
-                                                        out->VSvdw, out->VSc,
-                                                        out->Vvdw, out->Vc);
+                        reduceGroupEnergySimdBuffers<2>(nbatParams.nenergrp,
+                                                        nbatParams.neg_2log,
+                                                        out);
                         break;
                     case 4:
-                        reduceGroupEnergySimdBuffers<4>(nbat->nenergrp,
-                                                        nbat->neg_2log,
-                                                        out->VSvdw, out->VSc,
-                                                        out->Vvdw, out->Vc);
+                        reduceGroupEnergySimdBuffers<4>(nbatParams.nenergrp,
+                                                        nbatParams.neg_2log,
+                                                        out);
                         break;
                     case 8:
-                        reduceGroupEnergySimdBuffers<8>(nbat->nenergrp,
-                                                        nbat->neg_2log,
-                                                        out->VSvdw, out->VSc,
-                                                        out->Vvdw, out->Vc);
+                        reduceGroupEnergySimdBuffers<8>(nbatParams.nenergrp,
+                                                        nbatParams.neg_2log,
+                                                        out);
                         break;
                     default:
                         GMX_RELEASE_ASSERT(false, "Unsupported j-unroll size");
index 5f4ba0cde0576fc6730859c0e2303d2644583598..389f5e6daa7418931024948603049010db006c59 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2017, by the GROMACS development team, led by
+ * Copyright (c) 2017,2018,2019, 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.
@@ -58,7 +58,7 @@ struct nonbonded_verlet_group_t;
  * within this function.
  *
  * \param[in,out] nbvg          The group (local/non-local) to compute interaction for
- * \param[in]     nbat          The atomdata for the interactions
+ * \param[in,out] nbat          The atomdata for the interactions
  * \param[in]     ic            Non-bonded interaction constants
  * \param[in]     shiftVectors  The PBC shift vectors
  * \param[in]     forceFlags    Flags that tell what to compute
@@ -69,7 +69,7 @@ struct nonbonded_verlet_group_t;
  */
 void
 nbnxn_kernel_cpu(nonbonded_verlet_group_t  *nbvg,
-                 const nbnxn_atomdata_t    *nbat,
+                 nbnxn_atomdata_t          *nbat,
                  const interaction_const_t *ic,
                  rvec                      *shiftVectors,
                  int                        forceFlags,
index 8ab083c30a8a38d61ba7358d4ba39edb796bd86e..411b5d3cac4f93ca4015ffa9d328b8f0a765b3aa 100755 (executable)
@@ -2,7 +2,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+# Copyright (c) 2013,2014,2015,2017,2018,2019, 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.
@@ -76,7 +76,7 @@ import collections # Requires Python 2.7
 sys.path.append('../../../../../admin')
 from copyright import create_copyright_header
 
-FileHeader = create_copyright_header('2012,2013,2014,2015')
+FileHeader = create_copyright_header('2012,2013,2014,2015,2019')
 FileHeader += """/*
  * Note: this file was generated by the Verlet kernel generator for
  * kernel type {0}.
index dcb6c09640b96c03bc9f58d14afedda611120ac6..2786209a147ab14bd177a741148af6e2aaaea2de 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -56,7 +56,7 @@
 
 #ifdef CALC_ENERGIES
 void
-{5}(const nbnxn_pairlist_t    gmx_unused *nbl,
+{5}(const NbnxnPairlistCpu    gmx_unused *nbl,
 {6}const nbnxn_atomdata_t    gmx_unused *nbat,
 {6}const interaction_const_t gmx_unused *ic,
 {6}rvec                      gmx_unused *shift_vec,
@@ -66,7 +66,7 @@ void
 {6}real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-{5}(const nbnxn_pairlist_t    gmx_unused *nbl,
+{5}(const NbnxnPairlistCpu    gmx_unused *nbl,
 {6}const nbnxn_atomdata_t    gmx_unused *nbat,
 {6}const interaction_const_t gmx_unused *ic,
 {6}rvec                      gmx_unused *shift_vec,
index aec699cd7a496e07fd9a010668388d921e44dae5..96c1e825e89ceaed44cc8d9b22390be5e6b9e968 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -56,7 +56,7 @@
 
 #ifdef CALC_ENERGIES
 void
-{5}(const nbnxn_pairlist_t    gmx_unused *nbl,
+{5}(const NbnxnPairlistCpu    gmx_unused *nbl,
 {6}const nbnxn_atomdata_t    gmx_unused *nbat,
 {6}const interaction_const_t gmx_unused *ic,
 {6}rvec                      gmx_unused *shift_vec,
@@ -66,7 +66,7 @@ void
 {6}real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-{5}(const nbnxn_pairlist_t    gmx_unused *nbl,
+{5}(const NbnxnPairlistCpu    gmx_unused *nbl,
 {6}const nbnxn_atomdata_t    gmx_unused *nbat,
 {6}const interaction_const_t gmx_unused *ic,
 {6}rvec                      gmx_unused *shift_vec,
index e7f805b370040432e590757adde5547d4fff7f50..43313db602f0667ab7229619de8adc5cf469c268 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, 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.
@@ -58,26 +58,23 @@ static const int c_numClPerSupercl = c_nbnxnGpuNumClusterPerSupercluster;
 static const int c_clSize          = c_nbnxnGpuClusterSize;
 
 void
-nbnxn_kernel_gpu_ref(const nbnxn_pairlist_t     *nbl,
+nbnxn_kernel_gpu_ref(const NbnxnPairlistGpu     *nbl,
                      const nbnxn_atomdata_t     *nbat,
                      const interaction_const_t  *iconst,
                      rvec                       *shift_vec,
                      int                         force_flags,
                      int                         clearF,
-                     real  *                     f,
+                     gmx::ArrayRef<real>         f,
                      real  *                     fshift,
                      real  *                     Vc,
                      real  *                     Vvdw)
 {
-    const nbnxn_sci_t  *nbln;
-    const real         *x;
     gmx_bool            bEner;
     gmx_bool            bEwald;
     const real         *Ftab = nullptr;
     real                rcut2, rvdw2, rlist2;
     int                 ntype;
     real                facel;
-    int                 n;
     int                 ish3;
     int                 sci;
     int                 cj4_ind0, cj4_ind1, cj4_ind;
@@ -102,9 +99,6 @@ nbnxn_kernel_gpu_ref(const nbnxn_pairlist_t     *nbl,
     int                 int_bit;
     real                fexcl;
     real                c6, c12;
-    const real       *  shiftvec;
-    real       *        vdwparam;
-    int       *         type;
     const nbnxn_excl_t *excl[2];
 
     int                 npair_tot, npair;
@@ -117,7 +111,7 @@ nbnxn_kernel_gpu_ref(const nbnxn_pairlist_t     *nbl,
 
     if (clearF == enbvClearFYes)
     {
-        clear_f(nbat, 0, f);
+        clear_f(nbat, 0, f.data());
     }
 
     bEner = ((force_flags & GMX_FORCE_ENERGY) != 0);
@@ -128,38 +122,36 @@ nbnxn_kernel_gpu_ref(const nbnxn_pairlist_t     *nbl,
         Ftab = iconst->tabq_coul_F;
     }
 
-    rcut2               = iconst->rcoulomb*iconst->rcoulomb;
-    rvdw2               = iconst->rvdw*iconst->rvdw;
+    rcut2                = iconst->rcoulomb*iconst->rcoulomb;
+    rvdw2                = iconst->rvdw*iconst->rvdw;
 
-    rlist2              = nbl->rlist*nbl->rlist;
+    rlist2               = nbl->rlist*nbl->rlist;
 
-    type                = nbat->type;
-    facel               = iconst->epsfac;
-    shiftvec            = shift_vec[0];
-    vdwparam            = nbat->nbfp;
-    ntype               = nbat->ntype;
+    const int  *type     = nbat->params().type.data();
+    facel                = iconst->epsfac;
+    const real *shiftvec = shift_vec[0];
+    const real *vdwparam = nbat->params().nbfp.data();
+    ntype                = nbat->params().numTypes;
 
-    x = nbat->x;
+    const real *x        = nbat->x().data();
 
     npair_tot   = 0;
     nhwu        = 0;
     nhwu_pruned = 0;
 
-    for (n = 0; n < nbl->nsci; n++)
+    for (const nbnxn_sci_t &nbln : nbl->sci)
     {
-        nbln = &nbl->sci[n];
-
-        ish3             = 3*nbln->shift;
+        ish3             = 3*nbln.shift;
         shX              = shiftvec[ish3];
         shY              = shiftvec[ish3+1];
         shZ              = shiftvec[ish3+2];
-        cj4_ind0         = nbln->cj4_ind_start;
-        cj4_ind1         = nbln->cj4_ind_end;
-        sci              = nbln->sci;
+        cj4_ind0         = nbln.cj4_ind_start;
+        cj4_ind1         = nbln.cj4_ind_end;
+        sci              = nbln.sci;
         vctot            = 0;
         Vvdwtot          = 0;
 
-        if (nbln->shift == CENTRAL &&
+        if (nbln.shift == CENTRAL &&
             nbl->cj4[cj4_ind0].cj[0] == sci*c_numClPerSupercl)
         {
             /* we have the diagonal:
@@ -228,7 +220,7 @@ nbnxn_kernel_gpu_ref(const nbnxn_pairlist_t     *nbl,
                             {
                                 ja               = cj*c_clSize + jc;
 
-                                if (nbln->shift == CENTRAL &&
+                                if (nbln.shift == CENTRAL &&
                                     ci == cj && ja <= ia)
                                 {
                                     continue;
index 94ce4fb3fc0a5926ee3eddc24768cb1cb579228e..7a5a1cff26f866144840a5022e53bc45948cb19c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2018,2019, 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.
 #include "gromacs/math/vectypes.h"
 #include "gromacs/mdlib/nbnxn_pairlist.h"
 #include "gromacs/mdtypes/forcerec.h"
+#include "gromacs/utility/arrayref.h"
 #include "gromacs/utility/real.h"
 
 /* Reference (slow) kernel for nb n vs n GPU type pair lists */
 void
-nbnxn_kernel_gpu_ref(const nbnxn_pairlist_t     *nbl,
+nbnxn_kernel_gpu_ref(const NbnxnPairlistGpu     *nbl,
                      const nbnxn_atomdata_t     *nbat,
                      const interaction_const_t  *iconst,
                      rvec                       *shift_vec,
                      int                         force_flags,
                      int                         clearF,
-                     real  *                     f,
+                     gmx::ArrayRef<real>         f,
                      real  *                     fshift,
                      real  *                     Vc,
                      real  *                     Vvdw);
index 31a25c0dfbb804ae2f8b71ed617a85aa649d58f9..0c177dbf8e6cdbb07b4d609339eed98b8fb80ea5 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2018,2019, 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.
@@ -54,13 +54,14 @@ void nbnxn_kernel_cpu_prune(nonbonded_verlet_group_t *nbvg,
 {
     nbnxn_pairlist_set_t   *nbl_lists = &nbvg->nbl_lists;
 
-    GMX_ASSERT(nbl_lists->nbl[0]->nciOuter >= 0, "nciOuter<0, which signals an invalid pair-list");
+    GMX_ASSERT(nbl_lists->nbl[0]->ciOuter.size() >= nbl_lists->nbl[0]->ci.size(),
+               "Here we should either have an empty ci list or ciOuter should be >= ci");
 
     int gmx_unused nthreads = gmx_omp_nthreads_get(emntNonbonded);
 #pragma omp parallel for schedule(static) num_threads(nthreads)
     for (int i = 0; i < nbl_lists->nnbl; i++)
     {
-        nbnxn_pairlist_t *nbl = nbl_lists->nbl[i];
+        NbnxnPairlistCpu *nbl = nbl_lists->nbl[i];
 
         switch (nbvg->kernel_type)
         {
index 4e5f0481e503418347a9a01497ac002edb008844..a6d44626a750cd5d0c13288d6df2af3494e4b4c2 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2018,2019, 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.
@@ -50,7 +50,7 @@
     cj = l_cj[cjind].cj;
 
 #ifdef ENERGY_GROUPS
-    egp_cj = nbat->energrp[cj];
+    egp_cj = nbatParams.energrp[cj];
 #endif
     for (i = 0; i < UNROLLI; i++)
     {
 
 #ifdef CALC_ENERGIES
 #ifdef ENERGY_GROUPS
-                Vvdw[egp_sh_i[i]+((egp_cj>>(nbat->neg_2log*j)) & egp_mask)] += VLJ;
+                Vvdw[egp_sh_i[i] + ((egp_cj >> (nbatParams.neg_2log*j)) & egp_mask)] += VLJ;
 #else
                 Vvdw_ci += VLJ;
                 /* 1 flop for LJ energy addition */
 
 #ifdef CALC_ENERGIES
 #ifdef ENERGY_GROUPS
-            Vc[egp_sh_i[i]+((egp_cj>>(nbat->neg_2log*j)) & egp_mask)] += vcoul;
+            Vc[egp_sh_i[i] + ((egp_cj >> (nbatParams.neg_2log*j)) & egp_mask)] += vcoul;
 #else
             Vc_ci += vcoul;
             /* 1 flop for Coulomb energy addition */
index c2c5fcaa2c63c9ef0d5825eaeb56692eab9a20e9..b50a45d9c0ab9ebf00e322801a91070817b2af29 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2017,2018,2019, 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.
  * the research papers on the package. Check out http://www.gromacs.org.
  */
 
-#define UNROLLI    NBNXN_CPU_CLUSTER_I_SIZE
-#define UNROLLJ    NBNXN_CPU_CLUSTER_I_SIZE
+#define UNROLLI    4
+#define UNROLLJ    4
+
+static_assert(UNROLLI == c_nbnxnCpuIClusterSize, "UNROLLI should match the i-cluster size");
 
 /* We could use nbat->xstride and nbat->fstride, but macros might be faster */
 #define X_STRIDE   3
@@ -91,7 +93,7 @@ NBK_FUNC_NAME(_VgrpF) // NOLINT(misc-definitions-in-headers)
 #endif
 #undef NBK_FUNC_NAME
 #undef NBK_FUNC_NAME2
-(const nbnxn_pairlist_t     *nbl,
+(const NbnxnPairlistCpu     *nbl,
  const nbnxn_atomdata_t     *nbat,
  const interaction_const_t  *ic,
  rvec                       *shift_vec,
@@ -104,20 +106,14 @@ NBK_FUNC_NAME(_VgrpF) // NOLINT(misc-definitions-in-headers)
 #endif
 )
 {
-    const nbnxn_ci_t   *nbln;
     const nbnxn_cj_t   *l_cj;
-    const int          *type;
-    const real         *q;
-    const real         *shiftvec;
-    const real         *x;
-    const real         *nbfp;
     real                rcut2;
 #ifdef VDW_CUTOFF_CHECK
     real                rvdw2;
 #endif
     int                 ntype2;
     real                facel;
-    int                 n, ci, ci_sh;
+    int                 ci, ci_sh;
     int                 ish, ishf;
     gmx_bool            do_LJ, half_LJ, do_coul;
     int                 cjind0, cjind1, cjind;
@@ -144,7 +140,6 @@ NBK_FUNC_NAME(_VgrpF) // NOLINT(misc-definitions-in-headers)
 #ifdef CALC_ENERGIES
     real        lje_vc;
 #endif
-    const real *ljc;
 #endif
 
 #ifdef CALC_COUL_RF
@@ -178,6 +173,8 @@ NBK_FUNC_NAME(_VgrpF) // NOLINT(misc-definitions-in-headers)
     swF4 = 5*ic->vdw_switch.c5;
 #endif
 
+    const nbnxn_atomdata_t::Params &nbatParams = nbat->params();
+
 #ifdef LJ_EWALD
     lje_coeff2   = ic->ewaldcoeff_lj*ic->ewaldcoeff_lj;
     lje_coeff6_6 = lje_coeff2*lje_coeff2*lje_coeff2/6.0;
@@ -185,7 +182,7 @@ NBK_FUNC_NAME(_VgrpF) // NOLINT(misc-definitions-in-headers)
     lje_vc       = ic->sh_lj_ewald;
 #endif
 
-    ljc          = nbat->nbfp_comb;
+    const real *ljc = nbatParams.nbfp_comb.data();
 #endif
 
 #ifdef CALC_COUL_RF
@@ -209,38 +206,36 @@ NBK_FUNC_NAME(_VgrpF) // NOLINT(misc-definitions-in-headers)
 #endif
 
 #ifdef ENERGY_GROUPS
-    egp_mask = (1<<nbat->neg_2log) - 1;
+    egp_mask = (1 << nbatParams.neg_2log) - 1;
 #endif
 
 
-    rcut2               = ic->rcoulomb*ic->rcoulomb;
+    rcut2                = ic->rcoulomb*ic->rcoulomb;
 #ifdef VDW_CUTOFF_CHECK
-    rvdw2               = ic->rvdw*ic->rvdw;
+    rvdw2                = ic->rvdw*ic->rvdw;
 #endif
 
-    ntype2              = nbat->ntype*2;
-    nbfp                = nbat->nbfp;
-    q                   = nbat->q;
-    type                = nbat->type;
-    facel               = ic->epsfac;
-    shiftvec            = shift_vec[0];
-    x                   = nbat->x;
+    ntype2               = nbatParams.numTypes*2;
+    const real *nbfp     = nbatParams.nbfp.data();
+    const real *q        = nbatParams.q.data();
+    const int  *type     = nbatParams.type.data();
+    facel                = ic->epsfac;
+    const real *shiftvec = shift_vec[0];
+    const real *x        = nbat->x().data();
 
-    l_cj = nbl->cj;
+    l_cj = nbl->cj.data();
 
-    for (n = 0; n < nbl->nci; n++)
+    for (const nbnxn_ci_t &ciEntry : nbl->ci)
     {
         int i, d;
 
-        nbln = &nbl->ci[n];
-
-        ish              = (nbln->shift & NBNXN_CI_SHIFT);
+        ish              = (ciEntry.shift & NBNXN_CI_SHIFT);
         /* x, f and fshift are assumed to be stored with stride 3 */
         ishf             = ish*DIM;
-        cjind0           = nbln->cj_ind_start;
-        cjind1           = nbln->cj_ind_end;
+        cjind0           = ciEntry.cj_ind_start;
+        cjind1           = ciEntry.cj_ind_end;
         /* Currently only works super-cells equal to sub-cells */
-        ci               = nbln->ci;
+        ci               = ciEntry.ci;
         ci_sh            = (ish == CENTRAL ? ci : -1);
 
         /* We have 5 LJ/C combinations, but use only three inner loops,
@@ -249,9 +244,9 @@ NBK_FUNC_NAME(_VgrpF) // NOLINT(misc-definitions-in-headers)
          * inner LJ + C      for full-LJ + C
          * inner LJ          for full-LJ + no-C / half-LJ + no-C
          */
-        do_LJ   = ((nbln->shift & NBNXN_CI_DO_LJ(0)) != 0);
-        do_coul = ((nbln->shift & NBNXN_CI_DO_COUL(0)) != 0);
-        half_LJ = (((nbln->shift & NBNXN_CI_HALF_LJ(0)) != 0) || !do_LJ) && do_coul;
+        do_LJ   = ((ciEntry.shift & NBNXN_CI_DO_LJ(0)) != 0);
+        do_coul = ((ciEntry.shift & NBNXN_CI_DO_COUL(0)) != 0);
+        half_LJ = (((ciEntry.shift & NBNXN_CI_HALF_LJ(0)) != 0) || !do_LJ) && do_coul;
 #ifdef CALC_ENERGIES
 
 #ifdef LJ_EWALD
@@ -266,7 +261,7 @@ NBK_FUNC_NAME(_VgrpF) // NOLINT(misc-definitions-in-headers)
 #else
         for (i = 0; i < UNROLLI; i++)
         {
-            egp_sh_i[i] = ((nbat->energrp[ci]>>(i*nbat->neg_2log)) & egp_mask)*nbat->nenergrp;
+            egp_sh_i[i] = ((nbatParams.energrp[ci] >> (i*nbatParams.neg_2log)) & egp_mask)*nbatParams.nenergrp;
         }
 #endif
 #endif
@@ -298,13 +293,13 @@ NBK_FUNC_NAME(_VgrpF) // NOLINT(misc-definitions-in-headers)
 #endif
 #endif
 
-            if (l_cj[nbln->cj_ind_start].cj == ci_sh)
+            if (l_cj[ciEntry.cj_ind_start].cj == ci_sh)
             {
                 for (i = 0; i < UNROLLI; i++)
                 {
                     int egp_ind;
 #ifdef ENERGY_GROUPS
-                    egp_ind = egp_sh_i[i] + ((nbat->energrp[ci]>>(i*nbat->neg_2log)) & egp_mask);
+                    egp_ind = egp_sh_i[i] + ((nbatParams.energrp[ci] >> (i*nbatParams.neg_2log)) & egp_mask);
 #else
                     egp_ind = 0;
 #endif
@@ -313,7 +308,7 @@ NBK_FUNC_NAME(_VgrpF) // NOLINT(misc-definitions-in-headers)
 
 #ifdef LJ_EWALD
                     /* LJ Ewald self interaction */
-                    Vvdw[egp_ind] += 0.5*nbat->nbfp[nbat->type[ci*UNROLLI+i]*(nbat->ntype + 1)*2]/6*lje_coeff6_6;
+                    Vvdw[egp_ind] += 0.5*nbatParams.nbfp[nbatParams.type[ci*UNROLLI+i]*(nbatParams.numTypes + 1)*2]/6*lje_coeff6_6;
 #endif
                 }
             }
index b9b90d8b6b89e9aed2d664fc1e719fd8816a5728..45b5eda20ae1da9c2f141e9c8184399ffed865d8 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2017, by the GROMACS development team, led by
+ * Copyright (c) 2017,2018,2019, 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.
 #include "gromacs/utility/gmxassert.h"
 
 
-/* Prune a single nbnxn_pairlist_t entry with distance rlistInner */
+/* Prune a single NbnxnPairlistCpu entry with distance rlistInner */
 void
-nbnxn_kernel_prune_ref(nbnxn_pairlist_t *         nbl,
+nbnxn_kernel_prune_ref(NbnxnPairlistCpu *         nbl,
                        const nbnxn_atomdata_t *   nbat,
                        const rvec * gmx_restrict  shift_vec,
                        real                       rlistInner)
 {
-    const nbnxn_ci_t * gmx_restrict ciOuter  = nbl->ciOuter;
-    nbnxn_ci_t       * gmx_restrict ciInner  = nbl->ci;
+    /* We avoid push_back() for efficiency reasons and resize after filling */
+    nbl->ci.resize(nbl->ciOuter.size());
+    nbl->cj.resize(nbl->cjOuter.size());
 
-    const nbnxn_cj_t * gmx_restrict cjOuter   = nbl->cjOuter;
-    nbnxn_cj_t       * gmx_restrict cjInner   = nbl->cj;
+    const nbnxn_ci_t * gmx_restrict ciOuter  = nbl->ciOuter.data();
+    nbnxn_ci_t       * gmx_restrict ciInner  = nbl->ci.data();
+
+    const nbnxn_cj_t * gmx_restrict cjOuter   = nbl->cjOuter.data();
+    nbnxn_cj_t       * gmx_restrict cjInner   = nbl->cj.data();
 
     const real       * gmx_restrict shiftvec = shift_vec[0];
-    const real       * gmx_restrict x        = nbat->x;
+    const real       * gmx_restrict x        = nbat->x().data();
 
     const real                      rlist2   = rlistInner*rlistInner;
 
@@ -65,13 +69,14 @@ nbnxn_kernel_prune_ref(nbnxn_pairlist_t *         nbl,
     GMX_ASSERT(c_xStride == nbat->xstride, "xStride should match nbat->xstride");
     constexpr int c_xiStride = 3;
 
-    constexpr int c_iUnroll  = NBNXN_CPU_CLUSTER_I_SIZE;
-    constexpr int c_jUnroll  = NBNXN_CPU_CLUSTER_I_SIZE;
+    constexpr int c_iUnroll  = c_nbnxnCpuIClusterSize;
+    constexpr int c_jUnroll  = c_nbnxnCpuIClusterSize;
 
     /* Initialize the new list as empty and add pairs that are in range */
-    int nciInner = 0;
-    int ncjInner = 0;
-    for (int ciIndex = 0; ciIndex < nbl->nciOuter; ciIndex++)
+    int       nciInner = 0;
+    int       ncjInner = 0;
+    const int nciOuter = nbl->ciOuter.size();
+    for (int ciIndex = 0; ciIndex < nciOuter; ciIndex++)
     {
         const nbnxn_ci_t * gmx_restrict ciEntry = &ciOuter[ciIndex];
 
@@ -134,5 +139,6 @@ nbnxn_kernel_prune_ref(nbnxn_pairlist_t *         nbl,
         }
     }
 
-    nbl->nci = nciInner;
+    nbl->ci.resize(nciInner);
+    nbl->cj.resize(ncjInner);
 }
index 3719ec0219eb65a459a69d838daa6cbe6805e3df..03dafde9dcdb363877935fc42719f4789415bb26 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2017, by the GROMACS development team, led by
+ * Copyright (c) 2017,2018,2019, 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.
 #include "gromacs/utility/real.h"
 
 struct nbnxn_atomdata_t;
-struct nbnxn_pairlist_t;
+struct NbnxnPairlistCpu;
 
-/*! \brief Prune a single nbnxn_pairlist_t entry with distance \p rlistInner
+/*! \brief Prune a single NbnxnPairlistCpu entry with distance \p rlistInner
  *
  * Reads a cluster pairlist \p nbl->ciOuter, \p nbl->cjOuter and writes
  * all cluster pairs within \p rlistInner to \p nbl->ci, \p nbl->cj.
  */
 void
-nbnxn_kernel_prune_ref(nbnxn_pairlist_t *         nbl,
+nbnxn_kernel_prune_ref(NbnxnPairlistCpu *         nbl,
                        const nbnxn_atomdata_t *   nbat,
                        const rvec * gmx_restrict  shift_vec,
                        real                       rlistInner);
index 473eafb90b3462ce51e7ab2ef13c50175eb36225..dd1a187bced74301f08855a6def9f8f4e560ed4e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                 const nbnxn_atomdata_t    gmx_unused *nbat,
                                                 const interaction_const_t gmx_unused *ic,
                                                 rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_F_2xnn(const nbnxn_pairlist_t    gmx_un
                                                 real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                 const nbnxn_atomdata_t    gmx_unused *nbat,
                                                 const interaction_const_t gmx_unused *ic,
                                                 rvec                      gmx_unused *shift_vec,
index 4f769e1e0df633e279e4f517b2f67c88467469e4..58e2c4f9be8825653a25714fd39e4efb590a8405 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                  const nbnxn_atomdata_t    gmx_unused *nbat,
                                                  const interaction_const_t gmx_unused *ic,
                                                  rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VF_2xnn(const nbnxn_pairlist_t    gmx_u
                                                  real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                  const nbnxn_atomdata_t    gmx_unused *nbat,
                                                  const interaction_const_t gmx_unused *ic,
                                                  rvec                      gmx_unused *shift_vec,
index bd9d52f1f798a32df9762e34ac6bc6239cc2edec..29ada8ac23fdb4c53f5ddef1cde662c6b2d1193c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                                     const interaction_const_t gmx_unused *ic,
                                                     rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t    gm
                                                     real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                                     const interaction_const_t gmx_unused *ic,
                                                     rvec                      gmx_unused *shift_vec,
index 838f1ce21b1e15ecfce82d4041e6cc1c5c30e467..4ce8011cac7d1f4be4e995ba7f171304e517acc3 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                               const nbnxn_atomdata_t    gmx_unused *nbat,
                                               const interaction_const_t gmx_unused *ic,
                                               rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_F_2xnn(const nbnxn_pairlist_t    gmx_unus
                                               real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                               const nbnxn_atomdata_t    gmx_unused *nbat,
                                               const interaction_const_t gmx_unused *ic,
                                               rvec                      gmx_unused *shift_vec,
index 761169f32c2eb9790a2943c9107c63f6d29e6e94..5d653900033862cf65aa364951185a6dfc5e07e8 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                const nbnxn_atomdata_t    gmx_unused *nbat,
                                                const interaction_const_t gmx_unused *ic,
                                                rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VF_2xnn(const nbnxn_pairlist_t    gmx_unu
                                                real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                const nbnxn_atomdata_t    gmx_unused *nbat,
                                                const interaction_const_t gmx_unused *ic,
                                                rvec                      gmx_unused *shift_vec,
index 352f1567f2d1ce55da77a81fe44a74161dbcd78b..57644576a74181a4cf55282b599bf7d5834546a6 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                   const nbnxn_atomdata_t    gmx_unused *nbat,
                                                   const interaction_const_t gmx_unused *ic,
                                                   rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_
                                                   real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                   const nbnxn_atomdata_t    gmx_unused *nbat,
                                                   const interaction_const_t gmx_unused *ic,
                                                   rvec                      gmx_unused *shift_vec,
index 10e2f61c5e4f293deb439511cf85bfcf6328a94b..cc9cf92a0e85ed6bb7ce828655d1d543b0f853dd 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                   const nbnxn_atomdata_t    gmx_unused *nbat,
                                                   const interaction_const_t gmx_unused *ic,
                                                   rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_F_2xnn(const nbnxn_pairlist_t    gmx_
                                                   real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                   const nbnxn_atomdata_t    gmx_unused *nbat,
                                                   const interaction_const_t gmx_unused *ic,
                                                   rvec                      gmx_unused *shift_vec,
index fb2b9d3977a94699809947347900f4e9ee5aa979..aa5d8d393fae94800423b75bdd1cf16d90dd6819 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                    const nbnxn_atomdata_t    gmx_unused *nbat,
                                                    const interaction_const_t gmx_unused *ic,
                                                    rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VF_2xnn(const nbnxn_pairlist_t    gmx
                                                    real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                    const nbnxn_atomdata_t    gmx_unused *nbat,
                                                    const interaction_const_t gmx_unused *ic,
                                                    rvec                      gmx_unused *shift_vec,
index 8f32a24b4dc26160bd45e44feb59cc4c8cbd2935..c2bd06803cfd6cbe2b398d42d2c688f9349f7f13 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -65,7 +65,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                       const nbnxn_atomdata_t    gmx_unused *nbat,
                                                       const interaction_const_t gmx_unused *ic,
                                                       rvec                      gmx_unused *shift_vec,
@@ -75,7 +75,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t
                                                       real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                       const nbnxn_atomdata_t    gmx_unused *nbat,
                                                       const interaction_const_t gmx_unused *ic,
                                                       rvec                      gmx_unused *shift_vec,
index 987ebaca0108b65eff22e0cfd4eb1c80c870c180..9ed5b8d26ac80334b09134b4e3f5c9862a463819 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_F_2xnn(const nbnxn_pairlist_t    gmx_unused
                                            real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
index 45e6fb270ba068b258b3c7c513d79313af39c487..320a6aaafb2397711b13290b623757bda2fd2801 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                             const nbnxn_atomdata_t    gmx_unused *nbat,
                                             const interaction_const_t gmx_unused *ic,
                                             rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unused
                                             real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                             const nbnxn_atomdata_t    gmx_unused *nbat,
                                             const interaction_const_t gmx_unused *ic,
                                             rvec                      gmx_unused *shift_vec,
index f277614dd6d5757336a6514e07727a78e78c25ca..0a47eeff3e3a803c749e5cb76d355e5937efebc4 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                const nbnxn_atomdata_t    gmx_unused *nbat,
                                                const interaction_const_t gmx_unused *ic,
                                                rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unu
                                                real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                const nbnxn_atomdata_t    gmx_unused *nbat,
                                                const interaction_const_t gmx_unused *ic,
                                                rvec                      gmx_unused *shift_vec,
index d9dfdc76058f610d5e29d58c2ade9c89684fd770..6051b500118d86e5cb9440c0a3526f166dd2dfdd 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_F_2xnn(const nbnxn_pairlist_t    gmx_unused
                                            real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
index f500fbd729f161fcfc6e6c7af27120b2576287d3..2ba8f90aaa466a40d55a5b7dc536a745f602cf61 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                             const nbnxn_atomdata_t    gmx_unused *nbat,
                                             const interaction_const_t gmx_unused *ic,
                                             rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unused
                                             real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                             const nbnxn_atomdata_t    gmx_unused *nbat,
                                             const interaction_const_t gmx_unused *ic,
                                             rvec                      gmx_unused *shift_vec,
index f312e9fd2994b76eae955e0187cb12c01277195f..a98934c58ac84780c45216b28d1ee7968b79f740 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                const nbnxn_atomdata_t    gmx_unused *nbat,
                                                const interaction_const_t gmx_unused *ic,
                                                rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unu
                                                real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                const nbnxn_atomdata_t    gmx_unused *nbat,
                                                const interaction_const_t gmx_unused *ic,
                                                rvec                      gmx_unused *shift_vec,
index c4c6fbfc5deaf8fc55016a89c092a979d2b3e95f..61c5c51efb42ab695494ae7bab0b14f19e799e95 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJ_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJ_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                         const nbnxn_atomdata_t    gmx_unused *nbat,
                                         const interaction_const_t gmx_unused *ic,
                                         rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJ_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nb
                                         real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJ_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJ_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                         const nbnxn_atomdata_t    gmx_unused *nbat,
                                         const interaction_const_t gmx_unused *ic,
                                         rvec                      gmx_unused *shift_vec,
index fbd89d8495878733866be6cf02b73b0bef32a08c..af5d6f3367be53dfd37fdb5c0541e741e0a5ff15 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJ_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJ_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                          const nbnxn_atomdata_t    gmx_unused *nbat,
                                          const interaction_const_t gmx_unused *ic,
                                          rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJ_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *n
                                          real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJ_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJ_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                          const nbnxn_atomdata_t    gmx_unused *nbat,
                                          const interaction_const_t gmx_unused *ic,
                                          rvec                      gmx_unused *shift_vec,
index 44d1f482dc2fa39531efe8e183788629c0d873be..a851ab569c78afa97bb7ea44a896643960fb142d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJ_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJ_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                             const nbnxn_atomdata_t    gmx_unused *nbat,
                                             const interaction_const_t gmx_unused *ic,
                                             rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJ_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused
                                             real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJ_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJ_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                             const nbnxn_atomdata_t    gmx_unused *nbat,
                                             const interaction_const_t gmx_unused *ic,
                                             rvec                      gmx_unused *shift_vec,
index e75fa095df0437386f6d50f3a3b4e930ef51fd35..2af7841e447e7b60538a9200a05d6503584a8e37 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJCombGeom_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombGeom_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                          const nbnxn_atomdata_t    gmx_unused *nbat,
                                          const interaction_const_t gmx_unused *ic,
                                          rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecEw_VdwLJCombGeom_F_2xnn(const nbnxn_pairlist_t    gmx_unused *n
                                          real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJCombGeom_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombGeom_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                          const nbnxn_atomdata_t    gmx_unused *nbat,
                                          const interaction_const_t gmx_unused *ic,
                                          rvec                      gmx_unused *shift_vec,
index 6da1e829ce8ee7a45748cc7ae329a2fa1f7b5c27..2bab57560bb1e551304c1d3b3daef5773604bf70 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJCombGeom_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombGeom_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                           const nbnxn_atomdata_t    gmx_unused *nbat,
                                           const interaction_const_t gmx_unused *ic,
                                           rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecEw_VdwLJCombGeom_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *
                                           real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJCombGeom_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombGeom_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                           const nbnxn_atomdata_t    gmx_unused *nbat,
                                           const interaction_const_t gmx_unused *ic,
                                           rvec                      gmx_unused *shift_vec,
index 5119a6db497769fc33f950c829202816312424cb..7e3dd8ca6a85b2aa8f8f257de3a251e7db72d694 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                              const nbnxn_atomdata_t    gmx_unused *nbat,
                                              const interaction_const_t gmx_unused *ic,
                                              rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEw_VdwLJCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unuse
                                              real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                              const nbnxn_atomdata_t    gmx_unused *nbat,
                                              const interaction_const_t gmx_unused *ic,
                                              rvec                      gmx_unused *shift_vec,
index 56bc3efdc18fc650d25b98d876ca9afb4f96df0f..fe92831245eb8dd8e74f48546b6104cd61621abf 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJCombLB_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombLB_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                        const interaction_const_t gmx_unused *ic,
                                        rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecEw_VdwLJCombLB_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl
                                        real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJCombLB_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombLB_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                        const interaction_const_t gmx_unused *ic,
                                        rvec                      gmx_unused *shift_vec,
index 99eda6a1cf0a186ef86083ca6c7c46634041849f..7b52a2c50fa432495d8928eada5bbf4c32e99f32 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJCombLB_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombLB_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                         const nbnxn_atomdata_t    gmx_unused *nbat,
                                         const interaction_const_t gmx_unused *ic,
                                         rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecEw_VdwLJCombLB_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nb
                                         real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJCombLB_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombLB_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                         const nbnxn_atomdata_t    gmx_unused *nbat,
                                         const interaction_const_t gmx_unused *ic,
                                         rvec                      gmx_unused *shift_vec,
index 1f874b7d0e745dc8323f94eab06ac258f4a1fa36..cfbbd559f48896160f8f45cb3eae99ccb0b54fcd 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJCombLB_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombLB_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEw_VdwLJCombLB_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused
                                            real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJCombLB_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombLB_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
index 85b382737923f39db5de2cac98f2193dedf2abc7..ec72823afaa3e15f4bacbb42d3da87a51f4a453c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJEwCombGeom_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJEwCombGeom_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEw_VdwLJEwCombGeom_F_2xnn(const nbnxn_pairlist_t    gmx_unused
                                            real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJEwCombGeom_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJEwCombGeom_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
index 8f9825d2caff2bd482be7bfdaeb12e146ba89eb0..ab83c5797274badb9f25d1118f5d277d302ea58d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                             const nbnxn_atomdata_t    gmx_unused *nbat,
                                             const interaction_const_t gmx_unused *ic,
                                             rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VF_2xnn(const nbnxn_pairlist_t    gmx_unused
                                             real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                             const nbnxn_atomdata_t    gmx_unused *nbat,
                                             const interaction_const_t gmx_unused *ic,
                                             rvec                      gmx_unused *shift_vec,
index ca951979668024f44b41613394b170da7c84b011..02f465e4e82bc014338afc7d77a7a96d537bdf38 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                const nbnxn_atomdata_t    gmx_unused *nbat,
                                                const interaction_const_t gmx_unused *ic,
                                                rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unu
                                                real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                const nbnxn_atomdata_t    gmx_unused *nbat,
                                                const interaction_const_t gmx_unused *ic,
                                                rvec                      gmx_unused *shift_vec,
index 462c581ef565794f2e85b3902e6510786548f1d7..43cadb5261873842b2e89b3c6b7858fb0b7ac843 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJFSw_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJFSw_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                     const interaction_const_t gmx_unused *ic,
                                     rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecEw_VdwLJFSw_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                     real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJFSw_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJFSw_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                     const interaction_const_t gmx_unused *ic,
                                     rvec                      gmx_unused *shift_vec,
index 057812faf3de0c31d28596684e99a2340b1173b8..ef960e4082429bf7954e70b3917c5c3fb2bcf898 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJFSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJFSw_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                      const nbnxn_atomdata_t    gmx_unused *nbat,
                                      const interaction_const_t gmx_unused *ic,
                                      rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecEw_VdwLJFSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                      real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJFSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJFSw_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                      const nbnxn_atomdata_t    gmx_unused *nbat,
                                      const interaction_const_t gmx_unused *ic,
                                      rvec                      gmx_unused *shift_vec,
index 089012fc1b150010cf40c06b15c0b33d700e04a8..2b23e5d08014236a7df0a901317ae308bf16123d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJFSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJFSw_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                         const nbnxn_atomdata_t    gmx_unused *nbat,
                                         const interaction_const_t gmx_unused *ic,
                                         rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEw_VdwLJFSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nb
                                         real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJFSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJFSw_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                         const nbnxn_atomdata_t    gmx_unused *nbat,
                                         const interaction_const_t gmx_unused *ic,
                                         rvec                      gmx_unused *shift_vec,
index 76b61c8f5a91b2f768610311e584f477240d80f3..e08309d2a3b8070bdfa7330ee042590cd663018c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJPSw_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJPSw_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                     const interaction_const_t gmx_unused *ic,
                                     rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecEw_VdwLJPSw_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                     real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJPSw_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJPSw_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                     const interaction_const_t gmx_unused *ic,
                                     rvec                      gmx_unused *shift_vec,
index 63d8cb91f0760819ff3fe893de0ba119456fe328..cb9b45ee346a14c54b15180c022e9606e78c099b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJPSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJPSw_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                      const nbnxn_atomdata_t    gmx_unused *nbat,
                                      const interaction_const_t gmx_unused *ic,
                                      rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecEw_VdwLJPSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                      real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJPSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJPSw_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                      const nbnxn_atomdata_t    gmx_unused *nbat,
                                      const interaction_const_t gmx_unused *ic,
                                      rvec                      gmx_unused *shift_vec,
index 23198afbcacf77d0285527c0bda590e7580107e1..204ca9f08e860de00f9196adec092db21fea65be 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJPSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJPSw_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                         const nbnxn_atomdata_t    gmx_unused *nbat,
                                         const interaction_const_t gmx_unused *ic,
                                         rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEw_VdwLJPSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nb
                                         real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJPSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJPSw_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                         const nbnxn_atomdata_t    gmx_unused *nbat,
                                         const interaction_const_t gmx_unused *ic,
                                         rvec                      gmx_unused *shift_vec,
index 64543863f4baa10f13464e6afe452351326adfe1..b441cc86b067b53583f9280ea6eb15bbe440b67e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJ_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJ_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                  const nbnxn_atomdata_t    gmx_unused *nbat,
                                  const interaction_const_t gmx_unused *ic,
                                  rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecEw_VdwLJ_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                  real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJ_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJ_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                  const nbnxn_atomdata_t    gmx_unused *nbat,
                                  const interaction_const_t gmx_unused *ic,
                                  rvec                      gmx_unused *shift_vec,
index fa5fb67d790b52020c652bb9f2682601c910a9d9..2ff900f9eeabb113e28e52a4fcfa1ce7118e4987 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJ_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJ_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                   const nbnxn_atomdata_t    gmx_unused *nbat,
                                   const interaction_const_t gmx_unused *ic,
                                   rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecEw_VdwLJ_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                   real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJ_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJ_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                   const nbnxn_atomdata_t    gmx_unused *nbat,
                                   const interaction_const_t gmx_unused *ic,
                                   rvec                      gmx_unused *shift_vec,
index 5129a03a46cd0a4cc9371734a90b4bebb6f25fb0..6c1485720c051aa88d23a9cef7ba16e440cbcc87 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJ_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJ_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                      const nbnxn_atomdata_t    gmx_unused *nbat,
                                      const interaction_const_t gmx_unused *ic,
                                      rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEw_VdwLJ_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                      real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJ_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJ_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                      const nbnxn_atomdata_t    gmx_unused *nbat,
                                      const interaction_const_t gmx_unused *ic,
                                      rvec                      gmx_unused *shift_vec,
index c9b9395048cba23dd493a561b08c8163494ebac4..1d4a1fc7a5cbb40b3f9cfa68eb625a6614333acc 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                    const nbnxn_atomdata_t    gmx_unused *nbat,
                                                    const interaction_const_t gmx_unused *ic,
                                                    rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_F_2xnn(const nbnxn_pairlist_t    gmx
                                                    real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                    const nbnxn_atomdata_t    gmx_unused *nbat,
                                                    const interaction_const_t gmx_unused *ic,
                                                    rvec                      gmx_unused *shift_vec,
index 09c9b702b2367a56f8c04c092ff2744ce5c94845..4a37fe8ecae77f67cec67c652e2f7ae17c23a1de 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                                     const interaction_const_t gmx_unused *ic,
                                                     rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VF_2xnn(const nbnxn_pairlist_t    gm
                                                     real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                                     const interaction_const_t gmx_unused *ic,
                                                     rvec                      gmx_unused *shift_vec,
index 9c40a9351dd84f357575a8c083f40ff60731882a..5cffddb30de570a226543f7f8593d0e1cf66891d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                                        const interaction_const_t gmx_unused *ic,
                                                        rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t
                                                        real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                                        const interaction_const_t gmx_unused *ic,
                                                        rvec                      gmx_unused *shift_vec,
index f3c47617be54c99e171eff0a6ec0d32bc167ae10..6135b976aab2cb6e709f791ac2ecd1cbac2c3de5 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                  const nbnxn_atomdata_t    gmx_unused *nbat,
                                                  const interaction_const_t gmx_unused *ic,
                                                  rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_F_2xnn(const nbnxn_pairlist_t    gmx_u
                                                  real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                  const nbnxn_atomdata_t    gmx_unused *nbat,
                                                  const interaction_const_t gmx_unused *ic,
                                                  rvec                      gmx_unused *shift_vec,
index 06582be78a9f5e08f5f004ba8905d8088db68e1e..aa092a43115dcd6fa99d255daca0c055ec25c6bb 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                   const nbnxn_atomdata_t    gmx_unused *nbat,
                                                   const interaction_const_t gmx_unused *ic,
                                                   rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VF_2xnn(const nbnxn_pairlist_t    gmx_
                                                   real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                   const nbnxn_atomdata_t    gmx_unused *nbat,
                                                   const interaction_const_t gmx_unused *ic,
                                                   rvec                      gmx_unused *shift_vec,
index db9291701fe03202217e6f5349f3c48b513d6686..5aee623b9d6dfc63cf03ef597181ed56e9a3a378 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                      const nbnxn_atomdata_t    gmx_unused *nbat,
                                                      const interaction_const_t gmx_unused *ic,
                                                      rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VgrpF_2xnn(const nbnxn_pairlist_t    g
                                                      real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                      const nbnxn_atomdata_t    gmx_unused *nbat,
                                                      const interaction_const_t gmx_unused *ic,
                                                      rvec                      gmx_unused *shift_vec,
index b59a7b216fc5ad7ca79991c74dd2f414f7a125ec..fc4c259df1d5c40ad6cb7e5765b5b28a6fc05a82 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                      const nbnxn_atomdata_t    gmx_unused *nbat,
                                                      const interaction_const_t gmx_unused *ic,
                                                      rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_F_2xnn(const nbnxn_pairlist_t    g
                                                      real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                      const nbnxn_atomdata_t    gmx_unused *nbat,
                                                      const interaction_const_t gmx_unused *ic,
                                                      rvec                      gmx_unused *shift_vec,
index 03aca52130b04b9642d328115fdd57fedbef398d..11a05d6c25255e7012266b155d31f14369dddd23 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                       const nbnxn_atomdata_t    gmx_unused *nbat,
                                                       const interaction_const_t gmx_unused *ic,
                                                       rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VF_2xnn(const nbnxn_pairlist_t
                                                       real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                       const nbnxn_atomdata_t    gmx_unused *nbat,
                                                       const interaction_const_t gmx_unused *ic,
                                                       rvec                      gmx_unused *shift_vec,
index b1dd28f3221744af34468d7b43e3dbb0c9d9140b..00b979864ab10ccaed20d8f55e05c54e4ea1b677 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -65,7 +65,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                          const nbnxn_atomdata_t    gmx_unused *nbat,
                                                          const interaction_const_t gmx_unused *ic,
                                                          rvec                      gmx_unused *shift_vec,
@@ -75,7 +75,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t
                                                          real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                          const nbnxn_atomdata_t    gmx_unused *nbat,
                                                          const interaction_const_t gmx_unused *ic,
                                                          rvec                      gmx_unused *shift_vec,
index 277c27d9cf086631c2e937dae30ba336d52aa458..d3006d04dd8674c67af3e95cb8d474c50dd20482 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                               const nbnxn_atomdata_t    gmx_unused *nbat,
                                               const interaction_const_t gmx_unused *ic,
                                               rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_F_2xnn(const nbnxn_pairlist_t    gmx_unus
                                               real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                               const nbnxn_atomdata_t    gmx_unused *nbat,
                                               const interaction_const_t gmx_unused *ic,
                                               rvec                      gmx_unused *shift_vec,
index 9e96a994cd4e49c923052d06b2cc64fc628dc764..642c3e4b504aa71458dc226662eda18b80b84503 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                const nbnxn_atomdata_t    gmx_unused *nbat,
                                                const interaction_const_t gmx_unused *ic,
                                                rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unu
                                                real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                const nbnxn_atomdata_t    gmx_unused *nbat,
                                                const interaction_const_t gmx_unused *ic,
                                                rvec                      gmx_unused *shift_vec,
index 9b0248a11bb8c38b9267a94413212eb5a8d32597..ff6e160e134710f8727881d4f9cc625cb2918b09 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                   const nbnxn_atomdata_t    gmx_unused *nbat,
                                                   const interaction_const_t gmx_unused *ic,
                                                   rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_
                                                   real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                   const nbnxn_atomdata_t    gmx_unused *nbat,
                                                   const interaction_const_t gmx_unused *ic,
                                                   rvec                      gmx_unused *shift_vec,
index d8285ea0ef57556897885157defdd0cf410009e0..c21dd62f3ec1275c2d84b80894e7af58a320fa09 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                               const nbnxn_atomdata_t    gmx_unused *nbat,
                                               const interaction_const_t gmx_unused *ic,
                                               rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_F_2xnn(const nbnxn_pairlist_t    gmx_unus
                                               real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                               const nbnxn_atomdata_t    gmx_unused *nbat,
                                               const interaction_const_t gmx_unused *ic,
                                               rvec                      gmx_unused *shift_vec,
index f83b0195bf0abb38640ceaf0ff85c5bdf3deca7f..2f8ec63e0953f21a14ccb2f45277aad9532e20e4 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                const nbnxn_atomdata_t    gmx_unused *nbat,
                                                const interaction_const_t gmx_unused *ic,
                                                rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unu
                                                real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                const nbnxn_atomdata_t    gmx_unused *nbat,
                                                const interaction_const_t gmx_unused *ic,
                                                rvec                      gmx_unused *shift_vec,
index 4e418cb44eb3e1f517c2caa4cba4ef6766578540..aa68ca5725829075a03665da19fbe00cdd3653d7 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                   const nbnxn_atomdata_t    gmx_unused *nbat,
                                                   const interaction_const_t gmx_unused *ic,
                                                   rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_
                                                   real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                   const nbnxn_atomdata_t    gmx_unused *nbat,
                                                   const interaction_const_t gmx_unused *ic,
                                                   rvec                      gmx_unused *shift_vec,
index 40329a0bfc9cbc42f077f876f99918892214041f..08255fa86693a263fbcc3915d3c69a9ed1582b3e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_F_2xnn(const nbnxn_pairlist_t    gmx_unused
                                            real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
index 1411a21358bcbe79aad0f9bf61af98c797eed603..f2d42ac0c03437ddef8a3a257f85f489e3e63397 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                             const nbnxn_atomdata_t    gmx_unused *nbat,
                                             const interaction_const_t gmx_unused *ic,
                                             rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VF_2xnn(const nbnxn_pairlist_t    gmx_unused
                                             real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                             const nbnxn_atomdata_t    gmx_unused *nbat,
                                             const interaction_const_t gmx_unused *ic,
                                             rvec                      gmx_unused *shift_vec,
index 6ab1e3e4f58d42b6c5bef74df2cedae63f339e98..1545776ec5f1c95e0aac04f336ceaaad7c5f7f44 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                const nbnxn_atomdata_t    gmx_unused *nbat,
                                                const interaction_const_t gmx_unused *ic,
                                                rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unu
                                                real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                const nbnxn_atomdata_t    gmx_unused *nbat,
                                                const interaction_const_t gmx_unused *ic,
                                                rvec                      gmx_unused *shift_vec,
index 87c2579381f1d4cd60d80fca6bf7c219aee49c27..86a69f388a9da30de09e08fd03f73320c39ff87b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJCombGeom_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombGeom_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                             const nbnxn_atomdata_t    gmx_unused *nbat,
                                             const interaction_const_t gmx_unused *ic,
                                             rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecQSTab_VdwLJCombGeom_F_2xnn(const nbnxn_pairlist_t    gmx_unused
                                             real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJCombGeom_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombGeom_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                             const nbnxn_atomdata_t    gmx_unused *nbat,
                                             const interaction_const_t gmx_unused *ic,
                                             rvec                      gmx_unused *shift_vec,
index 43092fa5be553148b8e79f7c92a788aa5ca5d155..9377660eb1f32be3f7526ddac38812e971fcbb58 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                              const nbnxn_atomdata_t    gmx_unused *nbat,
                                              const interaction_const_t gmx_unused *ic,
                                              rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VF_2xnn(const nbnxn_pairlist_t    gmx_unuse
                                              real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                              const nbnxn_atomdata_t    gmx_unused *nbat,
                                              const interaction_const_t gmx_unused *ic,
                                              rvec                      gmx_unused *shift_vec,
index 9745cd4a4367724cbf6258cdcc2e1a7e1f713385..39d54a048d02eca8a1f9df8387370c41f42fc4ea 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                 const nbnxn_atomdata_t    gmx_unused *nbat,
                                                 const interaction_const_t gmx_unused *ic,
                                                 rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_un
                                                 real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                 const nbnxn_atomdata_t    gmx_unused *nbat,
                                                 const interaction_const_t gmx_unused *ic,
                                                 rvec                      gmx_unused *shift_vec,
index 84b3c3f6f2170dbdf4e071021ddaf75261f0eaa9..c840a375ba3d890b4c93b17bd160342da2f32516 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJCombLB_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombLB_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                           const nbnxn_atomdata_t    gmx_unused *nbat,
                                           const interaction_const_t gmx_unused *ic,
                                           rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecQSTab_VdwLJCombLB_F_2xnn(const nbnxn_pairlist_t    gmx_unused *
                                           real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJCombLB_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombLB_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                           const nbnxn_atomdata_t    gmx_unused *nbat,
                                           const interaction_const_t gmx_unused *ic,
                                           rvec                      gmx_unused *shift_vec,
index b547073f58fe57c8ecddf6626ab123ece165cadf..a5fc775781d48218c6da3953e3a59f25fae8422b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJCombLB_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombLB_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecQSTab_VdwLJCombLB_VF_2xnn(const nbnxn_pairlist_t    gmx_unused
                                            real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJCombLB_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombLB_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
index e4a45194e4f5737467be53d1a140dacf1e550d2c..2905e5770a39f8980fe929eb90a2ecbb2b22df25 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJCombLB_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombLB_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                               const nbnxn_atomdata_t    gmx_unused *nbat,
                                               const interaction_const_t gmx_unused *ic,
                                               rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTab_VdwLJCombLB_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unus
                                               real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJCombLB_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombLB_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                               const nbnxn_atomdata_t    gmx_unused *nbat,
                                               const interaction_const_t gmx_unused *ic,
                                               rvec                      gmx_unused *shift_vec,
index 7983ce5cba8d2c7efb5b9811a36bbd3ea00b445c..c3b1db3766dd5bc02a09236ccd496a8fa0d82e0a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                               const nbnxn_atomdata_t    gmx_unused *nbat,
                                               const interaction_const_t gmx_unused *ic,
                                               rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_F_2xnn(const nbnxn_pairlist_t    gmx_unus
                                               real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                               const nbnxn_atomdata_t    gmx_unused *nbat,
                                               const interaction_const_t gmx_unused *ic,
                                               rvec                      gmx_unused *shift_vec,
index 37a717b0828ca9dad49ecf5d030f431ecc79f3e3..c3940fca0d5374a6b84633949b8389236674202c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                const nbnxn_atomdata_t    gmx_unused *nbat,
                                                const interaction_const_t gmx_unused *ic,
                                                rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VF_2xnn(const nbnxn_pairlist_t    gmx_unu
                                                real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                const nbnxn_atomdata_t    gmx_unused *nbat,
                                                const interaction_const_t gmx_unused *ic,
                                                rvec                      gmx_unused *shift_vec,
index 8740e7deeefa58a9ee9ffcf4ab58a7afca8637e2..67723dce7f24c12780abe0acd2ac0b7912b0ae7c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                   const nbnxn_atomdata_t    gmx_unused *nbat,
                                                   const interaction_const_t gmx_unused *ic,
                                                   rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_
                                                   real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                   const nbnxn_atomdata_t    gmx_unused *nbat,
                                                   const interaction_const_t gmx_unused *ic,
                                                   rvec                      gmx_unused *shift_vec,
index 3d67e2e143fe6e64b896ef4fec8f6d1a1504f6f0..4ab0ab04db6a3ffe47c82a98cb0e6007fa180eda 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJFSw_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJFSw_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                        const interaction_const_t gmx_unused *ic,
                                        rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecQSTab_VdwLJFSw_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl
                                        real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJFSw_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJFSw_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                        const interaction_const_t gmx_unused *ic,
                                        rvec                      gmx_unused *shift_vec,
index 352337dfd5531bb04a82002dcf1ae239d431bd36..e912b42741754c4b36d31aac96f56686e0272604 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJFSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJFSw_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                         const nbnxn_atomdata_t    gmx_unused *nbat,
                                         const interaction_const_t gmx_unused *ic,
                                         rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecQSTab_VdwLJFSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nb
                                         real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJFSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJFSw_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                         const nbnxn_atomdata_t    gmx_unused *nbat,
                                         const interaction_const_t gmx_unused *ic,
                                         rvec                      gmx_unused *shift_vec,
index 340a2dd881664500e6e6d0505a5a3ffc4fce33ac..b51ec9dea56b28d944f4c2ef663bd66c80538c0c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJFSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJFSw_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTab_VdwLJFSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused
                                            real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJFSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJFSw_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
index 0af087eab8b80590196858fdacaa21881172ba82..67c43d6f44b75f10470b5275156fb08e37c3c57a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJPSw_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJPSw_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                        const interaction_const_t gmx_unused *ic,
                                        rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecQSTab_VdwLJPSw_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl
                                        real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJPSw_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJPSw_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                        const interaction_const_t gmx_unused *ic,
                                        rvec                      gmx_unused *shift_vec,
index 5784556c7268b6800bf719075cedd902e8094198..438aedd1805149d4678772467220cd8cb93ce363 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJPSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJPSw_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                         const nbnxn_atomdata_t    gmx_unused *nbat,
                                         const interaction_const_t gmx_unused *ic,
                                         rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecQSTab_VdwLJPSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nb
                                         real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJPSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJPSw_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                         const nbnxn_atomdata_t    gmx_unused *nbat,
                                         const interaction_const_t gmx_unused *ic,
                                         rvec                      gmx_unused *shift_vec,
index ad942ab23bbdaaeead5d54cebf27f26fbb70138a..4cc4005f403802f932c40b2c9340ff3116cdc0f2 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJPSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJPSw_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTab_VdwLJPSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused
                                            real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJPSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJPSw_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
index f1b39645ed779b874e023b13d63468651f418649..14bb6b95413ae556393052ff3c4eee21ecff835f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJ_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJ_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                     const interaction_const_t gmx_unused *ic,
                                     rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecQSTab_VdwLJ_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                     real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJ_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJ_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                     const interaction_const_t gmx_unused *ic,
                                     rvec                      gmx_unused *shift_vec,
index 5932c4c8ccf26fd2914bf37e75a84e20c8517ae8..3dce0d795eef6a5f783acd98eda98823cb352080 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJ_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJ_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                      const nbnxn_atomdata_t    gmx_unused *nbat,
                                      const interaction_const_t gmx_unused *ic,
                                      rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecQSTab_VdwLJ_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                      real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJ_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJ_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                      const nbnxn_atomdata_t    gmx_unused *nbat,
                                      const interaction_const_t gmx_unused *ic,
                                      rvec                      gmx_unused *shift_vec,
index 3a9c256a8627fe15d0ca7efbd211ed4978ad2423..1353281499caea682eec35ae002f3dd2340287c6 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJ_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJ_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                         const nbnxn_atomdata_t    gmx_unused *nbat,
                                         const interaction_const_t gmx_unused *ic,
                                         rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTab_VdwLJ_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nb
                                         real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJ_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJ_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                         const nbnxn_atomdata_t    gmx_unused *nbat,
                                         const interaction_const_t gmx_unused *ic,
                                         rvec                      gmx_unused *shift_vec,
index 718b3c8f85d17d996274908a2d1b6fb7c272820b..6a87128b0156634d6aba8dfb8e82cc3adf4e583f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJCombGeom_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombGeom_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                          const nbnxn_atomdata_t    gmx_unused *nbat,
                                          const interaction_const_t gmx_unused *ic,
                                          rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecRF_VdwLJCombGeom_F_2xnn(const nbnxn_pairlist_t    gmx_unused *n
                                          real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJCombGeom_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombGeom_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                          const nbnxn_atomdata_t    gmx_unused *nbat,
                                          const interaction_const_t gmx_unused *ic,
                                          rvec                      gmx_unused *shift_vec,
index d1ce7751de7529849e768381e559afd51e01812c..25e0e44dbbec931a9450a268e08c9492794c1564 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJCombGeom_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombGeom_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                           const nbnxn_atomdata_t    gmx_unused *nbat,
                                           const interaction_const_t gmx_unused *ic,
                                           rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecRF_VdwLJCombGeom_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *
                                           real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJCombGeom_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombGeom_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                           const nbnxn_atomdata_t    gmx_unused *nbat,
                                           const interaction_const_t gmx_unused *ic,
                                           rvec                      gmx_unused *shift_vec,
index 6c3e9b0d702557b67c6fb9dc2bd0345a64c52dbf..dbe6ff9725d8f1006a45338af6f36192c4503ba9 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                              const nbnxn_atomdata_t    gmx_unused *nbat,
                                              const interaction_const_t gmx_unused *ic,
                                              rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecRF_VdwLJCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unuse
                                              real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                              const nbnxn_atomdata_t    gmx_unused *nbat,
                                              const interaction_const_t gmx_unused *ic,
                                              rvec                      gmx_unused *shift_vec,
index b45772522e01f95c2c388286143b95568bde56aa..e604a8f4f9d61f57ecff11fd1f3d62f53310b4cc 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJCombLB_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombLB_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                        const interaction_const_t gmx_unused *ic,
                                        rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecRF_VdwLJCombLB_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl
                                        real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJCombLB_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombLB_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                        const interaction_const_t gmx_unused *ic,
                                        rvec                      gmx_unused *shift_vec,
index 7008c14db978c720afc75f71173699b7c6bfe765..fade8d373378127f5e6ddf4f89f2f8b6ab046670 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJCombLB_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombLB_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                         const nbnxn_atomdata_t    gmx_unused *nbat,
                                         const interaction_const_t gmx_unused *ic,
                                         rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecRF_VdwLJCombLB_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nb
                                         real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJCombLB_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombLB_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                         const nbnxn_atomdata_t    gmx_unused *nbat,
                                         const interaction_const_t gmx_unused *ic,
                                         rvec                      gmx_unused *shift_vec,
index 9c8b8a1a1e78529b27640a1414d257d2821a6c46..28e86be3ccaa11f6b42c7ba1c67c4ad58ad34c3c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJCombLB_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombLB_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecRF_VdwLJCombLB_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused
                                            real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJCombLB_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombLB_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
index 7685222bcf27f1d154641dc7cb0467ecadd2d266..c17df753a4fd472c59680a5d90dda8e1e05a54e4 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJEwCombGeom_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJEwCombGeom_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecRF_VdwLJEwCombGeom_F_2xnn(const nbnxn_pairlist_t    gmx_unused
                                            real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJEwCombGeom_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJEwCombGeom_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
index f1b3095e6ea9aa3d2b6cefa2c261e77a85913a7c..4b1eaae56ae3fdb7a63a4dd6ae5fd89b4f851a78 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                             const nbnxn_atomdata_t    gmx_unused *nbat,
                                             const interaction_const_t gmx_unused *ic,
                                             rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VF_2xnn(const nbnxn_pairlist_t    gmx_unused
                                             real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                             const nbnxn_atomdata_t    gmx_unused *nbat,
                                             const interaction_const_t gmx_unused *ic,
                                             rvec                      gmx_unused *shift_vec,
index 1eebfe0b960ea416a935ca5a33a25557e405cd55..f18044a4703d1d26db2321c49bc09e1fcfa28c47 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                const nbnxn_atomdata_t    gmx_unused *nbat,
                                                const interaction_const_t gmx_unused *ic,
                                                rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unu
                                                real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                const nbnxn_atomdata_t    gmx_unused *nbat,
                                                const interaction_const_t gmx_unused *ic,
                                                rvec                      gmx_unused *shift_vec,
index c20ee4754007103cb7ea9c662e0651a3a84c62d7..44b6d3a0b5fc96f541e00bfd513328561ef15773 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJFSw_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJFSw_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                     const interaction_const_t gmx_unused *ic,
                                     rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecRF_VdwLJFSw_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                     real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJFSw_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJFSw_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                     const interaction_const_t gmx_unused *ic,
                                     rvec                      gmx_unused *shift_vec,
index 3559593aade6415b4506b436f9eeee7e3b95c6c4..c752860f0d634e3e172dd355c3633b4b052516ca 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJFSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJFSw_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                      const nbnxn_atomdata_t    gmx_unused *nbat,
                                      const interaction_const_t gmx_unused *ic,
                                      rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecRF_VdwLJFSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                      real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJFSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJFSw_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                      const nbnxn_atomdata_t    gmx_unused *nbat,
                                      const interaction_const_t gmx_unused *ic,
                                      rvec                      gmx_unused *shift_vec,
index 15b6c8655ebf9567cf24b070bae9356083c01c14..7f42ab4af8cb3ee12bebc98046a9e525ef693275 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJFSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJFSw_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                         const nbnxn_atomdata_t    gmx_unused *nbat,
                                         const interaction_const_t gmx_unused *ic,
                                         rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecRF_VdwLJFSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nb
                                         real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJFSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJFSw_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                         const nbnxn_atomdata_t    gmx_unused *nbat,
                                         const interaction_const_t gmx_unused *ic,
                                         rvec                      gmx_unused *shift_vec,
index 80d3e7e015dbe0b96d1dbf28602e4a47638cff85..d525b31355bcab942783139f67df16f555c53c2a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJPSw_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJPSw_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                     const interaction_const_t gmx_unused *ic,
                                     rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecRF_VdwLJPSw_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                     real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJPSw_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJPSw_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                     const interaction_const_t gmx_unused *ic,
                                     rvec                      gmx_unused *shift_vec,
index f263d8fa877e00bf0d6cf2c2bc4e829a370fda64..48e93a02260a7e40fff5bcf4d65562e08d04d222 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJPSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJPSw_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                      const nbnxn_atomdata_t    gmx_unused *nbat,
                                      const interaction_const_t gmx_unused *ic,
                                      rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecRF_VdwLJPSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                      real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJPSw_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJPSw_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                      const nbnxn_atomdata_t    gmx_unused *nbat,
                                      const interaction_const_t gmx_unused *ic,
                                      rvec                      gmx_unused *shift_vec,
index 329e09dd834ca5bfa1da1c30e41395e353d36032..2e8e26fdd6d17b89f9f7dc5711494a02f0113e83 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJPSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJPSw_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                         const nbnxn_atomdata_t    gmx_unused *nbat,
                                         const interaction_const_t gmx_unused *ic,
                                         rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecRF_VdwLJPSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nb
                                         real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJPSw_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJPSw_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                         const nbnxn_atomdata_t    gmx_unused *nbat,
                                         const interaction_const_t gmx_unused *ic,
                                         rvec                      gmx_unused *shift_vec,
index fb12cad1fc67272a73d209e0b2e03da9b5f05a58..da98a6b66a86158fe99c0659f8edebbf590e2b9d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJ_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJ_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                  const nbnxn_atomdata_t    gmx_unused *nbat,
                                  const interaction_const_t gmx_unused *ic,
                                  rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecRF_VdwLJ_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                  real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJ_F_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJ_F_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                  const nbnxn_atomdata_t    gmx_unused *nbat,
                                  const interaction_const_t gmx_unused *ic,
                                  rvec                      gmx_unused *shift_vec,
index eb9afe48af80bbc258bf327ed134d1c6c57cee88..9ed097cecfe814b9b1be7324ce077dbb204c10b6 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJ_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJ_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                   const nbnxn_atomdata_t    gmx_unused *nbat,
                                   const interaction_const_t gmx_unused *ic,
                                   rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecRF_VdwLJ_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                   real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJ_VF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJ_VF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                   const nbnxn_atomdata_t    gmx_unused *nbat,
                                   const interaction_const_t gmx_unused *ic,
                                   rvec                      gmx_unused *shift_vec,
index 44605c1cf54748ae266d4a91b3ec26f223ec1357..ebb84540dd4955137f444b7f2b0faaf22d56f46e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJ_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJ_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                      const nbnxn_atomdata_t    gmx_unused *nbat,
                                      const interaction_const_t gmx_unused *ic,
                                      rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecRF_VdwLJ_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                      real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJ_VgrpF_2xnn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJ_VgrpF_2xnn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                      const nbnxn_atomdata_t    gmx_unused *nbat,
                                      const interaction_const_t gmx_unused *ic,
                                      rvec                      gmx_unused *shift_vec,
index f4eb1bf9d12b1cb0b2b1b9d39ee8029e4a34e3de..7ca628d94a2898c6326852b19debd5067fe0529b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2017,2018,2019, 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.
@@ -143,7 +143,7 @@ nbk_func_noener       nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_F_2xnn;
  * The minor index of the array goes over both the LJ combination rules,
  * which is only supported by plain cut-off, and the LJ switch/PME functions.
  */
-static p_nbk_func_noener nbnxn_kernel_noener_simd_2xnn[coulktNR][vdwktNR] =
+p_nbk_func_noener nbnxn_kernel_noener_simd_2xnn[coulktNR][vdwktNR] =
 {
     {
         nbnxn_kernel_ElecRF_VdwLJCombGeom_F_2xnn,
@@ -187,7 +187,7 @@ static p_nbk_func_noener nbnxn_kernel_noener_simd_2xnn[coulktNR][vdwktNR] =
     },
 };
 
-static p_nbk_func_ener nbnxn_kernel_ener_simd_2xnn[coulktNR][vdwktNR] =
+p_nbk_func_ener nbnxn_kernel_ener_simd_2xnn[coulktNR][vdwktNR] =
 {
     {
         nbnxn_kernel_ElecRF_VdwLJCombGeom_VF_2xnn,
@@ -231,7 +231,7 @@ static p_nbk_func_ener nbnxn_kernel_ener_simd_2xnn[coulktNR][vdwktNR] =
     },
 };
 
-static p_nbk_func_ener nbnxn_kernel_energrp_simd_2xnn[coulktNR][vdwktNR] =
+p_nbk_func_ener nbnxn_kernel_energrp_simd_2xnn[coulktNR][vdwktNR] =
 {
     {
         nbnxn_kernel_ElecRF_VdwLJCombGeom_VgrpF_2xnn,
index f02e5a40765d6ae48c466e94088e6ae9a6806c5c..da326f8a55ee307a6840e09529cd02d13a0425c5 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2018,2019, 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.
 #error "Need to define GMX_SIMD_J_UNROLL_SIZE before including the 2xnn kernel common header file"
 #endif
 
-#define UNROLLI    NBNXN_CPU_CLUSTER_I_SIZE
+#define UNROLLI    4
 #define UNROLLJ    (GMX_SIMD_REAL_WIDTH/GMX_SIMD_J_UNROLL_SIZE)
 
+static_assert(UNROLLI == c_nbnxnCpuIClusterSize, "UNROLLI should match the i-cluster size");
+
 /* The stride of all the atom data arrays is equal to half the SIMD width */
 #define STRIDE     UNROLLJ
 
index 844f55d7f58ddc3860b640e30c7318ebee5bbd04..38724cb2b5f7f00bcf74d7d162c308e205aceff3 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, 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.
     {
         int egps_j;
 #if UNROLLJ == 2
-        egps_j    = nbat->energrp[cj>>1];
+        egps_j    = nbatParams.energrp[cj >> 1];
         egp_jj[0] = ((egps_j >> ((cj & 1)*egps_jshift)) & egps_jmask)*egps_jstride;
 #else
         /* We assume UNROLLI <= UNROLLJ */
         for (jdi = 0; jdi < UNROLLJ/UNROLLI; jdi++)
         {
             int jj;
-            egps_j = nbat->energrp[cj*(UNROLLJ/UNROLLI)+jdi];
+            egps_j = nbatParams.energrp[cj*(UNROLLJ/UNROLLI) + jdi];
             for (jj = 0; jj < (UNROLLI/2); jj++)
             {
                 egp_jj[jdi*(UNROLLI/2)+jj] = ((egps_j >> (jj*egps_jshift)) & egps_jmask)*egps_jstride;
index f08be441056a01f5c82694f1e87d858663cc05a3..3a289895fb9ec9e425f2074a4ce153d6f277201c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, 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.
 
 {
     using namespace gmx;
-    const nbnxn_ci_t   *nbln;
     const nbnxn_cj_t   *l_cj;
-    const real         *q;
-    const real         *shiftvec;
-    const real         *x;
-    real                facel;
-    int                 n, ci, ci_sh;
+    int                 ci, ci_sh;
     int                 ish, ish3;
     gmx_bool            do_LJ, half_LJ, do_coul;
     int                 cjind0, cjind1, cjind;
@@ -72,7 +67,6 @@
     SimdBool  diagonal_mask1_S0, diagonal_mask1_S2;
 #endif
 
-    unsigned            *exclusion_filter;
     SimdBitMask          filter_S0, filter_S2;
 
     SimdReal             zero_S(0.0);
 #endif
 
 #ifdef LJ_COMB_LB
-    const real       *ljc;
-
     SimdReal          hsig_i_S0, seps_i_S0;
     SimdReal          hsig_i_S2, seps_i_S2;
 #else
     alignas(GMX_SIMD_ALIGNMENT) real  pvdw_c6[2*UNROLLI*UNROLLJ];
     real  *pvdw_c12 = pvdw_c6 + UNROLLI*UNROLLJ;
 #endif
-
-#if defined LJ_COMB_GEOM || defined LJ_EWALD_GEOM
-    const real       *ljc;
-#endif
 #endif /* LJ_COMB_LB */
 
     SimdReal  minRsq_S;
     int npair = 0;
 #endif
 
+    const nbnxn_atomdata_t::Params &nbatParams = nbat->params();
+
 #if defined LJ_COMB_GEOM || defined LJ_COMB_LB || defined LJ_EWALD_GEOM
-    ljc = nbat->lj_comb;
+    const real * gmx_restrict ljc      = nbatParams.lj_comb.data();
 #endif
 #if !(defined LJ_COMB_GEOM || defined LJ_COMB_LB || defined FIX_LJ_C)
     /* No combination rule used */
-    real      *nbfp_ptr = nbat->nbfp_aligned;
-    const int *type     = nbat->type;
+    const real * gmx_restrict nbfp_ptr = nbatParams.nbfp_aligned.data();
+    const int * gmx_restrict  type     = nbatParams.type.data();
 #endif
 
     /* Load j-i for the first i */
-    diagonal_jmi_S    = load<SimdReal>(nbat->simd_2xnn_diagonal_j_minus_i);
+    diagonal_jmi_S    = load<SimdReal>(nbat->simdMasks.diagonal_2xnn_j_minus_i.data());
     /* Generate all the diagonal masks as comparison results */
 #if UNROLLI == UNROLLJ
     diagonal_mask_S0  = (zero_S < diagonal_jmi_S);
     /* Load masks for topology exclusion masking. filter_stride is
        static const, so the conditional will be optimized away. */
 #if GMX_DOUBLE && !GMX_SIMD_HAVE_INT32_LOGICAL
-    exclusion_filter = nbat->simd_exclusion_filter64;
+    const std::uint64_t * gmx_restrict exclusion_filter = nbat->simdMasks.exclusion_filter64.data();
 #else
-    exclusion_filter = nbat->simd_exclusion_filter;
+    const std::uint32_t * gmx_restrict exclusion_filter = nbat->simdMasks.exclusion_filter.data();
 #endif
 
     /* Here we cast the exclusion filters from unsigned * to int * or real *.
     rcvdw2_S = SimdReal(ic->rvdw*ic->rvdw);
 #endif
 
-    minRsq_S            = SimdReal(NBNXN_MIN_RSQ);
+    minRsq_S                           = SimdReal(NBNXN_MIN_RSQ);
 
-    q                   = nbat->q;
-    facel               = ic->epsfac;
-    shiftvec            = shift_vec[0];
-    x                   = nbat->x;
+    const real * gmx_restrict q        = nbatParams.q.data();
+    const real                facel    = ic->epsfac;
+    const real * gmx_restrict shiftvec = shift_vec[0];
+    const real * gmx_restrict x        = nbat->x().data();
 
 #ifdef FIX_LJ_C
 
 #endif /* FIX_LJ_C */
 
 #ifdef ENERGY_GROUPS
-    egps_ishift  = nbat->neg_2log;
+    egps_ishift  = nbatParams.neg_2log;
     egps_imask   = (1<<egps_ishift) - 1;
-    egps_jshift  = 2*nbat->neg_2log;
+    egps_jshift  = 2*nbatParams.neg_2log;
     egps_jmask   = (1<<egps_jshift) - 1;
     egps_jstride = (UNROLLJ>>1)*UNROLLJ;
     /* Major division is over i-particle energy groups, determine the stride */
-    Vstride_i    = nbat->nenergrp*(1<<nbat->neg_2log)*egps_jstride;
+    Vstride_i    = nbatParams.nenergrp*(1 << nbatParams.neg_2log)*egps_jstride;
 #endif
 
-    l_cj = nbl->cj;
+    l_cj = nbl->cj.data();
 
     ninner = 0;
-    for (n = 0; n < nbl->nci; n++)
+    for (const nbnxn_ci_t &ciEntry : nbl->ci)
     {
-        nbln = &nbl->ci[n];
-
-        ish              = (nbln->shift & NBNXN_CI_SHIFT);
+        ish              = (ciEntry.shift & NBNXN_CI_SHIFT);
         ish3             = ish*3;
-        cjind0           = nbln->cj_ind_start;
-        cjind1           = nbln->cj_ind_end;
-        ci               = nbln->ci;
+        cjind0           = ciEntry.cj_ind_start;
+        cjind1           = ciEntry.cj_ind_end;
+        ci               = ciEntry.ci;
         ci_sh            = (ish == CENTRAL ? ci : -1);
 
         shX_S = SimdReal(shiftvec[ish3]);
          * inner LJ + C      for full-LJ + C
          * inner LJ          for full-LJ + no-C / half-LJ + no-C
          */
-        do_LJ   = ((nbln->shift & NBNXN_CI_DO_LJ(0)) != 0);
-        do_coul = ((nbln->shift & NBNXN_CI_DO_COUL(0)) != 0);
-        half_LJ = (((nbln->shift & NBNXN_CI_HALF_LJ(0)) != 0) || !do_LJ) && do_coul;
+        do_LJ   = ((ciEntry.shift & NBNXN_CI_DO_LJ(0)) != 0);
+        do_coul = ((ciEntry.shift & NBNXN_CI_DO_COUL(0)) != 0);
+        half_LJ = (((ciEntry.shift & NBNXN_CI_HALF_LJ(0)) != 0) || !do_LJ) && do_coul;
 
 #ifdef ENERGY_GROUPS
-        egps_i = nbat->energrp[ci];
+        egps_i = nbatParams.energrp[ci];
         {
             int ia, egp_ia;
 
         gmx_bool do_self = do_coul;
 #endif
 #if UNROLLJ == 4
-        if (do_self && l_cj[nbln->cj_ind_start].cj == ci_sh)
+        if (do_self && l_cj[ciEntry.cj_ind_start].cj == ci_sh)
 #endif
 #if UNROLLJ == 8
-        if (do_self && l_cj[nbln->cj_ind_start].cj == (ci_sh>>1))
+        if (do_self && l_cj[ciEntry.cj_ind_start].cj == (ci_sh>>1))
 #endif
         {
             if (do_coul)
                 {
                     real c6_i;
 
-                    c6_i = nbat->nbfp[nbat->type[sci+ia]*(nbat->ntype + 1)*2]/6;
+                    c6_i = nbatParams.nbfp[nbatParams.type[sci+ia]*(nbatParams.numTypes + 1)*2]/6;
 #ifdef ENERGY_GROUPS
                     vvdwtp[ia][((egps_i>>(ia*egps_ishift)) & egps_imask)*egps_jstride]
 #else
             c12s_S2 = loadU1DualHsimd(ljc+sci2+STRIDE+2);
         }
 #elif !defined LJ_COMB_LB && !defined FIX_LJ_C
-        const real *nbfp0     = nbfp_ptr + type[sci  ]*nbat->ntype*c_simdBestPairAlignment;
-        const real *nbfp1     = nbfp_ptr + type[sci+1]*nbat->ntype*c_simdBestPairAlignment;
+        const int   numTypes  = nbatParams.numTypes;
+        const real *nbfp0     = nbfp_ptr + type[sci  ]*numTypes*c_simdBestPairAlignment;
+        const real *nbfp1     = nbfp_ptr + type[sci+1]*numTypes*c_simdBestPairAlignment;
         const real *nbfp2     = nullptr, *nbfp3 = nullptr;
         if (!half_LJ)
         {
-            nbfp2 = nbfp_ptr + type[sci+2]*nbat->ntype*c_simdBestPairAlignment;
-            nbfp3 = nbfp_ptr + type[sci+3]*nbat->ntype*c_simdBestPairAlignment;
+            nbfp2 = nbfp_ptr + type[sci+2]*numTypes*c_simdBestPairAlignment;
+            nbfp3 = nbfp_ptr + type[sci+3]*numTypes*c_simdBestPairAlignment;
         }
 #endif
 #endif
index 99aaaf01b664e84c288e28164ab6b1e2b051c6d7..daca1cd809ab885556aa38b58187dcb6814047b6 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2018,2019, 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.
 
 /* Prune a single nbnxn_pairtlist_t entry with distance rlistInner */
 void
-nbnxn_kernel_prune_2xnn(nbnxn_pairlist_t *         nbl,
+nbnxn_kernel_prune_2xnn(NbnxnPairlistCpu *         nbl,
                         const nbnxn_atomdata_t *   nbat,
                         const rvec * gmx_restrict  shift_vec,
                         real                       rlistInner)
 {
 #ifdef GMX_NBNXN_SIMD_2XNN
     using namespace gmx;
-    const nbnxn_ci_t * gmx_restrict ciOuter  = nbl->ciOuter;
-    nbnxn_ci_t       * gmx_restrict ciInner  = nbl->ci;
 
-    const nbnxn_cj_t * gmx_restrict cjOuter  = nbl->cjOuter;
-    nbnxn_cj_t       * gmx_restrict cjInner  = nbl->cj;
+    /* We avoid push_back() for efficiency reasons and resize after filling */
+    nbl->ci.resize(nbl->ciOuter.size());
+    nbl->cj.resize(nbl->cjOuter.size());
+
+    const nbnxn_ci_t * gmx_restrict ciOuter  = nbl->ciOuter.data();
+    nbnxn_ci_t       * gmx_restrict ciInner  = nbl->ci.data();
+
+    const nbnxn_cj_t * gmx_restrict cjOuter  = nbl->cjOuter.data();
+    nbnxn_cj_t       * gmx_restrict cjInner  = nbl->cj.data();
 
     const real       * gmx_restrict shiftvec = shift_vec[0];
-    const real       * gmx_restrict x        = nbat->x;
+    const real       * gmx_restrict x        = nbat->x().data();
 
     const SimdReal                  rlist2_S(rlistInner*rlistInner);
 
-    /* Initialize the new list as empty and add pairs that are in range */
-    int nciInner = 0;
-    int ncjInner = 0;
-    for (int i = 0; i < nbl->nciOuter; i++)
+    /* Initialize the new list count as empty and add pairs that are in range */
+    int       nciInner = 0;
+    int       ncjInner = 0;
+    const int nciOuter = nbl->ciOuter.size();
+    for (int i = 0; i < nciOuter; i++)
     {
         const nbnxn_ci_t * gmx_restrict ciEntry = &ciOuter[i];
 
@@ -156,7 +162,8 @@ nbnxn_kernel_prune_2xnn(nbnxn_pairlist_t *         nbl,
         }
     }
 
-    nbl->nci = nciInner;
+    nbl->ci.resize(nciInner);
+    nbl->cj.resize(ncjInner);
 
 #else  /* GMX_NBNXN_SIMD_2XNN */
 
index e65c5b9dbeae388c34cfc90c1ce9004e3eeb5949..92504cf9b7eaebf51e80791ed8a1e5a6a3f9f7fb 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2016,2017, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2019, 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.
 #include "gromacs/utility/real.h"
 
 struct nbnxn_atomdata_t;
-struct nbnxn_pairlist_t;
+struct NbnxnPairlistCpu;
 
-/*! \brief Prune a single nbnxn_pairlist_t entry with distance \p rlistInner
+/*! \brief Prune a single NbnxnPairlistCpu entry with distance \p rlistInner
  *
  * Reads a cluster pairlist \p nbl->ciOuter, \p nbl->cjOuter and writes
  * all cluster pairs within \p rlistInner to \p nbl->ci, \p nbl->cj.
  */
 void
-nbnxn_kernel_prune_2xnn(nbnxn_pairlist_t *         nbl,
+nbnxn_kernel_prune_2xnn(NbnxnPairlistCpu *         nbl,
                         const nbnxn_atomdata_t *   nbat,
                         const rvec * gmx_restrict  shift_vec,
                         real                       rlistInner);
index e261ebe5d39cd9b7bcb9e3be828898ad76ec9c7f..718a0829f6212f9f637271d7f12e59c8d982e194 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                const nbnxn_atomdata_t    gmx_unused *nbat,
                                                const interaction_const_t gmx_unused *ic,
                                                rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_F_4xn(const nbnxn_pairlist_t    gmx_unu
                                                real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                const nbnxn_atomdata_t    gmx_unused *nbat,
                                                const interaction_const_t gmx_unused *ic,
                                                rvec                      gmx_unused *shift_vec,
index 0338df9f20e1bb54ac57d7db4608770079e757db..620e69f3ed4b3fa664306815ea72bbb50d308e1a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                 const nbnxn_atomdata_t    gmx_unused *nbat,
                                                 const interaction_const_t gmx_unused *ic,
                                                 rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VF_4xn(const nbnxn_pairlist_t    gmx_un
                                                 real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                 const nbnxn_atomdata_t    gmx_unused *nbat,
                                                 const interaction_const_t gmx_unused *ic,
                                                 rvec                      gmx_unused *shift_vec,
index 42161157626ac3de423d8aadec49aa2aa395234e..b070056b0509c3ab5c777818489d410c6d3128c0 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                    const nbnxn_atomdata_t    gmx_unused *nbat,
                                                    const interaction_const_t gmx_unused *ic,
                                                    rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VgrpF_4xn(const nbnxn_pairlist_t    gmx
                                                    real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombGeom_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                    const nbnxn_atomdata_t    gmx_unused *nbat,
                                                    const interaction_const_t gmx_unused *ic,
                                                    rvec                      gmx_unused *shift_vec,
index e761d7d6c40fefd67a3807791b03cb6d4d86f778..7a16c3e79c035bf8e1369d90c1d17a14a05afcc4 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                              const nbnxn_atomdata_t    gmx_unused *nbat,
                                              const interaction_const_t gmx_unused *ic,
                                              rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_F_4xn(const nbnxn_pairlist_t    gmx_unuse
                                              real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                              const nbnxn_atomdata_t    gmx_unused *nbat,
                                              const interaction_const_t gmx_unused *ic,
                                              rvec                      gmx_unused *shift_vec,
index dcf1c17d05199764d2c3311aaf4d2f26c28e2651..bf97fc097a2a6b385d68be51ef8559d71cfcb511 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                               const nbnxn_atomdata_t    gmx_unused *nbat,
                                               const interaction_const_t gmx_unused *ic,
                                               rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VF_4xn(const nbnxn_pairlist_t    gmx_unus
                                               real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                               const nbnxn_atomdata_t    gmx_unused *nbat,
                                               const interaction_const_t gmx_unused *ic,
                                               rvec                      gmx_unused *shift_vec,
index 1dc3cc591767a311b3fa0f7003b24e1e3ea3e412..002d4762c7c9466a1a13a724b311066f7dbb8f6e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                  const nbnxn_atomdata_t    gmx_unused *nbat,
                                                  const interaction_const_t gmx_unused *ic,
                                                  rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VgrpF_4xn(const nbnxn_pairlist_t    gmx_u
                                                  real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJCombLB_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                  const nbnxn_atomdata_t    gmx_unused *nbat,
                                                  const interaction_const_t gmx_unused *ic,
                                                  rvec                      gmx_unused *shift_vec,
index 82a4378960da64ddd75159c11d2962ad3ca69e49..33a5516d5d93fc4d6c5d0cfb3b536cc18e3cce38 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                  const nbnxn_atomdata_t    gmx_unused *nbat,
                                                  const interaction_const_t gmx_unused *ic,
                                                  rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_F_4xn(const nbnxn_pairlist_t    gmx_u
                                                  real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                  const nbnxn_atomdata_t    gmx_unused *nbat,
                                                  const interaction_const_t gmx_unused *ic,
                                                  rvec                      gmx_unused *shift_vec,
index 59d8122d3a9adc53e89eb04e5a041999c289dca7..c2383a87f719491513baf59aaebc6e2e0a7917af 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                   const nbnxn_atomdata_t    gmx_unused *nbat,
                                                   const interaction_const_t gmx_unused *ic,
                                                   rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VF_4xn(const nbnxn_pairlist_t    gmx_
                                                   real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                   const nbnxn_atomdata_t    gmx_unused *nbat,
                                                   const interaction_const_t gmx_unused *ic,
                                                   rvec                      gmx_unused *shift_vec,
index 447bb94caeb5cb0cc5c283ecb9c9adc317800799..814d16da6de54c313bfb35bb6eba1e9e4fcbdc6c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -65,7 +65,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                      const nbnxn_atomdata_t    gmx_unused *nbat,
                                                      const interaction_const_t gmx_unused *ic,
                                                      rvec                      gmx_unused *shift_vec,
@@ -75,7 +75,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VgrpF_4xn(const nbnxn_pairlist_t    g
                                                      real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                      const nbnxn_atomdata_t    gmx_unused *nbat,
                                                      const interaction_const_t gmx_unused *ic,
                                                      rvec                      gmx_unused *shift_vec,
index 331fc60f9fa4c27a584b1a583b8b15770a93545f..46af165ac41740a90d4d1c343c5fe3ef383c103f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                           const nbnxn_atomdata_t    gmx_unused *nbat,
                                           const interaction_const_t gmx_unused *ic,
                                           rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_F_4xn(const nbnxn_pairlist_t    gmx_unused *
                                           real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                           const nbnxn_atomdata_t    gmx_unused *nbat,
                                           const interaction_const_t gmx_unused *ic,
                                           rvec                      gmx_unused *shift_vec,
index 9a630eff82b7945e6054039085b10a2eb133a99e..d5305178c254365fbf414d459edd9b4228404304 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VF_4xn(const nbnxn_pairlist_t    gmx_unused
                                            real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
index c8d41785b4cfb0f11085833ca96b00617f9ce0a4..7addd906d3289a81d9aef99742257b08ad06fd98 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                               const nbnxn_atomdata_t    gmx_unused *nbat,
                                               const interaction_const_t gmx_unused *ic,
                                               rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unus
                                               real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJFSw_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                               const nbnxn_atomdata_t    gmx_unused *nbat,
                                               const interaction_const_t gmx_unused *ic,
                                               rvec                      gmx_unused *shift_vec,
index dd04b1c025bfdc0a1020901941f3d43b91791473..8960cda71a926f37376fbb898a7d64e2af8893de 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                           const nbnxn_atomdata_t    gmx_unused *nbat,
                                           const interaction_const_t gmx_unused *ic,
                                           rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_F_4xn(const nbnxn_pairlist_t    gmx_unused *
                                           real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                           const nbnxn_atomdata_t    gmx_unused *nbat,
                                           const interaction_const_t gmx_unused *ic,
                                           rvec                      gmx_unused *shift_vec,
index b6a4000260af7f7fb4b4a4548fdd2490738b3f5d..2f177971a174805986e14b699e66a88c72665001 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VF_4xn(const nbnxn_pairlist_t    gmx_unused
                                            real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
index 1067db694efc38d07d17581ada67e07166e80915..f01727568fe373c08679a6e89941e11e09b9e3cb 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                               const nbnxn_atomdata_t    gmx_unused *nbat,
                                               const interaction_const_t gmx_unused *ic,
                                               rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unus
                                               real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJPSw_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                               const nbnxn_atomdata_t    gmx_unused *nbat,
                                               const interaction_const_t gmx_unused *ic,
                                               rvec                      gmx_unused *shift_vec,
index ec98e953139d2c7c5cace3f5510d35674886c6bf..465705e5fc2fc2394f43625faac9dca103ca0045 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJ_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJ_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                        const interaction_const_t gmx_unused *ic,
                                        rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJ_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl
                                        real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJ_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJ_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                        const interaction_const_t gmx_unused *ic,
                                        rvec                      gmx_unused *shift_vec,
index b8ac80c2a0b01c4a7916081d9a8af30c6d23f0e4..f55b5a40e42f3c6781fa24fd3c18e80d80b214ce 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJ_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJ_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                         const nbnxn_atomdata_t    gmx_unused *nbat,
                                         const interaction_const_t gmx_unused *ic,
                                         rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJ_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nb
                                         real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJ_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJ_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                         const nbnxn_atomdata_t    gmx_unused *nbat,
                                         const interaction_const_t gmx_unused *ic,
                                         rvec                      gmx_unused *shift_vec,
index 8464060cdc6de0b9892cca6198d69a4ae70f5943..4a287b1f80bed4fe0cdaea1933c935d24f2e87dc 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJ_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJ_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecEwTwinCut_VdwLJ_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused
                                            real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEwTwinCut_VdwLJ_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEwTwinCut_VdwLJ_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
index 2061ad1649e3de1203118f7c26b2229cec780e2a..877b933fc78e800fec3acc04bfdfa8aa04042a53 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJCombGeom_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombGeom_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                         const nbnxn_atomdata_t    gmx_unused *nbat,
                                         const interaction_const_t gmx_unused *ic,
                                         rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecEw_VdwLJCombGeom_F_4xn(const nbnxn_pairlist_t    gmx_unused *nb
                                         real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJCombGeom_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombGeom_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                         const nbnxn_atomdata_t    gmx_unused *nbat,
                                         const interaction_const_t gmx_unused *ic,
                                         rvec                      gmx_unused *shift_vec,
index b459eb87c5659569963edb666ae2cbe1b9c66b17..41403182370673ebba308fee4ef9d93c4bd7b522 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJCombGeom_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombGeom_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                          const nbnxn_atomdata_t    gmx_unused *nbat,
                                          const interaction_const_t gmx_unused *ic,
                                          rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecEw_VdwLJCombGeom_VF_4xn(const nbnxn_pairlist_t    gmx_unused *n
                                          real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJCombGeom_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombGeom_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                          const nbnxn_atomdata_t    gmx_unused *nbat,
                                          const interaction_const_t gmx_unused *ic,
                                          rvec                      gmx_unused *shift_vec,
index b7bfb1e4f9525237bb949de773ffa1a20363f263..b40088c839a366c6f4d9f753baf599bca3fd05c1 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJCombGeom_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombGeom_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                             const nbnxn_atomdata_t    gmx_unused *nbat,
                                             const interaction_const_t gmx_unused *ic,
                                             rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEw_VdwLJCombGeom_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused
                                             real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJCombGeom_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombGeom_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                             const nbnxn_atomdata_t    gmx_unused *nbat,
                                             const interaction_const_t gmx_unused *ic,
                                             rvec                      gmx_unused *shift_vec,
index a5a514f2e2a7a0208c42b6ba8a68676131db7f3e..9c28c15654a24ef299ae77d13797522422eb38e7 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJCombLB_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombLB_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                       const nbnxn_atomdata_t    gmx_unused *nbat,
                                       const interaction_const_t gmx_unused *ic,
                                       rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecEw_VdwLJCombLB_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                       real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJCombLB_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombLB_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                       const nbnxn_atomdata_t    gmx_unused *nbat,
                                       const interaction_const_t gmx_unused *ic,
                                       rvec                      gmx_unused *shift_vec,
index 12ec2159e370c071920131a54d39043452846346..6278a0a3bf955c210887d47b9256440b5f9a0273 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJCombLB_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombLB_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                        const interaction_const_t gmx_unused *ic,
                                        rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecEw_VdwLJCombLB_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl
                                        real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJCombLB_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombLB_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                        const interaction_const_t gmx_unused *ic,
                                        rvec                      gmx_unused *shift_vec,
index 2d0d796f1d8775fcfead7042e98aad83bbc04711..27af95bdcae441b672040aa5b8d8c4165e212e40 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJCombLB_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombLB_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                           const nbnxn_atomdata_t    gmx_unused *nbat,
                                           const interaction_const_t gmx_unused *ic,
                                           rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEw_VdwLJCombLB_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *
                                           real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJCombLB_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJCombLB_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                           const nbnxn_atomdata_t    gmx_unused *nbat,
                                           const interaction_const_t gmx_unused *ic,
                                           rvec                      gmx_unused *shift_vec,
index a1adec0f9ce64e7128dfdfa3ae26e6c96813d530..9197c1d09864bf3a81a2c88a037107c61687037a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJEwCombGeom_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJEwCombGeom_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                           const nbnxn_atomdata_t    gmx_unused *nbat,
                                           const interaction_const_t gmx_unused *ic,
                                           rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEw_VdwLJEwCombGeom_F_4xn(const nbnxn_pairlist_t    gmx_unused *
                                           real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJEwCombGeom_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJEwCombGeom_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                           const nbnxn_atomdata_t    gmx_unused *nbat,
                                           const interaction_const_t gmx_unused *ic,
                                           rvec                      gmx_unused *shift_vec,
index 739e6224666307d6bfcd4252465a3aaad4998636..e4525f5bbb79940f25450b66a4ca47f1c54d47fb 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VF_4xn(const nbnxn_pairlist_t    gmx_unused
                                            real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
index a52c03130d6710023d8675a2c94a908e5342262d..ef47bb4346deebcfc1aa7b873c7508662bf3bedc 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                               const nbnxn_atomdata_t    gmx_unused *nbat,
                                               const interaction_const_t gmx_unused *ic,
                                               rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unus
                                               real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJEwCombGeom_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                               const nbnxn_atomdata_t    gmx_unused *nbat,
                                               const interaction_const_t gmx_unused *ic,
                                               rvec                      gmx_unused *shift_vec,
index 4dfe84738c08540d40fe7b45caec4cc360c0f5b5..a9acd2fd7bef723a03969281c4eaeed15d891583 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJFSw_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJFSw_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                    const nbnxn_atomdata_t    gmx_unused *nbat,
                                    const interaction_const_t gmx_unused *ic,
                                    rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecEw_VdwLJFSw_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                    real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJFSw_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJFSw_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                    const nbnxn_atomdata_t    gmx_unused *nbat,
                                    const interaction_const_t gmx_unused *ic,
                                    rvec                      gmx_unused *shift_vec,
index 348d5aeab4ff587d05536a32f0a8801b573de687..0fd036fc645951cbdb111d0814679eb7cfbe1ef5 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJFSw_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJFSw_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                     const interaction_const_t gmx_unused *ic,
                                     rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecEw_VdwLJFSw_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                     real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJFSw_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJFSw_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                     const interaction_const_t gmx_unused *ic,
                                     rvec                      gmx_unused *shift_vec,
index a75764a5f3c19726a41d768b9192c421b946a61d..bb929050527fdc55f83f6ec119fe9c24feeafab7 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJFSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJFSw_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                        const interaction_const_t gmx_unused *ic,
                                        rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEw_VdwLJFSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl
                                        real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJFSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJFSw_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                        const interaction_const_t gmx_unused *ic,
                                        rvec                      gmx_unused *shift_vec,
index 6050cb29a83c43994ce4bced071465499b61da33..97028336aa870bb0e3b09ed2435a7233b081e725 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJPSw_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJPSw_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                    const nbnxn_atomdata_t    gmx_unused *nbat,
                                    const interaction_const_t gmx_unused *ic,
                                    rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecEw_VdwLJPSw_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                    real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJPSw_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJPSw_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                    const nbnxn_atomdata_t    gmx_unused *nbat,
                                    const interaction_const_t gmx_unused *ic,
                                    rvec                      gmx_unused *shift_vec,
index 3acfb63f16b2374d169513b2285a9ccc9b43d860..415d25b77ad375030a50b1f6ff97e6d67a845503 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJPSw_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJPSw_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                     const interaction_const_t gmx_unused *ic,
                                     rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecEw_VdwLJPSw_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                     real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJPSw_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJPSw_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                     const interaction_const_t gmx_unused *ic,
                                     rvec                      gmx_unused *shift_vec,
index c9ce3dbaffd09b188638d9f712c8c4031163fe25..c67510c72a6f0e1a186d804f15d7e0a143f6f26f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJPSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJPSw_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                        const interaction_const_t gmx_unused *ic,
                                        rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEw_VdwLJPSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl
                                        real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJPSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJPSw_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                        const interaction_const_t gmx_unused *ic,
                                        rvec                      gmx_unused *shift_vec,
index 24d5f76b338452c45cb3f6dbd608e59b886934ba..1b7c6278528bb82dc4c5c5d986a8d490d6ed2aff 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJ_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJ_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                 const nbnxn_atomdata_t    gmx_unused *nbat,
                                 const interaction_const_t gmx_unused *ic,
                                 rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecEw_VdwLJ_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                 real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJ_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJ_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                 const nbnxn_atomdata_t    gmx_unused *nbat,
                                 const interaction_const_t gmx_unused *ic,
                                 rvec                      gmx_unused *shift_vec,
index 6ae0c823e1e3b009d884353616b76e7cb2be9b05..dad375568ef0bda20b57835a20296b78b9c7df44 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJ_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJ_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                  const nbnxn_atomdata_t    gmx_unused *nbat,
                                  const interaction_const_t gmx_unused *ic,
                                  rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecEw_VdwLJ_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                  real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJ_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJ_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                  const nbnxn_atomdata_t    gmx_unused *nbat,
                                  const interaction_const_t gmx_unused *ic,
                                  rvec                      gmx_unused *shift_vec,
index 7f1d754387ceef89e87b5e3d58fced58e1f863f4..461a447335e72aaad6d1f04fcf8947fa6dadacfe 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecEw_VdwLJ_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJ_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                     const interaction_const_t gmx_unused *ic,
                                     rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecEw_VdwLJ_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                     real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecEw_VdwLJ_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecEw_VdwLJ_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                     const interaction_const_t gmx_unused *ic,
                                     rvec                      gmx_unused *shift_vec,
index 471d87a0005486d474e881d003a290bbcfd00850..07a231392865b8623ee87ef23c10ff3538d9bf56 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                   const nbnxn_atomdata_t    gmx_unused *nbat,
                                                   const interaction_const_t gmx_unused *ic,
                                                   rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_F_4xn(const nbnxn_pairlist_t    gmx_
                                                   real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                   const nbnxn_atomdata_t    gmx_unused *nbat,
                                                   const interaction_const_t gmx_unused *ic,
                                                   rvec                      gmx_unused *shift_vec,
index 59262d8cd8c4ef3796ac6aeb14b3eff98641b1d3..48b92d90e4483017e1318c5d7d3c17e83a6e24e7 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                    const nbnxn_atomdata_t    gmx_unused *nbat,
                                                    const interaction_const_t gmx_unused *ic,
                                                    rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VF_4xn(const nbnxn_pairlist_t    gmx
                                                    real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                    const nbnxn_atomdata_t    gmx_unused *nbat,
                                                    const interaction_const_t gmx_unused *ic,
                                                    rvec                      gmx_unused *shift_vec,
index 67d74fc7a8b2fbb40fd2b6d7725d582cd239e9c5..42dae0d51cd6cc4e98af6dc135e9e6dee8ba4d07 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                       const nbnxn_atomdata_t    gmx_unused *nbat,
                                                       const interaction_const_t gmx_unused *ic,
                                                       rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VgrpF_4xn(const nbnxn_pairlist_t
                                                       real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombGeom_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                       const nbnxn_atomdata_t    gmx_unused *nbat,
                                                       const interaction_const_t gmx_unused *ic,
                                                       rvec                      gmx_unused *shift_vec,
index e8c7c04bacb4aa14ee0d6f03089f186c80e2b675..2c45550355492f587b38a8c72c2623005382018e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                 const nbnxn_atomdata_t    gmx_unused *nbat,
                                                 const interaction_const_t gmx_unused *ic,
                                                 rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_F_4xn(const nbnxn_pairlist_t    gmx_un
                                                 real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                 const nbnxn_atomdata_t    gmx_unused *nbat,
                                                 const interaction_const_t gmx_unused *ic,
                                                 rvec                      gmx_unused *shift_vec,
index b7805dfb91096c722a308eaaa7ed9ac98a755d17..3a8a150023442ca56f9157b6746add772ad22339 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                  const nbnxn_atomdata_t    gmx_unused *nbat,
                                                  const interaction_const_t gmx_unused *ic,
                                                  rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VF_4xn(const nbnxn_pairlist_t    gmx_u
                                                  real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                  const nbnxn_atomdata_t    gmx_unused *nbat,
                                                  const interaction_const_t gmx_unused *ic,
                                                  rvec                      gmx_unused *shift_vec,
index 084393a61be837fc40d81019e0cebd1c29464d83..da15b89842053d5075c6c2d6b05cc6dd52a7da44 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                                     const interaction_const_t gmx_unused *ic,
                                                     rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VgrpF_4xn(const nbnxn_pairlist_t    gm
                                                     real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJCombLB_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                                     const interaction_const_t gmx_unused *ic,
                                                     rvec                      gmx_unused *shift_vec,
index c72ea62a0292dd8ecb84b5843931d6945198685b..86857b80e4dbb56bd7cac4a7685acd0a854b641e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                                     const interaction_const_t gmx_unused *ic,
                                                     rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_F_4xn(const nbnxn_pairlist_t    gm
                                                     real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                                     const interaction_const_t gmx_unused *ic,
                                                     rvec                      gmx_unused *shift_vec,
index 85f088303834ccb4774e01d3917529f380d2b492..3b31211d9e4255f43589b2909f8f4766c2f145ca 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                      const nbnxn_atomdata_t    gmx_unused *nbat,
                                                      const interaction_const_t gmx_unused *ic,
                                                      rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VF_4xn(const nbnxn_pairlist_t    g
                                                      real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                      const nbnxn_atomdata_t    gmx_unused *nbat,
                                                      const interaction_const_t gmx_unused *ic,
                                                      rvec                      gmx_unused *shift_vec,
index 8b334fd0260319935e00efe560fe328173b4c3f2..6d710edb72e8b6d0655a1fddf87e9fd47268614f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -65,7 +65,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                         const nbnxn_atomdata_t    gmx_unused *nbat,
                                                         const interaction_const_t gmx_unused *ic,
                                                         rvec                      gmx_unused *shift_vec,
@@ -75,7 +75,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VgrpF_4xn(const nbnxn_pairlist_t
                                                         real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJEwCombGeom_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                         const nbnxn_atomdata_t    gmx_unused *nbat,
                                                         const interaction_const_t gmx_unused *ic,
                                                         rvec                      gmx_unused *shift_vec,
index 7c369131ff404447d6df408196d1072f38fdd680..d42fa34bac8b4d0fb06586c44f5d3c31371ce74a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                              const nbnxn_atomdata_t    gmx_unused *nbat,
                                              const interaction_const_t gmx_unused *ic,
                                              rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_F_4xn(const nbnxn_pairlist_t    gmx_unuse
                                              real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                              const nbnxn_atomdata_t    gmx_unused *nbat,
                                              const interaction_const_t gmx_unused *ic,
                                              rvec                      gmx_unused *shift_vec,
index 1a361b766df8a4ca7c802b4f31ecefd0714b7fd0..8f606fe6b0dde1f34d975adeac35452d87b42ad7 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                               const nbnxn_atomdata_t    gmx_unused *nbat,
                                               const interaction_const_t gmx_unused *ic,
                                               rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VF_4xn(const nbnxn_pairlist_t    gmx_unus
                                               real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                               const nbnxn_atomdata_t    gmx_unused *nbat,
                                               const interaction_const_t gmx_unused *ic,
                                               rvec                      gmx_unused *shift_vec,
index 9901d05d53eeb54ab485e3c5123f633153eb9298..632097c18a825a4c95ac54f471115e239f9b4a74 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                  const nbnxn_atomdata_t    gmx_unused *nbat,
                                                  const interaction_const_t gmx_unused *ic,
                                                  rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_u
                                                  real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJFSw_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                  const nbnxn_atomdata_t    gmx_unused *nbat,
                                                  const interaction_const_t gmx_unused *ic,
                                                  rvec                      gmx_unused *shift_vec,
index 40d96088d44e6a85d0a1601d7a9d454e2e6bb28d..e989026a65730840897772d72e9a9dc88cb07ddd 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                              const nbnxn_atomdata_t    gmx_unused *nbat,
                                              const interaction_const_t gmx_unused *ic,
                                              rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_F_4xn(const nbnxn_pairlist_t    gmx_unuse
                                              real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                              const nbnxn_atomdata_t    gmx_unused *nbat,
                                              const interaction_const_t gmx_unused *ic,
                                              rvec                      gmx_unused *shift_vec,
index e1b97da722a7fa3071949a48f791e6fe51ed8c63..18e5b35dc0e7dc01d8fae7c2fb0f43519dd04144 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                               const nbnxn_atomdata_t    gmx_unused *nbat,
                                               const interaction_const_t gmx_unused *ic,
                                               rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VF_4xn(const nbnxn_pairlist_t    gmx_unus
                                               real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                               const nbnxn_atomdata_t    gmx_unused *nbat,
                                               const interaction_const_t gmx_unused *ic,
                                               rvec                      gmx_unused *shift_vec,
index 74b6f9ae3749d09aa79878f02c40973d13f3b337..1b3cb3e8d286e4b302bb6e85353f6f8bdad78f3d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                  const nbnxn_atomdata_t    gmx_unused *nbat,
                                                  const interaction_const_t gmx_unused *ic,
                                                  rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_u
                                                  real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJPSw_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                  const nbnxn_atomdata_t    gmx_unused *nbat,
                                                  const interaction_const_t gmx_unused *ic,
                                                  rvec                      gmx_unused *shift_vec,
index 8053eb13a7fac8cc390db856897ed8904cbe4120..14eaa2e6cbe5dcb4b5af46ff47a599ee9cf667cb 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                           const nbnxn_atomdata_t    gmx_unused *nbat,
                                           const interaction_const_t gmx_unused *ic,
                                           rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_F_4xn(const nbnxn_pairlist_t    gmx_unused *
                                           real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                           const nbnxn_atomdata_t    gmx_unused *nbat,
                                           const interaction_const_t gmx_unused *ic,
                                           rvec                      gmx_unused *shift_vec,
index 3ebad86d5c953947dc91e42c5c9af6e1bba71a7c..9ce158cbb30b4b6079c5295026fc77e70a99e0ac 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VF_4xn(const nbnxn_pairlist_t    gmx_unused
                                            real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
index fffb94548ec66f5136c588d9beca2ba62daa195c..9bc0a1dbed8ca2c96f301b13343d9c99cdaf3194 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                               const nbnxn_atomdata_t    gmx_unused *nbat,
                                               const interaction_const_t gmx_unused *ic,
                                               rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unus
                                               real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTabTwinCut_VdwLJ_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                               const nbnxn_atomdata_t    gmx_unused *nbat,
                                               const interaction_const_t gmx_unused *ic,
                                               rvec                      gmx_unused *shift_vec,
index f783769fae6ca634d54a25c49886f6da02678970..0283154b0f2a01f715dadb443514e706e8654b56 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJCombGeom_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombGeom_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecQSTab_VdwLJCombGeom_F_4xn(const nbnxn_pairlist_t    gmx_unused
                                            real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJCombGeom_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombGeom_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
index e26492baa84ecbd990c0e311515808b4e82bbd07..2d286c25a915a6f1885bd25834bb04728346fc1f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                             const nbnxn_atomdata_t    gmx_unused *nbat,
                                             const interaction_const_t gmx_unused *ic,
                                             rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VF_4xn(const nbnxn_pairlist_t    gmx_unused
                                             real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                             const nbnxn_atomdata_t    gmx_unused *nbat,
                                             const interaction_const_t gmx_unused *ic,
                                             rvec                      gmx_unused *shift_vec,
index 23c96cecd12c0f8668b3b860de935a4ac8410fbc..51f3e562e672aea523679c76f8c631326f9a47cd 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                const nbnxn_atomdata_t    gmx_unused *nbat,
                                                const interaction_const_t gmx_unused *ic,
                                                rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unu
                                                real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombGeom_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                const nbnxn_atomdata_t    gmx_unused *nbat,
                                                const interaction_const_t gmx_unused *ic,
                                                rvec                      gmx_unused *shift_vec,
index 69357872591a0d06fe4e4148458fe43637b78a5f..65eef8b30598648e55f26a9e500223b35680ab50 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJCombLB_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombLB_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                          const nbnxn_atomdata_t    gmx_unused *nbat,
                                          const interaction_const_t gmx_unused *ic,
                                          rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecQSTab_VdwLJCombLB_F_4xn(const nbnxn_pairlist_t    gmx_unused *n
                                          real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJCombLB_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombLB_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                          const nbnxn_atomdata_t    gmx_unused *nbat,
                                          const interaction_const_t gmx_unused *ic,
                                          rvec                      gmx_unused *shift_vec,
index d57c1f4ad28b80cd94430fb7c27395f7b4e28b9d..69263a1fd1bc0576129018beb3ec128b3b944ab3 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJCombLB_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombLB_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                           const nbnxn_atomdata_t    gmx_unused *nbat,
                                           const interaction_const_t gmx_unused *ic,
                                           rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecQSTab_VdwLJCombLB_VF_4xn(const nbnxn_pairlist_t    gmx_unused *
                                           real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJCombLB_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombLB_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                           const nbnxn_atomdata_t    gmx_unused *nbat,
                                           const interaction_const_t gmx_unused *ic,
                                           rvec                      gmx_unused *shift_vec,
index c28ff139a08dc30e3eff40ccb0fa327f51ff7335..e20cf637f4a3e947953588616fc41970cc41592b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJCombLB_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombLB_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                              const nbnxn_atomdata_t    gmx_unused *nbat,
                                              const interaction_const_t gmx_unused *ic,
                                              rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTab_VdwLJCombLB_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unuse
                                              real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJCombLB_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJCombLB_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                              const nbnxn_atomdata_t    gmx_unused *nbat,
                                              const interaction_const_t gmx_unused *ic,
                                              rvec                      gmx_unused *shift_vec,
index d9c317e99a130c5c48bfea0786da641d1d3a6f1a..4cf542b008f3f3702311c3db42829a0e9cd845e4 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                              const nbnxn_atomdata_t    gmx_unused *nbat,
                                              const interaction_const_t gmx_unused *ic,
                                              rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_F_4xn(const nbnxn_pairlist_t    gmx_unuse
                                              real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                              const nbnxn_atomdata_t    gmx_unused *nbat,
                                              const interaction_const_t gmx_unused *ic,
                                              rvec                      gmx_unused *shift_vec,
index a461347b8b143fd5ffca3163d5bfd7dabb2385d5..6b6b8c9c602aad6dc03ed8455fc8a344cc973614 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                               const nbnxn_atomdata_t    gmx_unused *nbat,
                                               const interaction_const_t gmx_unused *ic,
                                               rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VF_4xn(const nbnxn_pairlist_t    gmx_unus
                                               real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                               const nbnxn_atomdata_t    gmx_unused *nbat,
                                               const interaction_const_t gmx_unused *ic,
                                               rvec                      gmx_unused *shift_vec,
index a4de436f961c5cb1b7e568fe47c869451b1428de..3ba45418c06f4ccf80ff2958c28e97442deced11 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                  const nbnxn_atomdata_t    gmx_unused *nbat,
                                                  const interaction_const_t gmx_unused *ic,
                                                  rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VgrpF_4xn(const nbnxn_pairlist_t    gmx_u
                                                  real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJEwCombGeom_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                                  const nbnxn_atomdata_t    gmx_unused *nbat,
                                                  const interaction_const_t gmx_unused *ic,
                                                  rvec                      gmx_unused *shift_vec,
index fe0398f6586724d6b8b9bea6c36b607f2760578a..0ae4fcd11048d3f18452743f2da4fd384492905a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJFSw_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJFSw_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                       const nbnxn_atomdata_t    gmx_unused *nbat,
                                       const interaction_const_t gmx_unused *ic,
                                       rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecQSTab_VdwLJFSw_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                       real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJFSw_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJFSw_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                       const nbnxn_atomdata_t    gmx_unused *nbat,
                                       const interaction_const_t gmx_unused *ic,
                                       rvec                      gmx_unused *shift_vec,
index fd6341a7112b5a077efececfb1d7b8259287546e..3555140a2dbc0f75e8122e9dfdc59317edffd42e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJFSw_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJFSw_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                        const interaction_const_t gmx_unused *ic,
                                        rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecQSTab_VdwLJFSw_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl
                                        real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJFSw_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJFSw_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                        const interaction_const_t gmx_unused *ic,
                                        rvec                      gmx_unused *shift_vec,
index 1fe30f2d1454212b5c535d83efdfd1ca65a93c31..45e424a79c7cacf194bf4b962705262dc5f65e2c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJFSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJFSw_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                           const nbnxn_atomdata_t    gmx_unused *nbat,
                                           const interaction_const_t gmx_unused *ic,
                                           rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTab_VdwLJFSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *
                                           real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJFSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJFSw_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                           const nbnxn_atomdata_t    gmx_unused *nbat,
                                           const interaction_const_t gmx_unused *ic,
                                           rvec                      gmx_unused *shift_vec,
index 3dc3ac11a428b257a0e72307ddceb0c73e690089..711c21fa8ca7eeb364c85a36d4d0c93b099359f1 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJPSw_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJPSw_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                       const nbnxn_atomdata_t    gmx_unused *nbat,
                                       const interaction_const_t gmx_unused *ic,
                                       rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecQSTab_VdwLJPSw_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                       real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJPSw_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJPSw_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                       const nbnxn_atomdata_t    gmx_unused *nbat,
                                       const interaction_const_t gmx_unused *ic,
                                       rvec                      gmx_unused *shift_vec,
index 16b9eb8c12f22c9083bcd07886e8af702177d2d5..8a4b70c90f28bc879bce8afa3a81455aff3af186 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJPSw_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJPSw_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                        const interaction_const_t gmx_unused *ic,
                                        rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecQSTab_VdwLJPSw_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl
                                        real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJPSw_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJPSw_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                        const interaction_const_t gmx_unused *ic,
                                        rvec                      gmx_unused *shift_vec,
index 9798ec810a448bda6ead8f169ffd1aad856b99db..ad717f96e769407de84a272d104ffa0e10c3122c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJPSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJPSw_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                           const nbnxn_atomdata_t    gmx_unused *nbat,
                                           const interaction_const_t gmx_unused *ic,
                                           rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTab_VdwLJPSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *
                                           real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJPSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJPSw_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                           const nbnxn_atomdata_t    gmx_unused *nbat,
                                           const interaction_const_t gmx_unused *ic,
                                           rvec                      gmx_unused *shift_vec,
index 2527bee0967369380ccc0d912c50dae073723f21..8bd49504f6aaa2171a54c9ce40f50e1f6dd63fb8 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJ_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJ_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                    const nbnxn_atomdata_t    gmx_unused *nbat,
                                    const interaction_const_t gmx_unused *ic,
                                    rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecQSTab_VdwLJ_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                    real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJ_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJ_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                    const nbnxn_atomdata_t    gmx_unused *nbat,
                                    const interaction_const_t gmx_unused *ic,
                                    rvec                      gmx_unused *shift_vec,
index 802951e490fd66cd1271b03dbf8cfa517002b888..784b9019f51b34c7c0e27bddc7396ddef38ae13e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJ_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJ_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                     const interaction_const_t gmx_unused *ic,
                                     rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecQSTab_VdwLJ_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                     real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJ_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJ_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                     const interaction_const_t gmx_unused *ic,
                                     rvec                      gmx_unused *shift_vec,
index 481e08c5f24b85ef82ace24f443b87248c9c4c17..86ec48cb4c8647d163607969436fcd15b1a15428 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecQSTab_VdwLJ_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJ_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                        const interaction_const_t gmx_unused *ic,
                                        rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecQSTab_VdwLJ_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl
                                        real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecQSTab_VdwLJ_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecQSTab_VdwLJ_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                        const interaction_const_t gmx_unused *ic,
                                        rvec                      gmx_unused *shift_vec,
index 7bfede79b44ee5c3ae652db572d251cd59b42849..0b8f0726d14ab51d4219b94ae22dcfc3e238a17f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJCombGeom_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombGeom_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                         const nbnxn_atomdata_t    gmx_unused *nbat,
                                         const interaction_const_t gmx_unused *ic,
                                         rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecRF_VdwLJCombGeom_F_4xn(const nbnxn_pairlist_t    gmx_unused *nb
                                         real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJCombGeom_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombGeom_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                         const nbnxn_atomdata_t    gmx_unused *nbat,
                                         const interaction_const_t gmx_unused *ic,
                                         rvec                      gmx_unused *shift_vec,
index 6ae2216729feadc387c12e20366f919c19cb5d24..faee8996d30fbbbc485c9948e169084394f471ae 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJCombGeom_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombGeom_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                          const nbnxn_atomdata_t    gmx_unused *nbat,
                                          const interaction_const_t gmx_unused *ic,
                                          rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecRF_VdwLJCombGeom_VF_4xn(const nbnxn_pairlist_t    gmx_unused *n
                                          real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJCombGeom_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombGeom_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                          const nbnxn_atomdata_t    gmx_unused *nbat,
                                          const interaction_const_t gmx_unused *ic,
                                          rvec                      gmx_unused *shift_vec,
index 68e92719ae3e6a7bbba49bcc971d7b60f5c4244b..9eb0ec59636229b0260d5218ddcde52fe06ab616 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJCombGeom_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombGeom_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                             const nbnxn_atomdata_t    gmx_unused *nbat,
                                             const interaction_const_t gmx_unused *ic,
                                             rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecRF_VdwLJCombGeom_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused
                                             real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJCombGeom_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombGeom_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                             const nbnxn_atomdata_t    gmx_unused *nbat,
                                             const interaction_const_t gmx_unused *ic,
                                             rvec                      gmx_unused *shift_vec,
index 5929a7387732993844753427c6ef67270ac67edb..b948ade5a630f47eb12a18f213355d2e0501e0e5 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJCombLB_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombLB_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                       const nbnxn_atomdata_t    gmx_unused *nbat,
                                       const interaction_const_t gmx_unused *ic,
                                       rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecRF_VdwLJCombLB_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                       real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJCombLB_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombLB_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                       const nbnxn_atomdata_t    gmx_unused *nbat,
                                       const interaction_const_t gmx_unused *ic,
                                       rvec                      gmx_unused *shift_vec,
index ce438f6f04939d757eb17267d6fd0e6e6650e4e4..5f21405d1a3a27db3712f944b79c6c77b96596e5 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJCombLB_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombLB_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                        const interaction_const_t gmx_unused *ic,
                                        rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecRF_VdwLJCombLB_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl
                                        real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJCombLB_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombLB_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                        const interaction_const_t gmx_unused *ic,
                                        rvec                      gmx_unused *shift_vec,
index 35d2c00a5acca5d90afc699547f4765ab4983407..a5f7287d61f3981f7f1ee7bb1e1f7d3d9233bdc6 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJCombLB_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombLB_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                           const nbnxn_atomdata_t    gmx_unused *nbat,
                                           const interaction_const_t gmx_unused *ic,
                                           rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecRF_VdwLJCombLB_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *
                                           real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJCombLB_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJCombLB_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                           const nbnxn_atomdata_t    gmx_unused *nbat,
                                           const interaction_const_t gmx_unused *ic,
                                           rvec                      gmx_unused *shift_vec,
index bd70e0b57e89b7dc5324ad042dd1a2149353b6d5..a6c3ffbe22a682a7809e2206073d1b25e5696808 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJEwCombGeom_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJEwCombGeom_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                           const nbnxn_atomdata_t    gmx_unused *nbat,
                                           const interaction_const_t gmx_unused *ic,
                                           rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecRF_VdwLJEwCombGeom_F_4xn(const nbnxn_pairlist_t    gmx_unused *
                                           real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJEwCombGeom_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJEwCombGeom_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                           const nbnxn_atomdata_t    gmx_unused *nbat,
                                           const interaction_const_t gmx_unused *ic,
                                           rvec                      gmx_unused *shift_vec,
index 0e7cecbd996d0b66e7dce01a8d8327a4db577206..24e53a873eaf0868c6fe00ae92f27dfc4cea0aa5 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VF_4xn(const nbnxn_pairlist_t    gmx_unused
                                            real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                            const nbnxn_atomdata_t    gmx_unused *nbat,
                                            const interaction_const_t gmx_unused *ic,
                                            rvec                      gmx_unused *shift_vec,
index f84740e462ae5a7138d9d5bc84fa2f4513babcb7..a9797ce94479285d80d7d1f5f1798824f887fa71 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -64,7 +64,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                               const nbnxn_atomdata_t    gmx_unused *nbat,
                                               const interaction_const_t gmx_unused *ic,
                                               rvec                      gmx_unused *shift_vec,
@@ -74,7 +74,7 @@ nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unus
                                               real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJEwCombGeom_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                               const nbnxn_atomdata_t    gmx_unused *nbat,
                                               const interaction_const_t gmx_unused *ic,
                                               rvec                      gmx_unused *shift_vec,
index 75d34524fa6d155c771dc4c49c1c987f2bd0d896..b06ee570a8a5eb825b541fab54f71473a4f42ca1 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJFSw_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJFSw_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                    const nbnxn_atomdata_t    gmx_unused *nbat,
                                    const interaction_const_t gmx_unused *ic,
                                    rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecRF_VdwLJFSw_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                    real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJFSw_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJFSw_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                    const nbnxn_atomdata_t    gmx_unused *nbat,
                                    const interaction_const_t gmx_unused *ic,
                                    rvec                      gmx_unused *shift_vec,
index 5b0ef7cb9d949337f635afa6246c26ccdd41ac49..adf65c67680568f46e7b014b68219e6ed550e47c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJFSw_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJFSw_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                     const interaction_const_t gmx_unused *ic,
                                     rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecRF_VdwLJFSw_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                     real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJFSw_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJFSw_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                     const interaction_const_t gmx_unused *ic,
                                     rvec                      gmx_unused *shift_vec,
index 585b1b5c5f6b0d833c81708f1cc7af6f410119a3..2c1ac393251ad2ae1aabc55b97ea0d483127d10c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJFSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJFSw_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                        const interaction_const_t gmx_unused *ic,
                                        rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecRF_VdwLJFSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl
                                        real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJFSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJFSw_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                        const interaction_const_t gmx_unused *ic,
                                        rvec                      gmx_unused *shift_vec,
index 407a135765fb0897047c89d49458ea5a4c947e7c..125afe8031a1508179689c881a47c3aa3f0b60d2 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJPSw_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJPSw_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                    const nbnxn_atomdata_t    gmx_unused *nbat,
                                    const interaction_const_t gmx_unused *ic,
                                    rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecRF_VdwLJPSw_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                    real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJPSw_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJPSw_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                    const nbnxn_atomdata_t    gmx_unused *nbat,
                                    const interaction_const_t gmx_unused *ic,
                                    rvec                      gmx_unused *shift_vec,
index efc36dd7c71c345986d438c0f72c13d01b84ae7a..681a8ad15ea48357cf8a1fcf32bc0201c6868292 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJPSw_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJPSw_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                     const interaction_const_t gmx_unused *ic,
                                     rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecRF_VdwLJPSw_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                     real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJPSw_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJPSw_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                     const interaction_const_t gmx_unused *ic,
                                     rvec                      gmx_unused *shift_vec,
index d39573281010100b528bbb762c4124b5aacab453..bb37ca1eec3cd1ecfd4b9dd1a8e08ba3d34e1ef1 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJPSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJPSw_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                        const interaction_const_t gmx_unused *ic,
                                        rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecRF_VdwLJPSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl
                                        real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJPSw_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJPSw_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                        const nbnxn_atomdata_t    gmx_unused *nbat,
                                        const interaction_const_t gmx_unused *ic,
                                        rvec                      gmx_unused *shift_vec,
index bee4727d9db6495c4b9a68535ece96a2e423a8d5..79aeab798d3a836a54c7c7ef75e16a3e0a587fb7 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJ_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJ_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                 const nbnxn_atomdata_t    gmx_unused *nbat,
                                 const interaction_const_t gmx_unused *ic,
                                 rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecRF_VdwLJ_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                 real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJ_F_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJ_F_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                 const nbnxn_atomdata_t    gmx_unused *nbat,
                                 const interaction_const_t gmx_unused *ic,
                                 rvec                      gmx_unused *shift_vec,
index 28e784f7858d5642bae3ae3d3bfc020af0339b95..e23a63f5afb5449fc78573fd7696382b445c828c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -62,7 +62,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJ_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJ_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                  const nbnxn_atomdata_t    gmx_unused *nbat,
                                  const interaction_const_t gmx_unused *ic,
                                  rvec                      gmx_unused *shift_vec,
@@ -72,7 +72,7 @@ nbnxn_kernel_ElecRF_VdwLJ_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                  real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJ_VF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJ_VF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                  const nbnxn_atomdata_t    gmx_unused *nbat,
                                  const interaction_const_t gmx_unused *ic,
                                  rvec                      gmx_unused *shift_vec,
index 70b0ab358540e6e187851e332b69e70e90f2e9b9..52cbb43fa0aa1d4937d90f18e6e5f68ba2b892db 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2019, 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.
@@ -63,7 +63,7 @@
 
 #ifdef CALC_ENERGIES
 void
-nbnxn_kernel_ElecRF_VdwLJ_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJ_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                     const interaction_const_t gmx_unused *ic,
                                     rvec                      gmx_unused *shift_vec,
@@ -73,7 +73,7 @@ nbnxn_kernel_ElecRF_VdwLJ_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
                                     real                      gmx_unused *Vc)
 #else /* CALC_ENERGIES */
 void
-nbnxn_kernel_ElecRF_VdwLJ_VgrpF_4xn(const nbnxn_pairlist_t    gmx_unused *nbl,
+nbnxn_kernel_ElecRF_VdwLJ_VgrpF_4xn(const NbnxnPairlistCpu    gmx_unused *nbl,
                                     const nbnxn_atomdata_t    gmx_unused *nbat,
                                     const interaction_const_t gmx_unused *ic,
                                     rvec                      gmx_unused *shift_vec,
index 18f1449ece2e5144769770bede257aa6e7e19848..7e07a7c554290875a717e685eb96882a8412d004 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2017,2018,2019, 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.
@@ -143,7 +143,7 @@ nbk_func_noener       nbnxn_kernel_ElecEwTwinCut_VdwLJEwCombGeom_F_4xn;
  * The minor index of the array goes over both the LJ combination rules,
  * which is only supported by plain cut-off, and the LJ switch/PME functions.
  */
-static p_nbk_func_noener nbnxn_kernel_noener_simd_4xn[coulktNR][vdwktNR] =
+p_nbk_func_noener nbnxn_kernel_noener_simd_4xn[coulktNR][vdwktNR] =
 {
     {
         nbnxn_kernel_ElecRF_VdwLJCombGeom_F_4xn,
@@ -187,7 +187,7 @@ static p_nbk_func_noener nbnxn_kernel_noener_simd_4xn[coulktNR][vdwktNR] =
     },
 };
 
-static p_nbk_func_ener nbnxn_kernel_ener_simd_4xn[coulktNR][vdwktNR] =
+p_nbk_func_ener nbnxn_kernel_ener_simd_4xn[coulktNR][vdwktNR] =
 {
     {
         nbnxn_kernel_ElecRF_VdwLJCombGeom_VF_4xn,
@@ -231,7 +231,7 @@ static p_nbk_func_ener nbnxn_kernel_ener_simd_4xn[coulktNR][vdwktNR] =
     },
 };
 
-static p_nbk_func_ener nbnxn_kernel_energrp_simd_4xn[coulktNR][vdwktNR] =
+p_nbk_func_ener nbnxn_kernel_energrp_simd_4xn[coulktNR][vdwktNR] =
 {
     {
         nbnxn_kernel_ElecRF_VdwLJCombGeom_VgrpF_4xn,
index 2c101a61789da4e6653d64b600da35bbfad29c8f..7ac6e4f62ad62ed3cc6b02c651e5e0f08a781a36 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2017,2018,2019, 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.
 #error "Need to define GMX_SIMD_J_UNROLL_SIZE before including the 4xn kernel common header file"
 #endif
 
-#define UNROLLI    NBNXN_CPU_CLUSTER_I_SIZE
+#define UNROLLI    4
 #define UNROLLJ    (GMX_SIMD_REAL_WIDTH/GMX_SIMD_J_UNROLL_SIZE)
 
+static_assert(UNROLLI == c_nbnxnCpuIClusterSize, "UNROLLI should match the i-cluster size");
+
 /* The stride of all the atom data arrays is max(UNROLLI,unrollj) */
 #if GMX_SIMD_REAL_WIDTH >= UNROLLI
 #define STRIDE     (GMX_SIMD_REAL_WIDTH/GMX_SIMD_J_UNROLL_SIZE)
@@ -102,7 +104,7 @@ gmx_load_simd_4xn_interactions(int                               excl,
                                SimdBitMask gmx_unused            filter_S1,
                                SimdBitMask gmx_unused            filter_S2,
                                SimdBitMask gmx_unused            filter_S3,
-                               real gmx_unused                  *simd_interaction_array,
+                               const real gmx_unused            *simd_interaction_array,
                                gmx::SimdBool                    *interact_S0,
                                gmx::SimdBool                    *interact_S1,
                                gmx::SimdBool                    *interact_S2,
index 5bc77035f06a264a12efa5bf396becc1d3904f50..8b842916275578bc806d82c3dc31a676b015485b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, 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.
     gmx_load_simd_4xn_interactions(l_cj[cjind].excl,
                                    filter_S0, filter_S1,
                                    filter_S2, filter_S3,
-                                   nbat->simd_interaction_array,
+                                   nbat->simdMasks.interaction_array.data(),
                                    &interact_S0, &interact_S1,
                                    &interact_S2, &interact_S3);
 #endif /* CHECK_EXCLS */
     {
         int egps_j;
 #if UNROLLJ == 2
-        egps_j    = nbat->energrp[cj>>1];
+        egps_j    = nbatParams.energrp[cj >> 1];
         egp_jj[0] = ((egps_j >> ((cj & 1)*egps_jshift)) & egps_jmask)*egps_jstride;
 #else
         /* We assume UNROLLI <= UNROLLJ */
         for (jdi = 0; jdi < UNROLLJ/UNROLLI; jdi++)
         {
             int jj;
-            egps_j = nbat->energrp[cj*(UNROLLJ/UNROLLI)+jdi];
+            egps_j = nbatParams.energrp[cj*(UNROLLJ/UNROLLI) + jdi];
             for (jj = 0; jj < (UNROLLI/2); jj++)
             {
                 egp_jj[jdi*(UNROLLI/2)+jj] = ((egps_j >> (jj*egps_jshift)) & egps_jmask)*egps_jstride;
index a96797a060e586ff81cc27101bc89a3c6f2a3b85..df29ca0b5655d7626983192a1020524b54a0b698 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, 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.
 
 {
     using namespace gmx;
-    const nbnxn_ci_t   *nbln;
     const nbnxn_cj_t   *l_cj;
-    const real *        q;
-    const real         *shiftvec;
-    const real         *x;
-    real                facel;
-    int                 n, ci, ci_sh;
+    int                 ci, ci_sh;
     int                 ish, ish3;
     gmx_bool            do_LJ, half_LJ, do_coul;
     int                 cjind0, cjind1, cjind;
     SimdBool  diagonal_mask1_S0, diagonal_mask1_S1, diagonal_mask1_S2, diagonal_mask1_S3;
 #endif
 
-#if GMX_DOUBLE && !GMX_SIMD_HAVE_INT32_LOGICAL
-    std::uint64_t       *exclusion_filter;
-#else
-    std::uint32_t       *exclusion_filter;
-#endif
     SimdBitMask          filter_S0, filter_S1, filter_S2, filter_S3;
 
     SimdReal             zero_S(0.0);
 #endif
 
 #ifdef LJ_COMB_LB
-    const real       *ljc;
-
     SimdReal          hsig_i_S0, seps_i_S0;
     SimdReal          hsig_i_S1, seps_i_S1;
     SimdReal          hsig_i_S2, seps_i_S2;
     SimdReal          hsig_i_S3, seps_i_S3;
-#else
-
-#if defined LJ_COMB_GEOM || defined LJ_EWALD_GEOM
-    const real       *ljc;
-#endif
 #endif /* LJ_COMB_LB */
 
     SimdReal  minRsq_S;
     int npair = 0;
 #endif
 
+    const nbnxn_atomdata_t::Params &nbatParams = nbat->params();
+
 #if defined LJ_COMB_GEOM || defined LJ_COMB_LB || defined LJ_EWALD_GEOM
-    ljc = nbat->lj_comb;
+    const real * gmx_restrict ljc      = nbatParams.lj_comb.data();
 #endif
 #if !(defined LJ_COMB_GEOM || defined LJ_COMB_LB || defined FIX_LJ_C)
     /* No combination rule used */
-    real      *nbfp_ptr    = nbat->nbfp_aligned;
-    const int *type        = nbat->type;
+    const real * gmx_restrict nbfp_ptr = nbatParams.nbfp_aligned.data();
+    const int * gmx_restrict  type     = nbatParams.type.data();
 #endif
 
     /* Load j-i for the first i */
-    diagonal_jmi_S    = load<SimdReal>(nbat->simd_4xn_diagonal_j_minus_i);
+    diagonal_jmi_S    = load<SimdReal>(nbat->simdMasks.diagonal_4xn_j_minus_i.data());
     /* Generate all the diagonal masks as comparison results */
 #if UNROLLI == UNROLLJ
     diagonal_mask_S0  = (zero_S < diagonal_jmi_S);
 
 #if UNROLLI == 2*UNROLLJ
     /* Load j-i for the second half of the j-cluster */
-    diagonal_jmi_S    = load<SimdReal>(nbat->simd_4xn_diagonal_j_minus_i + UNROLLJ);
+    diagonal_jmi_S    = load<SimdReal>(nbat->simdMasks.diagonal_4xn_j_minus_i.data() + UNROLLJ);
 #endif
 
     diagonal_mask1_S0 = (zero_S < diagonal_jmi_S);
 #endif
 
 #if GMX_DOUBLE && !GMX_SIMD_HAVE_INT32_LOGICAL
-    exclusion_filter = nbat->simd_exclusion_filter64;
+    const std::uint64_t * gmx_restrict exclusion_filter = nbat->simdMasks.exclusion_filter64.data();
 #else
-    exclusion_filter = nbat->simd_exclusion_filter;
+    const std::uint32_t * gmx_restrict exclusion_filter = nbat->simdMasks.exclusion_filter.data();
 #endif
 
     /* Here we cast the exclusion filters from unsigned * to int * or real *.
     rcvdw2_S =  SimdReal(ic->rvdw*ic->rvdw);
 #endif
 
-    minRsq_S            = SimdReal(NBNXN_MIN_RSQ);
+    minRsq_S                           = SimdReal(NBNXN_MIN_RSQ);
 
-    q                   = nbat->q;
-    facel               = ic->epsfac;
-    shiftvec            = shift_vec[0];
-    x                   = nbat->x;
+    const real * gmx_restrict q        = nbatParams.q.data();
+    const real                facel    = ic->epsfac;
+    const real * gmx_restrict shiftvec = shift_vec[0];
+    const real * gmx_restrict x        = nbat->x().data();
 
 #ifdef FIX_LJ_C
     alignas(GMX_SIMD_ALIGNMENT) real  pvdw_c6[2*UNROLLI*UNROLLJ];
 #endif /* FIX_LJ_C */
 
 #ifdef ENERGY_GROUPS
-    egps_ishift  = nbat->neg_2log;
+    egps_ishift  = nbatParams.neg_2log;
     egps_imask   = (1<<egps_ishift) - 1;
-    egps_jshift  = 2*nbat->neg_2log;
+    egps_jshift  = 2*nbatParams.neg_2log;
     egps_jmask   = (1<<egps_jshift) - 1;
     egps_jstride = (UNROLLJ>>1)*UNROLLJ;
     /* Major division is over i-particle energy groups, determine the stride */
-    Vstride_i    = nbat->nenergrp*(1<<nbat->neg_2log)*egps_jstride;
+    Vstride_i    = nbatParams.nenergrp*(1 << nbatParams.neg_2log)*egps_jstride;
 #endif
 
-    l_cj = nbl->cj;
+    l_cj = nbl->cj.data();
 
     ninner = 0;
 
-    for (n = 0; n < nbl->nci; n++)
+    for (const nbnxn_ci_t &ciEntry : nbl->ci)
     {
-        nbln = &nbl->ci[n];
-
-        ish              = (nbln->shift & NBNXN_CI_SHIFT);
+        ish              = (ciEntry.shift & NBNXN_CI_SHIFT);
         ish3             = ish*3;
-        cjind0           = nbln->cj_ind_start;
-        cjind1           = nbln->cj_ind_end;
-        ci               = nbln->ci;
+        cjind0           = ciEntry.cj_ind_start;
+        cjind1           = ciEntry.cj_ind_end;
+        ci               = ciEntry.ci;
         ci_sh            = (ish == CENTRAL ? ci : -1);
 
         shX_S = SimdReal(shiftvec[ish3]);
          * inner LJ + C      for full-LJ + C
          * inner LJ          for full-LJ + no-C / half-LJ + no-C
          */
-        do_LJ   = ((nbln->shift & NBNXN_CI_DO_LJ(0)) != 0);
-        do_coul = ((nbln->shift & NBNXN_CI_DO_COUL(0)) != 0);
-        half_LJ = (((nbln->shift & NBNXN_CI_HALF_LJ(0)) != 0) || !do_LJ) && do_coul;
+        do_LJ   = ((ciEntry.shift & NBNXN_CI_DO_LJ(0)) != 0);
+        do_coul = ((ciEntry.shift & NBNXN_CI_DO_COUL(0)) != 0);
+        half_LJ = (((ciEntry.shift & NBNXN_CI_HALF_LJ(0)) != 0) || !do_LJ) && do_coul;
 
 #ifdef ENERGY_GROUPS
-        egps_i = nbat->energrp[ci];
+        egps_i = nbatParams.energrp[ci];
         {
             int ia, egp_ia;
 
         gmx_bool do_self = do_coul;
 #endif
 #if UNROLLJ == 4
-        if (do_self && l_cj[nbln->cj_ind_start].cj == ci_sh)
+        if (do_self && l_cj[ciEntry.cj_ind_start].cj == ci_sh)
 #endif
 #if UNROLLJ == 2
-        if (do_self && l_cj[nbln->cj_ind_start].cj == (ci_sh<<1))
+        if (do_self && l_cj[ciEntry.cj_ind_start].cj == (ci_sh<<1))
 #endif
 #if UNROLLJ == 8
-        if (do_self && l_cj[nbln->cj_ind_start].cj == (ci_sh>>1))
+        if (do_self && l_cj[ciEntry.cj_ind_start].cj == (ci_sh>>1))
 #endif
         {
             if (do_coul)
                 {
                     real c6_i;
 
-                    c6_i = nbat->nbfp[nbat->type[sci+ia]*(nbat->ntype + 1)*2]/6;
+                    c6_i = nbatParams.nbfp[nbatParams.type[sci+ia]*(nbatParams.numTypes + 1)*2]/6;
 #ifdef ENERGY_GROUPS
                     vvdwtp[ia][((egps_i>>(ia*egps_ishift)) & egps_imask)*egps_jstride]
 #else
             c12s_S3    = setZero();
         }
 #else
-        const real *nbfp0     = nbfp_ptr + type[sci  ]*nbat->ntype*c_simdBestPairAlignment;
-        const real *nbfp1     = nbfp_ptr + type[sci+1]*nbat->ntype*c_simdBestPairAlignment;
+        const int   numTypes  = nbatParams.numTypes;
+        const real *nbfp0     = nbfp_ptr + type[sci  ]*numTypes*c_simdBestPairAlignment;
+        const real *nbfp1     = nbfp_ptr + type[sci+1]*numTypes*c_simdBestPairAlignment;
         const real *nbfp2     = nullptr, *nbfp3 = nullptr;
         if (!half_LJ)
         {
-            nbfp2 = nbfp_ptr + type[sci+2]*nbat->ntype*c_simdBestPairAlignment;
-            nbfp3 = nbfp_ptr + type[sci+3]*nbat->ntype*c_simdBestPairAlignment;
+            nbfp2 = nbfp_ptr + type[sci+2]*numTypes*c_simdBestPairAlignment;
+            nbfp3 = nbfp_ptr + type[sci+3]*numTypes*c_simdBestPairAlignment;
         }
 #endif
 #endif
index 9086e3431cba1e890d2b64da6243cf56faa15353..e7f829c47b09ad69326219143bdf4482595e7738 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2018,2019, 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.
 
 /* Prune a single nbnxn_pairtlist_t entry with distance rlistInner */
 void
-nbnxn_kernel_prune_4xn(nbnxn_pairlist_t *         nbl,
+nbnxn_kernel_prune_4xn(NbnxnPairlistCpu *         nbl,
                        const nbnxn_atomdata_t *   nbat,
                        const rvec * gmx_restrict  shift_vec,
                        real                       rlistInner)
 {
 #ifdef GMX_NBNXN_SIMD_4XN
     using namespace gmx;
-    const nbnxn_ci_t * gmx_restrict ciOuter  = nbl->ciOuter;
-    nbnxn_ci_t       * gmx_restrict ciInner  = nbl->ci;
 
-    const nbnxn_cj_t * gmx_restrict cjOuter  = nbl->cjOuter;
-    nbnxn_cj_t       * gmx_restrict cjInner  = nbl->cj;
+    /* We avoid push_back() for efficiency reasons and resize after filling */
+    nbl->ci.resize(nbl->ciOuter.size());
+    nbl->cj.resize(nbl->cjOuter.size());
+
+    const nbnxn_ci_t * gmx_restrict ciOuter  = nbl->ciOuter.data();
+    nbnxn_ci_t       * gmx_restrict ciInner  = nbl->ci.data();
+
+    const nbnxn_cj_t * gmx_restrict cjOuter  = nbl->cjOuter.data();
+    nbnxn_cj_t       * gmx_restrict cjInner  = nbl->cj.data();
 
     const real       * gmx_restrict shiftvec = shift_vec[0];
-    const real       * gmx_restrict x        = nbat->x;
+    const real       * gmx_restrict x        = nbat->x().data();
 
     const SimdReal                  rlist2_S(rlistInner*rlistInner);
 
-    /* Initialize the new list as empty and add pairs that are in range */
-    int nciInner = 0;
-    int ncjInner = 0;
-    for (int i = 0; i < nbl->nciOuter; i++)
+    /* Initialize the new list count as empty and add pairs that are in range */
+    int       nciInner = 0;
+    int       ncjInner = 0;
+    const int nciOuter = nbl->ciOuter.size();
+    for (int i = 0; i < nciOuter; i++)
     {
         const nbnxn_ci_t * gmx_restrict ciEntry = &ciOuter[i];
 
@@ -174,7 +180,8 @@ nbnxn_kernel_prune_4xn(nbnxn_pairlist_t *         nbl,
         }
     }
 
-    nbl->nci = nciInner;
+    nbl->ci.resize(nciInner);
+    nbl->cj.resize(ncjInner);
 
 #else  /* GMX_NBNXN_SIMD_4XN */
 
index 55b3ce73f927e93fa47101158b1bc1badea50926..47950fc86b660d7f702f85930d59f41673dc69aa 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2016,2017, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2019, 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.
 #include "gromacs/utility/real.h"
 
 struct nbnxn_atomdata_t;
-struct nbnxn_pairlist_t;
+struct NbnxnPairlistCpu;
 
-/*! \brief Prune a single nbnxn_pairlist_t entry with distance \p rlistInner
+/*! \brief Prune a single NbnxnPairlistCpu entry with distance \p rlistInner
  *
  * Reads a cluster pairlist \p nbl->ciOuter, \p nbl->cjOuter and writes
  * all cluster pairs within \p rlistInner to \p nbl->ci, \p nbl->cj.
  */
 void
-nbnxn_kernel_prune_4xn(nbnxn_pairlist_t *         nbl,
+nbnxn_kernel_prune_4xn(NbnxnPairlistCpu *         nbl,
                        const nbnxn_atomdata_t *   nbat,
                        const rvec * gmx_restrict  shift_vec,
                        real                       rlistInner);
index 22c6ba169e0700dd211338a3362ce43a55b93266..8908f3fb2e36937edeeb8ed314bd4d0348c53c9c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, 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.
@@ -410,7 +410,7 @@ void nbnxn_gpu_copy_xq_to_gpu(gmx_nbnxn_ocl_t        *nb,
     }
 
     /* HtoD x, q */
-    ocl_copy_H2D_async(adat->xq, nbatom->x + adat_begin * 4, adat_begin*sizeof(float)*4,
+    ocl_copy_H2D_async(adat->xq, nbatom->x().data() + adat_begin * 4, adat_begin*sizeof(float)*4,
                        adat_len * sizeof(float) * 4, stream, bDoTime ? t->nb_h2d[iloc].fetchNextEvent() : nullptr);
 
     if (bDoTime)
@@ -729,7 +729,7 @@ void nbnxn_gpu_launch_kernel_pruneonly(gmx_nbnxn_gpu_t       *nb,
  * (and energies/shift forces if required).
  */
 void nbnxn_gpu_launch_cpyback(gmx_nbnxn_ocl_t               *nb,
-                              const struct nbnxn_atomdata_t *nbatom,
+                              struct nbnxn_atomdata_t       *nbatom,
                               int                            flags,
                               int                            aloc,
                               bool                           haveOtherWork)
@@ -780,7 +780,7 @@ void nbnxn_gpu_launch_cpyback(gmx_nbnxn_ocl_t               *nb,
     }
 
     /* DtoH f */
-    ocl_copy_D2H_async(nbatom->out[0].f + adat_begin * 3, adat->f, adat_begin*3*sizeof(float),
+    ocl_copy_D2H_async(nbatom->out[0].f.data() + adat_begin * 3, adat->f, adat_begin*3*sizeof(float),
                        (adat_len)* adat->f_elem_size, stream, bDoTime ? t->nb_d2h[iloc].fetchNextEvent() : nullptr);
 
     /* kick off work */
index d04718ea9f3093eb4d547b1d87c4cc2d31226822..d164d268316118220b50bd871a99aaa57f86fad1 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, 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.
@@ -145,7 +145,7 @@ static void init_atomdata_first(cl_atomdata_t *ad, int ntypes, gmx_device_runtim
 
     /* An element of the shift_vec device buffer has the same size as one element
        of the host side shift_vec buffer. */
-    ad->shift_vec_elem_size = sizeof(*nbnxn_atomdata_t::shift_vec);
+    ad->shift_vec_elem_size = sizeof(*nbnxn_atomdata_t::shift_vec.data());
 
     ad->shift_vec = clCreateBuffer(runData->context, CL_MEM_READ_ONLY | CL_MEM_HOST_WRITE_ONLY,
                                    SHIFTS * ad->shift_vec_elem_size, nullptr, &cl_error);
@@ -291,7 +291,7 @@ map_interaction_types_to_gpu_kernel_flavors(const interaction_const_t *ic,
 static void init_nbparam(cl_nbparam_t                    *nbp,
                          const interaction_const_t       *ic,
                          const NbnxnListParameters       *listParams,
-                         const nbnxn_atomdata_t          *nbat,
+                         const nbnxn_atomdata_t::Params  &nbatParams,
                          const gmx_device_runtime_data_t *runData)
 {
     cl_int cl_error;
@@ -299,7 +299,7 @@ static void init_nbparam(cl_nbparam_t                    *nbp,
     set_cutoff_parameters(nbp, ic, listParams);
 
     map_interaction_types_to_gpu_kernel_flavors(ic,
-                                                nbat->comb_rule,
+                                                nbatParams.comb_rule,
                                                 &(nbp->eeltype),
                                                 &(nbp->vdwtype));
 
@@ -307,11 +307,11 @@ static void init_nbparam(cl_nbparam_t                    *nbp,
     {
         if (ic->ljpme_comb_rule == ljcrGEOM)
         {
-            GMX_ASSERT(nbat->comb_rule == ljcrGEOM, "Combination rule mismatch!");
+            GMX_ASSERT(nbatParams.comb_rule == ljcrGEOM, "Combination rule mismatch!");
         }
         else
         {
-            GMX_ASSERT(nbat->comb_rule == ljcrLB, "Combination rule mismatch!");
+            GMX_ASSERT(nbatParams.comb_rule == ljcrLB, "Combination rule mismatch!");
         }
     }
     /* generate table for PME */
@@ -342,8 +342,8 @@ static void init_nbparam(cl_nbparam_t                    *nbp,
                            ("clCreateBuffer failed: " + ocl_get_error_string(cl_error)).c_str());
     }
 
-    int nnbfp      = 2*nbat->ntype*nbat->ntype;
-    int nnbfp_comb = 2*nbat->ntype;
+    const int nnbfp      = 2*nbatParams.numTypes*nbatParams.numTypes;
+    const int nnbfp_comb = 2*nbatParams.numTypes;
 
     {
         /* Switched from using textures to using buffers */
@@ -358,8 +358,12 @@ static void init_nbparam(cl_nbparam_t                    *nbp,
             &array_format, nnbfp, 1, 0, nbat->nbfp, &cl_error);
          */
 
-        nbp->nbfp_climg2d = clCreateBuffer(runData->context, CL_MEM_READ_ONLY | CL_MEM_HOST_WRITE_ONLY | CL_MEM_COPY_HOST_PTR,
-                                           nnbfp*sizeof(cl_float), nbat->nbfp, &cl_error);
+        nbp->nbfp_climg2d =
+            clCreateBuffer(runData->context,
+                           CL_MEM_READ_ONLY | CL_MEM_HOST_WRITE_ONLY | CL_MEM_COPY_HOST_PTR,
+                           nnbfp*sizeof(cl_float),
+                           const_cast<float *>(nbatParams.nbfp.data()),
+                           &cl_error);
         GMX_RELEASE_ASSERT(cl_error == CL_SUCCESS,
                            ("clCreateBuffer failed: " + ocl_get_error_string(cl_error)).c_str());
 
@@ -369,8 +373,12 @@ static void init_nbparam(cl_nbparam_t                    *nbp,
             // TODO: decide which alternative is most efficient - textures or buffers.
             /*  nbp->nbfp_comb_climg2d = clCreateImage2D(runData->context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR,
                 &array_format, nnbfp_comb, 1, 0, nbat->nbfp_comb, &cl_error);*/
-            nbp->nbfp_comb_climg2d = clCreateBuffer(runData->context, CL_MEM_READ_ONLY | CL_MEM_HOST_WRITE_ONLY | CL_MEM_COPY_HOST_PTR,
-                                                    nnbfp_comb*sizeof(cl_float), nbat->nbfp_comb, &cl_error);
+            nbp->nbfp_comb_climg2d =
+                clCreateBuffer(runData->context,
+                               CL_MEM_READ_ONLY | CL_MEM_HOST_WRITE_ONLY | CL_MEM_COPY_HOST_PTR,
+                               nnbfp_comb*sizeof(cl_float),
+                               const_cast<float *>(nbatParams.nbfp_comb.data()),
+                               &cl_error);
             GMX_RELEASE_ASSERT(cl_error == CL_SUCCESS,
                                ("clCreateBuffer failed: " + ocl_get_error_string(cl_error)).c_str());
         }
@@ -598,10 +606,10 @@ static void nbnxn_gpu_init_kernels(gmx_nbnxn_ocl_t *nb)
 static void nbnxn_ocl_init_const(gmx_nbnxn_ocl_t                *nb,
                                  const interaction_const_t      *ic,
                                  const NbnxnListParameters      *listParams,
-                                 const nbnxn_atomdata_t         *nbat)
+                                 const nbnxn_atomdata_t::Params &nbatParams)
 {
-    init_atomdata_first(nb->atdat, nbat->ntype, nb->dev_rundata);
-    init_nbparam(nb->nbparam, ic, listParams, nbat, nb->dev_rundata);
+    init_atomdata_first(nb->atdat, nbatParams.numTypes, nb->dev_rundata);
+    init_nbparam(nb->nbparam, ic, listParams, nbatParams, nb->dev_rundata);
 }
 
 
@@ -695,7 +703,7 @@ void nbnxn_gpu_init(gmx_nbnxn_ocl_t          **p_nb,
         init_timings(nb->timings);
     }
 
-    nbnxn_ocl_init_const(nb, ic, listParams, nbat);
+    nbnxn_ocl_init_const(nb, ic, listParams, nbat->params());
 
     /* Enable LJ param manual prefetch for AMD or Intel or if we request through env. var.
      * TODO: decide about NVIDIA
@@ -765,14 +773,14 @@ nbnxn_gpu_clear_outputs(gmx_nbnxn_ocl_t   *nb,
 
 //! This function is documented in the header file
 void nbnxn_gpu_init_pairlist(gmx_nbnxn_ocl_t        *nb,
-                             const nbnxn_pairlist_t *h_plist,
+                             const NbnxnPairlistGpu *h_plist,
                              int                     iloc)
 {
     char             sbuf[STRLEN];
     // Timing accumulation should happen only if there was work to do
     // because getLastRangeTime() gets skipped with empty lists later
     // which leads to the counter not being reset.
-    bool             bDoTime    = ((nb->bDoTime == CL_TRUE) && h_plist->nsci > 0);
+    bool             bDoTime    = ((nb->bDoTime == CL_TRUE) && !h_plist->sci.empty());
     cl_command_queue stream     = nb->stream[iloc];
     cl_plist_t      *d_plist    = nb->plist[iloc];
 
@@ -799,24 +807,24 @@ void nbnxn_gpu_init_pairlist(gmx_nbnxn_ocl_t        *nb,
     // TODO most of this function is same in CUDA and OpenCL, move into the header
     Context context = nb->dev_rundata->context;
 
-    reallocateDeviceBuffer(&d_plist->sci, h_plist->nsci,
+    reallocateDeviceBuffer(&d_plist->sci, h_plist->sci.size(),
                            &d_plist->nsci, &d_plist->sci_nalloc, context);
-    copyToDeviceBuffer(&d_plist->sci, h_plist->sci, 0, h_plist->nsci,
+    copyToDeviceBuffer(&d_plist->sci, h_plist->sci.data(), 0, h_plist->sci.size(),
                        stream, GpuApiCallBehavior::Async,
                        bDoTime ? nb->timers->pl_h2d[iloc].fetchNextEvent() : nullptr);
 
-    reallocateDeviceBuffer(&d_plist->cj4, h_plist->ncj4,
+    reallocateDeviceBuffer(&d_plist->cj4, h_plist->cj4.size(),
                            &d_plist->ncj4, &d_plist->cj4_nalloc, context);
-    copyToDeviceBuffer(&d_plist->cj4, h_plist->cj4, 0, h_plist->ncj4,
+    copyToDeviceBuffer(&d_plist->cj4, h_plist->cj4.data(), 0, h_plist->cj4.size(),
                        stream, GpuApiCallBehavior::Async,
                        bDoTime ? nb->timers->pl_h2d[iloc].fetchNextEvent() : nullptr);
 
-    reallocateDeviceBuffer(&d_plist->imask, h_plist->ncj4*c_nbnxnGpuClusterpairSplit,
+    reallocateDeviceBuffer(&d_plist->imask, h_plist->cj4.size()*c_nbnxnGpuClusterpairSplit,
                            &d_plist->nimask, &d_plist->imask_nalloc, context);
 
-    reallocateDeviceBuffer(&d_plist->excl, h_plist->nexcl,
+    reallocateDeviceBuffer(&d_plist->excl, h_plist->excl.size(),
                            &d_plist->nexcl, &d_plist->excl_nalloc, context);
-    copyToDeviceBuffer(&d_plist->excl, h_plist->excl, 0, h_plist->nexcl,
+    copyToDeviceBuffer(&d_plist->excl, h_plist->excl.data(), 0, h_plist->excl.size(),
                        stream, GpuApiCallBehavior::Async,
                        bDoTime ? nb->timers->pl_h2d[iloc].fetchNextEvent() : nullptr);
 
@@ -839,7 +847,7 @@ void nbnxn_gpu_upload_shiftvec(gmx_nbnxn_ocl_t        *nb,
     /* only if we have a dynamic box */
     if (nbatom->bDynamicBox || !adat->bShiftVecUploaded)
     {
-        ocl_copy_H2D_async(adat->shift_vec, nbatom->shift_vec, 0,
+        ocl_copy_H2D_async(adat->shift_vec, nbatom->shift_vec.data(), 0,
                            SHIFTS * adat->shift_vec_elem_size, ls, nullptr);
         adat->bShiftVecUploaded = CL_TRUE;
     }
@@ -857,7 +865,7 @@ void nbnxn_gpu_init_atomdata(gmx_nbnxn_ocl_t               *nb,
     cl_atomdata_t   *d_atdat = nb->atdat;
     cl_command_queue ls      = nb->stream[eintLocal];
 
-    natoms    = nbat->natoms;
+    natoms    = nbat->numAtoms();
     realloced = false;
 
     if (bDoTime)
@@ -923,12 +931,12 @@ void nbnxn_gpu_init_atomdata(gmx_nbnxn_ocl_t               *nb,
 
     if (useLjCombRule(nb->nbparam->vdwtype))
     {
-        ocl_copy_H2D_async(d_atdat->lj_comb, nbat->lj_comb, 0,
+        ocl_copy_H2D_async(d_atdat->lj_comb, nbat->params().lj_comb.data(), 0,
                            natoms*sizeof(cl_float2), ls, bDoTime ? timers->atdat.fetchNextEvent() : nullptr);
     }
     else
     {
-        ocl_copy_H2D_async(d_atdat->atom_types, nbat->type, 0,
+        ocl_copy_H2D_async(d_atdat->atom_types, nbat->params().type.data(), 0,
                            natoms*sizeof(int), ls, bDoTime ? timers->atdat.fetchNextEvent() : nullptr);
 
     }
index efa1110e65542c25366e9098afb914e392254b79..ac5c189d34d07327c83ce444e771dbba29e7b0a1 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, 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.
 
 #include <cstddef>
 
+#include "gromacs/gpu_utils/hostallocator.h"
 #include "gromacs/math/vectypes.h"
 #include "gromacs/mdlib/nbnxn_consts.h"
 #include "gromacs/mdtypes/nblist.h"
 #include "gromacs/utility/basedefinitions.h"
 #include "gromacs/utility/bitmask.h"
+#include "gromacs/utility/defaultinitializationallocator.h"
 #include "gromacs/utility/real.h"
 
+struct NbnxnPairlistCpuWork;
+struct NbnxnPairlistGpuWork;
 struct tMPI_Atomic;
 
+/* Convenience type for vector with aligned memory */
+template<typename T>
+using AlignedVector = std::vector < T, gmx::AlignedAllocator < T>>;
+
+/* Convenience type for vector that avoids initialization at resize() */
+template<typename T>
+using FastVector = std::vector < T, gmx::DefaultInitializationAllocator < T>>;
+
 /*! \cond INTERNAL */
 
 /*! \brief The setup for generating and pruning the nbnxn pair list.
@@ -77,6 +89,9 @@ struct NbnxnListParameters
 
 /*! \endcond */
 
+/* With CPU kernels the i-cluster size is always 4 atoms. */
+static constexpr int c_nbnxnCpuIClusterSize = 4;
+
 /* With GPU kernels the i and j cluster size is 8 atoms for CUDA and can be set at compile time for OpenCL */
 #if GMX_GPU == GMX_GPU_OPENCL
 static constexpr int c_nbnxnGpuClusterSize = GMX_OPENCL_NB_CLUSTER_SIZE;
@@ -84,6 +99,11 @@ static constexpr int c_nbnxnGpuClusterSize = GMX_OPENCL_NB_CLUSTER_SIZE;
 static constexpr int c_nbnxnGpuClusterSize = 8;
 #endif
 
+/* The number of clusters in a pair-search cell, used for GPU */
+static constexpr int c_gpuNumClusterPerCellZ = 2;
+static constexpr int c_gpuNumClusterPerCellY = 2;
+static constexpr int c_gpuNumClusterPerCellX = 2;
+static constexpr int c_gpuNumClusterPerCell  = c_gpuNumClusterPerCellZ*c_gpuNumClusterPerCellY*c_gpuNumClusterPerCellX;
 
 /* In CUDA the number of threads in a warp is 32 and we have cluster pairs
  * of 8*8=64 atoms, so it's convenient to store data for cluster pair halves.
@@ -123,10 +143,11 @@ typedef void nbnxn_free_t (void *ptr);
  * This means that once a full mask (=NBNXN_INTERACTION_MASK_ALL)
  * is found, all subsequent j-entries in the i-entry also have full masks.
  */
-typedef struct {
+struct nbnxn_cj_t
+{
     int          cj;    /* The j-cluster                    */
     unsigned int excl;  /* The exclusion (interaction) bits */
-} nbnxn_cj_t;
+};
 
 /* In nbnxn_ci_t the integer shift contains the shift in the lower 7 bits.
  * The upper bits contain information for non-bonded kernel optimization.
@@ -141,83 +162,135 @@ typedef struct {
 #define NBNXN_CI_HALF_LJ(subc)  (1<<(8+3*(subc)))
 #define NBNXN_CI_DO_COUL(subc)  (1<<(9+3*(subc)))
 
+/* Cluster-pair Interaction masks
+ * Bit i*j-cluster-size + j tells if atom i and j interact.
+ */
+// TODO: Rename according to convention when moving into Nbnxn namespace
+/* All interaction mask is the same for all kernels */
+constexpr unsigned int NBNXN_INTERACTION_MASK_ALL       = 0xffffffffU;
+/* 4x4 kernel diagonal mask */
+constexpr unsigned int NBNXN_INTERACTION_MASK_DIAG      = 0x08ceU;
+/* 4x2 kernel diagonal masks */
+constexpr unsigned int NBNXN_INTERACTION_MASK_DIAG_J2_0 = 0x0002U;
+constexpr unsigned int NBNXN_INTERACTION_MASK_DIAG_J2_1 = 0x002fU;
+/* 4x8 kernel diagonal masks */
+constexpr unsigned int NBNXN_INTERACTION_MASK_DIAG_J8_0 = 0xf0f8fcfeU;
+constexpr unsigned int NBNXN_INTERACTION_MASK_DIAG_J8_1 = 0x0080c0e0U;
+
 /* Simple pair-list i-unit */
-typedef struct {
+struct nbnxn_ci_t
+{
     int ci;             /* i-cluster             */
     int shift;          /* Shift vector index plus possible flags, see above */
     int cj_ind_start;   /* Start index into cj   */
     int cj_ind_end;     /* End index into cj     */
-} nbnxn_ci_t;
+};
 
 /* Grouped pair-list i-unit */
 typedef struct {
+    /* Returns the number of j-cluster groups in this entry */
+    int numJClusterGroups() const
+    {
+        return cj4_ind_end - cj4_ind_start;
+    };
+
     int sci;            /* i-super-cluster       */
     int shift;          /* Shift vector index plus possible flags */
     int cj4_ind_start;  /* Start index into cj4  */
     int cj4_ind_end;    /* End index into cj4    */
 } nbnxn_sci_t;
 
-typedef struct {
-    unsigned int imask;    /* The i-cluster interactions mask for 1 warp  */
-    int          excl_ind; /* Index into the exclusion array for 1 warp   */
-} nbnxn_im_ei_t;
+/* Interaction data for a j-group for one warp */
+struct nbnxn_im_ei_t
+{
+    // The i-cluster interactions mask for 1 warp
+    unsigned int imask    = 0U;
+    // Index into the exclusion array for 1 warp, default index 0 which means no exclusions
+    int          excl_ind = 0;
+};
 
 typedef struct {
     int           cj[c_nbnxnGpuJgroupSize];         /* The 4 j-clusters */
     nbnxn_im_ei_t imei[c_nbnxnGpuClusterpairSplit]; /* The i-cluster mask data       for 2 warps   */
 } nbnxn_cj4_t;
 
-typedef struct {
-    unsigned int pair[c_nbnxnGpuExclSize]; /* Topology exclusion interaction bits for one warp,
-                                            * each unsigned has bitS for 4*8 i clusters
-                                            */
-} nbnxn_excl_t;
-
-typedef struct nbnxn_pairlist_t {
-    gmx_cache_protect_t cp0;
+/* Struct for storing the atom-pair interaction bits for a cluster pair in a GPU pairlist */
+struct nbnxn_excl_t
+{
+    /* Constructor, sets no exclusions, so all atom pairs interacting */
+    nbnxn_excl_t()
+    {
+        for (unsigned int &pairEntry : pair)
+        {
+            pairEntry = NBNXN_INTERACTION_MASK_ALL;
+        }
+    }
 
-    nbnxn_alloc_t      *alloc;
-    nbnxn_free_t       *free;
+    /* Topology exclusion interaction bits per warp */
+    unsigned int pair[c_nbnxnGpuExclSize];
+};
 
-    gmx_bool            bSimple;         /* Simple list has na_sc=na_s and uses cj   *
-                                          * Complex list uses cj4                    */
+/* Cluster pairlist type for use on CPUs */
+struct NbnxnPairlistCpu
+{
+    gmx_cache_protect_t     cp0;
 
     int                     na_ci;       /* The number of atoms per i-cluster        */
     int                     na_cj;       /* The number of atoms per j-cluster        */
-    int                     na_sc;       /* The number of atoms per super cluster    */
     real                    rlist;       /* The radius for constructing the list     */
-    int                     nci;         /* The number of i-clusters in the list     */
-    int                     nciOuter;    /* The number of i-clusters in the outer, unpruned list, -1 when invalid */
-    nbnxn_ci_t             *ci;          /* The i-cluster list, size nci             */
-    nbnxn_ci_t             *ciOuter;     /* The outer, unpruned i-cluster list, size nciOuter(=-1 when invalid) */
-    int                     ci_nalloc;   /* The allocation size of ci/ciOuter        */
-    int                     nsci;        /* The number of i-super-clusters in the list */
-    nbnxn_sci_t            *sci;         /* The i-super-cluster list                 */
-    int                     sci_nalloc;  /* The allocation size of sci               */
-
-    int                     ncj;         /* The number of j-clusters in the list     */
-    nbnxn_cj_t             *cj;          /* The j-cluster list, size ncj             */
-    nbnxn_cj_t             *cjOuter;     /* The outer, unpruned j-cluster list, size ncj    */
-    int                     cj_nalloc;   /* The allocation size of cj/cj0            */
-    int                     ncjInUse;    /* The number of j-clusters that are used by ci entries in this list, will be <= ncj */
-
-    int                     ncj4;        /* The total number of 4*j clusters         */
-    nbnxn_cj4_t            *cj4;         /* The 4*j cluster list, size ncj4          */
-    int                     cj4_nalloc;  /* The allocation size of cj4               */
-    int                     nexcl;       /* The count for excl                       */
-    nbnxn_excl_t           *excl;        /* Atom interaction bits (non-exclusions)   */
-    int                     excl_nalloc; /* The allocation size for excl             */
+    FastVector<nbnxn_ci_t>  ci;          /* The i-cluster list                       */
+    FastVector<nbnxn_ci_t>  ciOuter;     /* The outer, unpruned i-cluster list       */
+
+    FastVector<nbnxn_cj_t>  cj;          /* The j-cluster list, size ncj             */
+    FastVector<nbnxn_cj_t>  cjOuter;     /* The outer, unpruned j-cluster list       */
+    int                     ncjInUse;    /* The number of j-clusters that are used by ci entries in this list, will be <= cj.size() */
+
     int                     nci_tot;     /* The total number of i clusters           */
 
-    struct nbnxn_list_work *work;
+    NbnxnPairlistCpuWork   *work;
 
     gmx_cache_protect_t     cp1;
-} nbnxn_pairlist_t;
+};
+
+/* Cluster pairlist type, with extra hierarchies, for on the GPU
+ *
+ * NOTE: for better performance when combining lists over threads,
+ *       all vectors should use default initialization. But when
+ *       changing this, excl should be intialized when adding entries.
+ */
+struct NbnxnPairlistGpu
+{
+    /* Constructor
+     *
+     * \param[in] pinningPolicy  Sets the pinning policy for all buffers used on the GPU
+     */
+    NbnxnPairlistGpu(gmx::PinningPolicy pinningPolicy);
+
+    gmx_cache_protect_t            cp0;
+
+    int                            na_ci; /* The number of atoms per i-cluster        */
+    int                            na_cj; /* The number of atoms per j-cluster        */
+    int                            na_sc; /* The number of atoms per super cluster    */
+    real                           rlist; /* The radius for constructing the list     */
+    // The i-super-cluster list, indexes into cj4;
+    gmx::HostVector<nbnxn_sci_t>   sci;
+    // The list of 4*j-cluster groups
+    gmx::HostVector<nbnxn_cj4_t>   cj4;
+    // Atom interaction bits (non-exclusions)
+    gmx::HostVector<nbnxn_excl_t>  excl;
+    // The total number of i-clusters
+    int                            nci_tot;
+
+    NbnxnPairlistGpuWork          *work;
+
+    gmx_cache_protect_t            cp1;
+};
 
 typedef struct {
     int                nnbl;                  /* number of lists */
-    nbnxn_pairlist_t **nbl;                   /* lists */
-    nbnxn_pairlist_t **nbl_work;              /* work space for rebalancing lists */
+    NbnxnPairlistCpu **nbl;                   /* lists for CPU */
+    NbnxnPairlistCpu **nbl_work;              /* work space for rebalancing lists */
+    NbnxnPairlistGpu **nblGpu;                /* lists for GPU */
     gmx_bool           bCombined;             /* TRUE if lists get combined into one (the 1st) */
     gmx_bool           bSimple;               /* TRUE if the list of of type "simple"
                                                  (na_sc=na_s, no super-clusters used) */
@@ -232,16 +305,28 @@ enum {
     nbatXYZ, nbatXYZQ, nbatX4, nbatX8
 };
 
-typedef struct {
-    real *f;      /* f, size natoms*fstride                             */
-    real *fshift; /* Shift force array, size SHIFTS*DIM                 */
-    int   nV;     /* The size of *Vvdw and *Vc                          */
-    real *Vvdw;   /* Temporary Van der Waals group energy storage       */
-    real *Vc;     /* Temporary Coulomb group energy storage             */
-    int   nVS;    /* The size of *VSvdw and *VSc                        */
-    real *VSvdw;  /* Temporary SIMD Van der Waals group energy storage  */
-    real *VSc;    /* Temporary SIMD Coulomb group energy storage        */
-} nbnxn_atomdata_output_t;
+// Struct that holds force and energy output buffers
+struct nbnxn_atomdata_output_t
+{
+    /* Constructor
+     *
+     * \param[in] nb_kernel_type          Type of non-bonded kernel
+     * \param[in] numEnergyGroups         The number of energy groups
+     * \param[in] simdEnergyBufferStride  Stride for entries in the energy buffers for SIMD kernels
+     * \param[in] pinningPolicy           Sets the pinning policy for all buffers used on the GPU
+     */
+    nbnxn_atomdata_output_t(int                nb_kernel_type,
+                            int                numEnergyGroups,
+                            int                simdEnergyBUfferStride,
+                            gmx::PinningPolicy pinningPolicy);
+
+    gmx::HostVector<real> f;      // f, size natoms*fstride
+    gmx::HostVector<real> fshift; // Shift force array, size SHIFTS*DIM
+    gmx::HostVector<real> Vvdw;   // Temporary Van der Waals group energy storage
+    gmx::HostVector<real> Vc;     // Temporary Coulomb group energy storage
+    AlignedVector<real>   VSvdw;  // Temporary SIMD Van der Waals group energy storage
+    AlignedVector<real>   VSc;    // Temporary SIMD Coulomb group energy storage
+};
 
 /* Block size in atoms for the non-bonded thread force-buffer reduction,
  * should be a multiple of all cell and x86 SIMD sizes (i.e. 2, 4 and 8).
@@ -272,49 +357,132 @@ enum {
     ljcrGEOM, ljcrLB, ljcrNONE, ljcrNR
 };
 
-typedef struct nbnxn_atomdata_t { //NOLINT(clang-analyzer-optin.performance.Padding)
-    nbnxn_alloc_t           *alloc;
-    nbnxn_free_t            *free;
-    int                      ntype;           /* The number of different atom types                 */
-    real                    *nbfp;            /* Lennard-Jones 6*C6 and 12*C12 params, size ntype^2*2 */
-    int                      comb_rule;       /* Combination rule, see enum above                   */
-    real                    *nbfp_comb;       /* LJ parameter per atom type, size ntype*2           */
-    real                    *nbfp_aligned;    /* As nbfp, but with an alignment (stride) suitable
-                                               * for the present SIMD architectures
-                                               */
-    int                      natoms;          /* Number of atoms                                    */
-    int                      natoms_local;    /* Number of local atoms                           */
-    int                     *type;            /* Atom types                                         */
-    real                    *lj_comb;         /* LJ parameters per atom for combining for pairs     */
-    int                      XFormat;         /* The format of x (and q), enum                      */
-    int                      FFormat;         /* The format of f, enum                              */
-    real                    *q;               /* Charges, can be NULL if incorporated in x          */
-    int                      na_c;            /* The number of atoms per cluster                    */
-    int                      nenergrp;        /* The number of energy groups                        */
-    int                      neg_2log;        /* Log2 of nenergrp                                   */
-    int                     *energrp;         /* The energy groups per cluster, can be NULL         */
-    gmx_bool                 bDynamicBox;     /* Do we need to update shift_vec every step?    */
-    rvec                    *shift_vec;       /* Shift vectors, copied from t_forcerec              */
-    int                      xstride;         /* stride for a coordinate in x (usually 3 or 4)      */
-    int                      fstride;         /* stride for a coordinate in f (usually 3 or 4)      */
-    real                    *x;               /* x and possibly q, size natoms*xstride              */
-
-    /* j-atom minus i-atom index for generating self and Newton exclusions
-     * cluster-cluster pairs of the diagonal, for 4xn and 2xnn kernels.
+/* Struct that stores atom related data for the nbnxn module
+ *
+ * Note: performance would improve slightly when all std::vector containers
+ *       in this struct would not initialize during resize().
+ */
+struct nbnxn_atomdata_t
+{   //NOLINT(clang-analyzer-optin.performance.Padding)
+    struct Params
+    {
+        /* Constructor
+         *
+         * \param[in] pinningPolicy  Sets the pinning policy for all data that might be transfered to a GPU
+         */
+        Params(gmx::PinningPolicy pinningPolicy);
+
+        // The number of different atom types
+        int                   numTypes;
+        // Lennard-Jone 6*C6 and 12*C12 parameters, size numTypes*2*2
+        gmx::HostVector<real> nbfp;
+        // Combination rule, see enum defined above
+        int                   comb_rule;
+        // LJ parameters per atom type, size numTypes*2
+        gmx::HostVector<real> nbfp_comb;
+        // As nbfp, but with a stride for the present SIMD architecture
+        AlignedVector<real>   nbfp_aligned;
+        // Atom types per atom
+        gmx::HostVector<int>  type;
+        // LJ parameters per atom for fast SIMD loading
+        gmx::HostVector<real> lj_comb;
+        // Charges per atom, not set with format nbatXYZQ
+        gmx::HostVector<real> q;
+        // The number of energy groups
+        int                   nenergrp;
+        // 2log(nenergrp)
+        int                   neg_2log;
+        // The energy groups, one int entry per cluster, only set when needed
+        gmx::HostVector<int>  energrp;
+    };
+
+    // Diagonal and topology exclusion helper data for all SIMD kernels
+    struct SimdMasks
+    {
+        SimdMasks();
+
+        // Helper data for setting up diagonal exclusion masks in the SIMD 4xN kernels
+        AlignedVector<real>     diagonal_4xn_j_minus_i;
+        // Helper data for setting up diaginal exclusion masks in the SIMD 2xNN kernels
+        AlignedVector<real>     diagonal_2xnn_j_minus_i;
+        // Filters for topology exclusion masks for the SIMD kernels
+        AlignedVector<uint32_t> exclusion_filter;
+        // Filters for topology exclusion masks for double SIMD kernels without SIMD int32 logical support
+        AlignedVector<uint64_t> exclusion_filter64;
+        // Array of masks needed for exclusions
+        AlignedVector<real>     interaction_array;
+    };
+
+    /* Constructor
+     *
+     * \param[in] pinningPolicy  Sets the pinning policy for all data that might be transfered to a GPU
      */
-    real                    *simd_4xn_diagonal_j_minus_i;
-    real                    *simd_2xnn_diagonal_j_minus_i;
-    /* Filters for topology exclusion masks for the SIMD kernels. */
-    uint32_t                *simd_exclusion_filter;
-    uint64_t                *simd_exclusion_filter64; //!< Used for double w/o SIMD int32 logical support
-    real                    *simd_interaction_array;  /* Array of masks needed for exclusions */
-    int                      nout;                    /* The number of force arrays                         */
-    nbnxn_atomdata_output_t *out;                     /* Output data structures               */
-    int                      nalloc;                  /* Allocation size of all arrays (for x/f *x/fstride) */
-    gmx_bool                 bUseBufferFlags;         /* Use the flags or operate on all atoms     */
-    nbnxn_buffer_flags_t     buffer_flags;            /* Flags for buffer zeroing+reduc.  */
-    gmx_bool                 bUseTreeReduce;          /* Use tree for force reduction */
-    tMPI_Atomic             *syncStep;                /* Synchronization step for tree reduce */
-} nbnxn_atomdata_t;
+    nbnxn_atomdata_t(gmx::PinningPolicy pinningPolicy);
+
+    /* Returns a const reference to the parameters */
+    const Params &params() const
+    {
+        return params_;
+    }
+
+    /* Returns a non-const reference to the parameters */
+    Params &paramsDeprecated()
+    {
+        return params_;
+    }
+
+    /* Returns the current total number of atoms stored */
+    int numAtoms() const
+    {
+        return numAtoms_;
+    }
+
+    /* Return the coordinate buffer, and q with xFormat==nbatXYZQ */
+    gmx::ArrayRef<const real> x() const
+    {
+        return x_;
+    }
+
+    /* Return the coordinate buffer, and q with xFormat==nbatXYZQ */
+    gmx::ArrayRef<real> x()
+    {
+        return x_;
+    }
+
+    /* Resizes the coordinate buffer and sets the number of atoms */
+    void resizeCoordinateBuffer(int numAtoms);
+
+    /* Resizes the force buffers for the current number of atoms */
+    void resizeForceBuffers();
+
+    private:
+        // The LJ and charge parameters
+        Params                     params_;
+        // The total number of atoms currently stored
+        int                        numAtoms_;
+    public:
+        int                        natoms_local; /* Number of local atoms                           */
+        int                        XFormat;      /* The format of x (and q), enum                      */
+        int                        FFormat;      /* The format of f, enum                              */
+        gmx_bool                   bDynamicBox;  /* Do we need to update shift_vec every step?    */
+        gmx::HostVector<gmx::RVec> shift_vec;    /* Shift vectors, copied from t_forcerec              */
+        int                        xstride;      /* stride for a coordinate in x (usually 3 or 4)      */
+        int                        fstride;      /* stride for a coordinate in f (usually 3 or 4)      */
+    private:
+        gmx::HostVector<real>      x_;           /* x and possibly q, size natoms*xstride              */
+
+    public:
+        // Masks for handling exclusions in the SIMD kernels
+        const SimdMasks          simdMasks;
+
+        /* Output data */
+        std::vector<nbnxn_atomdata_output_t> out; /* Output data structures, 1 per thread */
+
+        /* Reduction related data */
+        gmx_bool                 bUseBufferFlags;     /* Use the flags or operate on all atoms     */
+        nbnxn_buffer_flags_t     buffer_flags;        /* Flags for buffer zeroing+reduc.  */
+        gmx_bool                 bUseTreeReduce;      /* Use tree for force reduction */
+        tMPI_Atomic             *syncStep;            /* Synchronization step for tree reduce */
+};
 
 #endif
index db292857fd39895e4bd60716d665d0db9ca82cb3..a06c309bdd628b8d3c357e7ac80b7cd89583dd23 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, 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.
@@ -137,20 +137,35 @@ static constexpr int jClusterSize()
 {
     static_assert(layout == NbnxnLayout::NoSimd4x4 || layout == NbnxnLayout::Simd4xN || layout == NbnxnLayout::Simd2xNN, "Currently jClusterSize only supports CPU layouts");
 
-    return layout == NbnxnLayout::Simd4xN ? GMX_SIMD_REAL_WIDTH : (layout == NbnxnLayout::Simd2xNN ? GMX_SIMD_REAL_WIDTH/2 : NBNXN_CPU_CLUSTER_I_SIZE);
+    return layout == NbnxnLayout::Simd4xN ? GMX_SIMD_REAL_WIDTH : (layout == NbnxnLayout::Simd2xNN ? GMX_SIMD_REAL_WIDTH/2 : c_nbnxnCpuIClusterSize);
 }
 
-/* Returns the j-cluster index given the i-cluster index */
-template <int jClusterSize>
+/*! \brief Returns the j-cluster index given the i-cluster index.
+ *
+ * \tparam    jClusterSize      The number of atoms in a j-cluster
+ * \tparam    jSubClusterIndex  The j-sub-cluster index (0/1), used when size(j-cluster) < size(i-cluster)
+ * \param[in] ci                The i-cluster index
+ */
+template <int jClusterSize, int jSubClusterIndex>
 static inline int cjFromCi(int ci)
 {
-    static_assert(jClusterSize == NBNXN_CPU_CLUSTER_I_SIZE/2 || jClusterSize == NBNXN_CPU_CLUSTER_I_SIZE || jClusterSize == NBNXN_CPU_CLUSTER_I_SIZE*2, "Only j-cluster sizes 2, 4 and 8 are currently implemented");
+    static_assert(jClusterSize == c_nbnxnCpuIClusterSize/2 || jClusterSize == c_nbnxnCpuIClusterSize || jClusterSize == c_nbnxnCpuIClusterSize*2, "Only j-cluster sizes 2, 4 and 8 are currently implemented");
+
+    static_assert(jSubClusterIndex == 0 || jSubClusterIndex == 1,
+                  "Only sub-cluster indices 0 and 1 are supported");
 
-    if (jClusterSize == NBNXN_CPU_CLUSTER_I_SIZE/2)
+    if (jClusterSize == c_nbnxnCpuIClusterSize/2)
     {
-        return ci << 1;
+        if (jSubClusterIndex == 0)
+        {
+            return ci << 1;
+        }
+        else
+        {
+            return ((ci + 1) << 1) - 1;
+        }
     }
-    else if (jClusterSize == NBNXN_CPU_CLUSTER_I_SIZE)
+    else if (jClusterSize == c_nbnxnCpuIClusterSize)
     {
         return ci;
     }
@@ -160,13 +175,18 @@ static inline int cjFromCi(int ci)
     }
 }
 
-/* Returns the j-cluster index given the i-cluster index */
-template <NbnxnLayout layout>
+/*! \brief Returns the j-cluster index given the i-cluster index.
+ *
+ * \tparam    layout            The pair-list layout
+ * \tparam    jSubClusterIndex  The j-sub-cluster index (0/1), used when size(j-cluster) < size(i-cluster)
+ * \param[in] ci                The i-cluster index
+ */
+template <NbnxnLayout layout, int jSubClusterIndex>
 static inline int cjFromCi(int ci)
 {
     constexpr int clusterSize = jClusterSize<layout>();
 
-    return cjFromCi<clusterSize>(ci);
+    return cjFromCi<clusterSize, jSubClusterIndex>(ci);
 }
 
 /* Returns the nbnxn coordinate data index given the i-cluster index */
@@ -175,9 +195,9 @@ static inline int xIndexFromCi(int ci)
 {
     constexpr int clusterSize = jClusterSize<layout>();
 
-    static_assert(clusterSize == NBNXN_CPU_CLUSTER_I_SIZE/2 || clusterSize == NBNXN_CPU_CLUSTER_I_SIZE || clusterSize == NBNXN_CPU_CLUSTER_I_SIZE*2, "Only j-cluster sizes 2, 4 and 8 are currently implemented");
+    static_assert(clusterSize == c_nbnxnCpuIClusterSize/2 || clusterSize == c_nbnxnCpuIClusterSize || clusterSize == c_nbnxnCpuIClusterSize*2, "Only j-cluster sizes 2, 4 and 8 are currently implemented");
 
-    if (clusterSize <= NBNXN_CPU_CLUSTER_I_SIZE)
+    if (clusterSize <= c_nbnxnCpuIClusterSize)
     {
         /* Coordinates are stored packed in groups of 4 */
         return ci*STRIDE_P4;
@@ -195,14 +215,14 @@ static inline int xIndexFromCj(int cj)
 {
     constexpr int clusterSize = jClusterSize<layout>();
 
-    static_assert(clusterSize == NBNXN_CPU_CLUSTER_I_SIZE/2 || clusterSize == NBNXN_CPU_CLUSTER_I_SIZE || clusterSize == NBNXN_CPU_CLUSTER_I_SIZE*2, "Only j-cluster sizes 2, 4 and 8 are currently implemented");
+    static_assert(clusterSize == c_nbnxnCpuIClusterSize/2 || clusterSize == c_nbnxnCpuIClusterSize || clusterSize == c_nbnxnCpuIClusterSize*2, "Only j-cluster sizes 2, 4 and 8 are currently implemented");
 
-    if (clusterSize == NBNXN_CPU_CLUSTER_I_SIZE/2)
+    if (clusterSize == c_nbnxnCpuIClusterSize/2)
     {
         /* Coordinates are stored packed in groups of 4 */
         return (cj >> 1)*STRIDE_P4 + (cj & 1)*(c_packX4 >> 1);
     }
-    else if (clusterSize == NBNXN_CPU_CLUSTER_I_SIZE)
+    else if (clusterSize == c_nbnxnCpuIClusterSize)
     {
         /* Coordinates are stored packed in groups of 4 */
         return cj*STRIDE_P4;
@@ -376,10 +396,10 @@ static real listRangeForBoundingBoxToGridCell(real                rlist,
  * to cells), this distance returned can be larger than the input.
  */
 static real listRangeForGridCellToGridCell(real                rlist,
-                                           const nbnxn_grid_t &gridi,
-                                           const nbnxn_grid_t &gridj)
+                                           const nbnxn_grid_t &iGrid,
+                                           const nbnxn_grid_t &jGrid)
 {
-    return rlist + gridi.maxAtomGroupRadius + gridj.maxAtomGroupRadius;
+    return rlist + iGrid.maxAtomGroupRadius + jGrid.maxAtomGroupRadius;
 }
 
 /* Determines the cell range along one dimension that
@@ -387,22 +407,22 @@ static real listRangeForGridCellToGridCell(real                rlist,
  */
 template<int dim>
 static void get_cell_range(real b0, real b1,
-                           const nbnxn_grid_t &gridj,
+                           const nbnxn_grid_t &jGrid,
                            real d2, real rlist, int *cf, int *cl)
 {
-    real listRangeBBToCell2 = gmx::square(listRangeForBoundingBoxToGridCell(rlist, gridj));
-    real distanceInCells    = (b0 - gridj.c0[dim])*gridj.invCellSize[dim];
+    real listRangeBBToCell2 = gmx::square(listRangeForBoundingBoxToGridCell(rlist, jGrid));
+    real distanceInCells    = (b0 - jGrid.c0[dim])*jGrid.invCellSize[dim];
     *cf                     = std::max(static_cast<int>(distanceInCells), 0);
 
     while (*cf > 0 &&
-           d2 + gmx::square((b0 - gridj.c0[dim]) - (*cf - 1 + 1)*gridj.cellSize[dim]) < listRangeBBToCell2)
+           d2 + gmx::square((b0 - jGrid.c0[dim]) - (*cf - 1 + 1)*jGrid.cellSize[dim]) < listRangeBBToCell2)
     {
         (*cf)--;
     }
 
-    *cl = std::min(static_cast<int>((b1 - gridj.c0[dim])*gridj.invCellSize[dim]), gridj.numCells[dim] - 1);
-    while (*cl < gridj.numCells[dim] - 1 &&
-           d2 + gmx::square((*cl + 1)*gridj.cellSize[dim] - (b1 - gridj.c0[dim])) < listRangeBBToCell2)
+    *cl = std::min(static_cast<int>((b1 - jGrid.c0[dim])*jGrid.invCellSize[dim]), jGrid.numCells[dim] - 1);
+    while (*cl < jGrid.numCells[dim] - 1 &&
+           d2 + gmx::square((*cl + 1)*jGrid.cellSize[dim] - (b1 - jGrid.c0[dim])) < listRangeBBToCell2)
     {
         (*cl)++;
     }
@@ -594,7 +614,7 @@ static void subc_bb_dist2_simd4_xxxx(const float *bb_j,
 
 /* Returns if any atom pair from two clusters is within distance sqrt(rlist2) */
 static inline gmx_bool
-clusterpair_in_range(const nbnxn_list_work_t *work,
+clusterpair_in_range(const NbnxnPairlistGpuWork &work,
                      int si,
                      int csj, int stride, const real *x_j,
                      real rlist2)
@@ -605,7 +625,7 @@ clusterpair_in_range(const nbnxn_list_work_t *work,
      * All coordinates are stored as xyzxyz...
      */
 
-    const real *x_i = work->x_ci;
+    const real *x_i = work.iSuperClusterData.x.data();
 
     for (int i = 0; i < c_nbnxnGpuClusterSize; i++)
     {
@@ -636,7 +656,7 @@ clusterpair_in_range(const nbnxn_list_work_t *work,
 
     Simd4Real   rc2_S      = Simd4Real(rlist2);
 
-    const real *x_i        = work->x_ci_simd;
+    const real *x_i        = work.iSuperClusterData.xSimd.data();
 
     int         dim_stride = c_nbnxnGpuClusterSize*DIM;
     Simd4Real   ix_S0      = load4(x_i + si*dim_stride + 0*GMX_SIMD4_WIDTH);
@@ -743,198 +763,69 @@ clusterpair_in_range(const nbnxn_list_work_t *work,
 }
 
 /* Returns the j-cluster index for index cjIndex in a cj list */
-static inline int nblCj(const nbnxn_cj_t *cjList, int cjIndex)
+static inline int nblCj(gmx::ArrayRef<const nbnxn_cj_t> cjList,
+                        int                             cjIndex)
 {
     return cjList[cjIndex].cj;
 }
 
 /* Returns the j-cluster index for index cjIndex in a cj4 list */
-static inline int nblCj(const nbnxn_cj4_t *cj4List, int cjIndex)
+static inline int nblCj(gmx::ArrayRef<const nbnxn_cj4_t> cj4List,
+                        int                              cjIndex)
 {
     return cj4List[cjIndex/c_nbnxnGpuJgroupSize].cj[cjIndex & (c_nbnxnGpuJgroupSize - 1)];
 }
 
 /* Returns the i-interaction mask of the j sub-cell for index cj_ind */
-static unsigned int nbl_imask0(const nbnxn_pairlist_t *nbl, int cj_ind)
+static unsigned int nbl_imask0(const NbnxnPairlistGpu *nbl, int cj_ind)
 {
     return nbl->cj4[cj_ind/c_nbnxnGpuJgroupSize].imei[0].imask;
 }
 
-/* Ensures there is enough space for extra extra exclusion masks */
-static void check_excl_space(nbnxn_pairlist_t *nbl, int extra)
-{
-    if (nbl->nexcl+extra > nbl->excl_nalloc)
-    {
-        nbl->excl_nalloc = over_alloc_small(nbl->nexcl+extra);
-        nbnxn_realloc_void(reinterpret_cast<void **>(&nbl->excl),
-                           nbl->nexcl*sizeof(*nbl->excl),
-                           nbl->excl_nalloc*sizeof(*nbl->excl),
-                           nbl->alloc, nbl->free);
-    }
-}
-
-/* Ensures there is enough space for maxNumExtraClusters extra j-clusters in the list */
-static void check_cell_list_space_simple(nbnxn_pairlist_t *nbl,
-                                         int               maxNumExtraClusters)
-{
-    int cj_max;
-
-    cj_max = nbl->ncj + maxNumExtraClusters;
-
-    if (cj_max > nbl->cj_nalloc)
-    {
-        nbl->cj_nalloc = over_alloc_small(cj_max);
-        nbnxn_realloc_void(reinterpret_cast<void **>(&nbl->cj),
-                           nbl->ncj*sizeof(*nbl->cj),
-                           nbl->cj_nalloc*sizeof(*nbl->cj),
-                           nbl->alloc, nbl->free);
-
-        nbnxn_realloc_void(reinterpret_cast<void **>(&nbl->cjOuter),
-                           nbl->ncj*sizeof(*nbl->cjOuter),
-                           nbl->cj_nalloc*sizeof(*nbl->cjOuter),
-                           nbl->alloc, nbl->free);
-    }
-}
-
-/* Ensures there is enough space for ncell extra j-clusters in the list */
-static void check_cell_list_space_supersub(nbnxn_pairlist_t *nbl,
-                                           int               ncell)
-{
-    int ncj4_max, w;
-
-    /* We can have maximally nsupercell*c_gpuNumClusterPerCell sj lists */
-    /* We can store 4 j-subcell - i-supercell pairs in one struct.
-     * since we round down, we need one extra entry.
-     */
-    ncj4_max = ((nbl->work->cj_ind + ncell*c_gpuNumClusterPerCell + c_nbnxnGpuJgroupSize - 1)/c_nbnxnGpuJgroupSize);
-
-    if (ncj4_max > nbl->cj4_nalloc)
-    {
-        nbl->cj4_nalloc = over_alloc_small(ncj4_max);
-        nbnxn_realloc_void(reinterpret_cast<void **>(&nbl->cj4),
-                           nbl->work->cj4_init*sizeof(*nbl->cj4),
-                           nbl->cj4_nalloc*sizeof(*nbl->cj4),
-                           nbl->alloc, nbl->free);
-    }
-
-    if (ncj4_max > nbl->work->cj4_init)
-    {
-        for (int j4 = nbl->work->cj4_init; j4 < ncj4_max; j4++)
-        {
-            /* No i-subcells and no excl's in the list initially */
-            for (w = 0; w < c_nbnxnGpuClusterpairSplit; w++)
-            {
-                nbl->cj4[j4].imei[w].imask    = 0U;
-                nbl->cj4[j4].imei[w].excl_ind = 0;
-
-            }
-        }
-        nbl->work->cj4_init = ncj4_max;
-    }
-}
-
-/* Set all excl masks for one GPU warp no exclusions */
-static void set_no_excls(nbnxn_excl_t *excl)
-{
-    for (int t = 0; t < c_nbnxnGpuExclSize; t++)
-    {
-        /* Turn all interaction bits on */
-        excl->pair[t] = NBNXN_INTERACTION_MASK_ALL;
-    }
-}
-
-/* Initializes a single nbnxn_pairlist_t data structure */
-static void nbnxn_init_pairlist(nbnxn_pairlist_t *nbl,
-                                gmx_bool          bSimple,
-                                nbnxn_alloc_t    *alloc,
-                                nbnxn_free_t     *free)
+/* Initializes a single NbnxnPairlistCpu data structure */
+static void nbnxn_init_pairlist(NbnxnPairlistCpu *nbl)
 {
-    if (alloc == nullptr)
-    {
-        nbl->alloc = nbnxn_alloc_aligned;
-    }
-    else
-    {
-        nbl->alloc = alloc;
-    }
-    if (free == nullptr)
-    {
-        nbl->free = nbnxn_free_aligned;
-    }
-    else
-    {
-        nbl->free = free;
-    }
-
-    nbl->bSimple     = bSimple;
-    nbl->na_sc       = 0;
-    nbl->na_ci       = 0;
+    nbl->na_ci       = c_nbnxnCpuIClusterSize;
     nbl->na_cj       = 0;
-    nbl->nci         = 0;
-    nbl->ci          = nullptr;
-    nbl->ci_nalloc   = 0;
-    nbl->nsci        = 0;
-    nbl->sci         = nullptr;
-    nbl->sci_nalloc  = 0;
-    nbl->ncj         = 0;
+    nbl->ci.clear();
+    nbl->ciOuter.clear();
     nbl->ncjInUse    = 0;
-    nbl->cj          = nullptr;
-    nbl->cj_nalloc   = 0;
-    nbl->ncj4        = 0;
-    /* We need one element extra in sj, so alloc initially with 1 */
-    nbl->cj4_nalloc  = 0;
-    nbl->cj4         = nullptr;
+    nbl->cj.clear();
+    nbl->cjOuter.clear();
     nbl->nci_tot     = 0;
 
-    if (!nbl->bSimple)
-    {
-        GMX_ASSERT(c_nbnxnGpuNumClusterPerSupercluster == c_gpuNumClusterPerCell, "The search code assumes that the a super-cluster matches a search grid cell");
+    nbl->work        = new NbnxnPairlistCpuWork();
+}
 
-        GMX_ASSERT(sizeof(nbl->cj4[0].imei[0].imask)*8 >= c_nbnxnGpuJgroupSize*c_gpuNumClusterPerCell, "The i super-cluster cluster interaction mask does not contain a sufficient number of bits");
-        GMX_ASSERT(sizeof(nbl->excl[0])*8 >= c_nbnxnGpuJgroupSize*c_gpuNumClusterPerCell, "The GPU exclusion mask does not contain a sufficient number of bits");
+NbnxnPairlistGpu::NbnxnPairlistGpu(gmx::PinningPolicy pinningPolicy) :
+    na_ci(c_nbnxnGpuClusterSize),
+    na_cj(c_nbnxnGpuClusterSize),
+    na_sc(c_gpuNumClusterPerCell*c_nbnxnGpuClusterSize),
+    rlist(0),
+    sci({}, {pinningPolicy}),
+    cj4({}, {pinningPolicy}),
+    excl({}, {pinningPolicy}),
+    nci_tot(0)
+{
+    static_assert(c_nbnxnGpuNumClusterPerSupercluster == c_gpuNumClusterPerCell,
+                  "The search code assumes that the a super-cluster matches a search grid cell");
 
-        nbl->excl        = nullptr;
-        nbl->excl_nalloc = 0;
-        nbl->nexcl       = 0;
-        check_excl_space(nbl, 1);
-        nbl->nexcl       = 1;
-        set_no_excls(&nbl->excl[0]);
-    }
+    static_assert(sizeof(cj4[0].imei[0].imask)*8 >= c_nbnxnGpuJgroupSize*c_gpuNumClusterPerCell,
+                  "The i super-cluster cluster interaction mask does not contain a sufficient number of bits");
 
-    snew(nbl->work, 1);
-    if (nbl->bSimple)
-    {
-        snew_aligned(nbl->work->bb_ci, 1, NBNXN_SEARCH_BB_MEM_ALIGN);
-    }
-    else
-    {
-#if NBNXN_BBXXXX
-        snew_aligned(nbl->work->pbb_ci, c_gpuNumClusterPerCell/STRIDE_PBB*NNBSBB_XXXX, NBNXN_SEARCH_BB_MEM_ALIGN);
-#else
-        snew_aligned(nbl->work->bb_ci, c_gpuNumClusterPerCell, NBNXN_SEARCH_BB_MEM_ALIGN);
-#endif
-    }
-    int gpu_clusterpair_nc = c_gpuNumClusterPerCell*c_nbnxnGpuClusterSize*DIM;
-    snew(nbl->work->x_ci, gpu_clusterpair_nc);
-#if GMX_SIMD
-    snew_aligned(nbl->work->x_ci_simd,
-                 std::max(NBNXN_CPU_CLUSTER_I_SIZE*DIM*GMX_SIMD_REAL_WIDTH,
-                          gpu_clusterpair_nc),
-                 GMX_SIMD_REAL_WIDTH);
-#endif
-    snew_aligned(nbl->work->d2, c_gpuNumClusterPerCell, NBNXN_SEARCH_BB_MEM_ALIGN);
+    static_assert(sizeof(excl[0])*8 >= c_nbnxnGpuJgroupSize*c_gpuNumClusterPerCell, "The GPU exclusion mask does not contain a sufficient number of bits");
+
+    // We always want a first entry without any exclusions
+    excl.resize(1);
 
-    nbl->work->sort            = nullptr;
-    nbl->work->sort_nalloc     = 0;
-    nbl->work->sci_sort        = nullptr;
-    nbl->work->sci_sort_nalloc = 0;
+    work = new NbnxnPairlistGpuWork();
 }
 
 void nbnxn_init_pairlist_set(nbnxn_pairlist_set_t *nbl_list,
-                             gmx_bool bSimple, gmx_bool bCombined,
-                             nbnxn_alloc_t *alloc,
-                             nbnxn_free_t  *free)
+                             gmx_bool bSimple, gmx_bool bCombined)
 {
+    GMX_RELEASE_ASSERT(!bSimple || !bCombined, "Can only combine non-simple lists");
+
     nbl_list->bSimple   = bSimple;
     nbl_list->bCombined = bCombined;
 
@@ -947,10 +838,17 @@ void nbnxn_init_pairlist_set(nbnxn_pairlist_set_t *nbl_list,
                   nbl_list->nnbl, NBNXN_BUFFERFLAG_MAX_THREADS, NBNXN_BUFFERFLAG_MAX_THREADS);
     }
 
-    snew(nbl_list->nbl, nbl_list->nnbl);
-    if (bSimple && nbl_list->nnbl > 1)
+    if (bSimple)
+    {
+        snew(nbl_list->nbl, nbl_list->nnbl);
+        if (nbl_list->nnbl > 1)
+        {
+            snew(nbl_list->nbl_work, nbl_list->nnbl);
+        }
+    }
+    else
     {
-        snew(nbl_list->nbl_work, nbl_list->nnbl);
+        snew(nbl_list->nblGpu, nbl_list->nnbl);
     }
     snew(nbl_list->nbl_fep, nbl_list->nnbl);
     /* Execute in order to avoid memory interleaving between threads */
@@ -962,21 +860,23 @@ void nbnxn_init_pairlist_set(nbnxn_pairlist_set_t *nbl_list,
             /* Allocate the nblist data structure locally on each thread
              * to optimize memory access for NUMA architectures.
              */
-            snew(nbl_list->nbl[i], 1);
-
-            /* Only list 0 is used on the GPU, use normal allocation for i>0 */
-            if (!bSimple && i == 0)
+            if (bSimple)
             {
-                nbnxn_init_pairlist(nbl_list->nbl[i], nbl_list->bSimple, alloc, free);
+                nbl_list->nbl[i] = new NbnxnPairlistCpu();
+
+                nbnxn_init_pairlist(nbl_list->nbl[i]);
+                if (nbl_list->nnbl > 1)
+                {
+                    nbl_list->nbl_work[i] = new NbnxnPairlistCpu();
+                    nbnxn_init_pairlist(nbl_list->nbl_work[i]);
+                }
             }
             else
             {
-                nbnxn_init_pairlist(nbl_list->nbl[i], nbl_list->bSimple, nullptr, nullptr);
-                if (bSimple && nbl_list->nnbl > 1)
-                {
-                    snew(nbl_list->nbl_work[i], 1);
-                    nbnxn_init_pairlist(nbl_list->nbl_work[i], nbl_list->bSimple, nullptr, nullptr);
-                }
+                /* Only list 0 is used on the GPU, use normal allocation for i>0 */
+                auto pinningPolicy = (i == 0 ? gmx::PinningPolicy::PinnedIfSupported : gmx::PinningPolicy::CannotBePinned);
+
+                nbl_list->nblGpu[i] = new NbnxnPairlistGpu(pinningPolicy);
             }
 
             snew(nbl_list->nbl_fep[i], 1);
@@ -987,8 +887,8 @@ void nbnxn_init_pairlist_set(nbnxn_pairlist_set_t *nbl_list,
 }
 
 /* Print statistics of a pair list, used for debug output */
-static void print_nblist_statistics_simple(FILE *fp, const nbnxn_pairlist_t *nbl,
-                                           const nbnxn_search *nbs, real rl)
+static void print_nblist_statistics(FILE *fp, const NbnxnPairlistCpu *nbl,
+                                    const nbnxn_search *nbs, real rl)
 {
     const nbnxn_grid_t *grid;
     int                 cs[SHIFTS];
@@ -996,36 +896,36 @@ static void print_nblist_statistics_simple(FILE *fp, const nbnxn_pairlist_t *nbl
 
     grid = &nbs->grid[0];
 
-    fprintf(fp, "nbl nci %d ncj %d\n",
-            nbl->nci, nbl->ncjInUse);
-    fprintf(fp, "nbl na_sc %d rl %g ncp %d per cell %.1f atoms %.1f ratio %.2f\n",
-            nbl->na_sc, rl, nbl->ncjInUse, nbl->ncjInUse/static_cast<double>(grid->nc),
-            nbl->ncjInUse/static_cast<double>(grid->nc)*grid->na_sc,
-            nbl->ncjInUse/static_cast<double>(grid->nc)*grid->na_sc/(0.5*4.0/3.0*M_PI*rl*rl*rl*grid->nc*grid->na_sc/(grid->size[XX]*grid->size[YY]*grid->size[ZZ])));
+    fprintf(fp, "nbl nci %zu ncj %d\n",
+            nbl->ci.size(), nbl->ncjInUse);
+    fprintf(fp, "nbl na_cj %d rl %g ncp %d per cell %.1f atoms %.1f ratio %.2f\n",
+            nbl->na_cj, rl, nbl->ncjInUse, nbl->ncjInUse/static_cast<double>(grid->nc),
+            nbl->ncjInUse/static_cast<double>(grid->nc)*grid->na_cj,
+            nbl->ncjInUse/static_cast<double>(grid->nc)*grid->na_cj/(0.5*4.0/3.0*M_PI*rl*rl*rl*grid->nc*grid->na_cj/(grid->size[XX]*grid->size[YY]*grid->size[ZZ])));
 
     fprintf(fp, "nbl average j cell list length %.1f\n",
-            0.25*nbl->ncjInUse/static_cast<double>(std::max(nbl->nci, 1)));
+            0.25*nbl->ncjInUse/std::max(static_cast<double>(nbl->ci.size()), 1.0));
 
     for (int s = 0; s < SHIFTS; s++)
     {
         cs[s] = 0;
     }
     npexcl = 0;
-    for (int i = 0; i < nbl->nci; i++)
+    for (const nbnxn_ci_t &ciEntry : nbl->ci)
     {
-        cs[nbl->ci[i].shift & NBNXN_CI_SHIFT] +=
-            nbl->ci[i].cj_ind_end - nbl->ci[i].cj_ind_start;
+        cs[ciEntry.shift & NBNXN_CI_SHIFT] +=
+            ciEntry.cj_ind_end - ciEntry.cj_ind_start;
 
-        int j = nbl->ci[i].cj_ind_start;
-        while (j < nbl->ci[i].cj_ind_end &&
+        int j = ciEntry.cj_ind_start;
+        while (j < ciEntry.cj_ind_end &&
                nbl->cj[j].excl != NBNXN_INTERACTION_MASK_ALL)
         {
             npexcl++;
             j++;
         }
     }
-    fprintf(fp, "nbl cell pairs, total: %d excl: %d %.1f%%\n",
-            nbl->ncj, npexcl, 100*npexcl/static_cast<double>(std::max(nbl->ncj, 1)));
+    fprintf(fp, "nbl cell pairs, total: %zu excl: %d %.1f%%\n",
+            nbl->cj.size(), npexcl, 100*npexcl/std::max(static_cast<double>(nbl->cj.size()), 1.0));
     for (int s = 0; s < SHIFTS; s++)
     {
         if (cs[s] > 0)
@@ -1036,8 +936,8 @@ static void print_nblist_statistics_simple(FILE *fp, const nbnxn_pairlist_t *nbl
 }
 
 /* Print statistics of a pair lists, used for debug output */
-static void print_nblist_statistics_supersub(FILE *fp, const nbnxn_pairlist_t *nbl,
-                                             const nbnxn_search *nbs, real rl)
+static void print_nblist_statistics(FILE *fp, const NbnxnPairlistGpu *nbl,
+                                    const nbnxn_search *nbs, real rl)
 {
     const nbnxn_grid_t *grid;
     int                 b;
@@ -1048,8 +948,8 @@ static void print_nblist_statistics_supersub(FILE *fp, const nbnxn_pairlist_t *n
     /* This code only produces correct statistics with domain decomposition */
     grid = &nbs->grid[0];
 
-    fprintf(fp, "nbl nsci %d ncj4 %d nsi %d excl4 %d\n",
-            nbl->nsci, nbl->ncj4, nbl->nci_tot, nbl->nexcl);
+    fprintf(fp, "nbl nsci %zu ncj4 %zu nsi %d excl4 %zu\n",
+            nbl->sci.size(), nbl->cj4.size(), nbl->nci_tot, nbl->excl.size());
     fprintf(fp, "nbl na_c %d rl %g ncp %d per cell %.1f atoms %.1f ratio %.2f\n",
             nbl->na_ci, rl, nbl->nci_tot, nbl->nci_tot/static_cast<double>(grid->nsubc_tot),
             nbl->nci_tot/static_cast<double>(grid->nsubc_tot)*grid->na_c,
@@ -1062,12 +962,10 @@ static void print_nblist_statistics_supersub(FILE *fp, const nbnxn_pairlist_t *n
     {
         c[si] = 0;
     }
-    for (int i = 0; i < nbl->nsci; i++)
+    for (const nbnxn_sci_t &sci : nbl->sci)
     {
-        int nsp;
-
-        nsp = 0;
-        for (int j4 = nbl->sci[i].cj4_ind_start; j4 < nbl->sci[i].cj4_ind_end; j4++)
+        int nsp = 0;
+        for (int j4 = sci.cj4_ind_start; j4 < sci.cj4_ind_end; j4++)
         {
             for (int j = 0; j < c_nbnxnGpuJgroupSize; j++)
             {
@@ -1087,74 +985,47 @@ static void print_nblist_statistics_supersub(FILE *fp, const nbnxn_pairlist_t *n
         sum_nsp2 += nsp*nsp;
         nsp_max   = std::max(nsp_max, nsp);
     }
-    if (nbl->nsci > 0)
+    if (!nbl->sci.empty())
     {
-        sum_nsp  /= nbl->nsci;
-        sum_nsp2 /= nbl->nsci;
+        sum_nsp  /= nbl->sci.size();
+        sum_nsp2 /= nbl->sci.size();
     }
     fprintf(fp, "nbl #cluster-pairs: av %.1f stddev %.1f max %d\n",
             sum_nsp, std::sqrt(sum_nsp2 - sum_nsp*sum_nsp), nsp_max);
 
-    if (nbl->ncj4 > 0)
+    if (!nbl->cj4.empty())
     {
         for (b = 0; b <= c_gpuNumClusterPerCell; b++)
         {
             fprintf(fp, "nbl j-list #i-subcell %d %7d %4.1f\n",
-                    b, c[b],
-                    100.0*c[b]/int{nbl->ncj4*c_nbnxnGpuJgroupSize});
+                    b, c[b], 100.0*c[b]/size_t {nbl->cj4.size()*c_nbnxnGpuJgroupSize});
         }
     }
 }
 
-/* Returns a pointer to the exclusion mask for cj4-unit cj4, warp warp */
-static void low_get_nbl_exclusions(nbnxn_pairlist_t *nbl, int cj4,
-                                   int warp, nbnxn_excl_t **excl)
-{
-    if (nbl->cj4[cj4].imei[warp].excl_ind == 0)
-    {
-        /* No exclusions set, make a new list entry */
-        nbl->cj4[cj4].imei[warp].excl_ind = nbl->nexcl;
-        nbl->nexcl++;
-        *excl = &nbl->excl[nbl->cj4[cj4].imei[warp].excl_ind];
-        set_no_excls(*excl);
-    }
-    else
-    {
-        /* We already have some exclusions, new ones can be added to the list */
-        *excl = &nbl->excl[nbl->cj4[cj4].imei[warp].excl_ind];
-    }
-}
-
-/* Returns a pointer to the exclusion mask for cj4-unit cj4, warp warp,
- * generates a new element and allocates extra memory, if necessary.
+/* Returns a pointer to the exclusion mask for j-cluster-group \p cj4 and warp \p warp
+ * Generates a new exclusion entry when the j-cluster-group uses
+ * the default all-interaction mask at call time, so the returned mask
+ * can be modified when needed.
  */
-static void get_nbl_exclusions_1(nbnxn_pairlist_t *nbl, int cj4,
-                                 int warp, nbnxn_excl_t **excl)
+static nbnxn_excl_t *get_exclusion_mask(NbnxnPairlistGpu *nbl,
+                                        int               cj4,
+                                        int               warp)
 {
     if (nbl->cj4[cj4].imei[warp].excl_ind == 0)
     {
-        /* We need to make a new list entry, check if we have space */
-        check_excl_space(nbl, 1);
+        /* No exclusions set, make a new list entry */
+        const size_t oldSize = nbl->excl.size();
+        GMX_ASSERT(oldSize >= 1, "We should always have entry [0]");
+        /* Add entry with default values: no exclusions */
+        nbl->excl.resize(oldSize + 1);
+        nbl->cj4[cj4].imei[warp].excl_ind = oldSize;
     }
-    low_get_nbl_exclusions(nbl, cj4, warp, excl);
-}
-
-/* Returns pointers to the exclusion masks for cj4-unit cj4 for both warps,
- * generates a new element and allocates extra memory, if necessary.
- */
-static void get_nbl_exclusions_2(nbnxn_pairlist_t *nbl, int cj4,
-                                 nbnxn_excl_t **excl_w0,
-                                 nbnxn_excl_t **excl_w1)
-{
-    /* Check for space we might need */
-    check_excl_space(nbl, 2);
 
-    low_get_nbl_exclusions(nbl, cj4, 0, excl_w0);
-    low_get_nbl_exclusions(nbl, cj4, 1, excl_w1);
+    return &nbl->excl[nbl->cj4[cj4].imei[warp].excl_ind];
 }
 
-/* Sets the self exclusions i=j and pair exclusions i>j */
-static void set_self_and_newton_excls_supersub(nbnxn_pairlist_t *nbl,
+static void set_self_and_newton_excls_supersub(NbnxnPairlistGpu *nbl,
                                                int cj4_ind, int sj_offset,
                                                int i_cluster_in_cell)
 {
@@ -1162,9 +1033,14 @@ static void set_self_and_newton_excls_supersub(nbnxn_pairlist_t *nbl,
 
     /* Here we only set the set self and double pair exclusions */
 
-    static_assert(c_nbnxnGpuClusterpairSplit == 2, "");
-
-    get_nbl_exclusions_2(nbl, cj4_ind, &excl[0], &excl[1]);
+    /* Reserve extra elements, so the resize() in get_exclusion_mask()
+     * will not invalidate excl entries in the loop below
+     */
+    nbl->excl.reserve(nbl->excl.size() + c_nbnxnGpuClusterpairSplit);
+    for (int w = 0; w < c_nbnxnGpuClusterpairSplit; w++)
+    {
+        excl[w] = get_exclusion_mask(nbl, cj4_ind, w);
+    }
 
     /* Only minor < major bits set */
     for (int ej = 0; ej < nbl->na_ci; ej++)
@@ -1236,8 +1112,8 @@ gmx_unused static unsigned int get_imask_simd_j8(gmx_bool rdiag, int ci, int cj)
  * \param[in,out] numDistanceChecks   The number of distance checks performed
  */
 static void
-makeClusterListSimple(const nbnxn_grid_t *      gridj,
-                      nbnxn_pairlist_t *        nbl,
+makeClusterListSimple(const nbnxn_grid_t       &jGrid,
+                      NbnxnPairlistCpu *        nbl,
                       int                       icluster,
                       int                       jclusterFirst,
                       int                       jclusterLast,
@@ -1247,15 +1123,15 @@ makeClusterListSimple(const nbnxn_grid_t *      gridj,
                       float                     rbb2,
                       int * gmx_restrict        numDistanceChecks)
 {
-    const nbnxn_bb_t * gmx_restrict bb_ci = nbl->work->bb_ci;
-    const real * gmx_restrict       x_ci  = nbl->work->x_ci;
+    const nbnxn_bb_t * gmx_restrict bb_ci = nbl->work->iClusterData.bb.data();
+    const real * gmx_restrict       x_ci  = nbl->work->iClusterData.x.data();
 
     gmx_bool                        InRange;
 
     InRange = FALSE;
     while (!InRange && jclusterFirst <= jclusterLast)
     {
-        real d2  = subc_bb_dist2(0, bb_ci, jclusterFirst, gridj->bb);
+        real d2  = subc_bb_dist2(0, bb_ci, jclusterFirst, jGrid.bb);
         *numDistanceChecks += 2;
 
         /* Check if the distance is within the distance where
@@ -1269,18 +1145,18 @@ makeClusterListSimple(const nbnxn_grid_t *      gridj,
         }
         else if (d2 < rlist2)
         {
-            int cjf_gl = gridj->cell0 + jclusterFirst;
-            for (int i = 0; i < NBNXN_CPU_CLUSTER_I_SIZE && !InRange; i++)
+            int cjf_gl = jGrid.cell0 + jclusterFirst;
+            for (int i = 0; i < c_nbnxnCpuIClusterSize && !InRange; i++)
             {
-                for (int j = 0; j < NBNXN_CPU_CLUSTER_I_SIZE; j++)
+                for (int j = 0; j < c_nbnxnCpuIClusterSize; j++)
                 {
                     InRange = InRange ||
-                        (gmx::square(x_ci[i*STRIDE_XYZ+XX] - x_j[(cjf_gl*NBNXN_CPU_CLUSTER_I_SIZE+j)*STRIDE_XYZ+XX]) +
-                         gmx::square(x_ci[i*STRIDE_XYZ+YY] - x_j[(cjf_gl*NBNXN_CPU_CLUSTER_I_SIZE+j)*STRIDE_XYZ+YY]) +
-                         gmx::square(x_ci[i*STRIDE_XYZ+ZZ] - x_j[(cjf_gl*NBNXN_CPU_CLUSTER_I_SIZE+j)*STRIDE_XYZ+ZZ]) < rlist2);
+                        (gmx::square(x_ci[i*STRIDE_XYZ+XX] - x_j[(cjf_gl*c_nbnxnCpuIClusterSize+j)*STRIDE_XYZ+XX]) +
+                         gmx::square(x_ci[i*STRIDE_XYZ+YY] - x_j[(cjf_gl*c_nbnxnCpuIClusterSize+j)*STRIDE_XYZ+YY]) +
+                         gmx::square(x_ci[i*STRIDE_XYZ+ZZ] - x_j[(cjf_gl*c_nbnxnCpuIClusterSize+j)*STRIDE_XYZ+ZZ]) < rlist2);
                 }
             }
-            *numDistanceChecks += NBNXN_CPU_CLUSTER_I_SIZE*NBNXN_CPU_CLUSTER_I_SIZE;
+            *numDistanceChecks += c_nbnxnCpuIClusterSize*c_nbnxnCpuIClusterSize;
         }
         if (!InRange)
         {
@@ -1295,7 +1171,7 @@ makeClusterListSimple(const nbnxn_grid_t *      gridj,
     InRange = FALSE;
     while (!InRange && jclusterLast > jclusterFirst)
     {
-        real d2  = subc_bb_dist2(0, bb_ci, jclusterLast, gridj->bb);
+        real d2  = subc_bb_dist2(0, bb_ci, jclusterLast, jGrid.bb);
         *numDistanceChecks += 2;
 
         /* Check if the distance is within the distance where
@@ -1309,18 +1185,18 @@ makeClusterListSimple(const nbnxn_grid_t *      gridj,
         }
         else if (d2 < rlist2)
         {
-            int cjl_gl = gridj->cell0 + jclusterLast;
-            for (int i = 0; i < NBNXN_CPU_CLUSTER_I_SIZE && !InRange; i++)
+            int cjl_gl = jGrid.cell0 + jclusterLast;
+            for (int i = 0; i < c_nbnxnCpuIClusterSize && !InRange; i++)
             {
-                for (int j = 0; j < NBNXN_CPU_CLUSTER_I_SIZE; j++)
+                for (int j = 0; j < c_nbnxnCpuIClusterSize; j++)
                 {
                     InRange = InRange ||
-                        (gmx::square(x_ci[i*STRIDE_XYZ+XX] - x_j[(cjl_gl*NBNXN_CPU_CLUSTER_I_SIZE+j)*STRIDE_XYZ+XX]) +
-                         gmx::square(x_ci[i*STRIDE_XYZ+YY] - x_j[(cjl_gl*NBNXN_CPU_CLUSTER_I_SIZE+j)*STRIDE_XYZ+YY]) +
-                         gmx::square(x_ci[i*STRIDE_XYZ+ZZ] - x_j[(cjl_gl*NBNXN_CPU_CLUSTER_I_SIZE+j)*STRIDE_XYZ+ZZ]) < rlist2);
+                        (gmx::square(x_ci[i*STRIDE_XYZ+XX] - x_j[(cjl_gl*c_nbnxnCpuIClusterSize+j)*STRIDE_XYZ+XX]) +
+                         gmx::square(x_ci[i*STRIDE_XYZ+YY] - x_j[(cjl_gl*c_nbnxnCpuIClusterSize+j)*STRIDE_XYZ+YY]) +
+                         gmx::square(x_ci[i*STRIDE_XYZ+ZZ] - x_j[(cjl_gl*c_nbnxnCpuIClusterSize+j)*STRIDE_XYZ+ZZ]) < rlist2);
                 }
             }
-            *numDistanceChecks += NBNXN_CPU_CLUSTER_I_SIZE*NBNXN_CPU_CLUSTER_I_SIZE;
+            *numDistanceChecks += c_nbnxnCpuIClusterSize*c_nbnxnCpuIClusterSize;
         }
         if (!InRange)
         {
@@ -1333,12 +1209,13 @@ makeClusterListSimple(const nbnxn_grid_t *      gridj,
         for (int jcluster = jclusterFirst; jcluster <= jclusterLast; jcluster++)
         {
             /* Store cj and the interaction mask */
-            nbl->cj[nbl->ncj].cj   = gridj->cell0 + jcluster;
-            nbl->cj[nbl->ncj].excl = get_imask(excludeSubDiagonal, icluster, jcluster);
-            nbl->ncj++;
+            nbnxn_cj_t cjEntry;
+            cjEntry.cj   = jGrid.cell0 + jcluster;
+            cjEntry.excl = get_imask(excludeSubDiagonal, icluster, jcluster);
+            nbl->cj.push_back(cjEntry);
         }
-        /* Increase the closing index in i super-cell list */
-        nbl->ci[nbl->nci].cj_ind_end = nbl->ncj;
+        /* Increase the closing index in the i list */
+        nbl->ci.back().cj_ind_end = nbl->cj.size();
     }
 }
 
@@ -1352,25 +1229,28 @@ makeClusterListSimple(const nbnxn_grid_t *      gridj,
 /* Plain C or SIMD4 code for making a pair list of super-cell sci vs scj.
  * Checks bounding box distances and possibly atom pair distances.
  */
-static void make_cluster_list_supersub(const nbnxn_grid_t *gridi,
-                                       const nbnxn_grid_t *gridj,
-                                       nbnxn_pairlist_t *nbl,
-                                       int sci, int scj,
-                                       gmx_bool sci_equals_scj,
-                                       int stride, const real *x,
-                                       real rlist2, float rbb2,
-                                       int *numDistanceChecks)
+static void make_cluster_list_supersub(const nbnxn_grid_t &iGrid,
+                                       const nbnxn_grid_t &jGrid,
+                                       NbnxnPairlistGpu   *nbl,
+                                       const int           sci,
+                                       const int           scj,
+                                       const bool          excludeSubDiagonal,
+                                       const int           stride,
+                                       const real         *x,
+                                       const real          rlist2,
+                                       const float         rbb2,
+                                       int                *numDistanceChecks)
 {
-    nbnxn_list_work_t *work   = nbl->work;
+    NbnxnPairlistGpuWork &work   = *nbl->work;
 
 #if NBNXN_BBXXXX
-    const float       *pbb_ci = work->pbb_ci;
+    const float          *pbb_ci = work.iSuperClusterData.bbPacked.data();
 #else
-    const nbnxn_bb_t  *bb_ci  = work->bb_ci;
+    const nbnxn_bb_t     *bb_ci  = work.iSuperClusterData.bb.data();
 #endif
 
-    assert(c_nbnxnGpuClusterSize == gridi->na_c);
-    assert(c_nbnxnGpuClusterSize == gridj->na_c);
+    assert(c_nbnxnGpuClusterSize == iGrid.na_c);
+    assert(c_nbnxnGpuClusterSize == jGrid.na_c);
 
     /* We generate the pairlist mainly based on bounding-box distances
      * and do atom pair distance based pruning on the GPU.
@@ -1384,34 +1264,29 @@ static void make_cluster_list_supersub(const nbnxn_grid_t *gridi,
     int  ci_last = -1;
 #endif
 
-    float *d2l = work->d2;
+    float *d2l = work.distanceBuffer.data();
 
-    for (int subc = 0; subc < gridj->nsubc[scj]; subc++)
+    for (int subc = 0; subc < jGrid.nsubc[scj]; subc++)
     {
-        int          cj4_ind   = nbl->work->cj_ind/c_nbnxnGpuJgroupSize;
-        int          cj_offset = nbl->work->cj_ind - cj4_ind*c_nbnxnGpuJgroupSize;
-        nbnxn_cj4_t *cj4       = &nbl->cj4[cj4_ind];
+        const int    cj4_ind   = work.cj_ind/c_nbnxnGpuJgroupSize;
+        const int    cj_offset = work.cj_ind - cj4_ind*c_nbnxnGpuJgroupSize;
+        const int    cj        = scj*c_gpuNumClusterPerCell + subc;
 
-        int          cj        = scj*c_gpuNumClusterPerCell + subc;
+        const int    cj_gl     = jGrid.cell0*c_gpuNumClusterPerCell + cj;
 
-        int          cj_gl     = gridj->cell0*c_gpuNumClusterPerCell + cj;
-
-        /* Initialize this j-subcell i-subcell list */
-        cj4->cj[cj_offset] = cj_gl;
-
-        int ci1;
-        if (sci_equals_scj)
+        int          ci1;
+        if (excludeSubDiagonal && sci == scj)
         {
             ci1 = subc + 1;
         }
         else
         {
-            ci1 = gridi->nsubc[sci];
+            ci1 = iGrid.nsubc[sci];
         }
 
 #if NBNXN_BBXXXX
         /* Determine all ci1 bb distances in one call with SIMD4 */
-        subc_bb_dist2_simd4_xxxx(gridj->pbb.data() + (cj >> STRIDE_PBB_2LOG)*NNBSBB_XXXX + (cj & (STRIDE_PBB-1)),
+        subc_bb_dist2_simd4_xxxx(jGrid.pbb.data() + (cj >> STRIDE_PBB_2LOG)*NNBSBB_XXXX + (cj & (STRIDE_PBB-1)),
                                  ci1, pbb_ci, d2l);
         *numDistanceChecks += c_nbnxnGpuClusterSize*2;
 #endif
@@ -1428,7 +1303,7 @@ static void make_cluster_list_supersub(const nbnxn_grid_t *gridi,
 
 #if !NBNXN_BBXXXX
             /* Determine the bb distance between ci and cj */
-            d2l[ci]             = subc_bb_dist2(ci, bb_ci, cj, gridj->bb);
+            d2l[ci]             = subc_bb_dist2(ci, bb_ci, cj, jGrid.bb);
             *numDistanceChecks += 2;
 #endif
             float d2 = d2l[ci];
@@ -1475,13 +1350,20 @@ static void make_cluster_list_supersub(const nbnxn_grid_t *gridi,
 
         if (npair > 0)
         {
-            /* We have a useful sj entry, close it now */
+            /* We have at least one cluster pair: add a j-entry */
+            if (static_cast<size_t>(cj4_ind) == nbl->cj4.size())
+            {
+                nbl->cj4.resize(nbl->cj4.size() + 1);
+            }
+            nbnxn_cj4_t *cj4   = &nbl->cj4[cj4_ind];
+
+            cj4->cj[cj_offset] = cj_gl;
 
             /* Set the exclusions for the ci==sj entry.
              * Here we don't bother to check if this entry is actually flagged,
              * as it will nearly always be in the list.
              */
-            if (sci_equals_scj)
+            if (excludeSubDiagonal && sci == scj)
             {
                 set_self_and_newton_excls_supersub(nbl, cj4_ind, cj_offset, subc);
             }
@@ -1498,7 +1380,7 @@ static void make_cluster_list_supersub(const nbnxn_grid_t *gridi,
             nbl->nci_tot += npair;
 
             /* Increase the closing index in i super-cell list */
-            nbl->sci[nbl->nsci].cj4_ind_end =
+            nbl->sci.back().cj4_ind_end =
                 (nbl->work->cj_ind + c_nbnxnGpuJgroupSize - 1)/c_nbnxnGpuJgroupSize;
         }
     }
@@ -1506,9 +1388,9 @@ static void make_cluster_list_supersub(const nbnxn_grid_t *gridi,
 
 /* Returns how many contiguous j-clusters we have starting in the i-list */
 template <typename CjListType>
-static int numContiguousJClusters(const int         cjIndexStart,
-                                  const int         cjIndexEnd,
-                                  const CjListType &cjList)
+static int numContiguousJClusters(const int                       cjIndexStart,
+                                  const int                       cjIndexEnd,
+                                  gmx::ArrayRef<const CjListType> cjList)
 {
     const int firstJCluster = nblCj(cjList, cjIndexStart);
 
@@ -1523,26 +1405,29 @@ static int numContiguousJClusters(const int         cjIndexStart,
     return numContiguous;
 }
 
-/* Helper struct for efficient searching for excluded atoms in a j-list */
+/*! \internal
+ * \brief Helper struct for efficient searching for excluded atoms in a j-list
+ */
 struct JListRanges
 {
-    /* Constructor */
+    /*! \brief Constructs a j-list range from \p cjList with the given index range */
     template <typename CjListType>
-    JListRanges(int               cjIndexStart,
-                int               cjIndexEnd,
-                const CjListType &cjList);
-
-    int cjIndexStart; // The start index in the j-list
-    int cjIndexEnd;   // The end index in the j-list
-    int cjFirst;      // The j-cluster with index cjIndexStart
-    int cjLast;       // The j-cluster with index cjIndexEnd-1
-    int numDirect;    // Up to cjIndexStart+numDirect the j-clusters are cjFirst + the index offset
+    JListRanges(int                             cjIndexStart,
+                int                             cjIndexEnd,
+                gmx::ArrayRef<const CjListType> cjList);
+
+    int cjIndexStart; //!< The start index in the j-list
+    int cjIndexEnd;   //!< The end index in the j-list
+    int cjFirst;      //!< The j-cluster with index cjIndexStart
+    int cjLast;       //!< The j-cluster with index cjIndexEnd-1
+    int numDirect;    //!< Up to cjIndexStart+numDirect the j-clusters are cjFirst + the index offset
 };
 
+#ifndef DOXYGEN
 template <typename CjListType>
-JListRanges::JListRanges(int               cjIndexStart,
-                         int               cjIndexEnd,
-                         const CjListType &cjList) :
+JListRanges::JListRanges(int                             cjIndexStart,
+                         int                             cjIndexEnd,
+                         gmx::ArrayRef<const CjListType> cjList) :
     cjIndexStart(cjIndexStart),
     cjIndexEnd(cjIndexEnd)
 {
@@ -1557,6 +1442,7 @@ JListRanges::JListRanges(int               cjIndexStart,
      */
     numDirect = numContiguousJClusters(cjIndexStart, cjIndexEnd, cjList);
 }
+#endif // !DOXYGEN
 
 /* Return the index of \p jCluster in the given range or -1 when not present
  *
@@ -1564,9 +1450,10 @@ JListRanges::JListRanges(int               cjIndexStart,
  *       important. It should be inlined and fully optimized.
  */
 template <typename CjListType>
-static inline int findJClusterInJList(int                jCluster,
-                                      const JListRanges &ranges,
-                                      const CjListType  &cjList)
+static inline int
+findJClusterInJList(int                              jCluster,
+                    const JListRanges               &ranges,
+                    gmx::ArrayRef<const CjListType>  cjList)
 {
     int index;
 
@@ -1606,18 +1493,32 @@ static inline int findJClusterInJList(int                jCluster,
     return index;
 }
 
+// TODO: Get rid of the two functions below by renaming sci to ci (or something better)
+
+/* Return the i-entry in the list we are currently operating on */
+static nbnxn_ci_t *getOpenIEntry(NbnxnPairlistCpu *nbl)
+{
+    return &nbl->ci.back();
+}
+
+/* Return the i-entry in the list we are currently operating on */
+static nbnxn_sci_t *getOpenIEntry(NbnxnPairlistGpu *nbl)
+{
+    return &nbl->sci.back();
+}
+
 /* Set all atom-pair exclusions for a simple type list i-entry
  *
  * Set all atom-pair exclusions from the topology stored in exclusions
  * as masks in the pair-list for simple list entry iEntry.
  */
 static void
-setExclusionsForSimpleIentry(const nbnxn_search   *nbs,
-                             nbnxn_pairlist_t     *nbl,
-                             gmx_bool              diagRemoved,
-                             int                   na_cj_2log,
-                             const nbnxn_ci_t     &iEntry,
-                             const t_blocka       &exclusions)
+setExclusionsForIEntry(const nbnxn_search   *nbs,
+                       NbnxnPairlistCpu     *nbl,
+                       gmx_bool              diagRemoved,
+                       int                   na_cj_2log,
+                       const nbnxn_ci_t     &iEntry,
+                       const t_blocka       &exclusions)
 {
     if (iEntry.cj_ind_end == iEntry.cj_ind_start)
     {
@@ -1625,16 +1526,16 @@ setExclusionsForSimpleIentry(const nbnxn_search   *nbs,
         return;
     }
 
-    const JListRanges        ranges(iEntry.cj_ind_start, iEntry.cj_ind_end, nbl->cj);
+    const JListRanges        ranges(iEntry.cj_ind_start, iEntry.cj_ind_end, gmx::makeConstArrayRef(nbl->cj));
 
     const int                iCluster = iEntry.ci;
 
     gmx::ArrayRef<const int> cell = nbs->cell;
 
     /* Loop over the atoms in the i-cluster */
-    for (int i = 0; i < nbl->na_sc; i++)
+    for (int i = 0; i < nbl->na_ci; i++)
     {
-        const int iIndex = iCluster*nbl->na_sc + i;
+        const int iIndex = iCluster*nbl->na_ci + i;
         const int iAtom  = nbs->a[iIndex];
         if (iAtom >= 0)
         {
@@ -1666,7 +1567,8 @@ setExclusionsForSimpleIentry(const nbnxn_search   *nbs,
                 if (jCluster >= ranges.cjFirst && jCluster <= ranges.cjLast)
                 {
                     const int index =
-                        findJClusterInJList(jCluster, ranges, nbl->cj);
+                        findJClusterInJList(jCluster, ranges,
+                                            gmx::makeConstArrayRef(nbl->cj));
 
                     if (index >= 0)
                     {
@@ -1714,11 +1616,15 @@ const int max_nrj_fep = 40;
  */
 static void make_fep_list(const nbnxn_search     *nbs,
                           const nbnxn_atomdata_t *nbat,
-                          nbnxn_pairlist_t       *nbl,
+                          NbnxnPairlistCpu       *nbl,
                           gmx_bool                bDiagRemoved,
                           nbnxn_ci_t             *nbl_ci,
-                          const nbnxn_grid_t     *gridi,
-                          const nbnxn_grid_t     *gridj,
+                          real gmx_unused         shx,
+                          real gmx_unused         shy,
+                          real gmx_unused         shz,
+                          real gmx_unused         rlist_fep2,
+                          const nbnxn_grid_t     &iGrid,
+                          const nbnxn_grid_t     &jGrid,
                           t_nblist               *nlist)
 {
     int      ci, cj_ind_start, cj_ind_end, cja, cjr;
@@ -1752,16 +1658,18 @@ static void make_fep_list(const nbnxn_search     *nbs,
         reallocate_nblist(nlist);
     }
 
-    ngid = nbat->nenergrp;
+    const nbnxn_atomdata_t::Params &nbatParams = nbat->params();
 
-    if (ngid*gridj->na_cj > gmx::index(sizeof(gid_cj)*8))
+    ngid = nbatParams.nenergrp;
+
+    if (ngid*jGrid.na_cj > gmx::index(sizeof(gid_cj)*8))
     {
         gmx_fatal(FARGS, "The Verlet scheme with %dx%d kernels and free-energy only supports up to %zu energy groups",
-                  gridi->na_c, gridj->na_cj, (sizeof(gid_cj)*8)/gridj->na_cj);
+                  iGrid.na_c, jGrid.na_cj, (sizeof(gid_cj)*8)/jGrid.na_cj);
     }
 
-    egp_shift = nbat->neg_2log;
-    egp_mask  = (1<<nbat->neg_2log) - 1;
+    egp_shift = nbatParams.neg_2log;
+    egp_mask  = (1 << egp_shift) - 1;
 
     /* Loop over the atoms in the i sub-cell */
     bFEP_i_all = TRUE;
@@ -1778,7 +1686,7 @@ static void make_fep_list(const nbnxn_search     *nbs,
             nlist->gid[nri]      = 0;
             nlist->shift[nri]    = nbl_ci->shift & NBNXN_CI_SHIFT;
 
-            bFEP_i = ((gridi->fep[ci - gridi->cell0] & (1 << i)) != 0u);
+            bFEP_i = ((iGrid.fep[ci - iGrid.cell0] & (1 << i)) != 0u);
 
             bFEP_i_all = bFEP_i_all && bFEP_i;
 
@@ -1791,7 +1699,7 @@ static void make_fep_list(const nbnxn_search     *nbs,
 
             if (ngid > 1)
             {
-                gid_i = (nbat->energrp[ci] >> (egp_shift*i)) & egp_mask;
+                gid_i = (nbatParams.energrp[ci] >> (egp_shift*i)) & egp_mask;
             }
 
             for (int cj_ind = cj_ind_start; cj_ind < cj_ind_end; cj_ind++)
@@ -1800,33 +1708,33 @@ static void make_fep_list(const nbnxn_search     *nbs,
 
                 cja = nbl->cj[cj_ind].cj;
 
-                if (gridj->na_cj == gridj->na_c)
+                if (jGrid.na_cj == jGrid.na_c)
                 {
-                    cjr    = cja - gridj->cell0;
-                    fep_cj = gridj->fep[cjr];
+                    cjr    = cja - jGrid.cell0;
+                    fep_cj = jGrid.fep[cjr];
                     if (ngid > 1)
                     {
-                        gid_cj = nbat->energrp[cja];
+                        gid_cj = nbatParams.energrp[cja];
                     }
                 }
-                else if (2*gridj->na_cj == gridj->na_c)
+                else if (2*jGrid.na_cj == jGrid.na_c)
                 {
-                    cjr    = cja - gridj->cell0*2;
+                    cjr    = cja - jGrid.cell0*2;
                     /* Extract half of the ci fep/energrp mask */
-                    fep_cj = (gridj->fep[cjr>>1] >> ((cjr&1)*gridj->na_cj)) & ((1<<gridj->na_cj) - 1);
+                    fep_cj = (jGrid.fep[cjr>>1] >> ((cjr&1)*jGrid.na_cj)) & ((1<<jGrid.na_cj) - 1);
                     if (ngid > 1)
                     {
-                        gid_cj = nbat->energrp[cja>>1] >> ((cja&1)*gridj->na_cj*egp_shift) & ((1<<(gridj->na_cj*egp_shift)) - 1);
+                        gid_cj = nbatParams.energrp[cja>>1] >> ((cja&1)*jGrid.na_cj*egp_shift) & ((1<<(jGrid.na_cj*egp_shift)) - 1);
                     }
                 }
                 else
                 {
-                    cjr    = cja - (gridj->cell0>>1);
+                    cjr    = cja - (jGrid.cell0>>1);
                     /* Combine two ci fep masks/energrp */
-                    fep_cj = gridj->fep[cjr*2] + (gridj->fep[cjr*2+1] << gridj->na_c);
+                    fep_cj = jGrid.fep[cjr*2] + (jGrid.fep[cjr*2+1] << jGrid.na_c);
                     if (ngid > 1)
                     {
-                        gid_cj = nbat->energrp[cja*2] + (nbat->energrp[cja*2+1] << (gridj->na_c*egp_shift));
+                        gid_cj = nbatParams.energrp[cja*2] + (nbatParams.energrp[cja*2+1] << (jGrid.na_c*egp_shift));
                     }
                 }
 
@@ -1914,20 +1822,19 @@ static inline int a_mod_wj(int a)
 }
 
 /* As make_fep_list above, but for super/sub lists. */
-static void make_fep_list_supersub(const nbnxn_search     *nbs,
-                                   const nbnxn_atomdata_t *nbat,
-                                   nbnxn_pairlist_t       *nbl,
-                                   gmx_bool                bDiagRemoved,
-                                   const nbnxn_sci_t      *nbl_sci,
-                                   real                    shx,
-                                   real                    shy,
-                                   real                    shz,
-                                   real                    rlist_fep2,
-                                   const nbnxn_grid_t     *gridi,
-                                   const nbnxn_grid_t     *gridj,
-                                   t_nblist               *nlist)
+static void make_fep_list(const nbnxn_search     *nbs,
+                          const nbnxn_atomdata_t *nbat,
+                          NbnxnPairlistGpu       *nbl,
+                          gmx_bool                bDiagRemoved,
+                          const nbnxn_sci_t      *nbl_sci,
+                          real                    shx,
+                          real                    shy,
+                          real                    shz,
+                          real                    rlist_fep2,
+                          const nbnxn_grid_t     &iGrid,
+                          const nbnxn_grid_t     &jGrid,
+                          t_nblist               *nlist)
 {
-    int                sci, cj4_ind_start, cj4_ind_end, cjr;
     int                nri_max;
     int                c_abs;
     int                ind_i, ind_j, ai, aj;
@@ -1936,16 +1843,17 @@ static void make_fep_list_supersub(const nbnxn_search     *nbs,
     real               xi, yi, zi;
     const nbnxn_cj4_t *cj4;
 
-    if (nbl_sci->cj4_ind_end == nbl_sci->cj4_ind_start)
+    const int          numJClusterGroups = nbl_sci->numJClusterGroups();
+    if (numJClusterGroups == 0)
     {
         /* Empty list */
         return;
     }
 
-    sci = nbl_sci->sci;
+    const int sci           = nbl_sci->sci;
 
-    cj4_ind_start = nbl_sci->cj4_ind_start;
-    cj4_ind_end   = nbl_sci->cj4_ind_end;
+    const int cj4_ind_start = nbl_sci->cj4_ind_start;
+    const int cj4_ind_end   = nbl_sci->cj4_ind_end;
 
     /* Here we process one super-cell, max #atoms na_sc, versus a list
      * cj4 entries, each with max c_nbnxnGpuJgroupSize cj's, each
@@ -1954,7 +1862,7 @@ static void make_fep_list_supersub(const nbnxn_search     *nbs,
      * So for each of the na_sc i-atoms, we need max one FEP list
      * for each max_nrj_fep j-atoms.
      */
-    nri_max = nbl->na_sc*nbl->na_cj*(1 + ((cj4_ind_end - cj4_ind_start)*c_nbnxnGpuJgroupSize)/max_nrj_fep);
+    nri_max = nbl->na_sc*nbl->na_cj*(1 + (numJClusterGroups*c_nbnxnGpuJgroupSize)/max_nrj_fep);
     if (nlist->nri + nri_max > nlist->maxnri)
     {
         nlist->maxnri = over_alloc_large(nlist->nri + nri_max);
@@ -1979,15 +1887,16 @@ static void make_fep_list_supersub(const nbnxn_search     *nbs,
                 nlist->gid[nri]      = 0;
                 nlist->shift[nri]    = nbl_sci->shift & NBNXN_CI_SHIFT;
 
-                bFEP_i = ((gridi->fep[c_abs - gridi->cell0*c_gpuNumClusterPerCell] & (1 << i)) != 0u);
+                bFEP_i = ((iGrid.fep[c_abs - iGrid.cell0*c_gpuNumClusterPerCell] & (1 << i)) != 0u);
 
-                xi = nbat->x[ind_i*nbat->xstride+XX] + shx;
-                yi = nbat->x[ind_i*nbat->xstride+YY] + shy;
-                zi = nbat->x[ind_i*nbat->xstride+ZZ] + shz;
+                xi = nbat->x()[ind_i*nbat->xstride+XX] + shx;
+                yi = nbat->x()[ind_i*nbat->xstride+YY] + shy;
+                zi = nbat->x()[ind_i*nbat->xstride+ZZ] + shz;
 
-                if ((nlist->nrj + cj4_ind_end - cj4_ind_start)*c_nbnxnGpuJgroupSize*nbl->na_cj > nlist->maxnrj)
+                const int nrjMax = nlist->nrj + numJClusterGroups*c_nbnxnGpuJgroupSize*nbl->na_cj;
+                if (nrjMax > nlist->maxnrj)
                 {
-                    nlist->maxnrj = over_alloc_small((nlist->nrj + cj4_ind_end - cj4_ind_start)*c_nbnxnGpuJgroupSize*nbl->na_cj);
+                    nlist->maxnrj = over_alloc_small(nrjMax);
                     srenew(nlist->jjnr,     nlist->maxnrj);
                     srenew(nlist->excl_fep, nlist->maxnrj);
                 }
@@ -2006,35 +1915,36 @@ static void make_fep_list_supersub(const nbnxn_search     *nbs,
                             continue;
                         }
 
-                        cjr = cj4->cj[gcj] - gridj->cell0*c_gpuNumClusterPerCell;
+                        const int cjr =
+                            cj4->cj[gcj] - jGrid.cell0*c_gpuNumClusterPerCell;
 
-                        fep_cj = gridj->fep[cjr];
+                        fep_cj = jGrid.fep[cjr];
 
                         if (bFEP_i || fep_cj != 0)
                         {
                             for (int j = 0; j < nbl->na_cj; j++)
                             {
                                 /* Is this interaction perturbed and not excluded? */
-                                ind_j = (gridj->cell0*c_gpuNumClusterPerCell + cjr)*nbl->na_cj + j;
+                                ind_j = (jGrid.cell0*c_gpuNumClusterPerCell + cjr)*nbl->na_cj + j;
                                 aj    = nbs->a[ind_j];
                                 if (aj >= 0 &&
                                     (bFEP_i || (fep_cj & (1 << j))) &&
                                     (!bDiagRemoved || ind_j >= ind_i))
                                 {
-                                    nbnxn_excl_t *excl;
                                     int           excl_pair;
                                     unsigned int  excl_bit;
                                     real          dx, dy, dz;
 
                                     const int     jHalf = j/(c_nbnxnGpuClusterSize/c_nbnxnGpuClusterpairSplit);
-                                    get_nbl_exclusions_1(nbl, cj4_ind, jHalf, &excl);
+                                    nbnxn_excl_t *excl  =
+                                        get_exclusion_mask(nbl, cj4_ind, jHalf);
 
                                     excl_pair = a_mod_wj(j)*nbl->na_ci + i;
                                     excl_bit  = (1U << (gcj*c_gpuNumClusterPerCell + c));
 
-                                    dx = nbat->x[ind_j*nbat->xstride+XX] - xi;
-                                    dy = nbat->x[ind_j*nbat->xstride+YY] - yi;
-                                    dz = nbat->x[ind_j*nbat->xstride+ZZ] - zi;
+                                    dx = nbat->x()[ind_j*nbat->xstride+XX] - xi;
+                                    dy = nbat->x()[ind_j*nbat->xstride+YY] - yi;
+                                    dz = nbat->x()[ind_j*nbat->xstride+ZZ] - zi;
 
                                     /* The unpruned GPU list has more than 2/3
                                      * of the atom pairs beyond rlist. Using
@@ -2093,13 +2003,14 @@ static void make_fep_list_supersub(const nbnxn_search     *nbs,
  * as masks in the pair-list for i-super-cluster list entry iEntry.
  */
 static void
-setExclusionsForGpuIentry(const nbnxn_search   *nbs,
-                          nbnxn_pairlist_t     *nbl,
-                          gmx_bool              diagRemoved,
-                          const nbnxn_sci_t    &iEntry,
-                          const t_blocka       &exclusions)
+setExclusionsForIEntry(const nbnxn_search   *nbs,
+                       NbnxnPairlistGpu     *nbl,
+                       gmx_bool              diagRemoved,
+                       int gmx_unused        na_cj_2log,
+                       const nbnxn_sci_t    &iEntry,
+                       const t_blocka       &exclusions)
 {
-    if (iEntry.cj4_ind_end == iEntry.cj4_ind_start)
+    if (iEntry.numJClusterGroups() == 0)
     {
         /* Empty list */
         return;
@@ -2111,7 +2022,7 @@ setExclusionsForGpuIentry(const nbnxn_search   *nbs,
      */
     const JListRanges ranges(iEntry.cj4_ind_start*c_nbnxnGpuJgroupSize,
                              nbl->work->cj_ind,
-                             nbl->cj4);
+                             gmx::makeConstArrayRef(nbl->cj4));
 
     GMX_ASSERT(nbl->na_ci == c_nbnxnGpuClusterSize, "na_ci should match the GPU cluster size");
     constexpr int            c_clusterSize      = c_nbnxnGpuClusterSize;
@@ -2164,7 +2075,8 @@ setExclusionsForGpuIentry(const nbnxn_search   *nbs,
                 if (jCluster >= ranges.cjFirst && jCluster <= ranges.cjLast)
                 {
                     const int index =
-                        findJClusterInJList(jCluster, ranges, nbl->cj4);
+                        findJClusterInJList(jCluster, ranges,
+                                            gmx::makeConstArrayRef(nbl->cj4));
 
                     if (index >= 0)
                     {
@@ -2181,8 +2093,8 @@ setExclusionsForGpuIentry(const nbnxn_search   *nbs,
                             /* Determine which j-half (CUDA warp) we are in */
                             const int     jHalf = innerJ/(c_clusterSize/c_nbnxnGpuClusterpairSplit);
 
-                            nbnxn_excl_t *interactionMask;
-                            get_nbl_exclusions_1(nbl, cj_to_cj4(index), jHalf, &interactionMask);
+                            nbnxn_excl_t *interactionMask =
+                                get_exclusion_mask(nbl, cj_to_cj4(index), jHalf);
 
                             interactionMask->pair[a_mod_wj(innerJ)*c_clusterSize + innerI] &= ~pairMask;
                         }
@@ -2193,75 +2105,41 @@ setExclusionsForGpuIentry(const nbnxn_search   *nbs,
     }
 }
 
-/* Reallocate the simple ci list for at least n entries */
-static void nb_realloc_ci(nbnxn_pairlist_t *nbl, int n)
+/* Make a new ci entry at the back of nbl->ci */
+static void addNewIEntry(NbnxnPairlistCpu *nbl, int ci, int shift, int flags)
 {
-    nbl->ci_nalloc = over_alloc_small(n);
-    nbnxn_realloc_void(reinterpret_cast<void **>(&nbl->ci),
-                       nbl->nci*sizeof(*nbl->ci),
-                       nbl->ci_nalloc*sizeof(*nbl->ci),
-                       nbl->alloc, nbl->free);
-
-    nbnxn_realloc_void(reinterpret_cast<void **>(&nbl->ciOuter),
-                       nbl->nci*sizeof(*nbl->ciOuter),
-                       nbl->ci_nalloc*sizeof(*nbl->ciOuter),
-                       nbl->alloc, nbl->free);
-}
-
-/* Reallocate the super-cell sci list for at least n entries */
-static void nb_realloc_sci(nbnxn_pairlist_t *nbl, int n)
-{
-    nbl->sci_nalloc = over_alloc_small(n);
-    nbnxn_realloc_void(reinterpret_cast<void **>(&nbl->sci),
-                       nbl->nsci*sizeof(*nbl->sci),
-                       nbl->sci_nalloc*sizeof(*nbl->sci),
-                       nbl->alloc, nbl->free);
-}
-
-/* Make a new ci entry at index nbl->nci */
-static void new_ci_entry(nbnxn_pairlist_t *nbl, int ci, int shift, int flags)
-{
-    if (nbl->nci + 1 > nbl->ci_nalloc)
-    {
-        nb_realloc_ci(nbl, nbl->nci+1);
-    }
-    nbl->ci[nbl->nci].ci            = ci;
-    nbl->ci[nbl->nci].shift         = shift;
+    nbnxn_ci_t ciEntry;
+    ciEntry.ci            = ci;
+    ciEntry.shift         = shift;
     /* Store the interaction flags along with the shift */
-    nbl->ci[nbl->nci].shift        |= flags;
-    nbl->ci[nbl->nci].cj_ind_start  = nbl->ncj;
-    nbl->ci[nbl->nci].cj_ind_end    = nbl->ncj;
+    ciEntry.shift        |= flags;
+    ciEntry.cj_ind_start  = nbl->cj.size();
+    ciEntry.cj_ind_end    = nbl->cj.size();
+    nbl->ci.push_back(ciEntry);
 }
 
 /* Make a new sci entry at index nbl->nsci */
-static void new_sci_entry(nbnxn_pairlist_t *nbl, int sci, int shift)
+static void addNewIEntry(NbnxnPairlistGpu *nbl, int sci, int shift, int gmx_unused flags)
 {
-    if (nbl->nsci + 1 > nbl->sci_nalloc)
-    {
-        nb_realloc_sci(nbl, nbl->nsci+1);
-    }
-    nbl->sci[nbl->nsci].sci           = sci;
-    nbl->sci[nbl->nsci].shift         = shift;
-    nbl->sci[nbl->nsci].cj4_ind_start = nbl->ncj4;
-    nbl->sci[nbl->nsci].cj4_ind_end   = nbl->ncj4;
+    nbnxn_sci_t sciEntry;
+    sciEntry.sci           = sci;
+    sciEntry.shift         = shift;
+    sciEntry.cj4_ind_start = nbl->cj4.size();
+    sciEntry.cj4_ind_end   = nbl->cj4.size();
+
+    nbl->sci.push_back(sciEntry);
 }
 
 /* Sort the simple j-list cj on exclusions.
  * Entries with exclusions will all be sorted to the beginning of the list.
  */
 static void sort_cj_excl(nbnxn_cj_t *cj, int ncj,
-                         nbnxn_list_work_t *work)
+                         NbnxnPairlistCpuWork *work)
 {
-    int jnew;
-
-    if (ncj > work->cj_nalloc)
-    {
-        work->cj_nalloc = over_alloc_large(ncj);
-        srenew(work->cj, work->cj_nalloc);
-    }
+    work->cj.resize(ncj);
 
     /* Make a list of the j-cells involving exclusions */
-    jnew = 0;
+    int jnew = 0;
     for (int j = 0; j < ncj; j++)
     {
         if (cj[j].excl != NBNXN_INTERACTION_MASK_ALL)
@@ -2288,32 +2166,40 @@ static void sort_cj_excl(nbnxn_cj_t *cj, int ncj,
 }
 
 /* Close this simple list i entry */
-static void close_ci_entry_simple(nbnxn_pairlist_t *nbl)
+static void closeIEntry(NbnxnPairlistCpu    *nbl,
+                        int gmx_unused       sp_max_av,
+                        gmx_bool gmx_unused  progBal,
+                        float gmx_unused     nsp_tot_est,
+                        int gmx_unused       thread,
+                        int gmx_unused       nthread)
 {
-    int jlen;
+    nbnxn_ci_t &ciEntry = nbl->ci.back();
 
     /* All content of the new ci entry have already been filled correctly,
-     * we only need to increase the count here (for non empty lists).
+     * we only need to sort and increase counts or remove the entry when empty.
      */
-    jlen = nbl->ci[nbl->nci].cj_ind_end - nbl->ci[nbl->nci].cj_ind_start;
+    const int jlen = ciEntry.cj_ind_end - ciEntry.cj_ind_start;
     if (jlen > 0)
     {
-        sort_cj_excl(nbl->cj+nbl->ci[nbl->nci].cj_ind_start, jlen, nbl->work);
+        sort_cj_excl(nbl->cj.data() + ciEntry.cj_ind_start, jlen, nbl->work);
 
         /* The counts below are used for non-bonded pair/flop counts
          * and should therefore match the available kernel setups.
          */
-        if (!(nbl->ci[nbl->nci].shift & NBNXN_CI_DO_COUL(0)))
+        if (!(ciEntry.shift & NBNXN_CI_DO_COUL(0)))
         {
             nbl->work->ncj_noq += jlen;
         }
-        else if ((nbl->ci[nbl->nci].shift & NBNXN_CI_HALF_LJ(0)) ||
-                 !(nbl->ci[nbl->nci].shift & NBNXN_CI_DO_LJ(0)))
+        else if ((ciEntry.shift & NBNXN_CI_HALF_LJ(0)) ||
+                 !(ciEntry.shift & NBNXN_CI_DO_LJ(0)))
         {
             nbl->work->ncj_hlj += jlen;
         }
-
-        nbl->nci++;
+    }
+    else
+    {
+        /* Entry is empty: remove it  */
+        nbl->ci.pop_back();
     }
 }
 
@@ -2325,15 +2211,12 @@ static void close_ci_entry_simple(nbnxn_pairlist_t *nbl)
  * As the lists get concatenated later, this estimate depends
  * both on nthread and our own thread index.
  */
-static void split_sci_entry(nbnxn_pairlist_t *nbl,
+static void split_sci_entry(NbnxnPairlistGpu *nbl,
                             int nsp_target_av,
                             gmx_bool progBal, float nsp_tot_est,
                             int thread, int nthread)
 {
     int nsp_max;
-    int cj4_start, cj4_end, j4len;
-    int sci;
-    int nsp, nsp_sci, nsp_cj4, nsp_cj4_e, nsp_cj4_p;
 
     if (progBal)
     {
@@ -2357,23 +2240,21 @@ static void split_sci_entry(nbnxn_pairlist_t *nbl,
         nsp_max = nsp_target_av;
     }
 
-    cj4_start = nbl->sci[nbl->nsci-1].cj4_ind_start;
-    cj4_end   = nbl->sci[nbl->nsci-1].cj4_ind_end;
-    j4len     = cj4_end - cj4_start;
+    const int cj4_start = nbl->sci.back().cj4_ind_start;
+    const int cj4_end   = nbl->sci.back().cj4_ind_end;
+    const int j4len     = cj4_end - cj4_start;
 
     if (j4len > 1 && j4len*c_gpuNumClusterPerCell*c_nbnxnGpuJgroupSize > nsp_max)
     {
-        /* Remove the last ci entry and process the cj4's again */
-        nbl->nsci -= 1;
+        /* Modify the last ci entry and process the cj4's again */
 
-        sci        = nbl->nsci;
-        nsp        = 0;
-        nsp_sci    = 0;
-        nsp_cj4_e  = 0;
-        nsp_cj4    = 0;
+        int nsp        = 0;
+        int nsp_sci    = 0;
+        int nsp_cj4_e  = 0;
+        int nsp_cj4    = 0;
         for (int cj4 = cj4_start; cj4 < cj4_end; cj4++)
         {
-            nsp_cj4_p = nsp_cj4;
+            int nsp_cj4_p = nsp_cj4;
             /* Count the number of cluster pairs in this cj4 group */
             nsp_cj4   = 0;
             for (int p = 0; p < c_gpuNumClusterPerCell*c_nbnxnGpuJgroupSize; p++)
@@ -2387,59 +2268,55 @@ static void split_sci_entry(nbnxn_pairlist_t *nbl,
             if (nsp > 0 && nsp_max - nsp < nsp + nsp_cj4 - nsp_max)
             {
                 /* Split the list at cj4 */
-                nbl->sci[sci].cj4_ind_end = cj4;
+                nbl->sci.back().cj4_ind_end = cj4;
                 /* Create a new sci entry */
-                sci++;
-                nbl->nsci++;
-                if (nbl->nsci+1 > nbl->sci_nalloc)
-                {
-                    nb_realloc_sci(nbl, nbl->nsci+1);
-                }
-                nbl->sci[sci].sci           = nbl->sci[nbl->nsci-1].sci;
-                nbl->sci[sci].shift         = nbl->sci[nbl->nsci-1].shift;
-                nbl->sci[sci].cj4_ind_start = cj4;
-                nsp_sci                     = nsp;
-                nsp_cj4_e                   = nsp_cj4_p;
-                nsp                         = 0;
+                nbnxn_sci_t sciNew;
+                sciNew.sci           = nbl->sci.back().sci;
+                sciNew.shift         = nbl->sci.back().shift;
+                sciNew.cj4_ind_start = cj4;
+                nbl->sci.push_back(sciNew);
+
+                nsp_sci              = nsp;
+                nsp_cj4_e            = nsp_cj4_p;
+                nsp                  = 0;
             }
             nsp += nsp_cj4;
         }
 
         /* Put the remaining cj4's in the last sci entry */
-        nbl->sci[sci].cj4_ind_end = cj4_end;
+        nbl->sci.back().cj4_ind_end = cj4_end;
 
         /* Possibly balance out the last two sci's
          * by moving the last cj4 of the second last sci.
          */
         if (nsp_sci - nsp_cj4_e >= nsp + nsp_cj4_e)
         {
-            nbl->sci[sci-1].cj4_ind_end--;
-            nbl->sci[sci].cj4_ind_start--;
+            GMX_ASSERT(nbl->sci.size() >= 2, "We expect at least two elements");
+            nbl->sci[nbl->sci.size() - 2].cj4_ind_end--;
+            nbl->sci[nbl->sci.size() - 1].cj4_ind_start--;
         }
-
-        nbl->nsci++;
     }
 }
 
 /* Clost this super/sub list i entry */
-static void close_ci_entry_supersub(nbnxn_pairlist_t *nbl,
-                                    int nsp_max_av,
-                                    gmx_bool progBal, float nsp_tot_est,
-                                    int thread, int nthread)
+static void closeIEntry(NbnxnPairlistGpu *nbl,
+                        int nsp_max_av,
+                        gmx_bool progBal, float nsp_tot_est,
+                        int thread, int nthread)
 {
+    nbnxn_sci_t &sciEntry = *getOpenIEntry(nbl);
+
     /* All content of the new ci entry have already been filled correctly,
-     * we only need to increase the count here (for non empty lists).
+     * we only need to, potentially, split or remove the entry when empty.
      */
-    int j4len = nbl->sci[nbl->nsci].cj4_ind_end - nbl->sci[nbl->nsci].cj4_ind_start;
+    int j4len = sciEntry.numJClusterGroups();
     if (j4len > 0)
     {
         /* We can only have complete blocks of 4 j-entries in a list,
          * so round the count up before closing.
          */
-        nbl->ncj4         = (nbl->work->cj_ind + c_nbnxnGpuJgroupSize - 1)/c_nbnxnGpuJgroupSize;
-        nbl->work->cj_ind = nbl->ncj4*c_nbnxnGpuJgroupSize;
-
-        nbl->nsci++;
+        int ncj4          = (nbl->work->cj_ind + c_nbnxnGpuJgroupSize - 1)/c_nbnxnGpuJgroupSize;
+        nbl->work->cj_ind = ncj4*c_nbnxnGpuJgroupSize;
 
         if (nsp_max_av > 0)
         {
@@ -2448,34 +2325,47 @@ static void close_ci_entry_supersub(nbnxn_pairlist_t *nbl,
                             thread, nthread);
         }
     }
+    else
+    {
+        /* Entry is empty: remove it  */
+        nbl->sci.pop_back();
+    }
 }
 
-/* Syncs the working array before adding another grid pair to the list */
-static void sync_work(nbnxn_pairlist_t *nbl)
+/* Syncs the working array before adding another grid pair to the GPU list */
+static void sync_work(NbnxnPairlistCpu gmx_unused *nbl)
 {
-    if (!nbl->bSimple)
-    {
-        nbl->work->cj_ind   = nbl->ncj4*c_nbnxnGpuJgroupSize;
-        nbl->work->cj4_init = nbl->ncj4;
-    }
 }
 
-/* Clears an nbnxn_pairlist_t data structure */
-static void clear_pairlist(nbnxn_pairlist_t *nbl)
+/* Syncs the working array before adding another grid pair to the GPU list */
+static void sync_work(NbnxnPairlistGpu *nbl)
 {
-    nbl->nci           = 0;
-    nbl->nsci          = 0;
-    nbl->ncj           = 0;
+    nbl->work->cj_ind   = nbl->cj4.size()*c_nbnxnGpuJgroupSize;
+}
+
+/* Clears an NbnxnPairlistCpu data structure */
+static void clear_pairlist(NbnxnPairlistCpu *nbl)
+{
+    nbl->ci.clear();
+    nbl->cj.clear();
     nbl->ncjInUse      = 0;
-    nbl->ncj4          = 0;
     nbl->nci_tot       = 0;
-    nbl->nciOuter      = -1;
-    nbl->nexcl         = 1;
+    nbl->ciOuter.clear();
+    nbl->cjOuter.clear();
 
     nbl->work->ncj_noq = 0;
     nbl->work->ncj_hlj = 0;
 }
 
+/* Clears an NbnxnPairlistGpu data structure */
+static void clear_pairlist(NbnxnPairlistGpu *nbl)
+{
+    nbl->sci.clear();
+    nbl->cj4.clear();
+    nbl->excl.resize(1);
+    nbl->nci_tot = 0;
+}
+
 /* Clears a group scheme pair list */
 static void clear_pairlist_fep(t_nblist *nl)
 {
@@ -2502,6 +2392,15 @@ static inline void set_icell_bb_simple(gmx::ArrayRef<const nbnxn_bb_t> bb,
     bb_ci->upper[BB_Z] = bb[ci].upper[BB_Z] + shz;
 }
 
+/* Sets a simple list i-cell bounding box, including PBC shift */
+static inline void set_icell_bb(const nbnxn_grid_t &iGrid,
+                                int ci,
+                                real shx, real shy, real shz,
+                                NbnxnPairlistCpuWork *work)
+{
+    set_icell_bb_simple(iGrid.bb, ci, shx, shy, shz, &work->iClusterData.bb[0]);
+}
+
 #if NBNXN_BBXXXX
 /* Sets a super-cell and sub cell bounding boxes, including PBC shift */
 static void set_icell_bbxxxx_supersub(gmx::ArrayRef<const float> bb,
@@ -2539,31 +2438,76 @@ gmx_unused static void set_icell_bb_supersub(gmx::ArrayRef<const nbnxn_bb_t> bb,
     }
 }
 
+/* Sets a super-cell and sub cell bounding boxes, including PBC shift */
+gmx_unused static void set_icell_bb(const nbnxn_grid_t &iGrid,
+                                    int ci,
+                                    real shx, real shy, real shz,
+                                    NbnxnPairlistGpuWork *work)
+{
+#if NBNXN_BBXXXX
+    set_icell_bbxxxx_supersub(iGrid.pbb, ci, shx, shy, shz,
+                              work->iSuperClusterData.bbPacked.data());
+#else
+    set_icell_bb_supersub(iGrid.bb, ci, shx, shy, shz,
+                          work->iSuperClusterData.bb.data());
+#endif
+}
+
 /* Copies PBC shifted i-cell atom coordinates x,y,z to working array */
 static void icell_set_x_simple(int ci,
                                real shx, real shy, real shz,
                                int stride, const real *x,
-                               nbnxn_list_work_t *work)
+                               NbnxnPairlistCpuWork::IClusterData *iClusterData)
 {
-    int ia = ci*NBNXN_CPU_CLUSTER_I_SIZE;
+    const int ia = ci*c_nbnxnCpuIClusterSize;
 
-    for (int i = 0; i < NBNXN_CPU_CLUSTER_I_SIZE; i++)
+    for (int i = 0; i < c_nbnxnCpuIClusterSize; i++)
     {
-        work->x_ci[i*STRIDE_XYZ+XX] = x[(ia+i)*stride+XX] + shx;
-        work->x_ci[i*STRIDE_XYZ+YY] = x[(ia+i)*stride+YY] + shy;
-        work->x_ci[i*STRIDE_XYZ+ZZ] = x[(ia+i)*stride+ZZ] + shz;
+        iClusterData->x[i*STRIDE_XYZ+XX] = x[(ia+i)*stride+XX] + shx;
+        iClusterData->x[i*STRIDE_XYZ+YY] = x[(ia+i)*stride+YY] + shy;
+        iClusterData->x[i*STRIDE_XYZ+ZZ] = x[(ia+i)*stride+ZZ] + shz;
+    }
+}
+
+static void icell_set_x(int ci,
+                        real shx, real shy, real shz,
+                        int stride, const real *x,
+                        int nb_kernel_type,
+                        NbnxnPairlistCpuWork *work)
+{
+    switch (nb_kernel_type)
+    {
+#if GMX_SIMD
+#ifdef GMX_NBNXN_SIMD_4XN
+        case nbnxnk4xN_SIMD_4xN:
+            icell_set_x_simd_4xn(ci, shx, shy, shz, stride, x, work);
+            break;
+#endif
+#ifdef GMX_NBNXN_SIMD_2XNN
+        case nbnxnk4xN_SIMD_2xNN:
+            icell_set_x_simd_2xnn(ci, shx, shy, shz, stride, x, work);
+            break;
+#endif
+#endif
+        case nbnxnk4x4_PlainC:
+            icell_set_x_simple(ci, shx, shy, shz, stride, x, &work->iClusterData);
+            break;
+        default:
+            GMX_ASSERT(false, "Unhandled case");
+            break;
     }
 }
 
 /* Copies PBC shifted super-cell atom coordinates x,y,z to working array */
-static void icell_set_x_supersub(int ci,
-                                 real shx, real shy, real shz,
-                                 int stride, const real *x,
-                                 nbnxn_list_work_t *work)
+static void icell_set_x(int ci,
+                        real shx, real shy, real shz,
+                        int stride, const real *x,
+                        int gmx_unused nb_kernel_type,
+                        NbnxnPairlistGpuWork *work)
 {
 #if !GMX_SIMD4_HAVE_REAL
 
-    real * x_ci = work->x_ci;
+    real * x_ci = work->iSuperClusterData.x.data();
 
     int    ia = ci*c_gpuNumClusterPerCell*c_nbnxnGpuClusterSize;
     for (int i = 0; i < c_gpuNumClusterPerCell*c_nbnxnGpuClusterSize; i++)
@@ -2575,7 +2519,7 @@ static void icell_set_x_supersub(int ci,
 
 #else /* !GMX_SIMD4_HAVE_REAL */
 
-    real * x_ci = work->x_ci_simd;
+    real * x_ci = work->iSuperClusterData.xSimd.data();
 
     for (int si = 0; si < c_gpuNumClusterPerCell; si++)
     {
@@ -2595,21 +2539,21 @@ static void icell_set_x_supersub(int ci,
 #endif /* !GMX_SIMD4_HAVE_REAL */
 }
 
-static real minimum_subgrid_size_xy(const nbnxn_grid_t *grid)
+static real minimum_subgrid_size_xy(const nbnxn_grid_t &grid)
 {
-    if (grid->bSimple)
+    if (grid.bSimple)
     {
-        return std::min(grid->cellSize[XX], grid->cellSize[YY]);
+        return std::min(grid.cellSize[XX], grid.cellSize[YY]);
     }
     else
     {
-        return std::min(grid->cellSize[XX]/c_gpuNumClusterPerCellX,
-                        grid->cellSize[YY]/c_gpuNumClusterPerCellY);
+        return std::min(grid.cellSize[XX]/c_gpuNumClusterPerCellX,
+                        grid.cellSize[YY]/c_gpuNumClusterPerCellY);
     }
 }
 
-static real effective_buffer_1x1_vs_MxN(const nbnxn_grid_t *gridi,
-                                        const nbnxn_grid_t *gridj)
+static real effective_buffer_1x1_vs_MxN(const nbnxn_grid_t &iGrid,
+                                        const nbnxn_grid_t &jGrid)
 {
     const real eff_1x1_buffer_fac_overest = 0.1;
 
@@ -2630,8 +2574,8 @@ static real effective_buffer_1x1_vs_MxN(const nbnxn_grid_t *gridi,
      * Smaller tolerances or using RF lead to a smaller effective buffer,
      * so 10% gives a safe overestimate.
      */
-    return eff_1x1_buffer_fac_overest*(minimum_subgrid_size_xy(gridi) +
-                                       minimum_subgrid_size_xy(gridj));
+    return eff_1x1_buffer_fac_overest*(minimum_subgrid_size_xy(iGrid) +
+                                       minimum_subgrid_size_xy(jGrid));
 }
 
 /* Clusters at the cut-off only increase rlist by 60% of their size */
@@ -2648,7 +2592,7 @@ real nbnxn_get_rlist_effective_inc(int cluster_size_j, real atom_density)
     /* We should get this from the setup, but currently it's the same for
      * all setups, including GPUs.
      */
-    cluster_size_i = NBNXN_CPU_CLUSTER_I_SIZE;
+    cluster_size_i = c_nbnxnCpuIClusterSize;
 
     vol_inc_i = (cluster_size_i - 1)/atom_density;
     vol_inc_j = (cluster_size_j - 1)/atom_density;
@@ -2715,11 +2659,10 @@ static void get_nsubpair_target(const nbnxn_search   *nbs,
      * Maxwell is less sensitive to the exact value.
      */
     const int           nsubpair_target_min = 36;
-    const nbnxn_grid_t *grid;
     rvec                ls;
     real                r_eff_sup, vol_est, nsp_est, nsp_est_nl;
 
-    grid = &nbs->grid[0];
+    const nbnxn_grid_t &grid = nbs->grid[0];
 
     /* We don't need to balance list sizes if:
      * - We didn't request balancing.
@@ -2727,7 +2670,7 @@ static void get_nsubpair_target(const nbnxn_search   *nbs,
      *   since we will always generate at least #cells lists.
      * - We don't have any cells, since then there won't be any lists.
      */
-    if (min_ci_balanced <= 0 || grid->nc >= min_ci_balanced || grid->nc == 0)
+    if (min_ci_balanced <= 0 || grid.nc >= min_ci_balanced || grid.nc == 0)
     {
         /* nsubpair_target==0 signals no balancing */
         *nsubpair_target  = 0;
@@ -2736,15 +2679,15 @@ static void get_nsubpair_target(const nbnxn_search   *nbs,
         return;
     }
 
-    ls[XX] = (grid->c1[XX] - grid->c0[XX])/(grid->numCells[XX]*c_gpuNumClusterPerCellX);
-    ls[YY] = (grid->c1[YY] - grid->c0[YY])/(grid->numCells[YY]*c_gpuNumClusterPerCellY);
-    ls[ZZ] = grid->na_c/(grid->atom_density*ls[XX]*ls[YY]);
+    ls[XX] = (grid.c1[XX] - grid.c0[XX])/(grid.numCells[XX]*c_gpuNumClusterPerCellX);
+    ls[YY] = (grid.c1[YY] - grid.c0[YY])/(grid.numCells[YY]*c_gpuNumClusterPerCellY);
+    ls[ZZ] = grid.na_c/(grid.atom_density*ls[XX]*ls[YY]);
 
     /* The average length of the diagonal of a sub cell */
     real diagonal = std::sqrt(ls[XX]*ls[XX] + ls[YY]*ls[YY] + ls[ZZ]*ls[ZZ]);
 
     /* The formulas below are a heuristic estimate of the average nsj per si*/
-    r_eff_sup = rlist + nbnxn_rlist_inc_outside_fac*gmx::square((grid->na_c - 1.0)/grid->na_c)*0.5*diagonal;
+    r_eff_sup = rlist + nbnxn_rlist_inc_outside_fac*gmx::square((grid.na_c - 1.0)/grid.na_c)*0.5*diagonal;
 
     if (!nbs->DomDec || nbs->zones->n == 1)
     {
@@ -2753,7 +2696,7 @@ static void get_nsubpair_target(const nbnxn_search   *nbs,
     else
     {
         nsp_est_nl =
-            gmx::square(grid->atom_density/grid->na_c)*
+            gmx::square(grid.atom_density/grid.na_c)*
             nonlocal_vol2(nbs->zones, ls, r_eff_sup);
     }
 
@@ -2771,7 +2714,7 @@ static void get_nsubpair_target(const nbnxn_search   *nbs,
         /* Estimate the number of cluster pairs as the local number of
          * clusters times the volume they interact with times the density.
          */
-        nsp_est = grid->nsubc_tot*vol_est*grid->atom_density/grid->na_c;
+        nsp_est = grid.nsubc_tot*vol_est*grid.atom_density/grid.na_c;
 
         /* Subtract the non-local pair count */
         nsp_est -= nsp_est_nl;
@@ -2785,7 +2728,7 @@ static void get_nsubpair_target(const nbnxn_search   *nbs,
          * groups of atoms we'll anyhow be limited by nsubpair_target_min,
          * so this overestimation will not matter.
          */
-        nsp_est = std::max(nsp_est, grid->nsubc_tot*14._real);
+        nsp_est = std::max(nsp_est, grid.nsubc_tot*14._real);
 
         if (debug)
         {
@@ -2814,15 +2757,15 @@ static void get_nsubpair_target(const nbnxn_search   *nbs,
 }
 
 /* Debug list print function */
-static void print_nblist_ci_cj(FILE *fp, const nbnxn_pairlist_t *nbl)
+static void print_nblist_ci_cj(FILE *fp, const NbnxnPairlistCpu *nbl)
 {
-    for (int i = 0; i < nbl->nci; i++)
+    for (const nbnxn_ci_t &ciEntry : nbl->ci)
     {
         fprintf(fp, "ci %4d  shift %2d  ncj %3d\n",
-                nbl->ci[i].ci, nbl->ci[i].shift,
-                nbl->ci[i].cj_ind_end - nbl->ci[i].cj_ind_start);
+                ciEntry.ci, ciEntry.shift,
+                ciEntry.cj_ind_end - ciEntry.cj_ind_start);
 
-        for (int j = nbl->ci[i].cj_ind_start; j < nbl->ci[i].cj_ind_end; j++)
+        for (int j = ciEntry.cj_ind_start; j < ciEntry.cj_ind_end; j++)
         {
             fprintf(fp, "  cj %5d  imask %x\n",
                     nbl->cj[j].cj,
@@ -2832,16 +2775,16 @@ static void print_nblist_ci_cj(FILE *fp, const nbnxn_pairlist_t *nbl)
 }
 
 /* Debug list print function */
-static void print_nblist_sci_cj(FILE *fp, const nbnxn_pairlist_t *nbl)
+static void print_nblist_sci_cj(FILE *fp, const NbnxnPairlistGpu *nbl)
 {
-    for (int i = 0; i < nbl->nsci; i++)
+    for (const nbnxn_sci_t &sci : nbl->sci)
     {
         fprintf(fp, "ci %4d  shift %2d  ncj4 %2d\n",
-                nbl->sci[i].sci, nbl->sci[i].shift,
-                nbl->sci[i].cj4_ind_end - nbl->sci[i].cj4_ind_start);
+                sci.sci, sci.shift,
+                sci.numJClusterGroups());
 
         int ncp = 0;
-        for (int j4 = nbl->sci[i].cj4_ind_start; j4 < nbl->sci[i].cj4_ind_end; j4++)
+        for (int j4 = sci.cj4_ind_start; j4 < sci.cj4_ind_end; j4++)
         {
             for (int j = 0; j < c_nbnxnGpuJgroupSize; j++)
             {
@@ -2858,53 +2801,31 @@ static void print_nblist_sci_cj(FILE *fp, const nbnxn_pairlist_t *nbl)
             }
         }
         fprintf(fp, "ci %4d  shift %2d  ncj4 %2d ncp %3d\n",
-                nbl->sci[i].sci, nbl->sci[i].shift,
-                nbl->sci[i].cj4_ind_end - nbl->sci[i].cj4_ind_start,
+                sci.sci, sci.shift,
+                sci.numJClusterGroups(),
                 ncp);
     }
 }
 
 /* Combine pair lists *nbl generated on multiple threads nblc */
-static void combine_nblists(int nnbl, nbnxn_pairlist_t **nbl,
-                            nbnxn_pairlist_t *nblc)
+static void combine_nblists(int nnbl, NbnxnPairlistGpu **nbl,
+                            NbnxnPairlistGpu *nblc)
 {
-    int nsci, ncj4, nexcl;
-
-    if (nblc->bSimple)
-    {
-        gmx_incons("combine_nblists does not support simple lists");
-    }
-
-    nsci  = nblc->nsci;
-    ncj4  = nblc->ncj4;
-    nexcl = nblc->nexcl;
+    int nsci  = nblc->sci.size();
+    int ncj4  = nblc->cj4.size();
+    int nexcl = nblc->excl.size();
     for (int i = 0; i < nnbl; i++)
     {
-        nsci  += nbl[i]->nsci;
-        ncj4  += nbl[i]->ncj4;
-        nexcl += nbl[i]->nexcl;
+        nsci  += nbl[i]->sci.size();
+        ncj4  += nbl[i]->cj4.size();
+        nexcl += nbl[i]->excl.size();
     }
 
-    if (nsci > nblc->sci_nalloc)
-    {
-        nb_realloc_sci(nblc, nsci);
-    }
-    if (ncj4 > nblc->cj4_nalloc)
-    {
-        nblc->cj4_nalloc = over_alloc_small(ncj4);
-        nbnxn_realloc_void(reinterpret_cast<void **>(&nblc->cj4),
-                           nblc->ncj4*sizeof(*nblc->cj4),
-                           nblc->cj4_nalloc*sizeof(*nblc->cj4),
-                           nblc->alloc, nblc->free);
-    }
-    if (nexcl > nblc->excl_nalloc)
-    {
-        nblc->excl_nalloc = over_alloc_small(nexcl);
-        nbnxn_realloc_void(reinterpret_cast<void **>(&nblc->excl),
-                           nblc->nexcl*sizeof(*nblc->excl),
-                           nblc->excl_nalloc*sizeof(*nblc->excl),
-                           nblc->alloc, nblc->free);
-    }
+    /* Resize with the final, combined size, so we can fill in parallel */
+    /* NOTE: For better performance we should use default initialization */
+    nblc->sci.resize(nsci);
+    nblc->cj4.resize(ncj4);
+    nblc->excl.resize(nexcl);
 
     /* Each thread should copy its own data to the combined arrays,
      * as otherwise data will go back and forth between different caches.
@@ -2918,42 +2839,39 @@ static void combine_nblists(int nnbl, nbnxn_pairlist_t **nbl,
     {
         try
         {
-            int                     sci_offset;
-            int                     cj4_offset;
-            int                     excl_offset;
-            const nbnxn_pairlist_t *nbli;
-
-            /* Determine the offset in the combined data for our thread */
-            sci_offset  = nblc->nsci;
-            cj4_offset  = nblc->ncj4;
-            excl_offset = nblc->nexcl;
+            /* Determine the offset in the combined data for our thread.
+             * Note that the original sizes in nblc are lost.
+             */
+            int sci_offset  = nsci;
+            int cj4_offset  = ncj4;
+            int excl_offset = nexcl;
 
-            for (int i = 0; i < n; i++)
+            for (int i = n; i < nnbl; i++)
             {
-                sci_offset  += nbl[i]->nsci;
-                cj4_offset  += nbl[i]->ncj4;
-                excl_offset += nbl[i]->nexcl;
+                sci_offset  -= nbl[i]->sci.size();
+                cj4_offset  -= nbl[i]->cj4.size();
+                excl_offset -= nbl[i]->excl.size();
             }
 
-            nbli = nbl[n];
+            const NbnxnPairlistGpu &nbli = *nbl[n];
 
-            for (int i = 0; i < nbli->nsci; i++)
+            for (size_t i = 0; i < nbli.sci.size(); i++)
             {
-                nblc->sci[sci_offset+i]                = nbli->sci[i];
-                nblc->sci[sci_offset+i].cj4_ind_start += cj4_offset;
-                nblc->sci[sci_offset+i].cj4_ind_end   += cj4_offset;
+                nblc->sci[sci_offset + i]                = nbli.sci[i];
+                nblc->sci[sci_offset + i].cj4_ind_start += cj4_offset;
+                nblc->sci[sci_offset + i].cj4_ind_end   += cj4_offset;
             }
 
-            for (int j4 = 0; j4 < nbli->ncj4; j4++)
+            for (size_t j4 = 0; j4 < nbli.cj4.size(); j4++)
             {
-                nblc->cj4[cj4_offset+j4]                   = nbli->cj4[j4];
-                nblc->cj4[cj4_offset+j4].imei[0].excl_ind += excl_offset;
-                nblc->cj4[cj4_offset+j4].imei[1].excl_ind += excl_offset;
+                nblc->cj4[cj4_offset + j4]                   = nbli.cj4[j4];
+                nblc->cj4[cj4_offset + j4].imei[0].excl_ind += excl_offset;
+                nblc->cj4[cj4_offset + j4].imei[1].excl_ind += excl_offset;
             }
 
-            for (int j4 = 0; j4 < nbli->nexcl; j4++)
+            for (size_t j4 = 0; j4 < nbli.excl.size(); j4++)
             {
-                nblc->excl[excl_offset+j4] = nbli->excl[j4];
+                nblc->excl[excl_offset + j4] = nbli.excl[j4];
             }
         }
         GMX_CATCH_ALL_AND_EXIT_WITH_FATAL_ERROR;
@@ -2961,10 +2879,7 @@ static void combine_nblists(int nnbl, nbnxn_pairlist_t **nbl,
 
     for (int n = 0; n < nnbl; n++)
     {
-        nblc->nsci    += nbl[n]->nsci;
-        nblc->ncj4    += nbl[n]->ncj4;
         nblc->nci_tot += nbl[n]->nci_tot;
-        nblc->nexcl   += nbl[n]->nexcl;
     }
 }
 
@@ -3083,7 +2998,7 @@ static void balance_fep_lists(const nbnxn_search   *nbs,
 }
 
 /* Returns the next ci to be processes by our thread */
-static gmx_bool next_ci(const nbnxn_grid_t *grid,
+static gmx_bool next_ci(const nbnxn_grid_t &grid,
                         int nth, int ci_block,
                         int *ci_x, int *ci_y,
                         int *ci_b, int *ci)
@@ -3098,15 +3013,15 @@ static gmx_bool next_ci(const nbnxn_grid_t *grid,
         *ci_b  = 0;
     }
 
-    if (*ci >= grid->nc)
+    if (*ci >= grid.nc)
     {
         return FALSE;
     }
 
-    while (*ci >= grid->cxy_ind[*ci_x*grid->numCells[YY] + *ci_y + 1])
+    while (*ci >= grid.cxy_ind[*ci_x*grid.numCells[YY] + *ci_y + 1])
     {
         *ci_y += 1;
-        if (*ci_y == grid->numCells[YY])
+        if (*ci_y == grid.numCells[YY])
         {
             *ci_x += 1;
             *ci_y  = 0;
@@ -3119,8 +3034,8 @@ static gmx_bool next_ci(const nbnxn_grid_t *grid,
 /* Returns the distance^2 for which we put cell pairs in the list
  * without checking atom pair distances. This is usually < rlist^2.
  */
-static float boundingbox_only_distance2(const nbnxn_grid_t *gridi,
-                                        const nbnxn_grid_t *gridj,
+static float boundingbox_only_distance2(const nbnxn_grid_t &iGrid,
+                                        const nbnxn_grid_t &jGrid,
                                         real                rlist,
                                         gmx_bool            simple)
 {
@@ -3140,8 +3055,8 @@ static float boundingbox_only_distance2(const nbnxn_grid_t *gridi,
     real bbx, bby;
     real rbb2;
 
-    bbx = 0.5*(gridi->cellSize[XX] + gridj->cellSize[XX]);
-    bby = 0.5*(gridi->cellSize[YY] + gridj->cellSize[YY]);
+    bbx = 0.5*(iGrid.cellSize[XX] + jGrid.cellSize[XX]);
+    bby = 0.5*(iGrid.cellSize[YY] + jGrid.cellSize[YY]);
     if (!simple)
     {
         bbx /= c_gpuNumClusterPerCellX;
@@ -3158,7 +3073,7 @@ static float boundingbox_only_distance2(const nbnxn_grid_t *gridi,
 #endif
 }
 
-static int get_ci_block_size(const nbnxn_grid_t *gridi,
+static int get_ci_block_size(const nbnxn_grid_t &iGrid,
                              gmx_bool bDomDec, int nth)
 {
     const int ci_block_enum      = 5;
@@ -3177,23 +3092,23 @@ static int get_ci_block_size(const nbnxn_grid_t *gridi,
      * zone boundaries with 3D domain decomposition. At the same time
      * the blocks will not become too small.
      */
-    ci_block = (gridi->nc*ci_block_enum)/(ci_block_denom*gridi->numCells[XX]*nth);
+    ci_block = (iGrid.nc*ci_block_enum)/(ci_block_denom*iGrid.numCells[XX]*nth);
 
     /* Ensure the blocks are not too small: avoids cache invalidation */
-    if (ci_block*gridi->na_sc < ci_block_min_atoms)
+    if (ci_block*iGrid.na_sc < ci_block_min_atoms)
     {
-        ci_block = (ci_block_min_atoms + gridi->na_sc - 1)/gridi->na_sc;
+        ci_block = (ci_block_min_atoms + iGrid.na_sc - 1)/iGrid.na_sc;
     }
 
     /* Without domain decomposition
      * or with less than 3 blocks per task, divide in nth blocks.
      */
-    if (!bDomDec || nth*3*ci_block > gridi->nc)
+    if (!bDomDec || nth*3*ci_block > iGrid.nc)
     {
-        ci_block = (gridi->nc + nth - 1)/nth;
+        ci_block = (iGrid.nc + nth - 1)/nth;
     }
 
-    if (ci_block > 1 && (nth - 1)*ci_block >= gridi->nc)
+    if (ci_block > 1 && (nth - 1)*ci_block >= iGrid.nc)
     {
         /* Some threads have no work. Although reducing the block size
          * does not decrease the block count on the first few threads,
@@ -3223,10 +3138,154 @@ static int getBufferFlagShift(int numAtomsPerCluster)
     return bufferFlagShift;
 }
 
+static bool pairlistIsSimple(const NbnxnPairlistCpu gmx_unused &pairlist)
+{
+    return true;
+}
+
+static bool pairlistIsSimple(const NbnxnPairlistGpu gmx_unused &pairlist)
+{
+    return false;
+}
+
+static void makeClusterListWrapper(NbnxnPairlistCpu              *nbl,
+                                   const nbnxn_grid_t gmx_unused &iGrid,
+                                   const int                      ci,
+                                   const nbnxn_grid_t            &jGrid,
+                                   const int                      firstCell,
+                                   const int                      lastCell,
+                                   const bool                     excludeSubDiagonal,
+                                   const nbnxn_atomdata_t        *nbat,
+                                   const real                     rlist2,
+                                   const real                     rbb2,
+                                   const int                      nb_kernel_type,
+                                   int                           *numDistanceChecks)
+{
+    switch (nb_kernel_type)
+    {
+        case nbnxnk4x4_PlainC:
+            makeClusterListSimple(jGrid,
+                                  nbl, ci, firstCell, lastCell,
+                                  excludeSubDiagonal,
+                                  nbat->x().data(),
+                                  rlist2, rbb2,
+                                  numDistanceChecks);
+            break;
+#ifdef GMX_NBNXN_SIMD_4XN
+        case nbnxnk4xN_SIMD_4xN:
+            makeClusterListSimd4xn(jGrid,
+                                   nbl, ci, firstCell, lastCell,
+                                   excludeSubDiagonal,
+                                   nbat->x().data(),
+                                   rlist2, rbb2,
+                                   numDistanceChecks);
+            break;
+#endif
+#ifdef GMX_NBNXN_SIMD_2XNN
+        case nbnxnk4xN_SIMD_2xNN:
+            makeClusterListSimd2xnn(jGrid,
+                                    nbl, ci, firstCell, lastCell,
+                                    excludeSubDiagonal,
+                                    nbat->x().data(),
+                                    rlist2, rbb2,
+                                    numDistanceChecks);
+            break;
+#endif
+    }
+}
+
+static void makeClusterListWrapper(NbnxnPairlistGpu              *nbl,
+                                   const nbnxn_grid_t &gmx_unused iGrid,
+                                   const int                      ci,
+                                   const nbnxn_grid_t            &jGrid,
+                                   const int                      firstCell,
+                                   const int                      lastCell,
+                                   const bool                     excludeSubDiagonal,
+                                   const nbnxn_atomdata_t        *nbat,
+                                   const real                     rlist2,
+                                   const real                     rbb2,
+                                   const int gmx_unused           nb_kernel_type,
+                                   int                           *numDistanceChecks)
+{
+    for (int cj = firstCell; cj <= lastCell; cj++)
+    {
+        make_cluster_list_supersub(iGrid, jGrid,
+                                   nbl, ci, cj,
+                                   excludeSubDiagonal,
+                                   nbat->xstride, nbat->x().data(),
+                                   rlist2, rbb2,
+                                   numDistanceChecks);
+    }
+}
+
+static int getNumSimpleJClustersInList(const NbnxnPairlistCpu &nbl)
+{
+    return nbl.cj.size();
+}
+
+static int getNumSimpleJClustersInList(const gmx_unused NbnxnPairlistGpu &nbl)
+{
+    return 0;
+}
+
+static void incrementNumSimpleJClustersInList(NbnxnPairlistCpu *nbl,
+                                              int               ncj_old_j)
+{
+    nbl->ncjInUse += nbl->cj.size() - ncj_old_j;
+}
+
+static void incrementNumSimpleJClustersInList(NbnxnPairlistGpu gmx_unused *nbl,
+                                              int              gmx_unused  ncj_old_j)
+{
+}
+
+static void checkListSizeConsistency(const NbnxnPairlistCpu &nbl,
+                                     const bool              haveFreeEnergy)
+{
+    GMX_RELEASE_ASSERT(static_cast<size_t>(nbl.ncjInUse) == nbl.cj.size() || haveFreeEnergy,
+                       "Without free-energy all cj pair-list entries should be in use. "
+                       "Note that subsequent code does not make use of the equality, "
+                       "this check is only here to catch bugs");
+}
+
+static void checkListSizeConsistency(const NbnxnPairlistGpu gmx_unused &nbl,
+                                     bool gmx_unused                    haveFreeEnergy)
+{
+    /* We currently can not check consistency here */
+}
+
+/* Set the buffer flags for newly added entries in the list */
+static void setBufferFlags(const NbnxnPairlistCpu &nbl,
+                           const int               ncj_old_j,
+                           const int               gridj_flag_shift,
+                           gmx_bitmask_t          *gridj_flag,
+                           const int               th)
+{
+    if (static_cast<gmx::index>(nbl.cj.size()) > ncj_old_j)
+    {
+        int cbFirst = nbl.cj[ncj_old_j].cj >> gridj_flag_shift;
+        int cbLast  = nbl.cj.back().cj >> gridj_flag_shift;
+        for (int cb = cbFirst; cb <= cbLast; cb++)
+        {
+            bitmask_init_bit(&gridj_flag[cb], th);
+        }
+    }
+}
+
+static void setBufferFlags(const NbnxnPairlistGpu gmx_unused &nbl,
+                           int gmx_unused                     ncj_old_j,
+                           int gmx_unused                     gridj_flag_shift,
+                           gmx_bitmask_t gmx_unused          *gridj_flag,
+                           int gmx_unused                     th)
+{
+    GMX_ASSERT(false, "This function should never be called");
+}
+
 /* Generates the part of pair-list nbl assigned to our thread */
+template <typename T>
 static void nbnxn_make_pairlist_part(const nbnxn_search *nbs,
-                                     const nbnxn_grid_t *gridi,
-                                     const nbnxn_grid_t *gridj,
+                                     const nbnxn_grid_t &iGrid,
+                                     const nbnxn_grid_t &jGrid,
                                      nbnxn_search_work_t *work,
                                      const nbnxn_atomdata_t *nbat,
                                      const t_blocka &exclusions,
@@ -3238,17 +3297,15 @@ static void nbnxn_make_pairlist_part(const nbnxn_search *nbs,
                                      gmx_bool progBal,
                                      float nsubpair_tot_est,
                                      int th, int nth,
-                                     nbnxn_pairlist_t *nbl,
+                                     T *nbl,
                                      t_nblist *nbl_fep)
 {
     int               na_cj_2log;
     matrix            box;
     real              rlist2, rl_fep2 = 0;
     float             rbb2;
-    int               ci_b, ci, ci_x, ci_y, ci_xy, cj;
+    int               ci_b, ci, ci_x, ci_y, ci_xy;
     ivec              shp;
-    int               shift;
-    real              shx, shy, shz;
     real              bx0, bx1, by0, by1, bz0, bz1;
     real              bz1_frac;
     real              d2cx, d2z, d2z_cx, d2z_cy, d2zx, d2zxy, d2xy;
@@ -3260,14 +3317,14 @@ static void nbnxn_make_pairlist_part(const nbnxn_search *nbs,
 
     nbs_cycle_start(&work->cc[enbsCCsearch]);
 
-    if (gridj->bSimple != nbl->bSimple || gridi->bSimple != nbl->bSimple)
+    if (jGrid.bSimple != pairlistIsSimple(*nbl) ||
+        iGrid.bSimple != pairlistIsSimple(*nbl))
     {
         gmx_incons("Grid incompatible with pair-list");
     }
 
     sync_work(nbl);
-    nbl->na_sc = gridj->na_sc;
-    nbl->na_ci = gridj->na_c;
+    GMX_ASSERT(nbl->na_ci == jGrid.na_c, "The cluster sizes in the list and grid should match");
     nbl->na_cj = nbnxn_kernel_to_cluster_j_size(nb_kernel_type);
     na_cj_2log = get_2log(nbl->na_cj);
 
@@ -3286,7 +3343,7 @@ static void nbnxn_make_pairlist_part(const nbnxn_search *nbs,
 
     rlist2 = nbl->rlist*nbl->rlist;
 
-    if (nbs->bFEP && !nbl->bSimple)
+    if (nbs->bFEP && !pairlistIsSimple(*nbl))
     {
         /* Determine an atom-pair list cut-off distance for FEP atom pairs.
          * We should not simply use rlist, since then we would not have
@@ -3294,7 +3351,7 @@ static void nbnxn_make_pairlist_part(const nbnxn_search *nbs,
          * The buffer is on overestimate, but the resulting cost for pairs
          * beyond rlist is neglible compared to the FEP pairs within rlist.
          */
-        rl_fep2 = nbl->rlist + effective_buffer_1x1_vs_MxN(gridi, gridj);
+        rl_fep2 = nbl->rlist + effective_buffer_1x1_vs_MxN(iGrid, jGrid);
 
         if (debug)
         {
@@ -3303,13 +3360,15 @@ static void nbnxn_make_pairlist_part(const nbnxn_search *nbs,
         rl_fep2 = rl_fep2*rl_fep2;
     }
 
-    rbb2 = boundingbox_only_distance2(gridi, gridj, nbl->rlist, nbl->bSimple);
+    rbb2 = boundingbox_only_distance2(iGrid, jGrid, nbl->rlist, pairlistIsSimple(*nbl));
 
     if (debug)
     {
         fprintf(debug, "nbl bounding box only distance %f\n", std::sqrt(rbb2));
     }
 
+    const bool isIntraGridList = (&iGrid == &jGrid);
+
     /* Set the shift range */
     for (int d = 0; d < DIM; d++)
     {
@@ -3322,7 +3381,7 @@ static void nbnxn_make_pairlist_part(const nbnxn_search *nbs,
         }
         else
         {
-            const real listRangeCellToCell = listRangeForGridCellToGridCell(rlist, *gridi, *gridj);
+            const real listRangeCellToCell = listRangeForGridCellToGridCell(rlist, iGrid, jGrid);
             if (d == XX &&
                 box[XX][XX] - fabs(box[YY][XX]) - fabs(box[ZZ][XX]) < listRangeCellToCell)
             {
@@ -3334,36 +3393,36 @@ static void nbnxn_make_pairlist_part(const nbnxn_search *nbs,
             }
         }
     }
-    const bool bSimple = nbl->bSimple;
+    const bool bSimple = pairlistIsSimple(*nbl);
     gmx::ArrayRef<const nbnxn_bb_t> bb_i;
 #if NBNXN_BBXXXX
     gmx::ArrayRef<const float>      pbb_i;
     if (bSimple)
     {
-        bb_i  = gridi->bb;
+        bb_i  = iGrid.bb;
     }
     else
     {
-        pbb_i = gridi->pbb;
+        pbb_i = iGrid.pbb;
     }
 #else
     /* We use the normal bounding box format for both grid types */
-    bb_i  = gridi->bb;
+    bb_i  = iGrid.bb;
 #endif
-    gmx::ArrayRef<const float> bbcz_i  = gridi->bbcz;
-    gmx::ArrayRef<const int>   flags_i = gridi->flags;
-    gmx::ArrayRef<const float> bbcz_j  = gridj->bbcz;
-    int                        cell0_i = gridi->cell0;
+    gmx::ArrayRef<const float> bbcz_i  = iGrid.bbcz;
+    gmx::ArrayRef<const int>   flags_i = iGrid.flags;
+    gmx::ArrayRef<const float> bbcz_j  = jGrid.bbcz;
+    int                        cell0_i = iGrid.cell0;
 
     if (debug)
     {
         fprintf(debug, "nbl nc_i %d col.av. %.1f ci_block %d\n",
-                gridi->nc, gridi->nc/static_cast<double>(gridi->numCells[XX]*gridi->numCells[YY]), ci_block);
+                iGrid.nc, iGrid.nc/static_cast<double>(iGrid.numCells[XX]*iGrid.numCells[YY]), ci_block);
     }
 
     numDistanceChecks = 0;
 
-    const real listRangeBBToJCell2 = gmx::square(listRangeForBoundingBoxToGridCell(rlist, *gridj));
+    const real listRangeBBToJCell2 = gmx::square(listRangeForBoundingBoxToGridCell(rlist, jGrid));
 
     /* Initially ci_b and ci to 1 before where we want them to start,
      * as they will both be incremented in next_ci.
@@ -3372,17 +3431,17 @@ static void nbnxn_make_pairlist_part(const nbnxn_search *nbs,
     ci   = th*ci_block - 1;
     ci_x = 0;
     ci_y = 0;
-    while (next_ci(gridi, nth, ci_block, &ci_x, &ci_y, &ci_b, &ci))
+    while (next_ci(iGrid, nth, ci_block, &ci_x, &ci_y, &ci_b, &ci))
     {
         if (bSimple && flags_i[ci] == 0)
         {
             continue;
         }
 
-        ncj_old_i = nbl->ncj;
+        ncj_old_i = getNumSimpleJClustersInList(*nbl);
 
         d2cx = 0;
-        if (gridj != gridi && shp[XX] == 0)
+        if (!isIntraGridList && shp[XX] == 0)
         {
             if (bSimple)
             {
@@ -3390,11 +3449,11 @@ static void nbnxn_make_pairlist_part(const nbnxn_search *nbs,
             }
             else
             {
-                bx1 = gridi->c0[XX] + (ci_x+1)*gridi->cellSize[XX];
+                bx1 = iGrid.c0[XX] + (ci_x+1)*iGrid.cellSize[XX];
             }
-            if (bx1 < gridj->c0[XX])
+            if (bx1 < jGrid.c0[XX])
             {
-                d2cx = gmx::square(gridj->c0[XX] - bx1);
+                d2cx = gmx::square(jGrid.c0[XX] - bx1);
 
                 if (d2cx >= listRangeBBToJCell2)
                 {
@@ -3403,12 +3462,12 @@ static void nbnxn_make_pairlist_part(const nbnxn_search *nbs,
             }
         }
 
-        ci_xy = ci_x*gridi->numCells[YY] + ci_y;
+        ci_xy = ci_x*iGrid.numCells[YY] + ci_y;
 
         /* Loop over shift vectors in three dimensions */
         for (int tz = -shp[ZZ]; tz <= shp[ZZ]; tz++)
         {
-            shz = tz*box[ZZ][ZZ];
+            const real shz = tz*box[ZZ][ZZ];
 
             bz0 = bbcz_i[ci*NNBSBB_D  ] + shz;
             bz1 = bbcz_i[ci*NNBSBB_D+1] + shz;
@@ -3433,7 +3492,7 @@ static void nbnxn_make_pairlist_part(const nbnxn_search *nbs,
                 continue;
             }
 
-            bz1_frac = bz1/(gridi->cxy_ind[ci_xy+1] - gridi->cxy_ind[ci_xy]);
+            bz1_frac = bz1/(iGrid.cxy_ind[ci_xy+1] - iGrid.cxy_ind[ci_xy]);
             if (bz1_frac < 0)
             {
                 bz1_frac = 0;
@@ -3442,7 +3501,7 @@ static void nbnxn_make_pairlist_part(const nbnxn_search *nbs,
 
             for (int ty = -shp[YY]; ty <= shp[YY]; ty++)
             {
-                shy = ty*box[YY][YY] + tz*box[ZZ][YY];
+                const real shy = ty*box[YY][YY] + tz*box[ZZ][YY];
 
                 if (bSimple)
                 {
@@ -3451,12 +3510,12 @@ static void nbnxn_make_pairlist_part(const nbnxn_search *nbs,
                 }
                 else
                 {
-                    by0 = gridi->c0[YY] + (ci_y  )*gridi->cellSize[YY] + shy;
-                    by1 = gridi->c0[YY] + (ci_y+1)*gridi->cellSize[YY] + shy;
+                    by0 = iGrid.c0[YY] + (ci_y  )*iGrid.cellSize[YY] + shy;
+                    by1 = iGrid.c0[YY] + (ci_y+1)*iGrid.cellSize[YY] + shy;
                 }
 
                 get_cell_range<YY>(by0, by1,
-                                   *gridj,
+                                   jGrid,
                                    d2z_cx, rlist,
                                    &cyf, &cyl);
 
@@ -3466,25 +3525,27 @@ static void nbnxn_make_pairlist_part(const nbnxn_search *nbs,
                 }
 
                 d2z_cy = d2z;
-                if (by1 < gridj->c0[YY])
+                if (by1 < jGrid.c0[YY])
                 {
-                    d2z_cy += gmx::square(gridj->c0[YY] - by1);
+                    d2z_cy += gmx::square(jGrid.c0[YY] - by1);
                 }
-                else if (by0 > gridj->c1[YY])
+                else if (by0 > jGrid.c1[YY])
                 {
-                    d2z_cy += gmx::square(by0 - gridj->c1[YY]);
+                    d2z_cy += gmx::square(by0 - jGrid.c1[YY]);
                 }
 
                 for (int tx = -shp[XX]; tx <= shp[XX]; tx++)
                 {
-                    shift = XYZ2IS(tx, ty, tz);
+                    const int  shift              = XYZ2IS(tx, ty, tz);
+
+                    const bool excludeSubDiagonal = (isIntraGridList && shift == CENTRAL);
 
-                    if (c_pbcShiftBackward && gridi == gridj && shift > CENTRAL)
+                    if (c_pbcShiftBackward && isIntraGridList && shift > CENTRAL)
                     {
                         continue;
                     }
 
-                    shx = tx*box[XX][XX] + ty*box[YY][XX] + tz*box[ZZ][XX];
+                    const real shx = tx*box[XX][XX] + ty*box[YY][XX] + tz*box[ZZ][XX];
 
                     if (bSimple)
                     {
@@ -3493,12 +3554,12 @@ static void nbnxn_make_pairlist_part(const nbnxn_search *nbs,
                     }
                     else
                     {
-                        bx0 = gridi->c0[XX] + (ci_x  )*gridi->cellSize[XX] + shx;
-                        bx1 = gridi->c0[XX] + (ci_x+1)*gridi->cellSize[XX] + shx;
+                        bx0 = iGrid.c0[XX] + (ci_x  )*iGrid.cellSize[XX] + shx;
+                        bx1 = iGrid.c0[XX] + (ci_x+1)*iGrid.cellSize[XX] + shx;
                     }
 
                     get_cell_range<XX>(bx0, bx1,
-                                       *gridj,
+                                       jGrid,
                                        d2z_cy, rlist,
                                        &cxf, &cxl);
 
@@ -3507,17 +3568,9 @@ static void nbnxn_make_pairlist_part(const nbnxn_search *nbs,
                         continue;
                     }
 
-                    if (bSimple)
-                    {
-                        new_ci_entry(nbl, cell0_i+ci, shift, flags_i[ci]);
-                    }
-                    else
-                    {
-                        new_sci_entry(nbl, cell0_i+ci, shift);
-                    }
+                    addNewIEntry(nbl, cell0_i+ci, shift, flags_i[ci]);
 
-                    if ((!c_pbcShiftBackward || (shift == CENTRAL &&
-                                                 gridi == gridj)) &&
+                    if ((!c_pbcShiftBackward || excludeSubDiagonal) &&
                         cxf < ci_x)
                     {
                         /* Leave the pairs with i > j.
@@ -3526,39 +3579,27 @@ static void nbnxn_make_pairlist_part(const nbnxn_search *nbs,
                         cxf = ci_x;
                     }
 
-                    if (bSimple)
-                    {
-                        set_icell_bb_simple(bb_i, ci, shx, shy, shz,
-                                            nbl->work->bb_ci);
-                    }
-                    else
-                    {
-#if NBNXN_BBXXXX
-                        set_icell_bbxxxx_supersub(pbb_i, ci, shx, shy, shz,
-                                                  nbl->work->pbb_ci);
-#else
-                        set_icell_bb_supersub(bb_i, ci, shx, shy, shz,
-                                              nbl->work->bb_ci);
-#endif
-                    }
+                    set_icell_bb(iGrid, ci, shx, shy, shz,
+                                 nbl->work);
 
-                    nbs->icell_set_x(cell0_i+ci, shx, shy, shz,
-                                     nbat->xstride, nbat->x,
-                                     nbl->work);
+                    icell_set_x(cell0_i+ci, shx, shy, shz,
+                                nbat->xstride, nbat->x().data(),
+                                nb_kernel_type,
+                                nbl->work);
 
                     for (int cx = cxf; cx <= cxl; cx++)
                     {
                         d2zx = d2z;
-                        if (gridj->c0[XX] + cx*gridj->cellSize[XX] > bx1)
+                        if (jGrid.c0[XX] + cx*jGrid.cellSize[XX] > bx1)
                         {
-                            d2zx += gmx::square(gridj->c0[XX] + cx*gridj->cellSize[XX] - bx1);
+                            d2zx += gmx::square(jGrid.c0[XX] + cx*jGrid.cellSize[XX] - bx1);
                         }
-                        else if (gridj->c0[XX] + (cx+1)*gridj->cellSize[XX] < bx0)
+                        else if (jGrid.c0[XX] + (cx+1)*jGrid.cellSize[XX] < bx0)
                         {
-                            d2zx += gmx::square(gridj->c0[XX] + (cx+1)*gridj->cellSize[XX] - bx0);
+                            d2zx += gmx::square(jGrid.c0[XX] + (cx+1)*jGrid.cellSize[XX] - bx0);
                         }
 
-                        if (gridi == gridj &&
+                        if (isIntraGridList &&
                             cx == 0 &&
                             (!c_pbcShiftBackward || shift == CENTRAL) &&
                             cyf < ci_y)
@@ -3575,17 +3616,17 @@ static void nbnxn_make_pairlist_part(const nbnxn_search *nbs,
 
                         for (int cy = cyf_x; cy <= cyl; cy++)
                         {
-                            const int columnStart = gridj->cxy_ind[cx*gridj->numCells[YY] + cy];
-                            const int columnEnd   = gridj->cxy_ind[cx*gridj->numCells[YY] + cy + 1];
+                            const int columnStart = jGrid.cxy_ind[cx*jGrid.numCells[YY] + cy];
+                            const int columnEnd   = jGrid.cxy_ind[cx*jGrid.numCells[YY] + cy + 1];
 
                             d2zxy = d2zx;
-                            if (gridj->c0[YY] + cy*gridj->cellSize[YY] > by1)
+                            if (jGrid.c0[YY] + cy*jGrid.cellSize[YY] > by1)
                             {
-                                d2zxy += gmx::square(gridj->c0[YY] + cy*gridj->cellSize[YY] - by1);
+                                d2zxy += gmx::square(jGrid.c0[YY] + cy*jGrid.cellSize[YY] - by1);
                             }
-                            else if (gridj->c0[YY] + (cy+1)*gridj->cellSize[YY] < by0)
+                            else if (jGrid.c0[YY] + (cy+1)*jGrid.cellSize[YY] < by0)
                             {
-                                d2zxy += gmx::square(gridj->c0[YY] + (cy+1)*gridj->cellSize[YY] - by0);
+                                d2zxy += gmx::square(jGrid.c0[YY] + (cy+1)*jGrid.cellSize[YY] - by0);
                             }
                             if (columnStart < columnEnd && d2zxy < listRangeBBToJCell2)
                             {
@@ -3664,7 +3705,7 @@ static void nbnxn_make_pairlist_part(const nbnxn_search *nbs,
                                 }
 #endif
 
-                                if (gridi == gridj)
+                                if (isIntraGridList)
                                 {
                                     /* We want each atom/cell pair only once,
                                      * only use cj >= ci.
@@ -3680,136 +3721,59 @@ static void nbnxn_make_pairlist_part(const nbnxn_search *nbs,
                                     GMX_ASSERT(firstCell >= columnStart && lastCell < columnEnd, "The range should reside within the current grid column");
 
                                     /* For f buffer flags with simple lists */
-                                    ncj_old_j = nbl->ncj;
-
-                                    if (bSimple)
-                                    {
-                                        /* We have a maximum of 2 j-clusters
-                                         * per i-cluster sized cell.
-                                         */
-                                        check_cell_list_space_simple(nbl, 2*(lastCell - firstCell + 1));
-                                    }
-                                    else
-                                    {
-                                        check_cell_list_space_supersub(nbl, lastCell - firstCell + 1);
-                                    }
-
-                                    switch (nb_kernel_type)
-                                    {
-                                        case nbnxnk4x4_PlainC:
-                                            makeClusterListSimple(gridj,
-                                                                  nbl, ci, firstCell, lastCell,
-                                                                  (gridi == gridj && shift == CENTRAL),
-                                                                  nbat->x,
-                                                                  rlist2, rbb2,
-                                                                  &numDistanceChecks);
-                                            break;
-#ifdef GMX_NBNXN_SIMD_4XN
-                                        case nbnxnk4xN_SIMD_4xN:
-                                            makeClusterListSimd4xn(gridj,
-                                                                   nbl, ci, firstCell, lastCell,
-                                                                   (gridi == gridj && shift == CENTRAL),
-                                                                   nbat->x,
-                                                                   rlist2, rbb2,
-                                                                   &numDistanceChecks);
-                                            break;
-#endif
-#ifdef GMX_NBNXN_SIMD_2XNN
-                                        case nbnxnk4xN_SIMD_2xNN:
-                                            makeClusterListSimd2xnn(gridj,
-                                                                    nbl, ci, firstCell, lastCell,
-                                                                    (gridi == gridj && shift == CENTRAL),
-                                                                    nbat->x,
-                                                                    rlist2, rbb2,
-                                                                    &numDistanceChecks);
-                                            break;
-#endif
-                                        case nbnxnk8x8x8_PlainC:
-                                        case nbnxnk8x8x8_GPU:
-                                            for (cj = firstCell; cj <= lastCell; cj++)
-                                            {
-                                                make_cluster_list_supersub(gridi, gridj,
-                                                                           nbl, ci, cj,
-                                                                           (gridi == gridj && shift == CENTRAL && ci == cj),
-                                                                           nbat->xstride, nbat->x,
-                                                                           rlist2, rbb2,
-                                                                           &numDistanceChecks);
-                                            }
-                                            break;
-                                    }
-
-                                    if (bFBufferFlag && nbl->ncj > ncj_old_j)
+                                    ncj_old_j = getNumSimpleJClustersInList(*nbl);
+
+                                    makeClusterListWrapper(nbl,
+                                                           iGrid, ci,
+                                                           jGrid, firstCell, lastCell,
+                                                           excludeSubDiagonal,
+                                                           nbat,
+                                                           rlist2, rbb2,
+                                                           nb_kernel_type,
+                                                           &numDistanceChecks);
+
+                                    if (bFBufferFlag)
                                     {
-                                        int cbf = nbl->cj[ncj_old_j].cj >> gridj_flag_shift;
-                                        int cbl = nbl->cj[nbl->ncj-1].cj >> gridj_flag_shift;
-                                        for (int cb = cbf; cb <= cbl; cb++)
-                                        {
-                                            bitmask_init_bit(&gridj_flag[cb], th);
-                                        }
+                                        setBufferFlags(*nbl, ncj_old_j, gridj_flag_shift,
+                                                       gridj_flag, th);
                                     }
 
-                                    nbl->ncjInUse += nbl->ncj - ncj_old_j;
+                                    incrementNumSimpleJClustersInList(nbl, ncj_old_j);
                                 }
                             }
                         }
                     }
 
                     /* Set the exclusions for this ci list */
-                    if (bSimple)
+                    setExclusionsForIEntry(nbs,
+                                           nbl,
+                                           excludeSubDiagonal,
+                                           na_cj_2log,
+                                           *getOpenIEntry(nbl),
+                                           exclusions);
+
+                    if (nbs->bFEP)
                     {
-                        setExclusionsForSimpleIentry(nbs,
-                                                     nbl,
-                                                     shift == CENTRAL && gridi == gridj,
-                                                     na_cj_2log,
-                                                     nbl->ci[nbl->nci],
-                                                     exclusions);
-
-                        if (nbs->bFEP)
-                        {
-                            make_fep_list(nbs, nbat, nbl,
-                                          shift == CENTRAL && gridi == gridj,
-                                          &(nbl->ci[nbl->nci]),
-                                          gridi, gridj, nbl_fep);
-                        }
-                    }
-                    else
-                    {
-                        setExclusionsForGpuIentry(nbs,
-                                                  nbl,
-                                                  shift == CENTRAL && gridi == gridj,
-                                                  nbl->sci[nbl->nsci],
-                                                  exclusions);
-
-                        if (nbs->bFEP)
-                        {
-                            make_fep_list_supersub(nbs, nbat, nbl,
-                                                   shift == CENTRAL && gridi == gridj,
-                                                   &(nbl->sci[nbl->nsci]),
-                                                   shx, shy, shz,
-                                                   rl_fep2,
-                                                   gridi, gridj, nbl_fep);
-                        }
+                        make_fep_list(nbs, nbat, nbl,
+                                      excludeSubDiagonal,
+                                      getOpenIEntry(nbl),
+                                      shx, shy, shz,
+                                      rl_fep2,
+                                      iGrid, jGrid, nbl_fep);
                     }
 
                     /* Close this ci list */
-                    if (bSimple)
-                    {
-                        close_ci_entry_simple(nbl);
-                    }
-                    else
-                    {
-                        close_ci_entry_supersub(nbl,
-                                                nsubpair_max,
-                                                progBal, nsubpair_tot_est,
-                                                th, nth);
-                    }
+                    closeIEntry(nbl,
+                                nsubpair_max,
+                                progBal, nsubpair_tot_est,
+                                th, nth);
                 }
             }
         }
 
-        if (bFBufferFlag && nbl->ncj > ncj_old_i)
+        if (bFBufferFlag && getNumSimpleJClustersInList(*nbl) > ncj_old_i)
         {
-            bitmask_init_bit(&(work->buffer_flags.flag[(gridi->cell0+ci)>>gridi_flag_shift]), th);
+            bitmask_init_bit(&(work->buffer_flags.flag[(iGrid.cell0+ci) >> gridi_flag_shift]), th);
         }
     }
 
@@ -3817,20 +3781,13 @@ static void nbnxn_make_pairlist_part(const nbnxn_search *nbs,
 
     nbs_cycle_stop(&work->cc[enbsCCsearch]);
 
-    GMX_ASSERT(nbl->ncjInUse == nbl->ncj || nbs->bFEP, "Without free-energy all cj pair-list entries should be in use. Note that subsequent code does not make use of the equality, this check is only here to catch bugs");
+    checkListSizeConsistency(*nbl, nbs->bFEP);
 
     if (debug)
     {
         fprintf(debug, "number of distance checks %d\n", numDistanceChecks);
 
-        if (bSimple)
-        {
-            print_nblist_statistics_simple(debug, nbl, nbs, rlist);
-        }
-        else
-        {
-            print_nblist_statistics_supersub(debug, nbl, nbs, rlist);
-        }
+        print_nblist_statistics(debug, nbl, nbs, rlist);
 
         if (nbs->bFEP)
         {
@@ -3908,22 +3865,16 @@ static void print_reduction_cost(const nbnxn_buffer_flags_t *flags, int nout)
  */
 template<bool setFlags>
 static void copySelectedListRange(const nbnxn_ci_t * gmx_restrict srcCi,
-                                  const nbnxn_pairlist_t * gmx_restrict src,
-                                  nbnxn_pairlist_t * gmx_restrict dest,
+                                  const NbnxnPairlistCpu * gmx_restrict src,
+                                  NbnxnPairlistCpu * gmx_restrict dest,
                                   gmx_bitmask_t *flag,
                                   int iFlagShift, int jFlagShift, int t)
 {
-    int ncj = srcCi->cj_ind_end - srcCi->cj_ind_start;
-
-    if (dest->nci + 1 >= dest->ci_nalloc)
-    {
-        nb_realloc_ci(dest, dest->nci + 1);
-    }
-    check_cell_list_space_simple(dest, ncj);
+    const int ncj = srcCi->cj_ind_end - srcCi->cj_ind_start;
 
-    dest->ci[dest->nci]              = *srcCi;
-    dest->ci[dest->nci].cj_ind_start = dest->ncj;
-    dest->ci[dest->nci].cj_ind_end   = dest->ncj + ncj;
+    dest->ci.push_back(*srcCi);
+    dest->ci.back().cj_ind_start = dest->cj.size();
+    dest->ci.back().cj_ind_end   = dest->cj.size() + ncj;
 
     if (setFlags)
     {
@@ -3932,7 +3883,7 @@ static void copySelectedListRange(const nbnxn_ci_t * gmx_restrict srcCi,
 
     for (int j = srcCi->cj_ind_start; j < srcCi->cj_ind_end; j++)
     {
-        dest->cj[dest->ncj++] = src->cj[j];
+        dest->cj.push_back(src->cj[j]);
 
         if (setFlags)
         {
@@ -3944,8 +3895,6 @@ static void copySelectedListRange(const nbnxn_ci_t * gmx_restrict srcCi,
             bitmask_init_bit(&flag[src->cj[j].cj >> jFlagShift], t);
         }
     }
-
-    dest->nci++;
 }
 
 /* This routine re-balances the pairlists such that all are nearly equally
@@ -3957,8 +3906,8 @@ static void copySelectedListRange(const nbnxn_ci_t * gmx_restrict srcCi,
  * the original lists are quite balanced, this will only give minor overhead.
  */
 static void rebalanceSimpleLists(int                                  numLists,
-                                 nbnxn_pairlist_t * const * const     srcSet,
-                                 nbnxn_pairlist_t                   **destSet,
+                                 NbnxnPairlistCpu * const * const     srcSet,
+                                 NbnxnPairlistCpu                   **destSet,
                                  gmx::ArrayRef<nbnxn_search_work_t>   searchWork)
 {
     int ncjTotal = 0;
@@ -3976,11 +3925,9 @@ static void rebalanceSimpleLists(int                                  numLists,
         int cjEnd   = ncjTarget*(t + 1);
 
         /* The destination pair-list for task/thread t */
-        nbnxn_pairlist_t *dest = destSet[t];
+        NbnxnPairlistCpu *dest = destSet[t];
 
         clear_pairlist(dest);
-        dest->bSimple = srcSet[0]->bSimple;
-        dest->na_ci   = srcSet[0]->na_ci;
         dest->na_cj   = srcSet[0]->na_cj;
 
         /* Note that the flags in the work struct (still) contain flags
@@ -3994,11 +3941,11 @@ static void rebalanceSimpleLists(int                                  numLists,
         int            cjGlobal   = 0;
         for (int s = 0; s < numLists && cjGlobal < cjEnd; s++)
         {
-            const nbnxn_pairlist_t *src = srcSet[s];
+            const NbnxnPairlistCpu *src = srcSet[s];
 
             if (cjGlobal + src->ncjInUse > cjStart)
             {
-                for (int i = 0; i < src->nci && cjGlobal < cjEnd; i++)
+                for (gmx::index i = 0; i < static_cast<gmx::index>(src->ci.size()) && cjGlobal < cjEnd; i++)
                 {
                     const nbnxn_ci_t *srcCi = &src->ci[i];
                     int               ncj   = srcCi->cj_ind_end - srcCi->cj_ind_start;
@@ -4031,7 +3978,7 @@ static void rebalanceSimpleLists(int                                  numLists,
             }
         }
 
-        dest->ncjInUse = dest->ncj;
+        dest->ncjInUse = dest->cj.size();
     }
 
 #ifndef NDEBUG
@@ -4079,69 +4026,52 @@ static bool checkRebalanceSimpleLists(const nbnxn_pairlist_set_t *listSet)
  * better load balancing than using a list sorted on exact load.
  * This function swaps the pointer in the pair list to avoid a copy operation.
  */
-static void sort_sci(nbnxn_pairlist_t *nbl)
+static void sort_sci(NbnxnPairlistGpu *nbl)
 {
-    nbnxn_list_work_t *work;
-    int                m, s0, s1;
-    nbnxn_sci_t       *sci_sort;
-
-    if (nbl->ncj4 <= nbl->nsci)
+    if (nbl->cj4.size() <= nbl->sci.size())
     {
         /* nsci = 0 or all sci have size 1, sorting won't change the order */
         return;
     }
 
-    work = nbl->work;
+    NbnxnPairlistGpuWork &work = *nbl->work;
 
     /* We will distinguish differences up to double the average */
-    m = (2*nbl->ncj4)/nbl->nsci;
-
-    if (m + 1 > work->sort_nalloc)
-    {
-        work->sort_nalloc = over_alloc_large(m + 1);
-        srenew(work->sort, work->sort_nalloc);
-    }
+    const int m = (2*nbl->cj4.size())/nbl->sci.size();
 
-    if (work->sci_sort_nalloc != nbl->sci_nalloc)
-    {
-        work->sci_sort_nalloc = nbl->sci_nalloc;
-        nbnxn_realloc_void(reinterpret_cast<void **>(&work->sci_sort),
-                           0,
-                           work->sci_sort_nalloc*sizeof(*work->sci_sort),
-                           nbl->alloc, nbl->free);
-    }
+    /* Resize work.sci_sort so we can sort into it */
+    work.sci_sort.resize(nbl->sci.size());
 
+    std::vector<int> &sort = work.sortBuffer;
+    /* Set up m + 1 entries in sort, initialized at 0 */
+    sort.clear();
+    sort.resize(m + 1, 0);
     /* Count the entries of each size */
-    for (int i = 0; i <= m; i++)
+    for (const nbnxn_sci_t &sci : nbl->sci)
     {
-        work->sort[i] = 0;
-    }
-    for (int s = 0; s < nbl->nsci; s++)
-    {
-        int i = std::min(m, nbl->sci[s].cj4_ind_end - nbl->sci[s].cj4_ind_start);
-        work->sort[i]++;
+        int i = std::min(m, sci.numJClusterGroups());
+        sort[i]++;
     }
     /* Calculate the offset for each count */
-    s0            = work->sort[m];
-    work->sort[m] = 0;
+    int s0  = sort[m];
+    sort[m] = 0;
     for (int i = m - 1; i >= 0; i--)
     {
-        s1            = work->sort[i];
-        work->sort[i] = work->sort[i + 1] + s0;
-        s0            = s1;
+        int s1  = sort[i];
+        sort[i] = sort[i + 1] + s0;
+        s0      = s1;
     }
 
     /* Sort entries directly into place */
-    sci_sort = work->sci_sort;
-    for (int s = 0; s < nbl->nsci; s++)
+    gmx::ArrayRef<nbnxn_sci_t> sci_sort = work.sci_sort;
+    for (const nbnxn_sci_t &sci : nbl->sci)
     {
-        int i = std::min(m, nbl->sci[s].cj4_ind_end - nbl->sci[s].cj4_ind_start);
-        sci_sort[work->sort[i]++] = nbl->sci[s];
+        int i = std::min(m, sci.numJClusterGroups());
+        sci_sort[sort[i]++] = sci;
     }
 
     /* Swap the sci pointers so we use the new, sorted list */
-    work->sci_sort = nbl->sci;
-    nbl->sci       = sci_sort;
+    std::swap(nbl->sci, work.sci_sort);
 }
 
 /* Make a local or non-local pair-list, depending on iloc */
@@ -4155,19 +4085,15 @@ void nbnxn_make_pairlist(nbnxn_search         *nbs,
                          int                   nb_kernel_type,
                          t_nrnb               *nrnb)
 {
-    nbnxn_grid_t      *gridi, *gridj;
-    int                nzi, zj0, zj1;
     int                nsubpair_target;
     float              nsubpair_tot_est;
     int                nnbl;
-    nbnxn_pairlist_t **nbl;
     int                ci_block;
     gmx_bool           CombineNBLists;
     gmx_bool           progBal;
     int                np_tot, np_noq, np_hlj, nap;
 
     nnbl            = nbl_list->nnbl;
-    nbl             = nbl_list->nbl;
     CombineNBLists  = nbl_list->bCombined;
 
     if (debug)
@@ -4175,48 +4101,18 @@ void nbnxn_make_pairlist(nbnxn_search         *nbs,
         fprintf(debug, "ns making %d nblists\n", nnbl);
     }
 
-    nbat->bUseBufferFlags = (nbat->nout > 1);
+    nbat->bUseBufferFlags = (nbat->out.size() > 1);
     /* We should re-init the flags before making the first list */
     if (nbat->bUseBufferFlags && LOCAL_I(iloc))
     {
-        init_buffer_flags(&nbat->buffer_flags, nbat->natoms);
-    }
-
-    if (nbl_list->bSimple)
-    {
-#if GMX_SIMD
-        switch (nb_kernel_type)
-        {
-#ifdef GMX_NBNXN_SIMD_4XN
-            case nbnxnk4xN_SIMD_4xN:
-                nbs->icell_set_x = icell_set_x_simd_4xn;
-                break;
-#endif
-#ifdef GMX_NBNXN_SIMD_2XNN
-            case nbnxnk4xN_SIMD_2xNN:
-                nbs->icell_set_x = icell_set_x_simd_2xnn;
-                break;
-#endif
-            default:
-                nbs->icell_set_x = icell_set_x_simple;
-                break;
-        }
-#else   // GMX_SIMD
-        /* MSVC 2013 complains about switch statements without case */
-        nbs->icell_set_x = icell_set_x_simple;
-#endif  // GMX_SIMD
-    }
-    else
-    {
-        nbs->icell_set_x = icell_set_x_supersub;
+        init_buffer_flags(&nbat->buffer_flags, nbat->numAtoms());
     }
 
+    int nzi;
     if (LOCAL_I(iloc))
     {
         /* Only zone (grid) 0 vs 0 */
         nzi = 1;
-        zj0 = 0;
-        zj1 = 1;
     }
     else
     {
@@ -4237,7 +4133,14 @@ void nbnxn_make_pairlist(nbnxn_search         *nbs,
     /* Clear all pair-lists */
     for (int th = 0; th < nnbl; th++)
     {
-        clear_pairlist(nbl[th]);
+        if (nbl_list->bSimple)
+        {
+            clear_pairlist(nbl_list->nbl[th]);
+        }
+        else
+        {
+            clear_pairlist(nbl_list->nblGpu[th]);
+        }
 
         if (nbs->bFEP)
         {
@@ -4247,9 +4150,16 @@ void nbnxn_make_pairlist(nbnxn_search         *nbs,
 
     for (int zi = 0; zi < nzi; zi++)
     {
-        gridi = &nbs->grid[zi];
+        const nbnxn_grid_t &iGrid = nbs->grid[zi];
 
-        if (NONLOCAL_I(iloc))
+        int                 zj0;
+        int                 zj1;
+        if (LOCAL_I(iloc))
+        {
+            zj0 = 0;
+            zj1 = 1;
+        }
+        else
         {
             zj0 = nbs->zones->izone[zi].j0;
             zj1 = nbs->zones->izone[zi].j1;
@@ -4260,7 +4170,7 @@ void nbnxn_make_pairlist(nbnxn_search         *nbs,
         }
         for (int zj = zj0; zj < zj1; zj++)
         {
-            gridj = &nbs->grid[zj];
+            const nbnxn_grid_t &jGrid = nbs->grid[zj];
 
             if (debug)
             {
@@ -4269,7 +4179,7 @@ void nbnxn_make_pairlist(nbnxn_search         *nbs,
 
             nbs_cycle_start(&nbs->cc[enbsCCsearch]);
 
-            ci_block = get_ci_block_size(gridi, nbs->DomDec, nnbl);
+            ci_block = get_ci_block_size(iGrid, nbs->DomDec, nnbl);
 
             /* With GPU: generate progressively smaller lists for
              * load balancing for local only or non-local with 2 zones.
@@ -4286,26 +4196,45 @@ void nbnxn_make_pairlist(nbnxn_search         *nbs,
                      */
                     if (nbat->bUseBufferFlags && ((zi == 0 && zj == 0)))
                     {
-                        init_buffer_flags(&nbs->work[th].buffer_flags, nbat->natoms);
+                        init_buffer_flags(&nbs->work[th].buffer_flags, nbat->numAtoms());
                     }
 
                     if (CombineNBLists && th > 0)
                     {
-                        clear_pairlist(nbl[th]);
+                        GMX_ASSERT(!nbl_list->bSimple, "Can only combine GPU lists");
+
+                        clear_pairlist(nbl_list->nblGpu[th]);
                     }
 
                     /* Divide the i super cell equally over the nblists */
-                    nbnxn_make_pairlist_part(nbs, gridi, gridj,
-                                             &nbs->work[th], nbat, *excl,
-                                             rlist,
-                                             nb_kernel_type,
-                                             ci_block,
-                                             nbat->bUseBufferFlags,
-                                             nsubpair_target,
-                                             progBal, nsubpair_tot_est,
-                                             th, nnbl,
-                                             nbl[th],
-                                             nbl_list->nbl_fep[th]);
+                    if (nbl_list->bSimple)
+                    {
+                        nbnxn_make_pairlist_part(nbs, iGrid, jGrid,
+                                                 &nbs->work[th], nbat, *excl,
+                                                 rlist,
+                                                 nb_kernel_type,
+                                                 ci_block,
+                                                 nbat->bUseBufferFlags,
+                                                 nsubpair_target,
+                                                 progBal, nsubpair_tot_est,
+                                                 th, nnbl,
+                                                 nbl_list->nbl[th],
+                                                 nbl_list->nbl_fep[th]);
+                    }
+                    else
+                    {
+                        nbnxn_make_pairlist_part(nbs, iGrid, jGrid,
+                                                 &nbs->work[th], nbat, *excl,
+                                                 rlist,
+                                                 nb_kernel_type,
+                                                 ci_block,
+                                                 nbat->bUseBufferFlags,
+                                                 nsubpair_target,
+                                                 progBal, nsubpair_tot_est,
+                                                 th, nnbl,
+                                                 nbl_list->nblGpu[th],
+                                                 nbl_list->nbl_fep[th]);
+                    }
                 }
                 GMX_CATCH_ALL_AND_EXIT_WITH_FATAL_ERROR;
             }
@@ -4320,23 +4249,35 @@ void nbnxn_make_pairlist(nbnxn_search         *nbs,
 
                 if (nbl_list->bSimple)
                 {
-                    np_tot += nbl[th]->ncj;
-                    np_noq += nbl[th]->work->ncj_noq;
-                    np_hlj += nbl[th]->work->ncj_hlj;
+                    NbnxnPairlistCpu *nbl = nbl_list->nbl[th];
+                    np_tot += nbl->cj.size();
+                    np_noq += nbl->work->ncj_noq;
+                    np_hlj += nbl->work->ncj_hlj;
                 }
                 else
                 {
+                    NbnxnPairlistGpu *nbl = nbl_list->nblGpu[th];
                     /* This count ignores potential subsequent pair pruning */
-                    np_tot += nbl[th]->nci_tot;
+                    np_tot += nbl->nci_tot;
                 }
             }
-            nap                   = nbl[0]->na_ci*nbl[0]->na_cj;
+            if (nbl_list->bSimple)
+            {
+                nap               = nbl_list->nbl[0]->na_ci*nbl_list->nbl[0]->na_cj;
+            }
+            else
+            {
+                nap               = gmx::square(nbl_list->nblGpu[0]->na_ci);
+            }
             nbl_list->natpair_ljq = (np_tot - np_noq)*nap - np_hlj*nap/2;
             nbl_list->natpair_lj  = np_noq*nap;
             nbl_list->natpair_q   = np_hlj*nap/2;
 
             if (CombineNBLists && nnbl > 1)
             {
+                GMX_ASSERT(!nbl_list->bSimple, "Can only combine GPU lists");
+                NbnxnPairlistGpu **nbl = nbl_list->nblGpu;
+
                 nbs_cycle_start(&nbs->cc[enbsCCcombine]);
 
                 combine_nblists(nnbl-1, nbl+1, nbl[0]);
@@ -4353,7 +4294,7 @@ void nbnxn_make_pairlist(nbnxn_search         *nbs,
             rebalanceSimpleLists(nbl_list->nnbl, nbl_list->nbl, nbl_list->nbl_work, nbs->work);
 
             /* Swap the pointer of the sets of pair lists */
-            nbnxn_pairlist_t **tmp = nbl_list->nbl;
+            NbnxnPairlistCpu **tmp = nbl_list->nbl;
             nbl_list->nbl          = nbl_list->nbl_work;
             nbl_list->nbl_work     = tmp;
         }
@@ -4363,7 +4304,7 @@ void nbnxn_make_pairlist(nbnxn_search         *nbs,
         /* Sort the entries on size, large ones first */
         if (CombineNBLists || nnbl == 1)
         {
-            sort_sci(nbl[0]);
+            sort_sci(nbl_list->nblGpu[0]);
         }
         else
         {
@@ -4372,7 +4313,7 @@ void nbnxn_make_pairlist(nbnxn_search         *nbs,
             {
                 try
                 {
-                    sort_sci(nbl[th]);
+                    sort_sci(nbl_list->nblGpu[th]);
                 }
                 GMX_CATCH_ALL_AND_EXIT_WITH_FATAL_ERROR;
             }
@@ -4390,10 +4331,13 @@ void nbnxn_make_pairlist(nbnxn_search         *nbs,
         balance_fep_lists(nbs, nbl_list);
     }
 
-    /* This is a fresh list, so not pruned, stored using ci and nci.
-     * ciOuter and nciOuter are invalid at this point.
-     */
-    GMX_ASSERT(nbl_list->nbl[0]->nciOuter == -1, "nciOuter should have been set to -1 to signal that it is invalid");
+    if (nbl_list->bSimple)
+    {
+        /* This is a fresh list, so not pruned, stored using ci.
+         * ciOuter is invalid at this point.
+         */
+        GMX_ASSERT(nbl_list->nbl[0]->ciOuter.empty(), "ciOuter is invalid so it should be empty");
+    }
 
     /* Special performance logging stuff (env.var. GMX_NBNXN_CYCLE) */
     if (LOCAL_I(iloc))
@@ -4416,12 +4360,12 @@ void nbnxn_make_pairlist(nbnxn_search         *nbs,
         {
             for (int t = 0; t < nbl_list->nnbl; t++)
             {
-                print_nblist_statistics_simple(debug, nbl_list->nbl[t], nbs, rlist);
+                print_nblist_statistics(debug, nbl_list->nbl[t], nbs, rlist);
             }
         }
         else
         {
-            print_nblist_statistics_supersub(debug, nbl_list->nbl[0], nbs, rlist);
+            print_nblist_statistics(debug, nbl_list->nblGpu[0], nbs, rlist);
         }
     }
 
@@ -4438,7 +4382,7 @@ void nbnxn_make_pairlist(nbnxn_search         *nbs,
             }
             else
             {
-                print_nblist_sci_cj(debug, nbl_list->nbl[0]);
+                print_nblist_sci_cj(debug, nbl_list->nblGpu[0]);
             }
         }
 
@@ -4451,6 +4395,8 @@ void nbnxn_make_pairlist(nbnxn_search         *nbs,
 
 void nbnxnPrepareListForDynamicPruning(nbnxn_pairlist_set_t *listSet)
 {
+    GMX_RELEASE_ASSERT(listSet->bSimple, "Should only be called for simple lists");
+
     /* TODO: Restructure the lists so we have actual outer and inner
      *       list objects so we can set a single pointer instead of
      *       swapping several pointers.
@@ -4458,22 +4404,16 @@ void nbnxnPrepareListForDynamicPruning(nbnxn_pairlist_set_t *listSet)
 
     for (int i = 0; i < listSet->nnbl; i++)
     {
+        NbnxnPairlistCpu &list = *listSet->nbl[i];
+
         /* The search produced a list in ci/cj.
          * Swap the list pointers so we get the outer list is ciOuter,cjOuter
          * and we can prune that to get an inner list in ci/cj.
          */
-        nbnxn_pairlist_t *list = listSet->nbl[i];
-        list->nciOuter         = list->nci;
-
-        nbnxn_ci_t *ciTmp      = list->ciOuter;
-        list->ciOuter          = list->ci;
-        list->ci               = ciTmp;
-
-        nbnxn_cj_t *cjTmp      = list->cjOuter;
-        list->cjOuter          = list->cj;
-        list->cj               = cjTmp;
+        GMX_RELEASE_ASSERT(list.ciOuter.empty() && list.cjOuter.empty(),
+                           "The outer lists should be empty before preparation");
 
-        /* Signal that this inner list is currently invalid */
-        list->nci              = -1;
+        std::swap(list.ci, list.ciOuter);
+        std::swap(list.cj, list.cjOuter);
     }
 }
index 2ff9f90726e03f2a75f6a865001413c3ddb192b5..dc043c2898bbfc554a42c59d9e6e81355b562d91 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2017,2018,2019, 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.
@@ -61,9 +61,7 @@ nbnxn_search_t nbnxn_init_search(const ivec                *n_dd_cells,
 
 /* Initializes a set of pair lists stored in nbnxn_pairlist_set_t */
 void nbnxn_init_pairlist_set(nbnxn_pairlist_set_t *nbl_list,
-                             gmx_bool simple, gmx_bool combined,
-                             nbnxn_alloc_t *alloc,
-                             nbnxn_free_t  *free);
+                             gmx_bool simple, gmx_bool combined);
 
 /* Make a apir-list with radius rlist, store it in nbl.
  * The parameter min_ci_balanced sets the minimum required
index e0ee80c75c59e9bd0c7a69ae5d350bd87187287e..ecfb60e37409561c312009c9f334585883e26d09 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, 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.
  * the research papers on the package. Check out http://www.gromacs.org.
  */
 
-#if GMX_SIMD_REAL_WIDTH >= 2*NBNXN_CPU_CLUSTER_I_SIZE
-#define STRIDE_S  (GMX_SIMD_REAL_WIDTH/2)
-#else
-#define STRIDE_S  NBNXN_CPU_CLUSTER_I_SIZE
-#endif
+/* Stride of the packed x coordinate array */
+static constexpr int c_xStride2xNN = c_nbnxnCpuIClusterSize;
 
 /* Copies PBC shifted i-cell packed atom coordinates to working array */
 static inline void
 icell_set_x_simd_2xnn(int ci,
                       real shx, real shy, real shz,
                       int gmx_unused stride, const real *x,
-                      nbnxn_list_work_t *work)
+                      NbnxnPairlistCpuWork *work)
 {
     int   ia;
-    real *x_ci_simd = work->x_ci_simd;
+    real *x_ci_simd = work->iClusterData.xSimd.data();
 
     ia = xIndexFromCi<NbnxnLayout::Simd2xNN>(ci);
 
-    store(x_ci_simd + 0*GMX_SIMD_REAL_WIDTH, loadU1DualHsimd(x + ia + 0*STRIDE_S + 0) + SimdReal(shx) );
-    store(x_ci_simd + 1*GMX_SIMD_REAL_WIDTH, loadU1DualHsimd(x + ia + 1*STRIDE_S + 0) + SimdReal(shy) );
-    store(x_ci_simd + 2*GMX_SIMD_REAL_WIDTH, loadU1DualHsimd(x + ia + 2*STRIDE_S + 0) + SimdReal(shz) );
-    store(x_ci_simd + 3*GMX_SIMD_REAL_WIDTH, loadU1DualHsimd(x + ia + 0*STRIDE_S + 2) + SimdReal(shx) );
-    store(x_ci_simd + 4*GMX_SIMD_REAL_WIDTH, loadU1DualHsimd(x + ia + 1*STRIDE_S + 2) + SimdReal(shy) );
-    store(x_ci_simd + 5*GMX_SIMD_REAL_WIDTH, loadU1DualHsimd(x + ia + 2*STRIDE_S + 2) + SimdReal(shz) );
+    store(x_ci_simd + 0*GMX_SIMD_REAL_WIDTH, loadU1DualHsimd(x + ia + 0*c_xStride2xNN + 0) + SimdReal(shx) );
+    store(x_ci_simd + 1*GMX_SIMD_REAL_WIDTH, loadU1DualHsimd(x + ia + 1*c_xStride2xNN + 0) + SimdReal(shy) );
+    store(x_ci_simd + 2*GMX_SIMD_REAL_WIDTH, loadU1DualHsimd(x + ia + 2*c_xStride2xNN + 0) + SimdReal(shz) );
+    store(x_ci_simd + 3*GMX_SIMD_REAL_WIDTH, loadU1DualHsimd(x + ia + 0*c_xStride2xNN + 2) + SimdReal(shx) );
+    store(x_ci_simd + 4*GMX_SIMD_REAL_WIDTH, loadU1DualHsimd(x + ia + 1*c_xStride2xNN + 2) + SimdReal(shy) );
+    store(x_ci_simd + 5*GMX_SIMD_REAL_WIDTH, loadU1DualHsimd(x + ia + 2*c_xStride2xNN + 2) + SimdReal(shz) );
 }
 
 /* SIMD code for checking and adding cluster-pairs to the list using coordinates in packed format.
@@ -64,7 +61,7 @@ icell_set_x_simd_2xnn(int ci,
  * Checks bouding box distances and possibly atom pair distances.
  * This is an accelerated version of make_cluster_list_simple.
  *
- * \param[in]     gridj               The j-grid
+ * \param[in]     jGrid               The j-grid
  * \param[in,out] nbl                 The pair-list to store the cluster pairs in
  * \param[in]     icluster            The index of the i-cluster
  * \param[in]     firstCell           The first cluster in the j-range, using i-cluster size indexing
@@ -76,8 +73,8 @@ icell_set_x_simd_2xnn(int ci,
  * \param[in,out] numDistanceChecks   The number of distance checks performed
  */
 static inline void
-makeClusterListSimd2xnn(const nbnxn_grid_t *      gridj,
-                        nbnxn_pairlist_t *        nbl,
+makeClusterListSimd2xnn(const nbnxn_grid_t       &jGrid,
+                        NbnxnPairlistCpu *        nbl,
                         int                       icluster,
                         int                       firstCell,
                         int                       lastCell,
@@ -88,8 +85,8 @@ makeClusterListSimd2xnn(const nbnxn_grid_t *      gridj,
                         int * gmx_restrict        numDistanceChecks)
 {
     using namespace gmx;
-    const real * gmx_restrict           x_ci_simd = nbl->work->x_ci_simd;
-    const nbnxn_bb_t * gmx_restrict     bb_ci     = nbl->work->bb_ci;
+    const real * gmx_restrict           x_ci_simd = nbl->work->iClusterData.xSimd.data();
+    const nbnxn_bb_t * gmx_restrict     bb_ci     = nbl->work->iClusterData.bb.data();
 
     SimdReal                            jx_S, jy_S, jz_S;
 
@@ -109,8 +106,8 @@ makeClusterListSimd2xnn(const nbnxn_grid_t *      gridj,
     float                               d2;
     int                                 xind_f, xind_l;
 
-    int jclusterFirst = cjFromCi<NbnxnLayout::Simd2xNN>(firstCell);
-    int jclusterLast  = cjFromCi<NbnxnLayout::Simd2xNN>(lastCell);
+    int jclusterFirst = cjFromCi<NbnxnLayout::Simd2xNN, 0>(firstCell);
+    int jclusterLast  = cjFromCi<NbnxnLayout::Simd2xNN, 1>(lastCell);
     GMX_ASSERT(jclusterLast >= jclusterFirst, "We should have a non-empty j-cluster range, since the calling code should have ensured a non-empty cell range");
 
     rc2_S   = SimdReal(rlist2);
@@ -119,9 +116,9 @@ makeClusterListSimd2xnn(const nbnxn_grid_t *      gridj,
     while (!InRange && jclusterFirst <= jclusterLast)
     {
 #if NBNXN_SEARCH_BB_SIMD4
-        d2 = subc_bb_dist2_simd4(0, bb_ci, jclusterFirst, gridj->bbj);
+        d2 = subc_bb_dist2_simd4(0, bb_ci, jclusterFirst, jGrid.bbj);
 #else
-        d2 = subc_bb_dist2(0, bb_ci, jclusterFirst, gridj->bbj);
+        d2 = subc_bb_dist2(0, bb_ci, jclusterFirst, jGrid.bbj);
 #endif
         *numDistanceChecks += 2;
 
@@ -136,11 +133,11 @@ makeClusterListSimd2xnn(const nbnxn_grid_t *      gridj,
         }
         else if (d2 < rlist2)
         {
-            xind_f  = xIndexFromCj<NbnxnLayout::Simd2xNN>(cjFromCi<NbnxnLayout::Simd2xNN>(gridj->cell0) + jclusterFirst);
+            xind_f  = xIndexFromCj<NbnxnLayout::Simd2xNN>(cjFromCi<NbnxnLayout::Simd2xNN, 0>(jGrid.cell0) + jclusterFirst);
 
-            jx_S  = loadDuplicateHsimd(x_j + xind_f + 0*STRIDE_S);
-            jy_S  = loadDuplicateHsimd(x_j + xind_f + 1*STRIDE_S);
-            jz_S  = loadDuplicateHsimd(x_j + xind_f + 2*STRIDE_S);
+            jx_S  = loadDuplicateHsimd(x_j + xind_f + 0*c_xStride2xNN);
+            jy_S  = loadDuplicateHsimd(x_j + xind_f + 1*c_xStride2xNN);
+            jz_S  = loadDuplicateHsimd(x_j + xind_f + 2*c_xStride2xNN);
 
             /* Calculate distance */
             dx_S0            = load<SimdReal>(x_ci_simd + 0*GMX_SIMD_REAL_WIDTH) - jx_S;
@@ -177,9 +174,9 @@ makeClusterListSimd2xnn(const nbnxn_grid_t *      gridj,
     while (!InRange && jclusterLast > jclusterFirst)
     {
 #if NBNXN_SEARCH_BB_SIMD4
-        d2 = subc_bb_dist2_simd4(0, bb_ci, jclusterLast, gridj->bbj);
+        d2 = subc_bb_dist2_simd4(0, bb_ci, jclusterLast, jGrid.bbj);
 #else
-        d2 = subc_bb_dist2(0, bb_ci, jclusterLast, gridj->bbj);
+        d2 = subc_bb_dist2(0, bb_ci, jclusterLast, jGrid.bbj);
 #endif
         *numDistanceChecks += 2;
 
@@ -194,11 +191,11 @@ makeClusterListSimd2xnn(const nbnxn_grid_t *      gridj,
         }
         else if (d2 < rlist2)
         {
-            xind_l  = xIndexFromCj<NbnxnLayout::Simd2xNN>(cjFromCi<NbnxnLayout::Simd2xNN>(gridj->cell0) + jclusterLast);
+            xind_l  = xIndexFromCj<NbnxnLayout::Simd2xNN>(cjFromCi<NbnxnLayout::Simd2xNN, 0>(jGrid.cell0) + jclusterLast);
 
-            jx_S  = loadDuplicateHsimd(x_j + xind_l + 0*STRIDE_S);
-            jy_S  = loadDuplicateHsimd(x_j + xind_l + 1*STRIDE_S);
-            jz_S  = loadDuplicateHsimd(x_j + xind_l + 2*STRIDE_S);
+            jx_S  = loadDuplicateHsimd(x_j + xind_l + 0*c_xStride2xNN);
+            jy_S  = loadDuplicateHsimd(x_j + xind_l + 1*c_xStride2xNN);
+            jz_S  = loadDuplicateHsimd(x_j + xind_l + 2*c_xStride2xNN);
 
             /* Calculate distance */
             dx_S0            = load<SimdReal>(x_ci_simd + 0*GMX_SIMD_REAL_WIDTH) - jx_S;
@@ -232,13 +229,12 @@ makeClusterListSimd2xnn(const nbnxn_grid_t *      gridj,
         for (int jcluster = jclusterFirst; jcluster <= jclusterLast; jcluster++)
         {
             /* Store cj and the interaction mask */
-            nbl->cj[nbl->ncj].cj   = cjFromCi<NbnxnLayout::Simd2xNN>(gridj->cell0) + jcluster;
-            nbl->cj[nbl->ncj].excl = get_imask_simd_2xnn(excludeSubDiagonal, icluster, jcluster);
-            nbl->ncj++;
+            nbnxn_cj_t cjEntry;
+            cjEntry.cj   = cjFromCi<NbnxnLayout::Simd2xNN, 0>(jGrid.cell0) + jcluster;
+            cjEntry.excl = get_imask_simd_2xnn(excludeSubDiagonal, icluster, jcluster);
+            nbl->cj.push_back(cjEntry);
         }
-        /* Increase the closing index in i super-cell list */
-        nbl->ci[nbl->nci].cj_ind_end = nbl->ncj;
+        /* Increase the closing index in the i list */
+        nbl->ci.back().cj_ind_end = nbl->cj.size();
     }
 }
-
-#undef STRIDE_S
index ceeb619ffd3976653c948ad92788d9c0c16f1824..7ca3d8c6e1caaed2e21d51b0dd3ffcbb16a7b174 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, 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.
  * the research papers on the package. Check out http://www.gromacs.org.
  */
 
-#if GMX_SIMD_REAL_WIDTH >= NBNXN_CPU_CLUSTER_I_SIZE
-#define STRIDE_S  (GMX_SIMD_REAL_WIDTH)
-#else
-#define STRIDE_S  NBNXN_CPU_CLUSTER_I_SIZE
-#endif
+/* Stride of the packed x coordinate array */
+static constexpr int c_xStride4xN = (GMX_SIMD_REAL_WIDTH > c_nbnxnCpuIClusterSize ? GMX_SIMD_REAL_WIDTH : c_nbnxnCpuIClusterSize);
 
 /* Copies PBC shifted i-cell packed atom coordinates to working array */
 static inline void
 icell_set_x_simd_4xn(int ci,
                      real shx, real shy, real shz,
                      int gmx_unused stride, const real *x,
-                     nbnxn_list_work_t *work)
+                     NbnxnPairlistCpuWork *work)
 {
     int    ia;
-    real  *x_ci_simd = work->x_ci_simd;
+    real  *x_ci_simd = work->iClusterData.xSimd.data();
 
     ia = xIndexFromCi<NbnxnLayout::Simd4xN>(ci);
 
-    store(x_ci_simd +  0*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 0*STRIDE_S    ] + shx) );
-    store(x_ci_simd +  1*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 1*STRIDE_S    ] + shy) );
-    store(x_ci_simd +  2*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 2*STRIDE_S    ] + shz) );
-    store(x_ci_simd +  3*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 0*STRIDE_S + 1] + shx) );
-    store(x_ci_simd +  4*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 1*STRIDE_S + 1] + shy) );
-    store(x_ci_simd +  5*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 2*STRIDE_S + 1] + shz) );
-    store(x_ci_simd +  6*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 0*STRIDE_S + 2] + shx) );
-    store(x_ci_simd +  7*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 1*STRIDE_S + 2] + shy) );
-    store(x_ci_simd +  8*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 2*STRIDE_S + 2] + shz) );
-    store(x_ci_simd +  9*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 0*STRIDE_S + 3] + shx) );
-    store(x_ci_simd + 10*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 1*STRIDE_S + 3] + shy) );
-    store(x_ci_simd + 11*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 2*STRIDE_S + 3] + shz) );
+    store(x_ci_simd +  0*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 0*c_xStride4xN    ] + shx) );
+    store(x_ci_simd +  1*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 1*c_xStride4xN    ] + shy) );
+    store(x_ci_simd +  2*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 2*c_xStride4xN    ] + shz) );
+    store(x_ci_simd +  3*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 0*c_xStride4xN + 1] + shx) );
+    store(x_ci_simd +  4*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 1*c_xStride4xN + 1] + shy) );
+    store(x_ci_simd +  5*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 2*c_xStride4xN + 1] + shz) );
+    store(x_ci_simd +  6*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 0*c_xStride4xN + 2] + shx) );
+    store(x_ci_simd +  7*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 1*c_xStride4xN + 2] + shy) );
+    store(x_ci_simd +  8*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 2*c_xStride4xN + 2] + shz) );
+    store(x_ci_simd +  9*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 0*c_xStride4xN + 3] + shx) );
+    store(x_ci_simd + 10*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 1*c_xStride4xN + 3] + shy) );
+    store(x_ci_simd + 11*GMX_SIMD_REAL_WIDTH, SimdReal(x[ia + 2*c_xStride4xN + 3] + shz) );
 }
 
 /* SIMD code for checking and adding cluster-pairs to the list using coordinates in packed format.
@@ -70,7 +67,7 @@ icell_set_x_simd_4xn(int ci,
  * Checks bouding box distances and possibly atom pair distances.
  * This is an accelerated version of make_cluster_list_simple.
  *
- * \param[in]     gridj               The j-grid
+ * \param[in]     jGrid               The j-grid
  * \param[in,out] nbl                 The pair-list to store the cluster pairs in
  * \param[in]     icluster            The index of the i-cluster
  * \param[in]     firstCell           The first cluster in the j-range, using i-cluster size indexing
@@ -82,8 +79,8 @@ icell_set_x_simd_4xn(int ci,
  * \param[in,out] numDistanceChecks   The number of distance checks performed
  */
 static inline void
-makeClusterListSimd4xn(const nbnxn_grid_t *      gridj,
-                       nbnxn_pairlist_t *        nbl,
+makeClusterListSimd4xn(const nbnxn_grid_t       &jGrid,
+                       NbnxnPairlistCpu *        nbl,
                        int                       icluster,
                        int                       firstCell,
                        int                       lastCell,
@@ -94,8 +91,8 @@ makeClusterListSimd4xn(const nbnxn_grid_t *      gridj,
                        int * gmx_restrict        numDistanceChecks)
 {
     using namespace gmx;
-    const real * gmx_restrict          x_ci_simd = nbl->work->x_ci_simd;
-    const nbnxn_bb_t * gmx_restrict    bb_ci     = nbl->work->bb_ci;
+    const real * gmx_restrict          x_ci_simd = nbl->work->iClusterData.xSimd.data();
+    const nbnxn_bb_t * gmx_restrict    bb_ci     = nbl->work->iClusterData.bb.data();
 
     SimdReal                           jx_S, jy_S, jz_S;
 
@@ -122,13 +119,8 @@ makeClusterListSimd4xn(const nbnxn_grid_t *      gridj,
     int                                xind_f, xind_l;
 
     /* Convert the j-range from i-cluster size indexing to j-cluster indexing */
-    int jclusterFirst = cjFromCi<NbnxnLayout::Simd4xN>(firstCell);
-#if GMX_SIMD_REAL_WIDTH >= NBNXN_CPU_CLUSTER_I_SIZE
-    int jclusterLast  = cjFromCi<NbnxnLayout::Simd4xN>(lastCell);
-#else
-    /* Set the correct last j-cluster with a j-cluster size of 2 */
-    int jclusterLast  = cjFromCi<NbnxnLayout::Simd4xN>(lastCell + 1) - 1;
-#endif
+    int jclusterFirst = cjFromCi<NbnxnLayout::Simd4xN, 0>(firstCell);
+    int jclusterLast  = cjFromCi<NbnxnLayout::Simd4xN, 1>(lastCell);
     GMX_ASSERT(jclusterLast >= jclusterFirst, "We should have a non-empty j-cluster range, since the calling code should have ensured a non-empty cell range");
 
     rc2_S   = SimdReal(rlist2);
@@ -137,9 +129,9 @@ makeClusterListSimd4xn(const nbnxn_grid_t *      gridj,
     while (!InRange && jclusterFirst <= jclusterLast)
     {
 #if NBNXN_SEARCH_BB_SIMD4
-        d2 = subc_bb_dist2_simd4(0, bb_ci, jclusterFirst, gridj->bbj);
+        d2 = subc_bb_dist2_simd4(0, bb_ci, jclusterFirst, jGrid.bbj);
 #else
-        d2 = subc_bb_dist2(0, bb_ci, jclusterFirst, gridj->bbj);
+        d2 = subc_bb_dist2(0, bb_ci, jclusterFirst, jGrid.bbj);
 #endif
         *numDistanceChecks += 2;
 
@@ -154,11 +146,11 @@ makeClusterListSimd4xn(const nbnxn_grid_t *      gridj,
         }
         else if (d2 < rlist2)
         {
-            xind_f  = xIndexFromCj<NbnxnLayout::Simd4xN>(cjFromCi<NbnxnLayout::Simd4xN>(gridj->cell0) + jclusterFirst);
+            xind_f  = xIndexFromCj<NbnxnLayout::Simd4xN>(cjFromCi<NbnxnLayout::Simd4xN, 0>(jGrid.cell0) + jclusterFirst);
 
-            jx_S  = load<SimdReal>(x_j + xind_f + 0*STRIDE_S);
-            jy_S  = load<SimdReal>(x_j + xind_f + 1*STRIDE_S);
-            jz_S  = load<SimdReal>(x_j + xind_f + 2*STRIDE_S);
+            jx_S  = load<SimdReal>(x_j + xind_f + 0*c_xStride4xN);
+            jy_S  = load<SimdReal>(x_j + xind_f + 1*c_xStride4xN);
+            jz_S  = load<SimdReal>(x_j + xind_f + 2*c_xStride4xN);
 
 
             /* Calculate distance */
@@ -208,9 +200,9 @@ makeClusterListSimd4xn(const nbnxn_grid_t *      gridj,
     while (!InRange && jclusterLast > jclusterFirst)
     {
 #if NBNXN_SEARCH_BB_SIMD4
-        d2 = subc_bb_dist2_simd4(0, bb_ci, jclusterLast, gridj->bbj);
+        d2 = subc_bb_dist2_simd4(0, bb_ci, jclusterLast, jGrid.bbj);
 #else
-        d2 = subc_bb_dist2(0, bb_ci, jclusterLast, gridj->bbj);
+        d2 = subc_bb_dist2(0, bb_ci, jclusterLast, jGrid.bbj);
 #endif
         *numDistanceChecks += 2;
 
@@ -225,11 +217,11 @@ makeClusterListSimd4xn(const nbnxn_grid_t *      gridj,
         }
         else if (d2 < rlist2)
         {
-            xind_l  = xIndexFromCj<NbnxnLayout::Simd4xN>(cjFromCi<NbnxnLayout::Simd4xN>(gridj->cell0) + jclusterLast);
+            xind_l  = xIndexFromCj<NbnxnLayout::Simd4xN>(cjFromCi<NbnxnLayout::Simd4xN, 0>(jGrid.cell0) + jclusterLast);
 
-            jx_S  = load<SimdReal>(x_j +xind_l + 0*STRIDE_S);
-            jy_S  = load<SimdReal>(x_j +xind_l + 1*STRIDE_S);
-            jz_S  = load<SimdReal>(x_j +xind_l + 2*STRIDE_S);
+            jx_S  = load<SimdReal>(x_j +xind_l + 0*c_xStride4xN);
+            jy_S  = load<SimdReal>(x_j +xind_l + 1*c_xStride4xN);
+            jz_S  = load<SimdReal>(x_j +xind_l + 2*c_xStride4xN);
 
             /* Calculate distance */
             dx_S0            = load<SimdReal>(x_ci_simd +  0*GMX_SIMD_REAL_WIDTH) - jx_S;
@@ -275,13 +267,12 @@ makeClusterListSimd4xn(const nbnxn_grid_t *      gridj,
         for (int jcluster = jclusterFirst; jcluster <= jclusterLast; jcluster++)
         {
             /* Store cj and the interaction mask */
-            nbl->cj[nbl->ncj].cj   = cjFromCi<NbnxnLayout::Simd4xN>(gridj->cell0) + jcluster;
-            nbl->cj[nbl->ncj].excl = get_imask_simd_4xn(excludeSubDiagonal, icluster, jcluster);
-            nbl->ncj++;
+            nbnxn_cj_t cjEntry;
+            cjEntry.cj   = cjFromCi<NbnxnLayout::Simd4xN, 0>(jGrid.cell0) + jcluster;
+            cjEntry.excl = get_imask_simd_4xn(excludeSubDiagonal, icluster, jcluster);
+            nbl->cj.push_back(cjEntry);
         }
-        /* Increase the closing index in i super-cell list */
-        nbl->ci[nbl->nci].cj_ind_end = nbl->ncj;
+        /* Increase the closing index in the i list */
+        nbl->ci.back().cj_ind_end = nbl->cj.size();
     }
 }
-
-#undef STRIDE_S
index 9a30187d387140c79fc02067c1b313efb3a7d385..1ab116afdedea512b464366c89920b17df4d889a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, 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.
@@ -73,7 +73,7 @@ static inline int nbnxn_kernel_to_cluster_i_size(int nb_kernel_type)
         case nbnxnk4x4_PlainC:
         case nbnxnk4xN_SIMD_4xN:
         case nbnxnk4xN_SIMD_2xNN:
-            return NBNXN_CPU_CLUSTER_I_SIZE;
+            return c_nbnxnCpuIClusterSize;
         case nbnxnk8x8x8_GPU:
         case nbnxnk8x8x8_PlainC:
             /* The cluster size for super/sub lists is only set here.
@@ -101,7 +101,7 @@ static inline int nbnxn_kernel_to_cluster_j_size(int nb_kernel_type)
     switch (nb_kernel_type)
     {
         case nbnxnk4x4_PlainC:
-            cj_size = NBNXN_CPU_CLUSTER_I_SIZE;
+            cj_size = c_nbnxnCpuIClusterSize;
             break;
         case nbnxnk4xN_SIMD_4xN:
             cj_size = nbnxn_simd_width;
index 6ad71ef9f906d3bdf0742e5408739763358cda4f..51fc6cfbcc89fe03a0fe807a0f3981533970d1c1 100644 (file)
@@ -2194,6 +2194,10 @@ void init_ns(FILE *fplog, const t_commrec *cr,
 
 void done_ns(gmx_ns_t *ns, int numEnergyGroups)
 {
+    if (ns->bexcl != nullptr)
+    {
+        sfree(ns->bexcl);
+    }
     sfree(ns->bExcludeAlleg);
     if (ns->ns_buf)
     {
@@ -2203,8 +2207,20 @@ void done_ns(gmx_ns_t *ns, int numEnergyGroups)
         }
         sfree(ns->ns_buf);
     }
+    if (ns->nl_sr != nullptr)
+    {
+        for (int i = 0; i < numEnergyGroups; i++)
+        {
+            if (ns->nl_sr[i] != nullptr)
+            {
+                sfree(ns->nl_sr[i]);
+            }
+        }
+        sfree(ns->nl_sr);
+    }
     sfree(ns->simple_aaj);
     sfree(ns->bHaveVdW);
+    sfree(ns->nsr);
     done_grid(ns->grid);
     sfree(ns);
 }
index a0081e6fe2b28e6a313b3b97807f62608cfc76b9..88843e72c9a99be4dc5171890ab7fd8949dbb77c 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -351,6 +351,69 @@ t_QMMMrec *mk_QMMMrec()
 } /* mk_QMMMrec */
 #endif
 
+std::vector<int> qmmmAtomIndices(const t_inputrec &ir, const gmx_mtop_t &mtop)
+{
+    const int           numQmmmGroups = ir.opts.ngQM;
+    const gmx_groups_t &groups        = mtop.groups;
+    std::vector<int>    qmmmAtoms;
+    for (int i = 0; i < numQmmmGroups; i++)
+    {
+        for (const AtomProxy &atomP : AtomRange(mtop))
+        {
+            int index = atomP.globalAtomNumber();
+            if (getGroupType(groups, egcQMMM, index) == i)
+            {
+                qmmmAtoms.push_back(index);
+            }
+        }
+        if (ir.QMMMscheme == eQMMMschemeoniom)
+        {
+            /* I assume that users specify the QM groups from small to
+             * big(ger) in the mdp file
+             */
+            gmx_mtop_ilistloop_all_t iloop = gmx_mtop_ilistloop_all_init(&mtop);
+            int nral1                      = 1 + NRAL(F_VSITE2);
+            int atomOffset                 = 0;
+            while (const InteractionLists *ilists = gmx_mtop_ilistloop_all_next(iloop, &atomOffset))
+            {
+                const InteractionList &ilist = (*ilists)[F_VSITE2];
+                for (int j = 0; j < ilist.size(); j += nral1)
+                {
+                    const int vsite = atomOffset + ilist.iatoms[j  ]; /* the vsite         */
+                    const int ai    = atomOffset + ilist.iatoms[j+1]; /* constructing atom */
+                    const int aj    = atomOffset + ilist.iatoms[j+2]; /* constructing atom */
+                    if (getGroupType(groups, egcQMMM, vsite) == getGroupType(groups, egcQMMM, ai)
+                        &&
+                        getGroupType(groups, egcQMMM, vsite) == getGroupType(groups, egcQMMM, aj))
+                    {
+                        /* this dummy link atom needs to be removed from qmmmAtoms
+                         * before making the QMrec of this layer!
+                         */
+                        qmmmAtoms.erase(std::remove_if(qmmmAtoms.begin(),
+                                                       qmmmAtoms.end(),
+                                                       [&vsite](int atom){return atom == vsite; }),
+                                        qmmmAtoms.end());
+                    }
+                }
+            }
+        }
+    }
+    return qmmmAtoms;
+}
+
+void removeQmmmAtomCharges(gmx_mtop_t *mtop, gmx::ArrayRef<const int> qmmmAtoms)
+{
+    int molb = 0;
+    for (int i = 0; i < qmmmAtoms.size(); i++)
+    {
+        int     indexInMolecule;
+        mtopGetMolblockIndex(mtop, qmmmAtoms[i], &molb, nullptr, &indexInMolecule);
+        t_atom *atom = &mtop->moltype[mtop->molblock[molb].type].atoms.atom[indexInMolecule];
+        atom->q  = 0.0;
+        atom->qB = 0.0;
+    }
+}
+
 void init_QMMMrec(const t_commrec  *cr,
                   const gmx_mtop_t *mtop,
                   const t_inputrec *ir,
@@ -362,12 +425,8 @@ void init_QMMMrec(const t_commrec  *cr,
      * simply contains true/false for QM and MM (the other) atoms.
      */
 
-    int                     *qm_arr = nullptr, vsite, ai, aj;
-    int                      qm_max = 0, qm_nr = 0, i, j, jmax, k, l;
     t_QMMMrec               *qr;
     t_MMrec                 *mm;
-    gmx_mtop_atomloop_all_t  aloop;
-    int                      a_offset;
 
     if (!GMX_QMMM)
     {
@@ -409,44 +468,28 @@ void init_QMMMrec(const t_commrec  *cr,
 
     /* small problem if there is only QM.... so no MM */
 
-    jmax = ir->opts.ngQM;
+    int numQmmmGroups = ir->opts.ngQM;
 
     if (qr->QMMMscheme == eQMMMschemeoniom)
     {
-        qr->nrQMlayers = jmax;
+        qr->nrQMlayers = numQmmmGroups;
     }
     else
     {
         qr->nrQMlayers = 1;
     }
 
-    const gmx_groups_t *groups = &mtop->groups;
-
-    /* there are jmax groups of QM atoms. In case of multiple QM groups
+    /* there are numQmmmGroups groups of QM atoms. In case of multiple QM groups
      * I assume that the users wants to do ONIOM. However, maybe it
      * should also be possible to define more than one QM subsystem with
      * independent neighbourlists. I have to think about
      * that.. 11-11-2003
      */
-    snew(qr->qm, jmax);
-    for (j = 0; j < jmax; j++)
+    std::vector<int> qmmmAtoms = qmmmAtomIndices(*ir, *mtop);
+    snew(qr->qm, numQmmmGroups);
+    for (int i = 0; i < numQmmmGroups; i++)
     {
         /* new layer */
-        aloop = gmx_mtop_atomloop_all_init(mtop);
-        const t_atom *atom;
-        while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
-        {
-            if (qm_nr >= qm_max)
-            {
-                qm_max += 1000;
-                srenew(qm_arr, qm_max);
-            }
-            if (getGroupType(groups, egcQMMM, i) == j)
-            {
-                /* hack for tip4p */
-                qm_arr[qm_nr++] = i;
-            }
-        }
         if (qr->QMMMscheme == eQMMMschemeoniom)
         {
             /* add the atoms to the bQMMM array
@@ -455,50 +498,10 @@ void init_QMMMrec(const t_commrec  *cr,
             /* I assume that users specify the QM groups from small to
              * big(ger) in the mdp file
              */
-            qr->qm[j] = mk_QMrec();
-            /* we need to throw out link atoms that in the previous layer
-             * existed to separate this QMlayer from the previous
-             * QMlayer. We use the iatoms array in the idef for that
-             * purpose. If all atoms defining the current Link Atom (Dummy2)
-             * are part of the current QM layer it needs to be removed from
-             * qm_arr[].  */
-
-            gmx_mtop_ilistloop_all_t iloop = gmx_mtop_ilistloop_all_init(mtop);
-            int nral1 = 1 + NRAL(F_VSITE2);
-            while (const InteractionLists *ilists = gmx_mtop_ilistloop_all_next(iloop, &a_offset))
-            {
-                const InteractionList &ilist = (*ilists)[F_VSITE2];
-                for (int i = 0; i < ilist.size(); i += nral1)
-                {
-                    vsite = a_offset + ilist.iatoms[i  ]; /* the vsite         */
-                    ai    = a_offset + ilist.iatoms[i+1]; /* constructing atom */
-                    aj    = a_offset + ilist.iatoms[i+2]; /* constructing atom */
-                    if (getGroupType(groups, egcQMMM, vsite) == getGroupType(groups, egcQMMM, ai)
-                        &&
-                        getGroupType(groups, egcQMMM, vsite) == getGroupType(groups, egcQMMM, aj))
-                    {
-                        /* this dummy link atom needs to be removed from the qm_arr
-                         * before making the QMrec of this layer!
-                         */
-                        for (i = 0; i < qm_nr; i++)
-                        {
-                            if (qm_arr[i] == vsite)
-                            {
-                                /* drop the element */
-                                for (l = i; l < qm_nr; l++)
-                                {
-                                    qm_arr[l] = qm_arr[l+1];
-                                }
-                                qm_nr--;
-                            }
-                        }
-                    }
-                }
-            }
-
+            qr->qm[i] = mk_QMrec();
             /* store QM atoms in this layer in the QMrec and initialise layer
              */
-            init_QMrec(j, qr->qm[j], qm_nr, qm_arr, mtop, ir);
+            init_QMrec(i, qr->qm[i], qmmmAtoms.size(), qmmmAtoms.data(), mtop, ir);
         }
     }
     if (qr->QMMMscheme != eQMMMschemeoniom)
@@ -511,19 +514,10 @@ void init_QMMMrec(const t_commrec  *cr,
          * TODO: Consider doing this in grompp instead.
          */
 
-        int molb = 0;
-        for (k = 0; k < qm_nr; k++)
-        {
-            int     indexInMolecule;
-            mtopGetMolblockIndex(mtop, qm_arr[k], &molb, nullptr, &indexInMolecule);
-            t_atom *atom = &mtop->moltype[mtop->molblock[molb].type].atoms.atom[indexInMolecule];
-            atom->q  = 0.0;
-            atom->qB = 0.0;
-        }
         qr->qm[0] = mk_QMrec();
         /* store QM atoms in the QMrec and initialise
          */
-        init_QMrec(0, qr->qm[0], qm_nr, qm_arr, mtop, ir);
+        init_QMrec(0, qr->qm[0], qmmmAtoms.size(), qmmmAtoms.data(), mtop, ir);
 
         /* MM rec creation */
         mm               = mk_MMrec();
index c8fb094c32bb99595166cb3c7a0d014676528888..78fb3b66b1151089eb3d69db39263881eba1824e 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2008, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2018,2019, 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.
 
 #include "config.h"
 
+#include <vector>
+
 #include "gromacs/math/vectypes.h"
 #include "gromacs/mdlib/tgroup.h"
+#include "gromacs/utility/arrayref.h"
 
 #define GMX_QMMM (GMX_QMMM_MOPAC || GMX_QMMM_GAMESS || GMX_QMMM_GAUSSIAN || GMX_QMMM_ORCA)
 
@@ -146,4 +149,21 @@ real calculate_QMMM(const t_commrec  *cr,
  * called by system().
  */
 
+/*! \brief
+ * Return vector of atom indices for atoms in the QMMM region.
+ *
+ * \param[in] mtop Topology to use for populating array.
+ * \param[in] ir   Inputrec used in simulation.
+ * \returns Vector of atoms.
+ */
+std::vector<int> qmmmAtomIndices(const t_inputrec &ir, const gmx_mtop_t &mtop);
+
+/*! \brief
+ * Remove charges from QMMM atoms.
+ *
+ * \param[in] mtop Topology used for removing atoms.
+ * \param[in] qmmmAtoms ArrayRef to vector conatining qmmm atom indices.
+ */
+void removeQmmmAtomCharges(gmx_mtop_t *mtop, gmx::ArrayRef<const int> qmmmAtoms);
+
 #endif
index 8f4b9c3d0686ca9f05c82a738c9ad4ca829c28e0..6e5c3f4d0bd3dbe53f9208360fa9a6d9ab4abd1e 100644 (file)
@@ -108,6 +108,17 @@ shakedata *shake_init()
     return d;
 }
 
+void done_shake(shakedata *d)
+{
+    sfree(d->rij);
+    sfree(d->half_of_reduced_mass);
+    sfree(d->distance_squared_tolerance);
+    sfree(d->constraint_distance_squared);
+    sfree(d->sblock);
+    sfree(d->scaled_lagrange_multiplier);
+    sfree(d);
+}
+
 typedef struct {
     int iatom[3];
     int blocknr;
@@ -184,6 +195,7 @@ make_shake_sblock_serial(shakedata *shaked,
     ncons = idef->il[F_CONSTR].nr/3;
 
     init_blocka(&sblocks);
+    sfree(sblocks.index); // To solve memory leak
     gen_sblocks(nullptr, 0, md.homenr, idef, &sblocks, FALSE);
 
     /*
index 62698ce61888839aa4be5840d492bedf65abd302..46a5b4065bf86f3ef48912b9758cc678a3048d86 100644 (file)
@@ -64,6 +64,9 @@ struct shakedata;
 /*! \brief Initializes and return the SHAKE data structure */
 shakedata *shake_init();
 
+//! Destroy SHAKE. Needed to solve memory leaks.
+void done_shake(shakedata *d);
+
 //! Make SHAKE blocks when not using DD.
 void
 make_shake_sblock_serial(shakedata *shaked,
index dee0eb0126daf3fb4044b9a22e548f032aa1702a..02e4c87c95f48aab58474cd22b40b8c473a7fcbb 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2008, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -304,7 +304,6 @@ gmx_shellfc_t *init_shell_flexcon(FILE *fplog,
     gmx_shellfc_t            *shfc;
     t_shell                  *shell;
     int                      *shell_index = nullptr, *at2cg;
-    const t_atom             *atom;
 
     int                       ns, nshell, nsi;
     int                       i, j, type, a_offset, cg, mol, ftype, nra;
@@ -312,7 +311,6 @@ gmx_shellfc_t *init_shell_flexcon(FILE *fplog,
     int                       aS, aN = 0; /* Shell and nucleus */
     int                       bondtypes[] = { F_BONDS, F_HARMONIC, F_CUBICBONDS, F_POLARIZATION, F_ANHARM_POL, F_WATER_POL };
 #define NBT asize(bondtypes)
-    gmx_mtop_atomloop_all_t   aloop;
     const gmx_ffparams_t     *ffparams;
 
     std::array<int, eptNR>    n = countPtypes(fplog, mtop);
@@ -354,11 +352,12 @@ gmx_shellfc_t *init_shell_flexcon(FILE *fplog,
     /* Global system sized array, this should be avoided */
     snew(shell_index, mtop->natoms);
 
-    aloop  = gmx_mtop_atomloop_all_init(mtop);
     nshell = 0;
-    while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
+    for (const AtomProxy &atomP : AtomRange(*mtop))
     {
-        if (atom->ptype == eptShell)
+        const t_atom &local = atomP.atom();
+        int           i     = atomP.globalAtomNumber();
+        if (local.ptype == eptShell)
         {
             shell_index[i] = nshell++;
         }
@@ -400,7 +399,7 @@ gmx_shellfc_t *init_shell_flexcon(FILE *fplog,
             }
         }
 
-        atom = molt->atoms.atom;
+        const t_atom *atom = molt->atoms.atom;
         for (mol = 0; mol < molb->nmol; mol++)
         {
             for (j = 0; (j < NBT); j++)
index efca232e6fca49c43683ed226ef87849428f3773..8e7af55869e7b0531c45ebb992f1da137f955376 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
 #include "gromacs/utility/gmxassert.h"
 #include "gromacs/utility/gmxmpi.h"
 #include "gromacs/utility/logger.h"
-#include "gromacs/utility/pleasecite.h"
 #include "gromacs/utility/smalloc.h"
 #include "gromacs/utility/strconvert.h"
 #include "gromacs/utility/sysinfo.h"
@@ -461,7 +460,7 @@ static void do_nb_verlet(const t_forcerec *fr,
             break;
 
         case nbnxnk8x8x8_PlainC:
-            nbnxn_kernel_gpu_ref(nbvg->nbl_lists.nbl[0],
+            nbnxn_kernel_gpu_ref(nbvg->nbl_lists.nblGpu[0],
                                  nbv->nbat, ic,
                                  fr->shift_vec,
                                  flags,
@@ -1049,7 +1048,7 @@ static void do_force_cutsVERLET(FILE *fplog,
     nonbonded_verlet_t *nbv = fr->nbv;
 
     bStateChanged = ((flags & GMX_FORCE_STATECHANGED) != 0);
-    bNS           = ((flags & GMX_FORCE_NS) != 0) && (!fr->bAllvsAll);
+    bNS           = ((flags & GMX_FORCE_NS) != 0);
     bFillGrid     = (bNS && bStateChanged);
     bCalcCGCM     = (bFillGrid && !DOMAINDECOMP(cr));
     bDoForces     = ((flags & GMX_FORCE_FORCES) != 0);
@@ -1256,7 +1255,7 @@ static void do_force_cutsVERLET(FILE *fplog,
         {
             /* initialize local pair-list on the GPU */
             nbnxn_gpu_init_pairlist(nbv->gpu_nbv,
-                                    nbv->grp[eintLocal].nbl_lists.nbl[0],
+                                    nbv->grp[eintLocal].nbl_lists.nblGpu[0],
                                     eintLocal);
         }
         wallcycle_stop(wcycle, ewcNS);
@@ -1334,7 +1333,7 @@ static void do_force_cutsVERLET(FILE *fplog,
             {
                 /* initialize non-local pair-list on the GPU */
                 nbnxn_gpu_init_pairlist(nbv->gpu_nbv,
-                                        nbv->grp[eintNonlocal].nbl_lists.nbl[0],
+                                        nbv->grp[eintNonlocal].nbl_lists.nblGpu[0],
                                         eintNonlocal);
             }
             wallcycle_stop(wcycle, ewcNS);
@@ -1602,7 +1601,7 @@ static void do_force_cutsVERLET(FILE *fplog,
             }
 
             /* skip the reduction if there was no non-local work to do */
-            if (nbv->grp[eintNonlocal].nbl_lists.nbl[0]->nsci > 0)
+            if (!nbv->grp[eintNonlocal].nbl_lists.nblGpu[0]->sci.empty())
             {
                 nbnxn_atomdata_add_nbat_f_to_f(nbv->nbs.get(), eatNonlocal,
                                                nbv->nbat, f, wcycle);
@@ -1836,7 +1835,7 @@ static void do_force_cutsGROUP(FILE *fplog,
     }
 
     bStateChanged  = ((flags & GMX_FORCE_STATECHANGED) != 0);
-    bNS            = ((flags & GMX_FORCE_NS) != 0) && (!fr->bAllvsAll);
+    bNS            = ((flags & GMX_FORCE_NS) != 0);
     /* Should we perform the long-range nonbonded evaluation inside the neighborsearching? */
     bFillGrid      = (bNS && bStateChanged);
     bCalcCGCM      = (bFillGrid && !DOMAINDECOMP(cr));
@@ -2871,49 +2870,59 @@ void finish_run(FILE *fplog, const gmx::MDLogger &mdlog, const t_commrec *cr,
     }
 }
 
-extern void initialize_lambdas(FILE *fplog, t_inputrec *ir, int *fep_state, gmx::ArrayRef<real> lambda, double *lam0)
+void initialize_lambdas(FILE               *fplog,
+                        const t_inputrec   &ir,
+                        bool                isMaster,
+                        int                *fep_state,
+                        gmx::ArrayRef<real> lambda,
+                        double             *lam0)
 {
-    /* this function works, but could probably use a logic rewrite to keep all the different
-       types of efep straight. */
+    /* TODO: Clean up initialization of fep_state and lambda in
+       t_state.  This function works, but could probably use a logic
+       rewrite to keep all the different types of efep straight. */
 
-    if ((ir->efep == efepNO) && (!ir->bSimTemp))
+    if ((ir.efep == efepNO) && (!ir.bSimTemp))
     {
         return;
     }
 
-    t_lambda *fep = ir->fepvals;
-    *fep_state    = fep->init_fep_state; /* this might overwrite the checkpoint
-                                            if checkpoint is set -- a kludge is in for now
-                                            to prevent this.*/
+    const t_lambda *fep = ir.fepvals;
+    if (isMaster)
+    {
+        *fep_state = fep->init_fep_state; /* this might overwrite the checkpoint
+                                             if checkpoint is set -- a kludge is in for now
+                                             to prevent this.*/
+    }
 
     for (int i = 0; i < efptNR; i++)
     {
+        double thisLambda;
         /* overwrite lambda state with init_lambda for now for backwards compatibility */
-        if (fep->init_lambda >= 0) /* if it's -1, it was never initializd */
+        if (fep->init_lambda >= 0) /* if it's -1, it was never initialized */
         {
-            lambda[i] = fep->init_lambda;
-            if (lam0)
-            {
-                lam0[i] = lambda[i];
-            }
+            thisLambda = fep->init_lambda;
         }
         else
         {
-            lambda[i] = fep->all_lambda[i][*fep_state];
-            if (lam0)
-            {
-                lam0[i] = lambda[i];
-            }
+            thisLambda = fep->all_lambda[i][fep->init_fep_state];
+        }
+        if (isMaster)
+        {
+            lambda[i] = thisLambda;
+        }
+        if (lam0 != nullptr)
+        {
+            lam0[i] = thisLambda;
         }
     }
-    if (ir->bSimTemp)
+    if (ir.bSimTemp)
     {
         /* need to rescale control temperatures to match current state */
-        for (int i = 0; i < ir->opts.ngtc; i++)
+        for (int i = 0; i < ir.opts.ngtc; i++)
         {
-            if (ir->opts.ref_t[i] > 0)
+            if (ir.opts.ref_t[i] > 0)
             {
-                ir->opts.ref_t[i] = ir->simtempvals->temperatures[*fep_state];
+                ir.opts.ref_t[i] = ir.simtempvals->temperatures[fep->init_fep_state];
             }
         }
     }
@@ -2929,135 +2938,3 @@ extern void initialize_lambdas(FILE *fplog, t_inputrec *ir, int *fep_state, gmx:
         fprintf(fplog, "]\n");
     }
 }
-
-
-void init_md(FILE *fplog,
-             const t_commrec *cr, gmx::IMDOutputProvider *outputProvider,
-             t_inputrec *ir, const gmx_output_env_t *oenv,
-             const MdrunOptions &mdrunOptions,
-             double *t, double *t0,
-             t_state *globalState, double *lam0,
-             t_nrnb *nrnb, gmx_mtop_t *mtop,
-             gmx_update_t **upd,
-             gmx::BoxDeformation *deform,
-             int nfile, const t_filenm fnm[],
-             gmx_mdoutf_t *outf, t_mdebin **mdebin,
-             tensor force_vir, tensor shake_vir,
-             tensor total_vir, tensor pres, rvec mu_tot,
-             gmx_bool *bSimAnn, t_vcm **vcm,
-             gmx_wallcycle_t wcycle)
-{
-    int  i;
-
-    /* Initial values */
-    *t = *t0       = ir->init_t;
-
-    *bSimAnn = FALSE;
-    for (i = 0; i < ir->opts.ngtc; i++)
-    {
-        /* set bSimAnn if any group is being annealed */
-        if (ir->opts.annealing[i] != eannNO)
-        {
-            *bSimAnn = TRUE;
-        }
-    }
-
-    /* Initialize lambda variables */
-    /* TODO: Clean up initialization of fep_state and lambda in t_state.
-     * We currently need to call initialize_lambdas on non-master ranks
-     * to initialize lam0.
-     */
-    if (MASTER(cr))
-    {
-        initialize_lambdas(fplog, ir, &globalState->fep_state, globalState->lambda, lam0);
-    }
-    else
-    {
-        int                      tmpFepState;
-        std::array<real, efptNR> tmpLambda;
-        initialize_lambdas(fplog, ir, &tmpFepState, tmpLambda, lam0);
-    }
-
-    // TODO upd is never NULL in practice, but the analysers don't know that
-    if (upd)
-    {
-        *upd = init_update(ir, deform);
-    }
-    if (*bSimAnn)
-    {
-        update_annealing_target_temp(ir, ir->init_t, upd ? *upd : nullptr);
-    }
-
-    if (vcm != nullptr)
-    {
-        *vcm = init_vcm(fplog, &mtop->groups, ir);
-    }
-
-    if (EI_DYNAMICS(ir->eI) && !mdrunOptions.continuationOptions.appendFiles)
-    {
-        if (ir->etc == etcBERENDSEN)
-        {
-            please_cite(fplog, "Berendsen84a");
-        }
-        if (ir->etc == etcVRESCALE)
-        {
-            please_cite(fplog, "Bussi2007a");
-        }
-        if (ir->eI == eiSD1)
-        {
-            please_cite(fplog, "Goga2012");
-        }
-    }
-    init_nrnb(nrnb);
-
-    if (nfile != -1)
-    {
-        *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, ir, mtop, oenv, wcycle);
-
-        *mdebin = init_mdebin(mdrunOptions.continuationOptions.appendFiles ? nullptr : mdoutf_get_fp_ene(*outf),
-                              mtop, ir, mdoutf_get_fp_dhdl(*outf));
-    }
-
-    /* Initiate variables */
-    clear_mat(force_vir);
-    clear_mat(shake_vir);
-    clear_rvec(mu_tot);
-    clear_mat(total_vir);
-    clear_mat(pres);
-}
-
-void init_rerun(FILE *fplog,
-                const t_commrec *cr, gmx::IMDOutputProvider *outputProvider,
-                t_inputrec *ir, const gmx_output_env_t *oenv,
-                const MdrunOptions &mdrunOptions,
-                t_state *globalState, double *lam0,
-                t_nrnb *nrnb, gmx_mtop_t *mtop,
-                int nfile, const t_filenm fnm[],
-                gmx_mdoutf_t *outf, t_mdebin **mdebin,
-                gmx_wallcycle_t wcycle)
-{
-    /* Initialize lambda variables */
-    /* TODO: Clean up initialization of fep_state and lambda in t_state.
-     * We currently need to call initialize_lambdas on non-master ranks
-     * to initialize lam0.
-     */
-    if (MASTER(cr))
-    {
-        initialize_lambdas(fplog, ir, &globalState->fep_state, globalState->lambda, lam0);
-    }
-    else
-    {
-        int                      tmpFepState;
-        std::array<real, efptNR> tmpLambda;
-        initialize_lambdas(fplog, ir, &tmpFepState, tmpLambda, lam0);
-    }
-
-    init_nrnb(nrnb);
-
-    if (nfile != -1)
-    {
-        *outf   = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, ir, mtop, oenv, wcycle);
-        *mdebin = init_mdebin(mdrunOptions.continuationOptions.appendFiles ? nullptr : mdoutf_get_fp_ene(*outf),
-                              mtop, ir, mdoutf_get_fp_dhdl(*outf), true);
-    }
-}
index a9bd066d754b4b51fc576218d8bcea78de6c542f..e15ce631b549a1aaa798bfb3b1435bd4245e2a5d 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -47,7 +47,6 @@
 
 struct gmx_output_env_t;
 struct gmx_pme_t;
-struct gmx_update_t;
 struct MdrunOptions;
 struct nonbonded_verlet_t;
 struct t_forcerec;
@@ -60,6 +59,7 @@ class BoxDeformation;
 class Constraints;
 class IMDOutputProvider;
 class MDLogger;
+class Update;
 }
 
 typedef struct gmx_global_stat *gmx_global_stat_t;
@@ -136,39 +136,25 @@ void calc_dispcorr(const t_inputrec *ir, const t_forcerec *fr,
                    const matrix box, real lambda, tensor pres, tensor virial,
                    real *prescorr, real *enercorr, real *dvdlcorr);
 
-void initialize_lambdas(FILE *fplog, t_inputrec *ir, int *fep_state, gmx::ArrayRef<real> lambda, double *lam0);
+/*! \brief Fills fep_state, lambda, and lam0 if needed
+ *
+ * If FEP or simulated tempering is in use:
+ *
+ *    fills non-null lam0 with the initial lambda values, and
+ *    on master rank fills fep_state and lambda.
+ *
+ * Reports the initial lambda state to the log file. */
+void initialize_lambdas(FILE               *fplog,
+                        const t_inputrec   &ir,
+                        bool                isMaster,
+                        int                *fep_state,
+                        gmx::ArrayRef<real> lambda,
+                        double             *lam0);
 
 void do_constrain_first(FILE *log, gmx::Constraints *constr,
                         const t_inputrec *inputrec, const t_mdatoms *md,
                         t_state *state);
 
-void init_md(FILE *fplog,
-             const t_commrec *cr, gmx::IMDOutputProvider *outputProvider,
-             t_inputrec *ir, const gmx_output_env_t *oenv,
-             const MdrunOptions &mdrunOptions,
-             double *t, double *t0,
-             t_state *globalState, double *lam0,
-             t_nrnb *nrnb, gmx_mtop_t *mtop,
-             gmx_update_t **upd,
-             gmx::BoxDeformation *deform,
-             int nfile, const t_filenm fnm[],
-             gmx_mdoutf_t *outf, t_mdebin **mdebin,
-             tensor force_vir, tensor shake_vir,
-             tensor total_vir, tensor pres,
-             rvec mu_tot,
-             gmx_bool *bSimAnn, t_vcm **vcm,
-             gmx_wallcycle_t wcycle);
-
-void init_rerun(FILE *fplog,
-                const t_commrec *cr, gmx::IMDOutputProvider *outputProvider,
-                t_inputrec *ir, const gmx_output_env_t *oenv,
-                const MdrunOptions &mdrunOptions,
-                t_state *globalState, double *lam0,
-                t_nrnb *nrnb, gmx_mtop_t *mtop,
-                int nfile, const t_filenm fnm[],
-                gmx_mdoutf_t *outf, t_mdebin **mdebin,
-                gmx_wallcycle_t wcycle);
-
 /* Routine in sim_util.c */
 
 gmx_bool use_GPU(const nonbonded_verlet_t *nbv);
index ba9a135ecf37b075814de343b817d81d77b8e7d1..a2159835c78994c8f3cee061a18d9cc1ecfd0281 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -261,7 +261,7 @@ void global_stat(const gmx_global_stat *gs,
     if (vcm)
     {
         icm   = add_binr(rb, DIM*vcm->nr, vcm->group_p[0]);
-        imass = add_binr(rb, vcm->nr, vcm->group_mass);
+        imass = add_binr(rb, vcm->nr, vcm->group_mass.data());
         if (vcm->mode == ecmANGULAR)
         {
             icj   = add_binr(rb, DIM*vcm->nr, vcm->group_j[0]);
@@ -359,7 +359,7 @@ void global_stat(const gmx_global_stat *gs,
     if (vcm)
     {
         extract_binr(rb, icm, DIM*vcm->nr, vcm->group_p[0]);
-        extract_binr(rb, imass, vcm->nr, vcm->group_mass);
+        extract_binr(rb, imass, vcm->nr, vcm->group_mass.data());
         if (vcm->mode == ecmANGULAR)
         {
             extract_binr(rb, icj, DIM*vcm->nr, vcm->group_j[0]);
index 39babd5e072b452e3c3b26473ea308bf04b349c5..3602f26d2856ef418a3f62d803cb07b74dc911b6 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2018, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019, 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.
@@ -187,8 +187,8 @@ std::unique_ptr<StopHandler> StopHandlerBuilder::getStopHandlerMD (
 {
     if (!GMX_THREAD_MPI || isMaster)
     {
-        // TODO: Use unique_ptr once we switch to C++14 (unique_ptr can not easily be
-        //       captured in lambda functions in C++11)
+        // Using shared ptr because move-only callable not supported by std::function.
+        // Would require replacement such as fu2::function or cxx_function.
         auto stopConditionSignal = std::make_shared<StopConditionSignal>(
                     nstList, makeBinaryReproducibleSimulation, nstSignalComm);
         registerStopCondition(
@@ -198,8 +198,6 @@ std::unique_ptr<StopHandler> StopHandlerBuilder::getStopHandlerMD (
 
     if (isMaster && maximumHoursToRun > 0)
     {
-        // TODO: Use unique_ptr once we switch to C++14 (unique_ptr can not easily be
-        //       captured in lambda functions in C++11)
         auto stopConditionTime = std::make_shared<StopConditionTime>(
                     nstList, maximumHoursToRun, nstSignalComm);
         registerStopCondition(
index b264637f232337495a956adaf6fe165430cc518f..5df63e852d007a7c1d55c40f8b9db80d5ff57a47 100644 (file)
@@ -34,6 +34,7 @@
 
 gmx_add_unit_test(MdlibUnitTest mdlib-test
                   calc_verletbuf.cpp
+                  constr.cpp
                   mdebin.cpp
                   settle.cpp
                   shake.cpp
diff --git a/src/gromacs/mdlib/tests/constr.cpp b/src/gromacs/mdlib/tests/constr.cpp
new file mode 100644 (file)
index 0000000..31e499e
--- /dev/null
@@ -0,0 +1,753 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2018, 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 SHAKE and LINCS tests.
+ *
+ * \author Artem Zhmurov <zhmurov@gmail.com>
+ * \ingroup module_mdlib
+ */
+
+#include "gmxpre.h"
+
+#include "gromacs/mdlib/constr.h"
+
+#include <assert.h>
+
+#include <cmath>
+
+#include <algorithm>
+#include <vector>
+
+#include <gtest/gtest.h>
+
+#include "gromacs/fileio/gmxfio.h"
+#include "gromacs/gmxlib/nonbonded/nonbonded.h"
+#include "gromacs/math/vec.h"
+#include "gromacs/math/vectypes.h"
+#include "gromacs/mdlib/gmx_omp_nthreads.h"
+#include "gromacs/mdlib/lincs.h"
+#include "gromacs/mdlib/shake.h"
+#include "gromacs/mdtypes/commrec.h"
+#include "gromacs/mdtypes/inputrec.h"
+#include "gromacs/mdtypes/mdatom.h"
+#include "gromacs/pbcutil/pbc.h"
+#include "gromacs/topology/block.h"
+#include "gromacs/topology/idef.h"
+#include "gromacs/topology/ifunc.h"
+#include "gromacs/topology/topology.h"
+#include "gromacs/utility/smalloc.h"
+#include "gromacs/utility/stringutil.h"
+#include "gromacs/utility/unique_cptr.h"
+
+#include "testutils/refdata.h"
+#include "testutils/testasserts.h"
+
+#include "constrdata.h"
+
+namespace gmx
+{
+namespace test
+{
+
+/*! \brief Test fixture for SHAKE and LINCS
+ *
+ * The fixture uses three simple and one real-life system for testing.
+ * Simple systems include:
+ * 1.1. Two atoms, connected with one constrain.
+ * 1.2. Three atoms, connected consequently with two constraints
+ * 1.3. Four atoms, connected by two independent constraints.
+ * 1.4. Three atoms, connected by three constraints in a triangle.
+ * 1.5. Four atoms, connected by three consequentive constraints.
+ * The real-life system is a Cys-Val-Trp peptide with constraints
+ * on:
+ * 2.1. Bonds, containing hydrogens (SHAKE and LINCS)
+ * 2.2. All bonds (SHAKE and LINCS).
+ * 2.3. Angles with hydrogens and all bonds (SHAKE).
+ * 2.4. All angles and all bonds (disabled).
+ *
+ * For all systems, the final length of the constraints is tested ageinst the
+ * reference values. For systems 2.1 and 2.2, the exact final coordinates of
+ * all atoms are also tested against the reference values.
+ */
+class ConstraintsTest : public ::testing::Test
+{
+    public:
+
+        /*! \brief
+         * Cleaning up the memory.
+         */
+        void TearDown() override
+        {
+            sfree(idef.il[F_CONSTR].iatoms);
+            sfree(idef.iparams);
+            sfree(x);
+            sfree(xprime);
+            sfree(xprime2);
+            sfree(v);
+            gmx_fio_close(log);
+        }
+
+        /*! \brief
+         * Method used to initialize atoms, constraints and their parameters.
+         *
+         * This method constructs stubs for all the data structures, required to initialize
+         * and apply LINCS and SHAKE constraints. The constraints data is also saved as a field
+         * to check if the target distances are achieved after the constraints are applied.
+         *
+         * \param[in] natom          Number of atoms in the system.
+         * \param[in] masses         Atom masses. Size of this vector should be equal to natom.
+         * \param[in] constraints    List of constraints, organized in tripples of integers.
+         *                           First integer is the index of type for a constrain, second
+         *                           and third are the indices of constrained atoms. The types
+         *                           of constraints should be sequential but not nesseseraly
+         *                           start from zero (which is the way they normally are in
+         *                           GROMACS).
+         * \param[in] constraintsR0  Target values for bond lengths for bonds of each type. The
+         *                           size of this vector should be equal to the total number of
+         *                           unique types in constraints vector.
+         * \param[in] firstType      The index of first interaction type used for constraints
+         *                           (i.e. the lowest number that appear as type in constraints
+         *                           vector). This is not fail-safe, since technically the
+         *                           numbering of the types may not be sequantial, but (i) this
+         *                           is the way things are in GROMACS, (ii) everything is fine
+         *                           in the examples provided for the test.
+         * \param[in] epbc           Type of PBC (epbcXYZ / epbcNONE are used in this test,
+         *                           see src/gromacs/pbcutil/pbc.h for details).
+         * \param[in] box            The PBC box.
+         * \param[in] init_t         Initial time.
+         * \param[in] delta_t        Timestep.
+         * \param[in] coordinates    Initial (unconstrained) coordinates.
+         *
+         */
+        void initSystem(int natom, std::vector<real> masses,
+                        std::vector<int> constraints, std::vector<real> constraintsR0, int firstType,
+                        int epbc, const matrix box,
+                        real init_t, real delta_t,
+                        std::vector<RVec> coordinates)
+
+        {
+
+            this->n = natom;   // Number of atoms
+
+            invmass.resize(n); // Vector of inverce masses
+
+            for (int i = 0; i < n; i++)
+            {
+                invmass.at(i) = 1.0/masses.at(i);
+            }
+
+            // Saving constraints to check if they are satisfied after algorithm was applied
+            this->constraints   = constraints;   // Constraints indexes (in type-i-j format)
+            this->constraintsR0 = constraintsR0; // Euilibrium distances for each type of constraint
+            this->firstType     = firstType;     // The first type index used for constraints
+
+            // PBC initialization
+            this->epbc = epbc;
+            for (int i = 0; i < DIM; i++)
+            {
+                for (int j = 0; j < DIM; j++)
+                {
+                    this->box[i][j] = box[i][j]; // Periodic box
+                }
+            }
+            set_pbc(&pbc, epbc, box);
+
+            this->invdt  = 1.0/delta_t; // Inverse timestep
+
+            // Communication record
+            cr.nnodes = 1;
+            cr.dd     = nullptr;
+
+            // Input record - data that usualy comes from configurtion file (.mdp)
+            ir.efep           = 0;
+            ir.init_t         = init_t;
+            ir.delta_t        = delta_t;
+            ir.eI             = 0;
+
+            // MD atoms data
+            md.nMassPerturbed = 0;
+            md.lambda         = 0.0;
+            md.invmass        = invmass.data();
+            md.nr             = n;
+            md.homenr         = n;
+
+            // Constraints and their parameters in old data format (local topology)
+            for (int i = 0; i < F_NRE; i++)
+            {
+                idef.il[i].nr = 0;
+            }
+            idef.il[F_CONSTR].nr   = constraints.size();
+
+            snew(idef.il[F_CONSTR].iatoms, constraints.size());
+            int maxType = 0;
+            for (unsigned i = 0; i < constraints.size(); i++)
+            {
+                if (i % 3 == 0)
+                {
+                    if (maxType < constraints.at(i))
+                    {
+                        maxType = constraints.at(i);
+                    }
+                }
+                idef.il[F_CONSTR].iatoms[i] = constraints.at(i);
+            }
+            snew(idef.iparams, maxType + 1);
+            for (unsigned i = 0; i < constraints.size()/3; i++)
+            {
+                idef.iparams[constraints.at(3*i)].constr.dA = constraintsR0.at(constraints.at(3*i) - firstType);
+                idef.iparams[constraints.at(3*i)].constr.dB = constraintsR0.at(constraints.at(3*i) - firstType);
+            }
+
+
+            // Constraints and their parameters in new data format (global topology)
+            InteractionList ilist;
+            ilist.iatoms.resize(constraints.size());
+            for (unsigned i = 0; i < constraints.size(); i++)
+            {
+                ilist.iatoms.at(i) = constraints.at(i);
+            }
+            InteractionList ilistEmpty;
+            ilistEmpty.iatoms.resize(0);
+
+            gmx_moltype_t moltype;
+            moltype.atoms.nr             = n;
+            moltype.ilist.at(F_CONSTR)   = ilist;
+            moltype.ilist.at(F_CONSTRNC) = ilistEmpty;
+            mtop.moltype.push_back(moltype);
+
+            gmx_molblock_t molblock;
+            molblock.type = 0;
+            molblock.nmol = 1;
+            mtop.molblock.push_back(molblock);
+
+            mtop.natoms = n;
+            mtop.ffparams.iparams.resize(maxType + 1);
+            for (int i = 0; i <= maxType; i++)
+            {
+                mtop.ffparams.iparams.at(i) = idef.iparams[i];
+            }
+            mtop.bIntermolecularInteractions = false;
+
+            // Log file may be here. Redirect it somewhere usefull?
+            log = gmx_fio_open("constraintstest.log", "w");
+
+            // Set the coordinates in convinient format
+            snew(x, n);
+            snew(xprime, n);
+            snew(xprime2, n);
+
+            for (int i = 0; i < n; i++)
+            {
+                for (int j = 0; j < DIM; j++)
+                {
+                    x[i][j]      = coordinates.at(i)[j];
+                    xprime[i][j] = coordinates.at(i)[j];
+                }
+            }
+
+            // Velocities (not used)
+            snew(v, n);
+
+
+        }
+
+        /*! \brief
+         * This method initializes and applies LINCS constraints.
+         *
+         * \param[in] nLincsIter     Number of iterations used to compute the inverse matrix.
+         * \param[in] nProjOrder     The order for algorithm that adjusts the direction of the
+         *                           bond after constraints are applied.
+         * \param[in] LincsWarnAngle The value for the change in bond angle after which the
+         *                           program will issue a warning.
+         */
+        void applyConstraintsLincs(int nLincsIter, int nProjOrder, real LincsWarnAngle)
+        {
+
+            Lincs                *lincsd;
+            int                   maxwarn         = 100;
+            int                   warncount_lincs = 0;
+            ir.nLincsIter     = nLincsIter;
+            ir.nProjOrder     = nProjOrder;
+            ir.LincsWarnAngle = LincsWarnAngle;
+            gmx_omp_nthreads_set(emntLINCS, 1);
+
+            // Make blocka structure for faster LINCS setup
+            std::vector<t_blocka> at2con_mt;
+            at2con_mt.reserve(mtop.moltype.size());
+            for (const gmx_moltype_t &moltype : mtop.moltype)
+            {
+                // This function is in constr.cpp
+                at2con_mt.push_back(make_at2con(moltype,
+                                                mtop.ffparams.iparams,
+                                                flexibleConstraintTreatment(EI_DYNAMICS(ir.eI))));
+            }
+            // Initialie LINCS
+            lincsd = init_lincs(gmx_fio_getfp(log), mtop,
+                                nflexcon, at2con_mt,
+                                false,
+                                ir.nLincsIter, ir.nProjOrder);
+            set_lincs(idef, md, EI_DYNAMICS(ir.eI), &cr, lincsd);
+
+            // Evaluate constraints
+            bool bOK = constrain_lincs(false, ir, 0, lincsd, md,
+                                       &cr,
+                                       nullptr,
+                                       x, xprime, xprime2,
+                                       box, &pbc, md.lambda, dvdlambda,
+                                       invdt, v,
+                                       computeVirial, vir_r_m_dr,
+                                       gmx::ConstraintVariable::Positions, &nrnb,
+                                       maxwarn, &warncount_lincs);
+            EXPECT_TRUE(bOK) << "Something went wrong: LINCS returned false value.";
+            EXPECT_EQ(warncount_lincs, 0) << "There were warnings in LINCS.";
+            for (unsigned int i = 0; i < mtop.moltype.size(); i++)
+            {
+                sfree(at2con_mt.at(i).index);
+                sfree(at2con_mt.at(i).a);
+            }
+            done_lincs(lincsd);
+        }
+
+        /*! \brief
+         * Initialize and apply SHAKE constraints.
+         *
+         * \param[in] shake_tol      Target tolerance for SHAKE.
+         * \param[in] bShakeSOR      Use successive over-relaxation method for SHAKE iterative process.
+         *                           The general formula is:
+         *                              x_n+1 = (1-omega)*x_n + omega*f(x_n),
+         *                           where omega = 1 if SOR is off and may be < 1 if SOR is on.
+         *
+         */
+        void applyConstraintsShake(real shake_tol, gmx_bool bShakeSOR)
+        {
+
+            ir.shake_tol      = shake_tol;
+            ir.bShakeSOR      = bShakeSOR;
+
+            shakedata* shaked = shake_init();
+            make_shake_sblock_serial(shaked, &idef, md);
+            bool       bOK = constrain_shake(
+                        gmx_fio_getfp(log),
+                        shaked,
+                        invmass.data(),
+                        idef,
+                        ir,
+                        x,
+                        xprime,
+                        xprime2,
+                        &nrnb,
+                        md.lambda,
+                        dvdlambda,
+                        invdt,
+                        v,
+                        computeVirial,
+                        vir_r_m_dr,
+                        false,
+                        gmx::ConstraintVariable::Positions);
+            EXPECT_TRUE(bOK) << "Something went wrong: SHAKE returned false value.";
+            done_shake(shaked);  // Not yet implemented. We will have memory leaks without this.
+        }
+
+        /*! \brief
+         * The test on the final length of constrained bonds.
+         *
+         * Goes through all the constraints and checks if the final length of all the constraints is equal
+         * to the target lenght with provided tolerance.
+         *
+         * \param[in] tolerance                  Allowed tolerance in final lengths.
+         */
+
+        void checkConstrained(FloatingPointTolerance tolerance)
+        {
+
+            // Test if all the constraints are satisfied
+            for (unsigned c = 0; c < constraints.size()/3; c++)
+            {
+                real r0 = constraintsR0.at(constraints.at(3*c) - firstType);
+                int  i  = constraints.at(3*c + 1);
+                int  j  = constraints.at(3*c + 2);
+                rvec v0, v1;
+                real d0, d1;
+                if (this->epbc == epbcXYZ)
+                {
+                    pbc_dx_aiuc(&pbc, x[i], x[j], v0);
+                    pbc_dx_aiuc(&pbc, xprime[i], xprime[j], v1);
+                }
+                else
+                {
+                    rvec_sub(x[i], x[j], v0);
+                    rvec_sub(xprime[i], xprime[j], v1);
+                }
+                d0 = norm(v0);
+                d1 = norm(v1);
+                EXPECT_REAL_EQ_TOL(r0, d1, tolerance) << "rij = " << d1 << ", which is not equal to r0 = " << r0
+                << " for constraint #" << c << ", between atoms " << i << " and " << j
+                << " (before lincs rij was " << d0 << ").";
+            }
+        }
+
+        /*! \brief
+         * The test on the final coordinates.
+         *
+         * Goes through all atoms and checks if the final positions correspond to the
+         * provided reference set of coordinates.
+         *
+         * \param[in] finalCoordinates           The reference set of coordinates.
+         * \param[in] finalCoordinatesTolerance  Tolerance for the coordinaes test.
+         */
+        void checkFinalCoordinates(std::vector<RVec> finalCoordinates, FloatingPointTolerance finalCoordinatesTolerance)
+        {
+            for (int i = 0; i < n; i++)
+            {
+                for (int d = 0; d < DIM; d++)
+                {
+                    EXPECT_REAL_EQ_TOL(finalCoordinates.at(i)[d], xprime[i][d], finalCoordinatesTolerance) <<
+                    "Coordinates after constrains were applied differ from these in the reference set for atom #" << i << ".";
+                }
+            }
+        }
+
+
+    private:
+        int                   n;                            // Number of atoms
+        gmx_mtop_t            mtop;                         // Topology
+        std::vector<real>     invmass;                      // Inverse masses
+        int                   epbc;                         // PBC used (epbcNONE/epbcXYZ)
+        matrix                box;                          // PBC box
+        t_pbc                 pbc;                          // PBC object
+        t_commrec             cr;                           // Communication record
+        t_inputrec            ir;                           // Input record (info that usually in .mdp file)
+        t_idef                idef;                         // Local topology
+        t_mdatoms             md;                           // MD atoms
+        t_nrnb                nrnb;
+
+        real                  invdt         = 1.0/0.001;    // Inverse timestep
+        int                   nflexcon      = 0;            // Number of flexible constraints
+        real                 *dvdlambda     = nullptr;      // Free energy computation stub (not tested)
+        bool                  computeVirial = false;        // If the virials should be conputed (not tested)
+        tensor                vir_r_m_dr;                   // Virials stuff
+        rvec                 *x;                            // Coordinates before constraints are applied
+        rvec                 *xprime;                       // Coordinates after constraints are applied
+        rvec                 *xprime2;                      // Intermediate set of coordinates used by LINCS and
+                                                            // SHAKE for different purposes
+        rvec                 *v;                            // Velocities (can also be constrained, this is not tested)
+        t_fileio             *log;                          // log file (now set to "constraintstest.log")
+
+        // Fields to store constraints data for testing
+        int                   firstType;                    // First interaction type used for constraints
+        std::vector<int>      constraints;                  // Constraints data (type1-i1-j1-type2-i2-j2-...)
+        std::vector<real>     constraintsR0;                // Target lengths for al the constrain
+};
+
+/*
+ *
+ * Tests that the interatomic distance along constraints correspond to the reference distances.
+ * Performed on basic systems of up to four constaints.
+ *
+ */
+
+/*
+ * Simple bond test for SHAKE
+ */
+TEST_F(ConstraintsTest, ShakeOneBond)
+{
+
+    FloatingPointTolerance tolerance = relativeToleranceAsFloatingPoint(0.1, 0.0001);
+    initSystem(2, c_oneBondMasses,
+               c_oneBondConstraints, c_oneBondConstraintsR0, c_oneBondConstraintsFirstType,
+               epbcNONE, c_infinitesimalBox,
+               real(0.0), real(0.001), c_oneBondCoordinates);
+    applyConstraintsShake(0.0001, false);
+    checkConstrained(tolerance);
+}
+
+/*
+ * Simple bond test for LINCS
+ */
+TEST_F(ConstraintsTest, LincsOneBond)
+{
+
+    FloatingPointTolerance tolerance = relativeToleranceAsFloatingPoint(0.1, 0.0000002);
+    initSystem(2, c_oneBondMasses,
+               c_oneBondConstraints, c_oneBondConstraintsR0, c_oneBondConstraintsFirstType,
+               epbcNONE, c_infinitesimalBox,
+               real(0.0), real(0.001), c_oneBondCoordinates);
+    applyConstraintsLincs(1, 4, real(30.0));
+    checkConstrained(tolerance);
+}
+
+/*
+ * Two disjoint bonds test for SHAKE
+ */
+TEST_F(ConstraintsTest, ShakeTwoDisjointBonds)
+{
+
+    FloatingPointTolerance tolerance = relativeToleranceAsFloatingPoint(0.1, 0.000001);
+    initSystem(4, c_twoDJBondsMasses,
+               c_twoDJBondsConstraints, c_twoDJBondsConstraintsR0, c_twoDJBondsConstraintsFirstType,
+               epbcNONE, c_infinitesimalBox,
+               real(0.0), real(0.001), c_twoDJBondsCoordinates);
+
+    applyConstraintsShake(0.000001, true);
+    checkConstrained(tolerance);
+}
+
+/*
+ * Two disjoint bonds test for LINCS
+ */
+TEST_F(ConstraintsTest, LincsTwoDisjointBonds)
+{
+
+    FloatingPointTolerance tolerance = relativeToleranceAsFloatingPoint(0.1, 0.0000002);
+    initSystem(4, c_twoDJBondsMasses,
+               c_twoDJBondsConstraints, c_twoDJBondsConstraintsR0, c_twoDJBondsConstraintsFirstType,
+               epbcNONE, c_infinitesimalBox,
+               real(0.0), real(0.001), c_twoDJBondsCoordinates);
+
+    applyConstraintsLincs(1, 4, real(30.0));
+    checkConstrained(tolerance);
+}
+
+/*
+ * Two consequentive constraints test for SHAKE.
+ */
+TEST_F(ConstraintsTest, ShakeTwoBonds)
+{
+
+    FloatingPointTolerance tolerance = relativeToleranceAsFloatingPoint(0.1, 0.0001);
+    initSystem(3, c_twoBondsMasses,
+               c_twoBondsConstraints, c_twoBondsConstraintsR0, c_twoBondsConstraintsFirstType,
+               epbcNONE, c_infinitesimalBox,
+               real(0.0), real(0.001), c_twoBondsCoordinates);
+
+    applyConstraintsShake(0.0001, true);
+    checkConstrained(tolerance);
+}
+
+/*
+ * Two consequentive constraints test for LINCS.
+ */
+TEST_F(ConstraintsTest, LincsTwoBonds)
+{
+
+    FloatingPointTolerance tolerance = relativeToleranceAsFloatingPoint(0.1, 0.000001);
+    initSystem(3, c_twoBondsMasses,
+               c_twoBondsConstraints, c_twoBondsConstraintsR0, c_twoBondsConstraintsFirstType,
+               epbcNONE, c_infinitesimalBox,
+               real(0.0), real(0.001), c_twoBondsCoordinates);
+
+    applyConstraintsLincs(1, 4, real(30.0));
+    checkConstrained(tolerance);
+}
+
+/*
+ * Triangle of constraints test for SHAKE
+ */
+TEST_F(ConstraintsTest, ShakeTriangleOfBonds)
+{
+
+    FloatingPointTolerance tolerance = relativeToleranceAsFloatingPoint(0.1, 0.0001);
+    initSystem(3, c_triangleMasses,
+               c_triangleConstraints, c_triangleConstraintsR0, c_triangleConstraintsFirstType,
+               epbcNONE, c_infinitesimalBox,
+               real(0.0), real(0.001), c_triangleCoordinates);
+    applyConstraintsShake(0.0001, true);
+    checkConstrained(tolerance);
+}
+
+/*
+ * Triangle of constraints test for LINCS
+ */
+TEST_F(ConstraintsTest, LincsTriangleOfBonds)
+{
+
+    FloatingPointTolerance tolerance = relativeToleranceAsFloatingPoint(0.1, 0.0001);
+    initSystem(3, c_triangleMasses,
+               c_triangleConstraints, c_triangleConstraintsR0, c_triangleConstraintsFirstType,
+               epbcNONE, c_infinitesimalBox,
+               real(0.0), real(0.001), c_triangleCoordinates);
+    applyConstraintsLincs(4, 4, real(30.0));
+    checkConstrained(tolerance);
+}
+
+/*
+ * Three consecutive constraints test for SHAKE.
+ */
+TEST_F(ConstraintsTest, ShakeThreeConsequativeConstraints)
+{
+
+    FloatingPointTolerance tolerance = relativeToleranceAsFloatingPoint(0.1, 0.001);
+    initSystem(4, c_threeBondsMasses,
+               c_threeBondsConstraints, c_threeBondsConstraintsR0, c_threeBondsConstraintsFirstType,
+               epbcNONE, c_infinitesimalBox,
+               real(0.0), real(0.001), c_threeBondsCoordinates);
+    applyConstraintsShake(0.0001, true);
+    checkConstrained(tolerance);
+}
+
+/*
+ * Three consecutive constraints test for LINCS.
+ */
+TEST_F(ConstraintsTest, LincsThreeConsequativeConstraints)
+{
+
+    FloatingPointTolerance tolerance = relativeToleranceAsFloatingPoint(0.1, 0.001);
+    initSystem(4, c_threeBondsMasses,
+               c_threeBondsConstraints, c_threeBondsConstraintsR0, c_threeBondsConstraintsFirstType,
+               epbcNONE, c_infinitesimalBox,
+               real(0.0), real(0.001), c_threeBondsCoordinates);
+    applyConstraintsLincs(4, 4, real(30.0));
+    checkConstrained(tolerance);
+}
+
+
+/*
+ *
+ * Tests of both final interatomic distances and final coordinates.
+ * Peformed on the peptide Cys-Val-Trp, with constraints along HBonds,
+ * AllBonds (for both SHAKE and LINCS), HAngles and AllAlngles (for
+ * SHAKE only).
+ */
+
+/*
+ * All bonds that involve hydrogen atom (HBonds) are constrained by SHAKE. Both final length
+ * of each constraint and final coordinates for each atom are tested.
+ */
+TEST_F(ConstraintsTest, ShakeCysValTrpHBonds)
+{
+
+    FloatingPointTolerance tolerance            = relativeToleranceAsFloatingPoint(0.1, 0.0001);
+    FloatingPointTolerance coordinatesTolerance = absoluteTolerance(0.0001);
+
+    initSystem(54, c_cvwMasses,
+               c_cvwHBondsConstraints, c_cvwHBondsConstraintsR0, c_cvwHBondsConstraintsFirstType,
+               epbcXYZ, c_cvwBox,
+               real(0.0), real(0.001), c_cvwInitialCoordinates);
+    applyConstraintsShake(0.0001, true);
+    checkConstrained(tolerance);
+    checkFinalCoordinates(c_cvwFinalCoordinatesHBonds, coordinatesTolerance);
+}
+
+/*
+ * All bonds that involve hydrogen atom (HBonds) are constrained by LINCS. Both final length
+ * of each constraint and final coordinates for each atom are tested.
+ */
+TEST_F(ConstraintsTest, LincsCysValTrpHBonds)
+{
+
+    FloatingPointTolerance tolerance            = relativeToleranceAsFloatingPoint(0.1, 0.00001);
+    FloatingPointTolerance coordinatesTolerance = absoluteTolerance(0.0001);
+
+    initSystem(54, c_cvwMasses,
+               c_cvwHBondsConstraints, c_cvwHBondsConstraintsR0, c_cvwHBondsConstraintsFirstType,
+               epbcXYZ, c_cvwBox,
+               real(0.0), real(0.001), c_cvwInitialCoordinates);
+    applyConstraintsLincs(1, 4, real(30.0));
+    checkConstrained(tolerance);
+    checkFinalCoordinates(c_cvwFinalCoordinatesHBonds, coordinatesTolerance);
+}
+
+/*
+ * All bonds are constrained by SHAKE. Both final length of each constraint and final coordinates
+ * for each atom are tested.
+ */
+TEST_F(ConstraintsTest, ShakeCysValTrpAllBonds)
+{
+
+    FloatingPointTolerance tolerance            = relativeToleranceAsFloatingPoint(0.1, 0.0001);
+    FloatingPointTolerance coordinatesTolerance = absoluteTolerance(0.001);
+
+    initSystem(54, c_cvwMasses,
+               c_cvwAllBondsConstraints, c_cvwAllBondsConstraintsR0, c_cvwAllBondsConstraintsFirstType,
+               epbcXYZ, c_cvwBox,
+               real(0.0), real(0.001), c_cvwInitialCoordinates);
+    applyConstraintsShake(0.0001, true);
+    checkConstrained(tolerance);
+    checkFinalCoordinates(c_cvwFinalCoordinatesAllBonds, coordinatesTolerance);
+}
+
+/*
+ * All bonds are constrained by LINCS. Both final length of each constraint and final coordinates
+ * for each atom are tested.
+ */
+TEST_F(ConstraintsTest, LincsCysValTrpAllBonds)
+{
+
+    FloatingPointTolerance tolerance            = relativeToleranceAsFloatingPoint(0.1, 0.0001);
+    FloatingPointTolerance coordinatesTolerance = absoluteTolerance(0.001);
+
+    initSystem(54, c_cvwMasses,
+               c_cvwAllBondsConstraints, c_cvwAllBondsConstraintsR0, c_cvwAllBondsConstraintsFirstType,
+               epbcXYZ, c_cvwBox,
+               real(0.0), real(0.001), c_cvwInitialCoordinates);
+    applyConstraintsLincs(4, 4, real(30.0));
+    checkConstrained(tolerance);
+    checkFinalCoordinates(c_cvwFinalCoordinatesAllBonds, coordinatesTolerance);
+}
+
+/*
+ * H angles and all bonds are constrained by SHAKE. Only final lengths of constraints are tested.
+ */
+TEST_F(ConstraintsTest, ShakeCysValTrpHAngles)
+{
+
+    FloatingPointTolerance tolerance            = relativeToleranceAsFloatingPoint(0.1, 0.0001);
+
+    initSystem(54, c_cvwMasses,
+               c_cvwHAnglesConstraints, c_cvwHAnglesConstraintsR0, c_cvwHAnglesConstraintsFirstType,
+               epbcXYZ, c_cvwBox,
+               real(0.0), real(0.001), c_cvwInitialCoordinates);
+    applyConstraintsShake(0.0001, true);
+    checkConstrained(tolerance);
+}
+
+/*
+ * All angles and all bonds are constrained by SHAKE. Only final lengths of constraints are tested.
+ */
+/*TEST_F(ConstraintsTest, ShakeCysValTrpAllAngles)
+   {
+
+    FloatingPointTolerance tolerance            = relativeToleranceAsFloatingPoint(0.1, 0.001);
+
+    initSystem(54, c_cvwMasses,
+               c_cvwAllAnglesConstraints, c_cvwAllAnglesConstraintsR0, c_cvwAllAnglesConstraintsFirstType,
+               epbcXYZ, c_cvwBox,
+               real(0.0), real(0.001), c_cvwInitialCoordinates);
+    applyConstraintsShake(0.000001, true);
+    checkConstrained(tolerance);
+   }
+ */
+} // namespace test
+} // namespace gmx
diff --git a/src/gromacs/mdlib/tests/constrdata.h b/src/gromacs/mdlib/tests/constrdata.h
new file mode 100644 (file)
index 0000000..72c3576
--- /dev/null
@@ -0,0 +1,492 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2018, 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 Data used by LINCS tests.
+ *
+ * \author Artem Zhmurov <zhmurov@gmail.com>
+ * \ingroup module_mdlib
+ */
+
+#include "gromacs/math/vectypes.h"
+
+namespace gmx
+{
+
+namespace test
+{
+
+//! A box with zero sides to check if PBC are actually disabled.
+static const matrix c_infinitesimalBox = { {0, 0, 0}, {0, 0, 0}, {0, 0, 0} };
+
+/*
+ * System of two connected atoms.
+ */
+//! System of two connected atoms: one constraint (type, i, j).
+static const std::vector<int>  c_oneBondConstraints( {0, 0, 1} );
+//! System of two connected atoms: equilibrium distance.
+static const std::vector<real> c_oneBondConstraintsR0( {0.1} );
+//! System of two connected atoms: starting type id for constraints.
+static const int               c_oneBondConstraintsFirstType = 0;
+//! System of two connected atoms: coordinates.
+static const std::vector<RVec> c_oneBondCoordinates(
+        {{
+             {  0.10, -0.13,  0.05 },
+             { -0.13,  0.05, -0.10 }
+         }} );
+//! System of two connected atoms: masses.
+static const std::vector<real> c_oneBondMasses ( {1.0, 12.0} );
+
+/*
+ * Two disjoint bonds (taken from the SHAKE test).
+ */
+//! Two disjoint bonds: two constraint (type1, i1, j1, type2, i2, j2).
+static const std::vector<int>  c_twoDJBondsConstraints( {0, 0, 1, 1, 2, 3} );
+//! Two disjoint bonds: equilibrium distances.
+static const std::vector<real> c_twoDJBondsConstraintsR0( {2.0, 1.0} );
+//! Two disjoint bonds: starting type id for constraints.
+static const int               c_twoDJBondsConstraintsFirstType = 0;
+//! Two disjoint bonds: coordinates.
+static const std::vector<RVec> c_twoDJBondsCoordinates(
+        {{
+             {  2.50, -3.10, 15.70 },
+             {  0.51, -3.02, 15.55 },
+             { -0.50, -3.00, 15.20 },
+             { -1.51, -2.95, 15.05 }
+         }} );
+//! Two disjoint bonds: masses.
+static const std::vector<real> c_twoDJBondsMasses ( {0.5, 1.0/3.0, 0.25, 1.0} );
+
+
+/*
+ * Three atoms, connected longitudaly.
+ */
+//! Three atoms, connected longitudaly: two constraints (type1, i1, j1, type2, i2, j2).
+static const std::vector<int>  c_twoBondsConstraints( {0, 0, 1, 1, 1, 2} );
+//! Three atoms, connected longitudaly: two distances.
+static const std::vector<real> c_twoBondsConstraintsR0( {0.1, 0.2} );
+//! Three atoms, connected longitudaly: starting type id for constraints.
+static const int               c_twoBondsConstraintsFirstType = 0;
+//! Three atoms, connected longitudaly: coordinates.
+static const std::vector<RVec> c_twoBondsCoordinates(
+        {{
+             {  0.08, 0.05,  0.01 },
+             { -0.02, 0.03, -0.02 },
+             {  0.14, 0.02,  0.01 }
+         }} );
+//! Three atoms, connected longitudaly: masses.
+static const std::vector<real> c_twoBondsMasses ( {1.0, 12.0, 16.0 } );
+
+/*
+ * Four atoms, connected longitudaly (taken from SHAKE test).
+ */
+//! Four atoms, connected longitudaly: two constraints (type1, i1, j1, type2, i2, j2).
+static const std::vector<int>  c_threeBondsConstraints( {0, 0, 1, 1, 1, 2, 2, 2, 3} );
+//! Four atoms, connected longitudaly: two distances.
+static const std::vector<real> c_threeBondsConstraintsR0( {2.0, 1.0, 1.0} );
+//! Four atoms, connected longitudaly: starting type id for constraints.
+static const int               c_threeBondsConstraintsFirstType = 0;
+//! Four atoms, connected longitudaly: coordinates.
+static const std::vector<RVec> c_threeBondsCoordinates(
+        {{
+             {  2.50, -3.10, 15.70 },
+             {  0.51, -3.02, 15.55 },
+             { -0.50, -3.00, 15.20 },
+             { -1.51, -2.95, 15.05 }
+         }} );
+//! Four atoms, connected longitudaly: masses.
+static const std::vector<real> c_threeBondsMasses ( {0.5, 1.0/3.0, 0.25, 1.0} );
+
+/*
+ * Basic triangle (tree atoms, connected with each other).
+ */
+//! Basic triangle: three constraints (type1, i1, j1, type2, i2, j2, type3, i3, j3).
+static const std::vector<int>  c_triangleConstraints( {0, 0, 1, 2, 0, 2, 1, 1, 2} );
+//! Basic triangle: euilibrium distances.
+static const std::vector<real> c_triangleConstraintsR0( {0.1, 0.1, 0.1} );
+//! Basic triangle: starting type id for constraints.
+static const int               c_triangleConstraintsFirstType = 0;
+//! Basic triangle: coordinates.
+static const std::vector<RVec> c_triangleCoordinates(
+        {{
+             {  0.09, -0.02,  0.01 },
+             { -0.02,  0.10, -0.02 },
+             {  0.03, -0.01,  0.07 }
+         }} );
+//! Basic triangle: masses.
+static const std::vector<real> c_triangleMasses ( {1.0, 1.0, 1.0} );
+
+
+
+/*
+ * Real-life system: Cys-Val-Trp peptide.
+ */
+//! CVW peptide: periodic box.
+static const matrix c_cvwBox = {{real(2.570950), 0, 0}, {0, real(2.570950), 0}, {0, 0, real(2.570950)}};
+
+
+/*
+ * Constraints only on covalent bonds with hydrogens.
+ */
+//! CVW peptide: constraints on bonds with hydrogens (type1, i1, j1, type2, i2, j2,...).
+static const std::vector<int> c_cvwHBondsConstraints(
+        {465,  0,  1, 465,  0,  2, 465,  0,  3, 466,  4,  5, 467,  6,  7, 467,  6,  8, 468,  9, 10, 469, 13, 14,
+         466, 15, 16, 467, 17, 18, 467, 19, 20, 467, 19, 21, 467, 19, 22, 467, 23, 24, 467, 23, 25, 467, 23, 26,
+         469, 29, 30, 466, 31, 32, 467, 33, 34, 467, 33, 35, 466, 37, 38, 470, 39, 40, 466, 43, 44, 466, 45, 46,
+         466, 47, 48, 466, 49, 50} );
+//! CVW peptide: equilibrium distances (one for each type of HBond).
+static const std::vector<real> c_cvwHBondsConstraintsR0(
+        {0.104000, 0.108000, 0.111100, 0.132500, 0.099700, 0.097600} );
+//! CVW peptide: first type id used for constraints when HBonds are constrained.
+static const int c_cvwHBondsConstraintsFirstType = 465;
+
+
+/*
+ *  Constraints on all covalent bonds.
+ */
+//! CVW peptide: constraints on all bonds (type1, i1, j1, type2, i2, j2,...).
+static const std::vector<int> c_cvwAllBondsConstraints(
+        {447,  0,  1, 447,  0,  2, 447,  0,  3, 448,  0,  4, 449,  4,  5, 450,  4,  6, 451,  4, 11, 452,  6,  7,
+         452,  6,  8, 453,  6,  9, 454,  9, 10, 455, 11, 12, 456, 11, 13, 457, 13, 14, 458, 13, 15, 449, 15, 16,
+         459, 15, 17, 451, 15, 27, 452, 17, 18, 450, 17, 19, 450, 17, 23, 452, 19, 20, 452, 19, 21, 452, 19, 22,
+         452, 23, 24, 452, 23, 25, 452, 23, 26, 455, 27, 28, 456, 27, 29, 457, 29, 30, 458, 29, 31, 449, 31, 32,
+         450, 31, 33, 460, 31, 51, 452, 33, 34, 452, 33, 35, 461, 33, 36, 462, 36, 37, 463, 36, 42, 449, 37, 38,
+         464, 37, 39, 465, 39, 40, 466, 39, 41, 467, 41, 42, 468, 41, 47, 468, 42, 43, 449, 43, 44, 466, 43, 45,
+         449, 45, 46, 466, 45, 49, 449, 47, 48, 466, 47, 49, 449, 49, 50, 469, 51, 52, 469, 51, 53} );
+//! CVW peptide: equilibrium distances (one for each type of bond).
+static const std::vector<real> c_cvwAllBondsConstraintsR0(
+        {0.104000, 0.148000, 0.108000, 0.153800, 0.149000, 0.111100, 0.181800, 0.132500, 0.123000, 0.134500,
+         0.099700, 0.143000, 0.150000, 0.152200, 0.151000, 0.136500, 0.144000, 0.137000, 0.097600, 0.137500,
+         0.140000, 0.136800, 0.126000} );
+//! CVW peptide: first type id used for constraints when all bonds are constrained.
+static const int c_cvwAllBondsConstraintsFirstType = 447;
+
+
+/*
+ *  Constraints on all covalent bonds and all angles with hydrogens.
+ */
+//! CVW peptide: constraints on angles with hydrogens and all bonds (type1, i1, j1, type2, i2, j2,...).
+static const std::vector<int> c_cvwHAnglesConstraints(
+        {444,  1,  2, 444,  1,  3, 444,  2,  3, 445,  7,  8, 446, 20, 21, 446, 20, 22, 446, 21, 22, 446, 24, 25,
+         446, 24, 26, 446, 25, 26, 445, 34, 35, 447,  0,  1, 447,  0,  2, 447,  0,  3, 448,  0,  4, 449,  4,  5,
+         450,  4,  6, 451,  4, 11, 452,  6,  7, 452,  6,  8, 453,  6,  9, 454,  9, 10, 455, 11, 12, 456, 11, 13,
+         457, 13, 14, 458, 13, 15, 449, 15, 16, 459, 15, 17, 451, 15, 27, 452, 17, 18, 450, 17, 19, 450, 17, 23,
+         452, 19, 20, 452, 19, 21, 452, 19, 22, 452, 23, 24, 452, 23, 25, 452, 23, 26, 455, 27, 28, 456, 27, 29,
+         457, 29, 30, 458, 29, 31, 449, 31, 32, 450, 31, 33, 460, 31, 51, 452, 33, 34, 452, 33, 35, 461, 33, 36,
+         462, 36, 37, 463, 36, 42, 449, 37, 38, 464, 37, 39, 465, 39, 40, 466, 39, 41, 467, 41, 42, 468, 41, 47,
+         468, 42, 43, 449, 43, 44, 466, 43, 45, 449, 45, 46, 466, 45, 49, 449, 47, 48, 466, 47, 49, 449, 49, 50,
+         469, 51, 52, 469, 51, 53} );
+//! CVW peptide: equilibrium distances (one for each type of constraint).
+static const std::vector<real> c_cvwHAnglesConstraintsR0(
+        {0.169861, 0.180896, 0.180218, 0.104000, 0.148000, 0.108000, 0.153800, 0.149000, 0.111100, 0.181800,
+         0.132500, 0.123000, 0.134500, 0.099700, 0.143000, 0.150000, 0.152200, 0.151000, 0.136500, 0.144000,
+         0.137000, 0.097600, 0.137500, 0.140000, 0.136800, 0.126000} );
+//! CVW peptide: first type id used.
+static const int c_cvwHAnglesConstraintsFirstType = 444;
+
+// Constrain all bonds and angles.
+//! CVW peptide: constraints on all angles and all bonds (type1, i1, j1, type2, i2, j2,...).
+static const std::vector<int> c_cvwAllAnglesConstraints(
+        {402,  1,  2, 403, 52, 53, 404, 31, 53, 404, 31, 52, 405, 47, 50, 405, 45, 50, 406, 45, 47, 405, 48, 49,
+         407, 41, 49, 408, 41, 48, 405, 46, 49, 406, 43, 49, 405, 43, 46, 405, 44, 45, 407, 42, 45, 408, 42, 44,
+         409, 41, 43, 410, 36, 43, 411, 36, 41, 409, 42, 47, 412, 39, 47, 413, 39, 42, 414, 40, 41, 415, 37, 41,
+         416, 37, 40, 417, 38, 39, 418, 36, 39, 419, 36, 38, 420, 37, 42, 421, 33, 42, 422, 33, 37, 423, 35, 36,
+         423, 34, 36, 424, 34, 35, 425, 31, 36, 426, 31, 35, 426, 31, 34, 427, 33, 51, 428, 32, 51, 429, 32, 33,
+         430, 29, 51, 431, 29, 33, 432, 29, 32, 433, 30, 31, 434, 27, 31, 435, 27, 30, 436, 28, 29, 437, 15, 29,
+         438, 15, 28, 439, 25, 26, 439, 24, 26, 439, 24, 25, 426, 17, 26, 426, 17, 25, 426, 17, 24, 439, 21, 22,
+         439, 20, 22, 439, 20, 21, 426, 17, 22, 426, 17, 21, 426, 17, 20, 440, 19, 23, 441, 18, 23, 441, 18, 19,
+         442, 15, 23, 442, 15, 19, 443, 15, 18, 444, 17, 27, 445, 16, 27, 446, 16, 17, 447, 13, 27, 448, 13, 17,
+         432, 13, 16, 433, 14, 15, 434, 11, 15, 435, 11, 14, 436, 12, 13, 437,  4, 13, 438,  4, 12, 449,  6, 10,
+         450,  8,  9, 450,  7,  9, 424,  7,  8, 451,  4,  9, 426,  4,  8, 426,  4,  7, 452,  6, 11, 445,  5, 11,
+         429,  5,  6, 453,  0, 11, 454,  0,  6, 455,  0,  5, 456,  3,  4, 456,  2,  4, 402,  2,  3, 456,  1,  4,
+         402,  1,  3, 457,  0,  1, 457,  0,  2, 457,  0,  3, 458,  0,  4, 459,  4,  5, 460,  4,  6, 461,  4, 11,
+         462,  6,  7, 462,  6,  8, 463,  6,  9, 464,  9, 10, 465, 11, 12, 466, 11, 13, 467, 13, 14, 468, 13, 15,
+         459, 15, 16, 469, 15, 17, 461, 15, 27, 462, 17, 18, 460, 17, 19, 460, 17, 23, 462, 19, 20, 462, 19, 21,
+         462, 19, 22, 462, 23, 24, 462, 23, 25, 462, 23, 26, 465, 27, 28, 466, 27, 29, 467, 29, 30, 468, 29, 31,
+         459, 31, 32, 460, 31, 33, 470, 31, 51, 462, 33, 34, 462, 33, 35, 471, 33, 36, 472, 36, 37, 473, 36, 42,
+         459, 37, 38, 474, 37, 39, 475, 39, 40, 476, 39, 41, 477, 41, 42, 478, 41, 47, 478, 42, 43, 459, 43, 44,
+         476, 43, 45, 459, 45, 46, 476, 45, 49, 459, 47, 48, 476, 47, 49, 459, 49, 50, 479, 51, 52, 479, 51, 53} );
+//! CVW peptide: equilibrium distances (one for each type of constraint).
+static const std::vector<real> c_cvwAllAnglesConstraintsR0(
+        {0.169861, 0.222503, 0.238845, 0.213120, 0.238157, 0.235121, 0.214562, 0.242100, 0.255127, 0.228896,
+         0.249204, 0.223650, 0.210257, 0.222075, 0.209794, 0.217730, 0.224038, 0.217273, 0.226106, 0.260490,
+         0.259998, 0.215277, 0.180896, 0.255631, 0.218499, 0.247561, 0.214016, 0.217310, 0.237362, 0.248280,
+         0.204103, 0.208169, 0.240360, 0.206488, 0.225825, 0.241196, 0.237083, 0.180218, 0.257975, 0.218499,
+         0.246566, 0.215168, 0.241897, 0.211207, 0.213951, 0.234753, 0.245062, 0.234108, 0.245088, 0.279474,
+         0.244987, 0.243289, 0.247242, 0.207800, 0.207355, 0.104000, 0.148000, 0.108000, 0.153800, 0.149000,
+         0.111100, 0.181800, 0.132500, 0.123000, 0.134500, 0.099700, 0.143000, 0.150000, 0.152200, 0.151000,
+         0.136500, 0.144000, 0.137000, 0.097600, 0.137500, 0.140000, 0.136800, 0.126000} );
+//! CVW peptide: first type id used.
+static const int c_cvwAllAnglesConstraintsFirstType = 402;
+
+
+//! Coordinates of all 54 atoms of the Cys-Val-Trp system before constraints were applied
+static const std::vector<RVec> c_cvwInitialCoordinates(
+        {{
+             { 1.746000, 1.404000, 1.052000 },
+             { 1.806000, 1.450000, 0.979000 },
+             { 1.672000, 1.473000, 1.086000 },
+             { 1.814000, 1.368000, 1.123000 },
+             { 1.681000, 1.283000, 0.992000 },
+             { 1.612000, 1.309000, 0.913000 },
+             { 1.801000, 1.204000, 0.919000 },
+             { 1.772000, 1.100000, 0.896000 },
+             { 1.814000, 1.266000, 0.827000 },
+             { 1.974000, 1.193000, 0.998000 },
+             { 2.058000, 1.204000, 0.896000 },
+             { 1.594000, 1.204000, 1.095000 },
+             { 1.568000, 1.083000, 1.091000 },
+             { 1.533000, 1.270000, 1.201000 },
+             { 1.540000, 1.372000, 1.213000 },
+             { 1.458000, 1.206000, 1.310000 },
+             { 1.457000, 1.094000, 1.307000 },
+             { 1.532000, 1.230000, 1.433000 },
+             { 1.527000, 1.340000, 1.449000 },
+             { 1.478000, 1.148000, 1.544000 },
+             { 1.544000, 1.157000, 1.633000 },
+             { 1.378000, 1.176000, 1.581000 },
+             { 1.461000, 1.043000, 1.518000 },
+             { 1.685000, 1.181000, 1.411000 },
+             { 1.747000, 1.243000, 1.345000 },
+             { 1.730000, 1.190000, 1.515000 },
+             { 1.688000, 1.075000, 1.377000 },
+             { 1.312000, 1.253000, 1.324000 },
+             { 1.268000, 1.367000, 1.318000 },
+             { 1.224000, 1.149000, 1.344000 },
+             { 1.264000, 1.058000, 1.349000 },
+             { 1.095000, 1.170000, 1.405000 },
+             { 1.103000, 1.263000, 1.454000 },
+             { 0.975000, 1.166000, 1.297000 },
+             { 1.025000, 1.113000, 1.214000 },
+             { 0.887000, 1.110000, 1.333000 },
+             { 0.924000, 1.306000, 1.265000 },
+             { 0.952000, 1.386000, 1.165000 },
+             { 1.017000, 1.361000, 1.079000 },
+             { 0.882000, 1.507000, 1.174000 },
+             { 0.911000, 1.589000, 1.129000 },
+             { 0.819000, 1.515000, 1.296000 },
+             { 0.840000, 1.389000, 1.355000 },
+             { 0.777000, 1.364000, 1.480000 },
+             { 0.785000, 1.264000, 1.522000 },
+             { 0.698000, 1.458000, 1.538000 },
+             { 0.640000, 1.433000, 1.626000 },
+             { 0.746000, 1.617000, 1.350000 },
+             { 0.719000, 1.711000, 1.307000 },
+             { 0.682000, 1.582000, 1.472000 },
+             { 0.631000, 1.668000, 1.515000 },
+             { 1.070000, 1.060000, 1.508000 },
+             { 1.150000, 0.960000, 1.515000 },
+             { 0.966000, 1.066000, 1.569000 }
+         }});
+
+//! Coordinates of 54 atoms of the Cys-Val-Trp system after H-Bonds were constrained
+static const std::vector<RVec> c_cvwFinalCoordinatesHBonds(
+        {{
+             { 1.745950, 1.404137, 1.052042 },
+             { 1.805376, 1.449522, 0.979759 },
+             { 1.673804, 1.471318, 1.085171 },
+             { 1.813515, 1.368257, 1.122494 },
+             { 1.680997, 1.283001, 0.991996 },
+             { 1.612038, 1.308986, 0.913044 },
+             { 1.801019, 1.204075, 0.918974 },
+             { 1.771832, 1.099398, 0.895867 },
+             { 1.813938, 1.265703, 0.827441 },
+             { 1.974002, 1.193000, 0.997998 },
+             { 2.057943, 1.203992, 0.896070 },
+             { 1.594000, 1.204000, 1.095000 },
+             { 1.568000, 1.083000, 1.091000 },
+             { 1.533015, 1.270216, 1.201025 },
+             { 1.539794, 1.369004, 1.212648 },
+             { 1.457997, 1.205687, 1.309992 },
+             { 1.457033, 1.097730, 1.307100 },
+             { 1.531999, 1.230013, 1.433002 },
+             { 1.527007, 1.339845, 1.448977 },
+             { 1.478082, 1.148102, 1.544007 },
+             { 1.543998, 1.157000, 1.632997 },
+             { 1.377262, 1.176207, 1.581273 },
+             { 1.460769, 1.041573, 1.517647 },
+             { 1.685022, 1.180937, 1.411234 },
+             { 1.747673, 1.243673, 1.344284 },
+             { 1.729067, 1.189813, 1.512844 },
+             { 1.687993, 1.075258, 1.377083 },
+             { 1.312000, 1.253000, 1.324000 },
+             { 1.268000, 1.367000, 1.318000 },
+             { 1.223995, 1.149011, 1.343999 },
+             { 1.264064, 1.057854, 1.349008 },
+             { 1.094985, 1.169824, 1.404907 },
+             { 1.103180, 1.265097, 1.455105 },
+             { 0.975024, 1.166056, 1.297020 },
+             { 1.025283, 1.112700, 1.213531 },
+             { 0.886430, 1.109637, 1.333233 },
+             { 0.924000, 1.306000, 1.265000 },
+             { 0.952121, 1.385953, 1.164840 },
+             { 1.015558, 1.361555, 1.080908 },
+             { 0.882007, 1.507018, 1.173990 },
+             { 0.910909, 1.588743, 1.129141 },
+             { 0.819000, 1.515000, 1.296000 },
+             { 0.840000, 1.389000, 1.355000 },
+             { 0.777004, 1.363946, 1.480023 },
+             { 0.784949, 1.264642, 1.521730 },
+             { 0.697987, 1.457994, 1.538020 },
+             { 0.640158, 1.433068, 1.625761 },
+             { 0.746023, 1.616921, 1.350036 },
+             { 0.718729, 1.711945, 1.306568 },
+             { 0.681970, 1.582051, 1.472026 },
+             { 0.631363, 1.667388, 1.514694 },
+             { 1.070000, 1.060000, 1.508000 },
+             { 1.150000, 0.960000, 1.515000 },
+             { 0.966000, 1.066000, 1.569000 }
+         }});
+
+//! Coordinates of 54 atoms of the Cys-Val-Trp system after all bonds were constrained
+static const std::vector<RVec> c_cvwFinalCoordinatesAllBonds(
+        {{
+             { 1.744192, 1.400876, 1.050408 },
+             { 1.804620, 1.448942, 0.980679 },
+             { 1.674799, 1.470390, 1.084714 },
+             { 1.812763, 1.368655, 1.121708 },
+             { 1.683948, 1.276865, 0.996242 },
+             { 1.616170, 1.307429, 0.917774 },
+             { 1.803010, 1.207954, 0.927155 },
+             { 1.773417, 1.105083, 0.897124 },
+             { 1.813404, 1.263159, 0.831216 },
+             { 1.970550, 1.193223, 0.996389 },
+             { 2.057327, 1.203912, 0.896817 },
+             { 1.595071, 1.207624, 1.094104 },
+             { 1.568932, 1.087338, 1.091143 },
+             { 1.533602, 1.264980, 1.199359 },
+             { 1.539437, 1.363790, 1.212034 },
+             { 1.455744, 1.209606, 1.306025 },
+             { 1.457067, 1.101535, 1.307202 },
+             { 1.536585, 1.230178, 1.430802 },
+             { 1.527027, 1.339398, 1.448912 },
+             { 1.477277, 1.146856, 1.545698 },
+             { 1.544449, 1.157061, 1.633605 },
+             { 1.376383, 1.176453, 1.581598 },
+             { 1.460628, 1.040705, 1.517432 },
+             { 1.681448, 1.182094, 1.411715 },
+             { 1.746716, 1.242717, 1.345302 },
+             { 1.728696, 1.189739, 1.511987 },
+             { 1.687955, 1.076581, 1.377507 },
+             { 1.313454, 1.250569, 1.323999 },
+             { 1.268736, 1.365093, 1.318100 },
+             { 1.224082, 1.152044, 1.344591 },
+             { 1.262989, 1.060300, 1.348874 },
+             { 1.093660, 1.168520, 1.401086 },
+             { 1.102950, 1.262423, 1.453696 },
+             { 0.977797, 1.168815, 1.299821 },
+             { 1.024283, 1.113760, 1.215191 },
+             { 0.888605, 1.111021, 1.332343 },
+             { 0.921772, 1.305848, 1.269492 },
+             { 0.951364, 1.387941, 1.164422 },
+             { 1.015236, 1.361678, 1.081333 },
+             { 0.882251, 1.505804, 1.174960 },
+             { 0.910507, 1.587606, 1.129765 },
+             { 0.819059, 1.513487, 1.296914 },
+             { 0.840064, 1.387880, 1.355340 },
+             { 0.778667, 1.365803, 1.475722 },
+             { 0.784710, 1.267623, 1.520478 },
+             { 0.698397, 1.459946, 1.535866 },
+             { 0.641444, 1.433622, 1.623810 },
+             { 0.745363, 1.614637, 1.352384 },
+             { 0.719425, 1.709521, 1.307677 },
+             { 0.683959, 1.580100, 1.470510 },
+             { 0.632793, 1.664977, 1.513489 },
+             { 1.072860, 1.060117, 1.505945 },
+             { 1.149574, 0.960533, 1.514963 },
+             { 0.964441, 1.066090, 1.569914 }
+         }});
+
+//! Masses of atoms in the Cys-Val-Trp system
+static const std::vector<real> c_cvwMasses ( {
+                                                 14.007000,
+                                                 1.008000,
+                                                 1.008000,
+                                                 1.008000,
+                                                 12.011000,
+                                                 1.008000,
+                                                 12.011000,
+                                                 1.008000,
+                                                 1.008000,
+                                                 32.060001,
+                                                 1.008000,
+                                                 12.011000,
+                                                 15.999000,
+                                                 14.007000,
+                                                 1.008000,
+                                                 12.011000,
+                                                 1.008000,
+                                                 12.011000,
+                                                 1.008000,
+                                                 12.011000,
+                                                 1.008000,
+                                                 1.008000,
+                                                 1.008000,
+                                                 12.011000,
+                                                 1.008000,
+                                                 1.008000,
+                                                 1.008000,
+                                                 12.011000,
+                                                 15.999000,
+                                                 14.007000,
+                                                 1.008000,
+                                                 12.011000,
+                                                 1.008000,
+                                                 12.011000,
+                                                 1.008000,
+                                                 1.008000,
+                                                 12.011000,
+                                                 12.011000,
+                                                 1.008000,
+                                                 14.007000,
+                                                 1.008000,
+                                                 12.011000,
+                                                 12.011000,
+                                                 12.011000,
+                                                 1.008000,
+                                                 12.011000,
+                                                 1.008000,
+                                                 12.011000,
+                                                 1.008000,
+                                                 12.011000,
+                                                 1.008000,
+                                                 12.011000,
+                                                 15.999400,
+                                                 15.999400
+                                             } );
+
+
+}  // namespace test
+
+}  // namespace gmx
index e52e74c137518f39241d8f138c7b27d33c2d39ab..f2df57562accd5d07ceb1b0e3ac4de88fc88e01d 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
 #include "gromacs/utility/futil.h"
 #include "gromacs/utility/smalloc.h"
 
-static void init_grptcstat(int ngtc, t_grp_tcstat tcstat[])
-{
-    int i;
-
-    for (i = 0; (i < ngtc); i++)
-    {
-        tcstat[i].T = 0;
-        clear_mat(tcstat[i].ekinh);
-        clear_mat(tcstat[i].ekinh_old);
-        clear_mat(tcstat[i].ekinf);
-    }
-}
-
 static void init_grpstat(const gmx_mtop_t *mtop, int ngacc, t_grp_acc gstat[])
 {
-    const gmx_groups_t     *groups;
-    gmx_mtop_atomloop_all_t aloop;
-    int                     i, grp;
-    const t_atom           *atom;
-
     if (ngacc > 0)
     {
-        groups = &mtop->groups;
-        aloop  = gmx_mtop_atomloop_all_init(mtop);
-        while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
+        const gmx_groups_t    &groups = mtop->groups;
+        for (const AtomProxy &atomP : AtomRange(*mtop))
         {
-            grp = getGroupType(groups, egcACC, i);
+            const t_atom &local = atomP.atom();
+            int           i     = atomP.globalAtomNumber();
+            int           grp   = getGroupType(groups, egcACC, i);
             if ((grp < 0) && (grp >= ngacc))
             {
                 gmx_incons("Input for acceleration groups wrong");
             }
             gstat[grp].nat++;
             /* This will not work for integrator BD */
-            gstat[grp].mA += atom->m;
-            gstat[grp].mB += atom->mB;
+            gstat[grp].mA += local.m;
+            gstat[grp].mB += local.mB;
         }
     }
 }
@@ -109,8 +92,7 @@ void init_ekindata(FILE gmx_unused *log, const gmx_mtop_t *mtop, const t_grpopts
     ekind->bNEMD = (opts->ngacc > 1 || norm2(opts->acc[0]) > 0);
 
     ekind->ngtc = opts->ngtc;
-    snew(ekind->tcstat, opts->ngtc);
-    init_grptcstat(opts->ngtc, ekind->tcstat);
+    ekind->tcstat.resize(opts->ngtc);
     /* Set Berendsen tcoupl lambda's to 1,
      * so runs without Berendsen coupling are not affected.
      */
@@ -122,8 +104,8 @@ void init_ekindata(FILE gmx_unused *log, const gmx_mtop_t *mtop, const t_grpopts
         ekind->tcstat[i].ekinscalef_nhc = 1.0;
     }
 
-    nthread = gmx_omp_nthreads_get(emntUpdate);
-
+    nthread         = gmx_omp_nthreads_get(emntUpdate);
+    ekind->nthreads = nthread;
     snew(ekind->ekin_work_alloc, nthread);
     snew(ekind->ekin_work, nthread);
     snew(ekind->dekindl_work, nthread);
@@ -151,8 +133,8 @@ void init_ekindata(FILE gmx_unused *log, const gmx_mtop_t *mtop, const t_grpopts
     }
 
     ekind->ngacc = opts->ngacc;
-    snew(ekind->grpstat, opts->ngacc);
-    init_grpstat(mtop, opts->ngacc, ekind->grpstat);
+    ekind->grpstat.resize(opts->ngacc);
+    init_grpstat(mtop, opts->ngacc, ekind->grpstat.data());
 }
 
 void accumulate_u(const t_commrec *cr, const t_grpopts *opts, gmx_ekindata_t *ekind)
index af0e485c75713fe5e221bf3fcb09213a955b8671..e6f39df9bc17b0f77db5e4b1dc377f60747cd98c 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -43,6 +43,7 @@
 
 #include <algorithm>
 
+#include "gromacs/compat/make_unique.h"
 #include "gromacs/domdec/domdec_struct.h"
 #include "gromacs/fileio/confio.h"
 #include "gromacs/gmxlib/network.h"
 
 using namespace gmx; // TODO: Remove when this file is moved into gmx namespace
 
-typedef struct {
+struct gmx_sd_const_t {
     double em;
-} gmx_sd_const_t;
+};
 
-typedef struct {
+struct gmx_sd_sigma_t {
     real V;
-} gmx_sd_sigma_t;
+};
 
-typedef struct {
+struct gmx_stochd_t
+{
     /* BD stuff */
-    real           *bd_rf;
+    std::vector<real>           bd_rf;
     /* SD stuff */
-    gmx_sd_const_t *sdc;
-    gmx_sd_sigma_t *sdsig;
+    std::vector<gmx_sd_const_t> sdc;
+    std::vector<gmx_sd_sigma_t> sdsig;
     /* andersen temperature control stuff */
-    gmx_bool       *randomize_group;
-    real           *boltzfac;
-} gmx_stochd_t;
+    std::vector<bool>           randomize_group;
+    std::vector<real>           boltzfac;
+
+    explicit gmx_stochd_t(const t_inputrec *ir);
+};
 
-struct gmx_update_t
+//! pImpled implementation for Update
+class Update::Impl
 {
-    gmx_stochd_t           *sd;
-    /* xprime for constraint algorithms */
-    PaddedVector<gmx::RVec> xp;
+    public:
+        //! Constructor
+        Impl(const t_inputrec    *ir, BoxDeformation *boxDeformation);
+        //! Destructor
+        ~Impl() = default;
+        //! stochastic dynamics struct
+        std::unique_ptr<gmx_stochd_t> sd;
+        //! xprime for constraint algorithms
+        PaddedVector<RVec>            xp;
+        //! Box deformation handler (or nullptr if inactive).
+        BoxDeformation               *deform = nullptr;
+};
 
-    /* Variables for the deform algorithm */
-    int64_t           deformref_step;
-    matrix            deformref_box;
+Update::Update(const t_inputrec    *ir, BoxDeformation *boxDeformation)
+    : impl_(new Impl(ir, boxDeformation))
+{};
 
-    //! Box deformation handler (or nullptr if inactive).
-    gmx::BoxDeformation *deform;
-};
+Update::~Update()
+{};
+
+gmx_stochd_t* Update::sd() const
+{
+    return impl_->sd.get();
+}
+
+PaddedVector<RVec> * Update::xp()
+{
+    return &impl_->xp;
+}
+
+BoxDeformation * Update::deform() const
+{
+    return impl_->deform;
+}
 
 static bool isTemperatureCouplingStep(int64_t step, const t_inputrec *ir)
 {
@@ -213,18 +241,18 @@ enum class ApplyParrinelloRahmanVScaling
 template<NumTempScaleValues            numTempScaleValues,
          ApplyParrinelloRahmanVScaling applyPRVScaling>
 static void
-updateMDLeapfrogSimple(int                       start,
-                       int                       nrend,
-                       real                      dt,
-                       real                      dtPressureCouple,
-                       const rvec * gmx_restrict invMassPerDim,
-                       const t_grp_tcstat      * tcstat,
-                       const unsigned short    * cTC,
-                       const rvec                pRVScaleMatrixDiagonal,
-                       const rvec * gmx_restrict x,
-                       rvec       * gmx_restrict xprime,
-                       rvec       * gmx_restrict v,
-                       const rvec * gmx_restrict f)
+updateMDLeapfrogSimple(int                               start,
+                       int                               nrend,
+                       real                              dt,
+                       real                              dtPressureCouple,
+                       const rvec * gmx_restrict         invMassPerDim,
+                       gmx::ArrayRef<const t_grp_tcstat> tcstat,
+                       const unsigned short            * cTC,
+                       const rvec                        pRVScaleMatrixDiagonal,
+                       const rvec * gmx_restrict         x,
+                       rvec       * gmx_restrict         xprime,
+                       rvec       * gmx_restrict         v,
+                       const rvec * gmx_restrict         f)
 {
     real lambdaGroup;
 
@@ -337,15 +365,15 @@ static inline void simdStoreRvecs(rvec     *r,
  * \param[in]    f                      Forces
  */
 static void
-updateMDLeapfrogSimpleSimd(int                       start,
-                           int                       nrend,
-                           real                      dt,
-                           const real * gmx_restrict invMass,
-                           const t_grp_tcstat      * tcstat,
-                           const rvec * gmx_restrict x,
-                           rvec       * gmx_restrict xprime,
-                           rvec       * gmx_restrict v,
-                           const rvec * gmx_restrict f)
+updateMDLeapfrogSimpleSimd(int                               start,
+                           int                               nrend,
+                           real                              dt,
+                           const real * gmx_restrict         invMass,
+                           gmx::ArrayRef<const t_grp_tcstat> tcstat,
+                           const rvec * gmx_restrict         x,
+                           rvec       * gmx_restrict         xprime,
+                           rvec       * gmx_restrict         v,
+                           const rvec * gmx_restrict         f)
 {
     SimdReal                  timestep(dt);
     SimdReal                  lambdaSystem(tcstat[0].lambda);
@@ -434,14 +462,13 @@ updateMDLeapfrogGeneral(int                         start,
      * Holian et al. Phys Rev E 52(3) : 2338, 1995
      */
 
-    const unsigned short    * cTC           = md->cTC;
-    const t_grp_tcstat      * tcstat        = ekind->tcstat;
-
-    const unsigned short    * cACC          = md->cACC;
-    const rvec              * accel         = ir->opts.acc;
-    const t_grp_acc         * grpstat       = ekind->grpstat;
+    gmx::ArrayRef<const t_grp_tcstat> tcstat        = ekind->tcstat;
+    gmx::ArrayRef<const t_grp_acc>    grpstat       = ekind->grpstat;
+    const unsigned short            * cTC           = md->cTC;
+    const unsigned short            * cACC          = md->cACC;
+    const rvec                      * accel         = ir->opts.acc;
 
-    const rvec * gmx_restrict invMassPerDim = md->invMassPerDim;
+    const rvec * gmx_restrict         invMassPerDim = md->invMassPerDim;
 
     /* Initialize group values, changed later when multiple groups are used */
     int  ga       = 0;
@@ -604,9 +631,9 @@ static void do_update_md(int                         start,
         bool haveSingleTempScaleValue = (!doTempCouple || ekind->ngtc == 1);
 
         /* Extract some pointers needed by all cases */
-        const unsigned short *cTC           = md->cTC;
-        const t_grp_tcstat   *tcstat        = ekind->tcstat;
-        const rvec           *invMassPerDim = md->invMassPerDim;
+        const unsigned short             *cTC           = md->cTC;
+        gmx::ArrayRef<const t_grp_tcstat> tcstat        = ekind->tcstat;
+        const rvec                       *invMassPerDim = md->invMassPerDim;
 
         if (doParrinelloRahman)
         {
@@ -765,25 +792,19 @@ static void do_update_vv_pos(int start, int nrend, real dt,
     }
 } /* do_update_vv_pos */
 
-static gmx_stochd_t *init_stochd(const t_inputrec *ir)
+gmx_stochd_t::gmx_stochd_t(const t_inputrec *ir)
 {
-    gmx_stochd_t   *sd;
-
-    snew(sd, 1);
-
     const t_grpopts *opts = &ir->opts;
-    int              ngtc = opts->ngtc;
+    const int        ngtc = opts->ngtc;
 
     if (ir->eI == eiBD)
     {
-        snew(sd->bd_rf, ngtc);
+        bd_rf.resize(ngtc);
     }
     else if (EI_SD(ir->eI))
     {
-        snew(sd->sdc, ngtc);
-        snew(sd->sdsig, ngtc);
-
-        gmx_sd_const_t *sdc = sd->sdc;
+        sdc.resize(ngtc);
+        sdsig.resize(ngtc);
 
         for (int gt = 0; gt < ngtc; gt++)
         {
@@ -800,8 +821,8 @@ static gmx_stochd_t *init_stochd(const t_inputrec *ir)
     }
     else if (ETC_ANDERSEN(ir->etc))
     {
-        snew(sd->randomize_group, ngtc);
-        snew(sd->boltzfac, ngtc);
+        randomize_group.resize(ngtc);
+        boltzfac.resize(ngtc);
 
         /* for now, assume that all groups, if randomized, are randomized at the same rate, i.e. tau_t is the same. */
         /* since constraint groups don't necessarily match up with temperature groups! This is checked in readir.c */
@@ -811,20 +832,18 @@ static gmx_stochd_t *init_stochd(const t_inputrec *ir)
             real reft = std::max<real>(0, opts->ref_t[gt]);
             if ((opts->tau_t[gt] > 0) && (reft > 0))  /* tau_t or ref_t = 0 means that no randomization is done */
             {
-                sd->randomize_group[gt] = TRUE;
-                sd->boltzfac[gt]        = BOLTZ*opts->ref_t[gt];
+                randomize_group[gt] = true;
+                boltzfac[gt]        = BOLTZ*opts->ref_t[gt];
             }
             else
             {
-                sd->randomize_group[gt] = FALSE;
+                randomize_group[gt] = false;
             }
         }
     }
-
-    return sd;
 }
 
-void update_temperature_constants(gmx_update_t *upd, const t_inputrec *ir)
+void update_temperature_constants(gmx_stochd_t *sd, const t_inputrec *ir)
 {
     if (ir->eI == eiBD)
     {
@@ -832,14 +851,14 @@ void update_temperature_constants(gmx_update_t *upd, const t_inputrec *ir)
         {
             for (int gt = 0; gt < ir->opts.ngtc; gt++)
             {
-                upd->sd->bd_rf[gt] = std::sqrt(2.0*BOLTZ*ir->opts.ref_t[gt]/(ir->bd_fric*ir->delta_t));
+                sd->bd_rf[gt] = std::sqrt(2.0*BOLTZ*ir->opts.ref_t[gt]/(ir->bd_fric*ir->delta_t));
             }
         }
         else
         {
             for (int gt = 0; gt < ir->opts.ngtc; gt++)
             {
-                upd->sd->bd_rf[gt] = std::sqrt(2.0*BOLTZ*ir->opts.ref_t[gt]);
+                sd->bd_rf[gt] = std::sqrt(2.0*BOLTZ*ir->opts.ref_t[gt]);
             }
         }
     }
@@ -849,35 +868,23 @@ void update_temperature_constants(gmx_update_t *upd, const t_inputrec *ir)
         {
             real kT = BOLTZ*ir->opts.ref_t[gt];
             /* The mass is accounted for later, since this differs per atom */
-            upd->sd->sdsig[gt].V  = std::sqrt(kT*(1 - upd->sd->sdc[gt].em*upd->sd->sdc[gt].em));
+            sd->sdsig[gt].V  = std::sqrt(kT*(1 - sd->sdc[gt].em * sd->sdc[gt].em));
         }
     }
 }
 
-gmx_update_t *init_update(const t_inputrec    *ir,
-                          gmx::BoxDeformation *deform)
+Update::Impl::Impl(const t_inputrec    *ir, BoxDeformation *boxDeformation)
 {
-    gmx_update_t *upd = new(gmx_update_t);
-
-    if (ir->eI == eiBD || EI_SD(ir->eI) || ir->etc == etcVRESCALE || ETC_ANDERSEN(ir->etc))
-    {
-        upd->sd    = init_stochd(ir);
-    }
-
-    update_temperature_constants(upd, ir);
-
-    upd->xp.resizeWithPadding(0);
-
-    upd->deform = deform;
-
-    return upd;
+    sd = gmx::compat::make_unique<gmx_stochd_t>(ir);
+    update_temperature_constants(sd.get(), ir);
+    xp.resizeWithPadding(0);
+    deform = boxDeformation;
 }
 
-void update_realloc(gmx_update_t *upd, int natoms)
+void Update::setNumAtoms(int nAtoms)
 {
-    GMX_ASSERT(upd, "upd must be allocated before its fields can be reallocated");
 
-    upd->xp.resizeWithPadding(natoms);
+    impl_->xp.resizeWithPadding(nAtoms);
 }
 
 /*! \brief Sets the SD update type */
@@ -901,7 +908,7 @@ enum class SDUpdate : int
  * two with only one contribution, and one with both contributions. */
 template <SDUpdate updateType>
 static void
-doSDUpdateGeneral(gmx_stochd_t *sd,
+doSDUpdateGeneral(const gmx_stochd_t &sd,
                   int start, int nrend, real dt,
                   const rvec accel[], const ivec nFreeze[],
                   const real invmass[], const unsigned short ptype[],
@@ -932,9 +939,6 @@ doSDUpdateGeneral(gmx_stochd_t *sd,
     gmx::ThreeFry2x64<0> rng(seed, gmx::RandomDomain::UpdateCoordinates);
     gmx::TabulatedNormalDistribution<real, 14> dist;
 
-    gmx_sd_const_t *sdc = sd->sdc;
-    gmx_sd_sigma_t *sig = sd->sdsig;
-
     for (int n = start; n < nrend; n++)
     {
         int globalAtomIndex = gatindex ? gatindex[n] : n;
@@ -962,8 +966,8 @@ doSDUpdateGeneral(gmx_stochd_t *sd,
                 else if (updateType == SDUpdate::FrictionAndNoiseOnly)
                 {
                     real vn      = v[n][d];
-                    v[n][d]      = (vn*sdc[temperatureGroup].em +
-                                    invsqrtMass*sig[temperatureGroup].V*dist(rng));
+                    v[n][d]      = (vn*sd.sdc[temperatureGroup].em +
+                                    invsqrtMass*sd.sdsig[temperatureGroup].V*dist(rng));
                     // The previous phase already updated the
                     // positions with a full v*dt term that must
                     // now be half removed.
@@ -972,8 +976,8 @@ doSDUpdateGeneral(gmx_stochd_t *sd,
                 else
                 {
                     real vn      = v[n][d] + (inverseMass*f[n][d] + accel[accelerationGroup][d])*dt;
-                    v[n][d]      = (vn*sdc[temperatureGroup].em +
-                                    invsqrtMass*sig[temperatureGroup].V*dist(rng));
+                    v[n][d]      = (vn*sd.sdc[temperatureGroup].em +
+                                    invsqrtMass*sd.sdsig[temperatureGroup].V*dist(rng));
                     // Here we include half of the friction+noise
                     // update of v into the position update.
                     xprime[n][d] = x[n][d] + 0.5*(vn + v[n][d])*dt;
@@ -1064,10 +1068,10 @@ static void do_update_bd(int start, int nrend, real dt,
 static void calc_ke_part_normal(const rvec v[], const t_grpopts *opts, const t_mdatoms *md,
                                 gmx_ekindata_t *ekind, t_nrnb *nrnb, gmx_bool bEkinAveVel)
 {
-    int           g;
-    t_grp_tcstat *tcstat  = ekind->tcstat;
-    t_grp_acc    *grpstat = ekind->grpstat;
-    int           nthread, thread;
+    int                         g;
+    gmx::ArrayRef<t_grp_tcstat> tcstat  = ekind->tcstat;
+    gmx::ArrayRef<t_grp_acc>    grpstat = ekind->grpstat;
+    int                         nthread, thread;
 
     /* three main: VV with AveVel, vv with AveEkin, leap with AveEkin.  Leap with AveVel is also
        an option, but not supported now.
@@ -1182,15 +1186,15 @@ static void calc_ke_part_visc(const matrix box, const rvec x[], const rvec v[],
                               gmx_ekindata_t *ekind,
                               t_nrnb *nrnb, gmx_bool bEkinAveVel)
 {
-    int           start = 0, homenr = md->homenr;
-    int           g, d, n, m, gt = 0;
-    rvec          v_corrt;
-    real          hm;
-    t_grp_tcstat *tcstat = ekind->tcstat;
-    t_cos_acc    *cosacc = &(ekind->cosacc);
-    real          dekindl;
-    real          fac, cosz;
-    double        mvcos;
+    int                         start = 0, homenr = md->homenr;
+    int                         g, d, n, m, gt = 0;
+    rvec                        v_corrt;
+    real                        hm;
+    gmx::ArrayRef<t_grp_tcstat> tcstat = ekind->tcstat;
+    t_cos_acc                  *cosacc = &(ekind->cosacc);
+    real                        dekindl;
+    real                        fac, cosz;
+    double                      mvcos;
 
     for (g = 0; g < opts->ngtc; g++)
     {
@@ -1489,15 +1493,15 @@ void constrain_velocities(int64_t                        step,
     }
 }
 
-void constrain_coordinates(int64_t                        step,
-                           real                          *dvdlambda, /* the contribution to be added to the bonded interactions */
-                           t_state                       *state,
-                           tensor                         vir_part,
-                           gmx_update_t                  *upd,
-                           gmx::Constraints              *constr,
-                           gmx_bool                       bCalcVir,
-                           bool                           do_log,
-                           bool                           do_ene)
+void constrain_coordinates(int64_t           step,
+                           real             *dvdlambda, /* the contribution to be added to the bonded interactions */
+                           t_state          *state,
+                           tensor            vir_part,
+                           Update           *upd,
+                           gmx::Constraints *constr,
+                           gmx_bool          bCalcVir,
+                           bool              do_log,
+                           bool              do_ene)
 {
     if (!constr)
     {
@@ -1513,7 +1517,7 @@ void constrain_coordinates(int64_t                        step,
         /* Constrain the coordinates upd->xp */
         constr->apply(do_log, do_ene,
                       step, 1, 1.0,
-                      state->x.rvec_array(), upd->xp.rvec_array(), nullptr,
+                      state->x.rvec_array(), upd->xp()->rvec_array(), nullptr,
                       state->box,
                       state->lambda[efptBONDED], dvdlambda,
                       as_rvec_array(state->v.data()), bCalcVir ? &vir_con : nullptr, ConstraintVariable::Positions);
@@ -1526,18 +1530,18 @@ void constrain_coordinates(int64_t                        step,
 }
 
 void
-update_sd_second_half(int64_t                        step,
-                      real                          *dvdlambda,   /* the contribution to be added to the bonded interactions */
-                      const t_inputrec              *inputrec,    /* input record and box stuff        */
-                      const t_mdatoms               *md,
-                      t_state                       *state,
-                      const t_commrec               *cr,
-                      t_nrnb                        *nrnb,
-                      gmx_wallcycle_t                wcycle,
-                      gmx_update_t                  *upd,
-                      gmx::Constraints              *constr,
-                      bool                           do_log,
-                      bool                           do_ene)
+update_sd_second_half(int64_t           step,
+                      real             *dvdlambda, /* the contribution to be added to the bonded interactions */
+                      const t_inputrec *inputrec,  /* input record and box stuff       */
+                      const t_mdatoms  *md,
+                      t_state          *state,
+                      const t_commrec  *cr,
+                      t_nrnb           *nrnb,
+                      gmx_wallcycle_t   wcycle,
+                      Update           *upd,
+                      gmx::Constraints *constr,
+                      bool              do_log,
+                      bool              do_ene)
 {
     if (!constr)
     {
@@ -1570,12 +1574,12 @@ update_sd_second_half(int64_t                        step,
                 getThreadAtomRange(nth, th, homenr, &start_th, &end_th);
 
                 doSDUpdateGeneral<SDUpdate::FrictionAndNoiseOnly>
-                    (upd->sd,
+                    (*upd->sd(),
                     start_th, end_th, dt,
                     inputrec->opts.acc, inputrec->opts.nFreeze,
                     md->invmass, md->ptype,
                     md->cFREEZE, nullptr, md->cTC,
-                    state->x.rvec_array(), upd->xp.rvec_array(),
+                    state->x.rvec_array(), upd->xp()->rvec_array(),
                     state->v.rvec_array(), nullptr,
                     step, inputrec->ld_seed,
                     DOMAINDECOMP(cr) ? cr->dd->globalAtomIndices.data() : nullptr);
@@ -1588,21 +1592,21 @@ update_sd_second_half(int64_t                        step,
         /* Constrain the coordinates upd->xp for half a time step */
         constr->apply(do_log, do_ene,
                       step, 1, 0.5,
-                      state->x.rvec_array(), upd->xp.rvec_array(), nullptr,
+                      state->x.rvec_array(), upd->xp()->rvec_array(), nullptr,
                       state->box,
                       state->lambda[efptBONDED], dvdlambda,
                       as_rvec_array(state->v.data()), nullptr, ConstraintVariable::Positions);
     }
 }
 
-void finish_update(const t_inputrec              *inputrec,  /* input record and box stuff     */
-                   const t_mdatoms               *md,
-                   t_state                       *state,
-                   const t_graph                 *graph,
-                   t_nrnb                        *nrnb,
-                   gmx_wallcycle_t                wcycle,
-                   gmx_update_t                  *upd,
-                   const gmx::Constraints        *constr)
+void finish_update(const t_inputrec       *inputrec, /* input record and box stuff     */
+                   const t_mdatoms        *md,
+                   t_state                *state,
+                   const t_graph          *graph,
+                   t_nrnb                 *nrnb,
+                   gmx_wallcycle_t         wcycle,
+                   Update                 *upd,
+                   const gmx::Constraints *constr)
 {
     int homenr = md->homenr;
 
@@ -1635,7 +1639,7 @@ void finish_update(const t_inputrec              *inputrec,  /* input record and
             }
             if (partialFreezeAndConstraints)
             {
-                auto xp = makeArrayRef(upd->xp).subArray(0, homenr);
+                auto xp = makeArrayRef(*upd->xp()).subArray(0, homenr);
                 auto x  = makeConstArrayRef(state->x).subArray(0, homenr);
                 for (int i = 0; i < homenr; i++)
                 {
@@ -1654,7 +1658,7 @@ void finish_update(const t_inputrec              *inputrec,  /* input record and
 
         if (graph && (graph->nnodes > 0))
         {
-            unshift_x(graph, state->box, state->x.rvec_array(), upd->xp.rvec_array());
+            unshift_x(graph, state->box, state->x.rvec_array(), upd->xp()->rvec_array());
             if (TRICLINIC(state->box))
             {
                 inc_nrnb(nrnb, eNR_SHIFTX, 2*graph->nnodes);
@@ -1666,7 +1670,7 @@ void finish_update(const t_inputrec              *inputrec,  /* input record and
         }
         else
         {
-            auto           xp = makeConstArrayRef(upd->xp).subArray(0, homenr);
+            auto           xp = makeConstArrayRef(*upd->xp()).subArray(0, homenr);
             auto           x  = makeArrayRef(state->x).subArray(0, homenr);
 #ifndef __clang_analyzer__
             int gmx_unused nth = gmx_omp_nthreads_get(emntUpdate);
@@ -1693,7 +1697,7 @@ void update_pcouple_after_coordinates(FILE             *fplog,
                                       const matrix      parrinellorahmanMu,
                                       t_state          *state,
                                       t_nrnb           *nrnb,
-                                      gmx_update_t     *upd)
+                                      Update           *upd)
 {
     int  start  = 0;
     int  homenr = md->homenr;
@@ -1775,10 +1779,10 @@ void update_pcouple_after_coordinates(FILE             *fplog,
             break;
     }
 
-    if (upd->deform)
+    if (upd->deform())
     {
         auto localX = makeArrayRef(state->x).subArray(start, homenr);
-        upd->deform->apply(localX, state->box, step);
+        upd->deform()->apply(localX, state->box, step);
     }
 }
 
@@ -1790,7 +1794,7 @@ void update_coords(int64_t                             step,
                    const t_fcdata                     *fcd,
                    const gmx_ekindata_t               *ekind,
                    const matrix                        M,
-                   gmx_update_t                       *upd,
+                   Update                             *upd,
                    int                                 UpdatePart,
                    const t_commrec                    *cr, /* these shouldn't be here -- need to think about it */
                    const gmx::Constraints             *constr)
@@ -1831,7 +1835,7 @@ void update_coords(int64_t                             step,
             getThreadAtomRange(nth, th, homenr, &start_th, &end_th);
 
             const rvec *x_rvec  = state->x.rvec_array();
-            rvec       *xp_rvec = upd->xp.rvec_array();
+            rvec       *xp_rvec = upd->xp()->rvec_array();
             rvec       *v_rvec  = state->v.rvec_array();
             const rvec *f_rvec  = as_rvec_array(f.unpaddedArrayRef().data());
 
@@ -1848,7 +1852,7 @@ void update_coords(int64_t                             step,
                     {
                         // With constraints, the SD update is done in 2 parts
                         doSDUpdateGeneral<SDUpdate::ForcesOnly>
-                            (upd->sd,
+                            (*upd->sd(),
                             start_th, end_th, dt,
                             inputrec->opts.acc, inputrec->opts.nFreeze,
                             md->invmass, md->ptype,
@@ -1859,7 +1863,7 @@ void update_coords(int64_t                             step,
                     else
                     {
                         doSDUpdateGeneral<SDUpdate::Combined>
-                            (upd->sd,
+                            (*upd->sd(),
                             start_th, end_th, dt,
                             inputrec->opts.acc, inputrec->opts.nFreeze,
                             md->invmass, md->ptype,
@@ -1875,7 +1879,7 @@ void update_coords(int64_t                             step,
                                  md->cFREEZE, md->cTC,
                                  x_rvec, xp_rvec, v_rvec, f_rvec,
                                  inputrec->bd_fric,
-                                 upd->sd->bd_rf,
+                                 upd->sd()->bd_rf.data(),
                                  step, inputrec->ld_seed, DOMAINDECOMP(cr) ? cr->dd->globalAtomIndices.data() : nullptr);
                     break;
                 case (eiVV):
@@ -1920,7 +1924,7 @@ void update_coords(int64_t                             step,
 extern gmx_bool update_randomize_velocities(const t_inputrec *ir, int64_t step, const t_commrec *cr,
                                             const t_mdatoms *md,
                                             gmx::ArrayRef<gmx::RVec> v,
-                                            const gmx_update_t *upd,
+                                            const Update *upd,
                                             const gmx::Constraints *constr)
 {
 
@@ -1942,7 +1946,8 @@ extern gmx_bool update_randomize_velocities(const t_inputrec *ir, int64_t step,
     if ((ir->etc == etcANDERSEN) || do_per_step(step, roundToInt(1.0/rate)))
     {
         andersen_tcoupl(ir, step, cr, md, v, rate,
-                        upd->sd->randomize_group, upd->sd->boltzfac);
+                        upd->sd()->randomize_group,
+                        upd->sd()->boltzfac);
         return TRUE;
     }
     return FALSE;
index 81b1ace2786d4cb42a9ec6e447d373536f6f1e7b..2f061bfc1a68e765904d2b15b9eed2eb97055711 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
 
 #include "gromacs/math/paddedvector.h"
 #include "gromacs/math/vectypes.h"
+#include "gromacs/mdtypes/md_enums.h"
 #include "gromacs/timing/wallcycle.h"
 #include "gromacs/utility/arrayref.h"
 #include "gromacs/utility/basedefinitions.h"
+#include "gromacs/utility/classhelpers.h"
 #include "gromacs/utility/real.h"
 
 class ekinstate_t;
@@ -57,33 +59,48 @@ struct t_nrnb;
 class t_state;
 
 /* Abstract type for update */
-struct gmx_update_t;
+struct gmx_stochd_t;
 
 namespace gmx
 {
 class BoxDeformation;
 class Constraints;
-}
 
-/* Initialize the stochastic dynamics struct */
-gmx_update_t *init_update(const t_inputrec    *ir,
-                          gmx::BoxDeformation *deform);
+
+/*! \libinternal
+ * \brief Contains data for update phase */
+class Update
+{
+    public:
+        //! Constructor
+        Update(const t_inputrec    *ir, BoxDeformation *boxDeformation);
+        ~Update();
+        // TODO Get rid of getters when more free functions are incorporated as member methods
+        //! Returns handle to stochd_t struct
+        gmx_stochd_t * sd() const;
+        //! Returns pointer to PaddedVector xp
+        PaddedVector<gmx::RVec> * xp();
+        //! Returns handle to box deformation class
+        BoxDeformation * deform() const;
+        //! Resizes xp
+        void setNumAtoms(int nAtoms);
+    private:
+        //! Implementation type.
+        class Impl;
+        //! Implementation object.
+        PrivateImplPointer<Impl> impl_;
+};
+
+}; // namespace gmx
 
 /* Update pre-computed constants that depend on the reference
  * temperature for coupling.
  *
  * This could change e.g. in simulated annealing. */
-void update_temperature_constants(gmx_update_t *upd, const t_inputrec *ir);
+void update_temperature_constants(gmx_stochd_t *sd, const t_inputrec *ir);
 
 /* Update the size of per-atom arrays (e.g. after DD re-partitioning,
    which might increase the number of home atoms). */
-void update_realloc(gmx_update_t *upd, int natoms);
-
-/* Store the box at step step
- * as a reference state for simulations with box deformation.
- */
-void set_deform_reference_box(gmx_update_t *upd,
-                              int64_t step, matrix box);
 
 void update_tcouple(int64_t           step,
                     const t_inputrec *inputrec,
@@ -117,27 +134,27 @@ void update_pcouple_after_coordinates(FILE             *fplog,
                                       const matrix      parrinellorahmanMu,
                                       t_state          *state,
                                       t_nrnb           *nrnb,
-                                      gmx_update_t     *upd);
-
-void update_coords(int64_t                              step,
-                   const t_inputrec                    *inputrec, /* input record and box stuff        */
-                   const t_mdatoms                     *md,
-                   t_state                             *state,
-                   gmx::ArrayRefWithPadding<gmx::RVec>  f, /* forces on home particles */
-                   const t_fcdata                      *fcd,
-                   const gmx_ekindata_t                *ekind,
-                   const matrix                         M,
-                   gmx_update_t                        *upd,
-                   int                                  bUpdatePart,
-                   const t_commrec                     *cr, /* these shouldn't be here -- need to think about it */
-                   const gmx::Constraints              *constr);
+                                      gmx::Update      *upd);
+
+void update_coords(int64_t                             step,
+                   const t_inputrec                   *inputrec, /* input record and box stuff */
+                   const t_mdatoms                    *md,
+                   t_state                            *state,
+                   gmx::ArrayRefWithPadding<gmx::RVec> f, /* forces on home particles */
+                   const t_fcdata                     *fcd,
+                   const gmx_ekindata_t               *ekind,
+                   const matrix                        M,
+                   gmx::Update                        *upd,
+                   int                                 bUpdatePart,
+                   const t_commrec                    *cr, /* these shouldn't be here -- need to think about it */
+                   const gmx::Constraints             *constr);
 
 /* Return TRUE if OK, FALSE in case of Shake Error */
 
 extern gmx_bool update_randomize_velocities(const t_inputrec *ir, int64_t step, const t_commrec *cr,
                                             const t_mdatoms *md,
                                             gmx::ArrayRef<gmx::RVec> v,
-                                            const gmx_update_t *upd,
+                                            const gmx::Update *upd,
                                             const gmx::Constraints *constr);
 
 void constrain_velocities(int64_t                        step,
@@ -149,37 +166,37 @@ void constrain_velocities(int64_t                        step,
                           bool                           do_log,
                           bool                           do_ene);
 
-void constrain_coordinates(int64_t                        step,
-                           real                          *dvdlambda, /* the contribution to be added to the bonded interactions */
-                           t_state                       *state,
-                           tensor                         vir_part,
-                           gmx_update_t                  *upd,
-                           gmx::Constraints              *constr,
-                           gmx_bool                       bCalcVir,
-                           bool                           do_log,
-                           bool                           do_ene);
-
-void update_sd_second_half(int64_t                        step,
-                           real                          *dvdlambda, /* the contribution to be added to the bonded interactions */
-                           const t_inputrec              *inputrec,  /* input record and box stuff */
-                           const t_mdatoms               *md,
-                           t_state                       *state,
-                           const t_commrec               *cr,
-                           t_nrnb                        *nrnb,
-                           gmx_wallcycle_t                wcycle,
-                           gmx_update_t                  *upd,
-                           gmx::Constraints              *constr,
-                           bool                           do_log,
-                           bool                           do_ene);
-
-void finish_update(const t_inputrec              *inputrec,
-                   const t_mdatoms               *md,
-                   t_state                       *state,
-                   const t_graph                 *graph,
-                   t_nrnb                        *nrnb,
-                   gmx_wallcycle_t                wcycle,
-                   gmx_update_t                  *upd,
-                   const gmx::Constraints        *constr);
+void constrain_coordinates(int64_t           step,
+                           real             *dvdlambda, /* the contribution to be added to the bonded interactions */
+                           t_state          *state,
+                           tensor            vir_part,
+                           gmx::Update      *upd,
+                           gmx::Constraints *constr,
+                           gmx_bool          bCalcVir,
+                           bool              do_log,
+                           bool              do_ene);
+
+void update_sd_second_half(int64_t           step,
+                           real             *dvdlambda, /* the contribution to be added to the bonded interactions */
+                           const t_inputrec *inputrec,  /* input record and box stuff */
+                           const t_mdatoms  *md,
+                           t_state          *state,
+                           const t_commrec  *cr,
+                           t_nrnb           *nrnb,
+                           gmx_wallcycle_t   wcycle,
+                           gmx::Update      *upd,
+                           gmx::Constraints *constr,
+                           bool              do_log,
+                           bool              do_ene);
+
+void finish_update(const t_inputrec       *inputrec,
+                   const t_mdatoms        *md,
+                   t_state                *state,
+                   const t_graph          *graph,
+                   t_nrnb                 *nrnb,
+                   gmx_wallcycle_t         wcycle,
+                   gmx::Update            *upd,
+                   const gmx::Constraints *constr);
 
 /* Return TRUE if OK, FALSE in case of Shake Error */
 
@@ -214,30 +231,29 @@ void
 restore_ekinstate_from_state(const t_commrec *cr,
                              gmx_ekindata_t *ekind, const ekinstate_t *ekinstate);
 
-void berendsen_tcoupl(const t_inputrec *ir, const gmx_ekindata_t *ekind, real dt,
+void berendsen_tcoupl(const t_inputrec *ir, gmx_ekindata_t *ekind, real dt,
                       std::vector<double> &therm_integral); //NOLINT(google-runtime-references)
 
 void andersen_tcoupl(const t_inputrec *ir, int64_t step,
                      const t_commrec *cr, const t_mdatoms *md,
                      gmx::ArrayRef<gmx::RVec> v,
-                     real rate, const gmx_bool *randomize, const real *boltzfac);
+                     real rate, const std::vector<bool> &randomize,
+                     gmx::ArrayRef<const real> boltzfac);
 
 void nosehoover_tcoupl(const t_grpopts *opts, const gmx_ekindata_t *ekind, real dt,
                        double xi[], double vxi[], const t_extmass *MassQ);
 
 void trotter_update(const t_inputrec *ir, int64_t step, gmx_ekindata_t *ekind,
-                    const gmx_enerdata_t *enerd, t_state *state, const tensor vir, const t_mdatoms *md,
-                    const t_extmass *MassQ, const int * const *trotter_seqlist, int trotter_seqno);
+                    const gmx_enerdata_t *enerd, t_state *state, const tensor vir,
+                    const t_mdatoms *md, const t_extmass *MassQ,
+                    gmx::ArrayRef < std::vector < int>> trotter_seqlist, int trotter_seqno);
 
-int **init_npt_vars(const t_inputrec *ir, t_state *state, t_extmass *Mass, gmx_bool bTrotter);
+std::array < std::vector < int>, ettTSEQMAX> init_npt_vars(const t_inputrec *ir, t_state *state,
+                                                           t_extmass *Mass, gmx_bool bTrotter);
 
 real NPT_energy(const t_inputrec *ir, const t_state *state, const t_extmass *MassQ);
 /* computes all the pressure/tempertature control energy terms to get a conserved energy */
 
-// TODO: This doesn't seem to be used or implemented anywhere
-void NBaroT_trotter(t_grpopts *opts, real dt,
-                    double xi[], double vxi[], real *veta, t_extmass *MassQ);
-
 void vrescale_tcoupl(const t_inputrec *ir, int64_t step,
                      gmx_ekindata_t *ekind, real dt,
                      double therm_integral[]);
@@ -247,8 +263,12 @@ void rescale_velocities(const gmx_ekindata_t *ekind, const t_mdatoms *mdatoms,
                         int start, int end, rvec v[]);
 /* Rescale the velocities with the scaling factor in ekind */
 
+//! Initialize simulated annealing.
+bool initSimulatedAnnealing(t_inputrec  *ir,
+                            gmx::Update *upd);
+
 // TODO: This is the only function in update.h altering the inputrec
-void update_annealing_target_temp(t_inputrec *ir, real t, gmx_update_t *upd);
+void update_annealing_target_temp(t_inputrec *ir, real t, gmx::Update *upd);
 /* Set reference temp for simulated annealing at time t*/
 
 real calc_temp(real ekin, real nrdf);
@@ -278,9 +298,7 @@ void berendsen_pscale(const t_inputrec *ir, const matrix mu,
                       rvec x[], const unsigned short cFREEZE[],
                       t_nrnb *nrnb);
 
-// TODO: This doesn't seem to be used or implemented anywhere
-void correct_ekin(FILE *log, int start, int end, rvec v[],
-                  rvec vcm, real mass[], real tmass, tensor ekin);
-/* Correct ekin for vcm */
+void pleaseCiteCouplingAlgorithms(FILE             *fplog,
+                                  const t_inputrec &ir);
 
 #endif
index d7a56714be0dafc7c70958425f4381d73b4bf040..b0e8881668c14ca8923ef98fbd13fca0b5da30b1 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
 #include "gromacs/utility/gmxomp.h"
 #include "gromacs/utility/smalloc.h"
 
-t_vcm *init_vcm(FILE *fp, const gmx_groups_t *groups, const t_inputrec *ir)
+t_vcm::t_vcm(const gmx_groups_t &groups, const t_inputrec &ir)
 {
-    t_vcm *vcm;
-    int    g;
+    mode     = (ir.nstcomm > 0) ? ir.comm_mode : ecmNO;
+    ndim     = ndof_com(&ir);
+    timeStep = ir.nstcomm*ir.delta_t;
 
-    snew(vcm, 1);
-
-    vcm->mode     = (ir->nstcomm > 0) ? ir->comm_mode : ecmNO;
-    vcm->ndim     = ndof_com(ir);
-    vcm->timeStep = ir->nstcomm*ir->delta_t;
-
-    if (vcm->mode == ecmANGULAR && vcm->ndim < 3)
+    if (mode == ecmANGULAR && ndim < 3)
     {
         gmx_fatal(FARGS, "Can not have angular comm removal with pbc=%s",
-                  epbc_names[ir->ePBC]);
+                  epbc_names[ir.ePBC]);
     }
 
-    if (vcm->mode != ecmNO)
+    if (mode != ecmNO)
     {
-        vcm->nr = groups->grps[egcVCM].nr;
+        nr = groups.grps[egcVCM].nr;
         /* Allocate one extra for a possible rest group */
-        vcm->size = vcm->nr + 1;
+        size = nr + 1;
         /* We need vcm->nr+1 elements per thread, but to avoid cache
          * invalidation we add 2 elements to get a 152 byte separation.
          */
-        vcm->stride = vcm->nr + 3;
-        if (vcm->mode == ecmANGULAR)
+        stride = nr + 3;
+        if (mode == ecmANGULAR)
         {
-            snew(vcm->group_j, vcm->size);
-            snew(vcm->group_x, vcm->size);
-            snew(vcm->group_i, vcm->size);
-            snew(vcm->group_w, vcm->size);
-        }
-        snew(vcm->group_p, vcm->size);
-        snew(vcm->group_v, vcm->size);
-        snew(vcm->group_mass, vcm->size);
-        snew(vcm->group_name, vcm->size);
-        snew(vcm->group_ndf, vcm->size);
-        for (g = 0; (g < vcm->nr); g++)
-        {
-            vcm->group_ndf[g] = ir->opts.nrdf[g];
-        }
+            snew(group_i, size);
+
+            group_j.resize(size);
+            group_x.resize(size);
+            group_w.resize(size);
 
-        /* Copy pointer to group names and print it. */
-        if (fp)
-        {
-            fprintf(fp, "Center of mass motion removal mode is %s\n",
-                    ECOM(vcm->mode));
-            fprintf(fp, "We have the following groups for center of"
-                    " mass motion removal:\n");
         }
-        for (g = 0; (g < vcm->nr); g++)
+
+        group_name.resize(size);
+        group_p.resize(size);
+        group_v.resize(size);
+        group_mass.resize(size);
+        group_ndf.resize(size);
+        for (int g = 0; (g < nr); g++)
         {
-            vcm->group_name[g] = *groups->grpname[groups->grps[egcVCM].nm_ind[g]];
-            if (fp)
-            {
-                fprintf(fp, "%3d:  %s\n", g, vcm->group_name[g]);
-            }
+            group_ndf[g]  = ir.opts.nrdf[g];
+            group_name[g] = *groups.grpname[groups.grps[egcVCM].nm_ind[g]];
+
         }
 
-        snew(vcm->thread_vcm, gmx_omp_nthreads_get(emntDefault) * vcm->stride);
+        thread_vcm.resize(gmx_omp_nthreads_get(emntDefault) * stride);
     }
 
-    vcm->nFreeze = ir->opts.nFreeze;
+    nFreeze = ir.opts.nFreeze;
+}
 
-    return vcm;
+t_vcm::~t_vcm()
+{
+    if (mode == ecmANGULAR)
+    {
+        sfree(group_i);
+    }
 }
 
+void reportComRemovalInfo(FILE * fp, const t_vcm &vcm)
+{
+
+    /* Copy pointer to group names and print it. */
+    if (fp && vcm.mode != ecmNO)
+    {
+        fprintf(fp, "Center of mass motion removal mode is %s\n",
+                ECOM(vcm.mode));
+        fprintf(fp, "We have the following groups for center of"
+                " mass motion removal:\n");
+
+        for (int g = 0; (g < vcm.nr); g++)
+        {
+
+            fprintf(fp, "%3d:  %s\n", g, vcm.group_name[g]);
+        }
+    }
+}
+
+
 static void update_tensor(const rvec x, real m0, tensor I)
 {
     real xy, xz, yz;
index 716cf07f70e5f030f1fb3735ba7fd32329e8b0cc..8351d97e4ec8adfed79fdc4a1261bc33fb0e6098 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -39,6 +39,8 @@
 
 #include <stdio.h>
 
+#include <vector>
+
 #include "gromacs/math/vectypes.h"
 #include "gromacs/mdtypes/mdatom.h"
 #include "gromacs/utility/basedefinitions.h"
@@ -48,35 +50,41 @@ struct gmx_groups_t;
 struct t_inputrec;
 struct t_mdatoms;
 
-typedef struct {
-    rvec      p;        /* Linear momentum                     */
-    rvec      x;        /* Center of mass                      */
-    rvec      j;        /* Angular momentum                    */
-    tensor    i;        /* Moment of inertia                   */
-    real      mass;     /* Mass                                */
-} t_vcm_thread;
+struct t_vcm_thread{
+    rvec      p    = {0};   /* Linear momentum                     */
+    rvec      x    = {0};   /* Center of mass                      */
+    rvec      j    = {0};   /* Angular momentum                    */
+    tensor    i    = {{0}}; /* Moment of inertia                   */
+    real      mass = 0;     /* Mass                                */
+};
+
+struct t_vcm
+{
+    int                       nr;         /* Number of groups                    */
+    int                       size;       /* Size of group arrays                */
+    int                       stride;     /* Stride for thread data              */
+    int                       mode;       /* One of the enums above              */
+    int                       ndim;       /* The number of dimensions for corr.  */
+    real                      timeStep;   /* The time step for COMM removal      */
+    std::vector<real>         group_ndf;  /* Number of degrees of freedom        */
+    std::vector<real>         group_mass; /* Mass per group                      */
+    std::vector<gmx::RVec>    group_p;    /* Linear momentum per group           */
+    std::vector<gmx::RVec>    group_v;    /* Linear velocity per group           */
+    std::vector<gmx::RVec>    group_x;    /* Center of mass per group            */
+    std::vector<gmx::RVec>    group_j;    /* Angular momentum per group          */
+    std::vector<gmx::RVec>    group_w;    /* Angular velocity (omega)            */
+    tensor                   *group_i;    /* Moment of inertia per group         */
+    std::vector<char *>       group_name; /* These two are copies to pointers in */
+    ivec                     *nFreeze;    /* Tells whether dimensions are frozen per freeze group */
+    std::vector<t_vcm_thread> thread_vcm; /* Temporary data per thread and group */
+
+    t_vcm(const gmx_groups_t &groups, const t_inputrec &ir);
+    ~t_vcm();
+};
 
-typedef struct {
-    int           nr;          /* Number of groups                    */
-    int           size;        /* Size of group arrays                */
-    int           stride;      /* Stride for thread data              */
-    int           mode;        /* One of the enums above              */
-    int           ndim;        /* The number of dimensions for corr.  */
-    real          timeStep;    /* The time step for COMM removal      */
-    real         *group_ndf;   /* Number of degrees of freedom        */
-    rvec         *group_p;     /* Linear momentum per group           */
-    rvec         *group_v;     /* Linear velocity per group           */
-    rvec         *group_x;     /* Center of mass per group            */
-    rvec         *group_j;     /* Angular momentum per group          */
-    rvec         *group_w;     /* Angular velocity (omega)            */
-    tensor       *group_i;     /* Moment of inertia per group         */
-    real         *group_mass;  /* Mass per group                      */
-    char        **group_name;  /* These two are copies to pointers in */
-    ivec         *nFreeze;     /* Tells whether dimensions are frozen per freeze group */
-    t_vcm_thread *thread_vcm;  /* Temporary data per thread and group */
-} t_vcm;
+/* print COM removal info to log */
+void reportComRemovalInfo(FILE * fp, const t_vcm &vcm);
 
-t_vcm *init_vcm(FILE *fp, const gmx_groups_t *groups, const t_inputrec *ir);
 
 /* Do a per group center of mass things */
 void calc_vcm_grp(int start, int homenr, t_mdatoms *md,
index de685e90348bfff377e9fe6cf20efa9fc2d516d6..188d4b3f365dcb5c933376cd207d38e50f3acfc8 100644 (file)
@@ -216,6 +216,7 @@ LegacyMdrunOptions::~LegacyMdrunOptions()
     {
         done_commrec(cr);
     }
+    output_env_done(oenv);
     done_multisim(ms);
 }
 
index a49a15df53a4246970f4f4a00e542f1c9a7cedbe..82923ab02b7266454fc5f23a6f4ab9914bb44bbb 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2011,2012,2013,2014,2015,2016,2017,2018,2019, 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.
@@ -153,31 +153,27 @@ void gmx::Integrator::do_md()
     // t_inputrec is being replaced by IMdpOptionsProvider, so this
     // will go away eventually.
     t_inputrec             *ir   = inputrec;
-    gmx_mdoutf             *outf = nullptr;
     int64_t                 step, step_rel;
-    double                  t, t0, lam0[efptNR];
+    double                  t = ir->init_t, t0 = ir->init_t, lam0[efptNR];
     gmx_bool                bGStatEveryStep, bGStat, bCalcVir, bCalcEnerStep, bCalcEner;
-    gmx_bool                bNS, bNStList, bSimAnn, bStopCM,
+    gmx_bool                bNS, bNStList, bStopCM,
                             bFirstStep, bInitStep, bLastStep = FALSE;
     gmx_bool                bDoDHDL = FALSE, bDoFEP = FALSE, bDoExpanded = FALSE;
     gmx_bool                do_ene, do_log, do_verbose;
     gmx_bool                bMasterState;
     int                     force_flags, cglo_flags;
-    tensor                  force_vir, shake_vir, total_vir, tmp_vir, pres;
+    tensor                  force_vir = {{0}}, shake_vir = {{0}}, total_vir = {{0}},
+                            tmp_vir   = {{0}}, pres = {{0}};
     int                     i, m;
     rvec                    mu_tot;
-    t_vcm                  *vcm;
     matrix                  parrinellorahmanMu, M;
     gmx_repl_ex_t           repl_ex = nullptr;
-    gmx_localtop_t         *top;
-    t_mdebin               *mdebin   = nullptr;
+    gmx_localtop_t          top;
     gmx_enerdata_t         *enerd;
     PaddedVector<gmx::RVec> f {};
     gmx_global_stat_t       gstat;
-    gmx_update_t           *upd   = nullptr;
     t_graph                *graph = nullptr;
     gmx_groups_t           *groups;
-    gmx_ekindata_t         *ekind;
     gmx_shellfc_t          *shellfc;
     gmx_bool                bSumEkinhOld, bDoReplEx, bExchanged, bNeedRepartition;
     gmx_bool                bTemp, bPres, bTrotter;
@@ -192,11 +188,9 @@ void gmx::Integrator::do_md()
     real                    saved_conserved_quantity = 0;
     real                    last_ekin                = 0;
     t_extmass               MassQ;
-    int                   **trotter_seq;
     char                    sbuf[STEPSTRSIZE], sbuf2[STEPSTRSIZE];
 
     /* PME load balancing data for GPU kernels */
-    pme_load_balancing_t *pme_loadbal      = nullptr;
     gmx_bool              bPMETune         = FALSE;
     gmx_bool              bPMETunePrinting = FALSE;
 
@@ -252,12 +246,18 @@ void gmx::Integrator::do_md()
                         oenv, mdrunOptions.continuationOptions.appendFiles);
     }
 
-    /* Initial values */
-    init_md(fplog, cr, outputProvider, ir, oenv, mdrunOptions,
-            &t, &t0, state_global, lam0,
-            nrnb, top_global, &upd, deform,
-            nfile, fnm, &outf, &mdebin,
-            force_vir, shake_vir, total_vir, pres, mu_tot, &bSimAnn, &vcm, wcycle);
+    initialize_lambdas(fplog, *ir, MASTER(cr), &state_global->fep_state, state_global->lambda, lam0);
+    Update upd(ir, deform);
+    bool   doSimulatedAnnealing = initSimulatedAnnealing(ir, &upd);
+    if (!mdrunOptions.continuationOptions.appendFiles)
+    {
+        pleaseCiteCouplingAlgorithms(fplog, *ir);
+    }
+    init_nrnb(nrnb);
+    gmx_mdoutf *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr,
+                                   outputProvider, ir, top_global, oenv, wcycle);
+    t_mdebin   *mdebin = init_mdebin(mdrunOptions.continuationOptions.appendFiles ? nullptr : mdoutf_get_fp_ene(outf),
+                                     top_global, ir, mdoutf_get_fp_dhdl(outf));
 
     /* Energy terms and groups */
     snew(enerd, 1);
@@ -265,7 +265,8 @@ void gmx::Integrator::do_md()
                   enerd);
 
     /* Kinetic energy data */
-    snew(ekind, 1);
+    std::unique_ptr<gmx_ekindata_t> eKinData = compat::make_unique<gmx_ekindata_t>();
+    gmx_ekindata_t                 *ekind    = eKinData.get();
     init_ekindata(fplog, top_global, &(ir->opts), ekind);
     /* Copy the cos acceleration to the groups struct */
     ekind->cosacc.cos_accel = ir->cos_accel;
@@ -298,7 +299,7 @@ void gmx::Integrator::do_md()
 
     if (DOMAINDECOMP(cr))
     {
-        top = dd_init_local_top(top_global);
+        dd_init_local_top(*top_global, &top);
 
         stateInstance = compat::make_unique<t_state>();
         state         = stateInstance.get();
@@ -306,12 +307,12 @@ void gmx::Integrator::do_md()
 
         /* Distribute the charge groups over the nodes from the master node */
         dd_partition_system(fplog, mdlog, ir->init_step, cr, TRUE, 1,
-                            state_global, top_global, ir,
-                            state, &f, mdAtoms, top, fr,
+                            state_global, *top_global, ir,
+                            state, &f, mdAtoms, &top, fr,
                             vsite, constr,
                             nrnb, nullptr, FALSE);
         shouldCheckNumberOfBondedInteractions = true;
-        update_realloc(upd, state->natoms);
+        upd.setNumAtoms(state->natoms);
     }
     else
     {
@@ -320,11 +321,11 @@ void gmx::Integrator::do_md()
         /* Copy the pointer to the global state */
         state = state_global;
 
-        snew(top, 1);
-        mdAlgorithmsSetupAtomData(cr, ir, top_global, top, fr,
+        /* Generate and initialize new topology */
+        mdAlgorithmsSetupAtomData(cr, ir, *top_global, &top, fr,
                                   &graph, mdAtoms, constr, vsite, shellfc);
 
-        update_realloc(upd, state->natoms);
+        upd.setNumAtoms(state->natoms);
     }
 
     auto mdatoms = mdAtoms->mdatoms();
@@ -408,6 +409,8 @@ void gmx::Integrator::do_md()
      * Coulomb. It is not supported with only LJ PME. */
     bPMETune = (mdrunOptions.tunePme && EEL_PME(fr->ic->eeltype) &&
                 !mdrunOptions.reproducible && ir->cutoff_scheme != ecutsGROUP);
+
+    pme_load_balancing_t *pme_loadbal      = nullptr;
     if (bPMETune)
     {
         pme_loadbal_init(&pme_loadbal, cr, mdlog, *ir, state->box,
@@ -450,7 +453,7 @@ void gmx::Integrator::do_md()
         {
             /* Construct the virtual sites for the initial configuration */
             construct_vsites(vsite, state->x.rvec_array(), ir->delta_t, nullptr,
-                             top->idef.iparams, top->idef.il,
+                             top.idef.iparams, top.idef.il,
                              fr->ePBC, fr->bMolPBC, cr, state->box);
         }
     }
@@ -487,6 +490,10 @@ void gmx::Integrator::do_md()
                   | (continuationOptions.haveReadEkin ? CGLO_READEKIN : 0));
 
     bSumEkinhOld = FALSE;
+
+    t_vcm vcm(top_global->groups, *ir);
+    reportComRemovalInfo(fplog, vcm);
+
     /* To minimize communication, compute_globals computes the COM velocity
      * and the kinetic energy for the velocities without COM motion removed.
      * Thus to get the kinetic energy without the COM contribution, we need
@@ -500,14 +507,14 @@ void gmx::Integrator::do_md()
             cglo_flags_iteration |= CGLO_STOPCM;
             cglo_flags_iteration &= ~CGLO_TEMPERATURE;
         }
-        compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
+        compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, &vcm,
                         nullptr, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
                         constr, &nullSignaller, state->box,
                         &totalNumberOfBondedInteractions, &bSumEkinhOld, cglo_flags_iteration
                         | (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS : 0));
     }
     checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
-                                    top_global, top, state,
+                                    top_global, &top, state,
                                     &shouldCheckNumberOfBondedInteractions);
     if (ir->eI == eiVVAK)
     {
@@ -517,7 +524,7 @@ void gmx::Integrator::do_md()
            kinetic energy calculation.  This minimized excess variables, but
            perhaps loses some logic?*/
 
-        compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
+        compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, &vcm,
                         nullptr, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
                         constr, &nullSignaller, state->box,
                         nullptr, &bSumEkinhOld,
@@ -535,7 +542,7 @@ void gmx::Integrator::do_md()
 
     /* need to make an initiation call to get the Trotter variables set, as well as other constants for non-trotter
        temperature control */
-    trotter_seq = init_npt_vars(ir, state, &MassQ, bTrotter);
+    auto trotter_seq = init_npt_vars(ir, state, &MassQ, bTrotter);
 
     if (MASTER(cr))
     {
@@ -718,9 +725,9 @@ void gmx::Integrator::do_md()
         bDoReplEx = (useReplicaExchange && (step > 0) && !bLastStep &&
                      do_per_step(step, replExParams.exchangeInterval));
 
-        if (bSimAnn)
+        if (doSimulatedAnnealing)
         {
-            update_annealing_target_temp(ir, t, upd);
+            update_annealing_target_temp(ir, t, &upd);
         }
 
         /* Stop Center of Mass motion */
@@ -762,13 +769,13 @@ void gmx::Integrator::do_md()
                 /* Repartition the domain decomposition */
                 dd_partition_system(fplog, mdlog, step, cr,
                                     bMasterState, nstglobalcomm,
-                                    state_global, top_global, ir,
-                                    state, &f, mdAtoms, top, fr,
+                                    state_global, *top_global, ir,
+                                    state, &f, mdAtoms, &top, fr,
                                     vsite, constr,
                                     nrnb, wcycle,
                                     do_verbose && !bPMETunePrinting);
                 shouldCheckNumberOfBondedInteractions = true;
-                update_realloc(upd, state->natoms);
+                upd.setNumAtoms(state->natoms);
             }
         }
 
@@ -788,13 +795,13 @@ void gmx::Integrator::do_md()
             /* We need the kinetic energy at minus the half step for determining
              * the full step kinetic energy and possibly for T-coupling.*/
             /* This may not be quite working correctly yet . . . . */
-            compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
+            compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, &vcm,
                             wcycle, enerd, nullptr, nullptr, nullptr, nullptr, mu_tot,
                             constr, &nullSignaller, state->box,
                             &totalNumberOfBondedInteractions, &bSumEkinhOld,
                             CGLO_GSTAT | CGLO_TEMPERATURE | CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS);
             checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
-                                            top_global, top, state,
+                                            top_global, &top, state,
                                             &shouldCheckNumberOfBondedInteractions);
         }
         clear_mat(force_vir);
@@ -844,7 +851,7 @@ void gmx::Integrator::do_md()
             /* Now is the time to relax the shells */
             relax_shell_flexcon(fplog, cr, ms, mdrunOptions.verbose,
                                 enforcedRotation, step,
-                                ir, bNS, force_flags, top,
+                                ir, bNS, force_flags, &top,
                                 constr, enerd, fcd,
                                 state, f.arrayRefWithPadding(), force_vir, mdatoms,
                                 nrnb, wcycle, graph, groups,
@@ -873,7 +880,7 @@ void gmx::Integrator::do_md()
              * Check comments in sim_util.c
              */
             do_force(fplog, cr, ms, ir, awh.get(), enforcedRotation,
-                     step, nrnb, wcycle, top, groups,
+                     step, nrnb, wcycle, &top, groups,
                      state->box, state->x.arrayRefWithPadding(), &state->hist,
                      f.arrayRefWithPadding(), force_vir, mdatoms, enerd, fcd,
                      state->lambda, graph,
@@ -906,7 +913,7 @@ void gmx::Integrator::do_md()
             }
 
             update_coords(step, ir, mdatoms, state, f.arrayRefWithPadding(), fcd,
-                          ekind, M, upd, etrtVELOCITY1,
+                          ekind, M, &upd, etrtVELOCITY1,
                           cr, constr);
 
             wallcycle_stop(wcycle, ewcUPDATE);
@@ -936,7 +943,7 @@ void gmx::Integrator::do_md()
             if (bGStat || do_per_step(step-1, nstglobalcomm))
             {
                 wallcycle_stop(wcycle, ewcUPDATE);
-                compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
+                compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, &vcm,
                                 wcycle, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
                                 constr, &nullSignaller, state->box,
                                 &totalNumberOfBondedInteractions, &bSumEkinhOld,
@@ -957,7 +964,7 @@ void gmx::Integrator::do_md()
                    b) If we are using EkinAveEkin for the kinetic energy for the temperature control, we still feed in
                    EkinAveVel because it's needed for the pressure */
                 checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
-                                                top_global, top, state,
+                                                top_global, &top, state,
                                                 &shouldCheckNumberOfBondedInteractions);
                 wallcycle_start(wcycle, ewcUPDATE);
             }
@@ -991,7 +998,7 @@ void gmx::Integrator::do_md()
                     /* We need the kinetic energy at minus the half step for determining
                      * the full step kinetic energy and possibly for T-coupling.*/
                     /* This may not be quite working correctly yet . . . . */
-                    compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
+                    compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, &vcm,
                                     wcycle, enerd, nullptr, nullptr, nullptr, nullptr, mu_tot,
                                     constr, &nullSignaller, state->box,
                                     nullptr, &bSumEkinhOld,
@@ -1086,7 +1093,7 @@ void gmx::Integrator::do_md()
         if (ETC_ANDERSEN(ir->etc)) /* keep this outside of update_tcouple because of the extra info required to pass */
         {
             gmx_bool bIfRandomize;
-            bIfRandomize = update_randomize_velocities(ir, step, cr, mdatoms, state->v, upd, constr);
+            bIfRandomize = update_randomize_velocities(ir, step, cr, mdatoms, state->v, &upd, constr);
             /* if we have constraints, we have to remove the kinetic energy parallel to the bonds */
             if (constr && bIfRandomize)
             {
@@ -1129,7 +1136,7 @@ void gmx::Integrator::do_md()
         {
             /* velocity half-step update */
             update_coords(step, ir, mdatoms, state, f.arrayRefWithPadding(), fcd,
-                          ekind, M, upd, etrtVELOCITY2,
+                          ekind, M, &upd, etrtVELOCITY2,
                           cr, constr);
         }
 
@@ -1150,18 +1157,18 @@ void gmx::Integrator::do_md()
         }
 
         update_coords(step, ir, mdatoms, state, f.arrayRefWithPadding(), fcd,
-                      ekind, M, upd, etrtPOSITION, cr, constr);
+                      ekind, M, &upd, etrtPOSITION, cr, constr);
         wallcycle_stop(wcycle, ewcUPDATE);
 
         constrain_coordinates(step, &dvdl_constr, state,
                               shake_vir,
-                              upd, constr,
+                              &upd, constr,
                               bCalcVir, do_log, do_ene);
         update_sd_second_half(step, &dvdl_constr, ir, mdatoms, state,
-                              cr, nrnb, wcycle, upd, constr, do_log, do_ene);
+                              cr, nrnb, wcycle, &upd, constr, do_log, do_ene);
         finish_update(ir, mdatoms,
                       state, graph,
-                      nrnb, wcycle, upd, constr);
+                      nrnb, wcycle, &upd, constr);
 
         if (ir->bPull && ir->pull->bSetPbcRefToPrevStepCOM)
         {
@@ -1172,7 +1179,7 @@ void gmx::Integrator::do_md()
         {
             /* erase F_EKIN and F_TEMP here? */
             /* just compute the kinetic energy at the half step to perform a trotter step */
-            compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
+            compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, &vcm,
                             wcycle, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
                             constr, &nullSignaller, lastbox,
                             nullptr, &bSumEkinhOld,
@@ -1184,7 +1191,7 @@ void gmx::Integrator::do_md()
             copy_rvecn(cbuf, as_rvec_array(state->x.data()), 0, state->natoms);
 
             update_coords(step, ir, mdatoms, state, f.arrayRefWithPadding(), fcd,
-                          ekind, M, upd, etrtPOSITION, cr, constr);
+                          ekind, M, &upd, etrtPOSITION, cr, constr);
             wallcycle_stop(wcycle, ewcUPDATE);
 
             /* do we need an extra constraint here? just need to copy out of as_rvec_array(state->v.data()) to upd->xp? */
@@ -1194,7 +1201,7 @@ void gmx::Integrator::do_md()
              * For now, will call without actually constraining, constr=NULL*/
             finish_update(ir, mdatoms,
                           state, graph,
-                          nrnb, wcycle, upd, nullptr);
+                          nrnb, wcycle, &upd, nullptr);
         }
         if (EI_VV(ir->eI))
         {
@@ -1227,7 +1234,7 @@ void gmx::Integrator::do_md()
                 shift_self(graph, state->box, state->x.rvec_array());
             }
             construct_vsites(vsite, state->x.rvec_array(), ir->delta_t, state->v.rvec_array(),
-                             top->idef.iparams, top->idef.il,
+                             top.idef.iparams, top.idef.il,
                              fr->ePBC, fr->bMolPBC, cr, state->box);
 
             if (graph != nullptr)
@@ -1259,7 +1266,7 @@ void gmx::Integrator::do_md()
                 bool                doIntraSimSignal = true;
                 SimulationSignaller signaller(&signals, cr, ms, doInterSimSignal, doIntraSimSignal);
 
-                compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, vcm,
+                compute_globals(fplog, gstat, cr, ir, fr, ekind, state, mdatoms, nrnb, &vcm,
                                 wcycle, enerd, force_vir, shake_vir, total_vir, pres, mu_tot,
                                 constr, &signaller,
                                 lastbox,
@@ -1273,7 +1280,7 @@ void gmx::Integrator::do_md()
                                 | (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS : 0)
                                 );
                 checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
-                                                top_global, top, state,
+                                                top_global, &top, state,
                                                 &shouldCheckNumberOfBondedInteractions);
             }
         }
@@ -1295,7 +1302,7 @@ void gmx::Integrator::do_md()
         update_pcouple_after_coordinates(fplog, step, ir, mdatoms,
                                          pres, force_vir, shake_vir,
                                          parrinellorahmanMu,
-                                         state, nrnb, upd);
+                                         state, nrnb, &upd);
 
         /* ################# END UPDATE STEP 2 ################# */
         /* #### We now have r(t+dt) and v(t+dt/2)  ############# */
@@ -1425,12 +1432,12 @@ void gmx::Integrator::do_md()
         if ( (bExchanged || bNeedRepartition) && DOMAINDECOMP(cr) )
         {
             dd_partition_system(fplog, mdlog, step, cr, TRUE, 1,
-                                state_global, top_global, ir,
-                                state, &f, mdAtoms, top, fr,
+                                state_global, *top_global, ir,
+                                state, &f, mdAtoms, &top, fr,
                                 vsite, constr,
                                 nrnb, wcycle, FALSE);
             shouldCheckNumberOfBondedInteractions = true;
-            update_realloc(upd, state->natoms);
+            upd.setNumAtoms(state->natoms);
         }
 
         bFirstStep             = FALSE;
@@ -1526,6 +1533,8 @@ void gmx::Integrator::do_md()
     walltime_accounting_set_nsteps_done(walltime_accounting, step_rel);
 
     destroy_enerdata(enerd);
+
     sfree(enerd);
-    sfree(top);
+    global_stat_destroy(gstat);
+
 }
index ad10a7bbc048d99d68e11195a31348c7e212f1ff..dc315a49e3149c27c26ce4646728816c1c0c54b5 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2018, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019, 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.
@@ -142,7 +142,6 @@ using gmx::SimulationSignaller;
 void gmx::Integrator::do_mimic()
 {
     t_inputrec              *ir   = inputrec;
-    gmx_mdoutf              *outf = nullptr;
     int64_t                  step, step_rel;
     double                   t, lam0[efptNR];
     bool                     isLastStep               = false;
@@ -150,14 +149,12 @@ void gmx::Integrator::do_mimic()
     int                      force_flags;
     tensor                   force_vir, shake_vir, total_vir, pres;
     rvec                     mu_tot;
-    gmx_localtop_t          *top;
-    t_mdebin                *mdebin   = nullptr;
+    gmx_localtop_t           top;
     gmx_enerdata_t          *enerd;
     PaddedVector<gmx::RVec>  f {};
     gmx_global_stat_t        gstat;
     t_graph                 *graph = nullptr;
     gmx_groups_t            *groups;
-    gmx_ekindata_t          *ekind;
     gmx_shellfc_t           *shellfc;
 
     double                   cycles;
@@ -229,10 +226,12 @@ void gmx::Integrator::do_mimic()
     groups                                   = &top_global->groups;
     top_global->intermolecularExclusionGroup = genQmmmIndices(*top_global);
 
-    /* Initial values */
-    init_rerun(fplog, cr, outputProvider, ir, oenv, mdrunOptions,
-               state_global, lam0, nrnb, top_global,
-               nfile, fnm, &outf, &mdebin, wcycle);
+    initialize_lambdas(fplog, *ir, MASTER(cr), &state_global->fep_state, state_global->lambda, lam0);
+    init_nrnb(nrnb);
+
+    gmx_mdoutf *outf   = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, ir, top_global, oenv, wcycle);
+    t_mdebin   *mdebin = init_mdebin(mdrunOptions.continuationOptions.appendFiles ? nullptr : mdoutf_get_fp_ene(outf),
+                                     top_global, ir, mdoutf_get_fp_dhdl(outf), true);
 
     /* Energy terms and groups */
     snew(enerd, 1);
@@ -240,7 +239,8 @@ void gmx::Integrator::do_mimic()
                   enerd);
 
     /* Kinetic energy data */
-    snew(ekind, 1);
+    std::unique_ptr<gmx_ekindata_t> eKinData = compat::make_unique<gmx_ekindata_t>();
+    gmx_ekindata_t                 *ekind    = eKinData.get();
     init_ekindata(fplog, top_global, &(ir->opts), ekind);
     /* Copy the cos acceleration to the groups struct */
     ekind->cosacc.cos_accel = ir->cos_accel;
@@ -268,7 +268,7 @@ void gmx::Integrator::do_mimic()
 
     if (DOMAINDECOMP(cr))
     {
-        top = dd_init_local_top(top_global);
+        dd_init_local_top(*top_global, &top);
 
         stateInstance = compat::make_unique<t_state>();
         state         = stateInstance.get();
@@ -276,8 +276,8 @@ void gmx::Integrator::do_mimic()
 
         /* Distribute the charge groups over the nodes from the master node */
         dd_partition_system(fplog, mdlog, ir->init_step, cr, TRUE, 1,
-                            state_global, top_global, ir,
-                            state, &f, mdAtoms, top, fr,
+                            state_global, *top_global, ir,
+                            state, &f, mdAtoms, &top, fr,
                             vsite, constr,
                             nrnb, nullptr, FALSE);
         shouldCheckNumberOfBondedInteractions = true;
@@ -293,8 +293,7 @@ void gmx::Integrator::do_mimic()
         /* Copy the pointer to the global state */
         state = state_global;
 
-        snew(top, 1);
-        mdAlgorithmsSetupAtomData(cr, ir, top_global, top, fr,
+        mdAlgorithmsSetupAtomData(cr, ir, *top_global, &top, fr,
                                   &graph, mdAtoms, constr, vsite, shellfc);
     }
 
@@ -324,7 +323,7 @@ void gmx::Integrator::do_mimic()
                         &totalNumberOfBondedInteractions, &bSumEkinhOld, cglo_flags);
     }
     checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
-                                    top_global, top, state,
+                                    top_global, &top, state,
                                     &shouldCheckNumberOfBondedInteractions);
 
     if (MASTER(cr))
@@ -415,8 +414,8 @@ void gmx::Integrator::do_mimic()
             const bool bMasterState = true;
             dd_partition_system(fplog, mdlog, step, cr,
                                 bMasterState, nstglobalcomm,
-                                state_global, top_global, ir,
-                                state, &f, mdAtoms, top, fr,
+                                state_global, *top_global, ir,
+                                state, &f, mdAtoms, &top, fr,
                                 vsite, constr,
                                 nrnb, wcycle,
                                 mdrunOptions.verbose);
@@ -445,7 +444,7 @@ void gmx::Integrator::do_mimic()
             /* Now is the time to relax the shells */
             relax_shell_flexcon(fplog, cr, ms, mdrunOptions.verbose,
                                 enforcedRotation, step,
-                                ir, bNS, force_flags, top,
+                                ir, bNS, force_flags, &top,
                                 constr, enerd, fcd,
                                 state, f.arrayRefWithPadding(), force_vir, mdatoms,
                                 nrnb, wcycle, graph, groups,
@@ -463,7 +462,7 @@ void gmx::Integrator::do_mimic()
             Awh       *awh = nullptr;
             gmx_edsam *ed  = nullptr;
             do_force(fplog, cr, ms, ir, awh, enforcedRotation,
-                     step, nrnb, wcycle, top, groups,
+                     step, nrnb, wcycle, &top, groups,
                      state->box, state->x.arrayRefWithPadding(), &state->hist,
                      f.arrayRefWithPadding(), force_vir, mdatoms, enerd, fcd,
                      state->lambda, graph,
@@ -504,7 +503,7 @@ void gmx::Integrator::do_mimic()
                 shift_self(graph, state->box, as_rvec_array(state->x.data()));
             }
             construct_vsites(vsite, as_rvec_array(state->x.data()), ir->delta_t, as_rvec_array(state->v.data()),
-                             top->idef.iparams, top->idef.il,
+                             top.idef.iparams, top.idef.il,
                              fr->ePBC, fr->bMolPBC, cr, state->box);
 
             if (graph != nullptr)
@@ -530,7 +529,7 @@ void gmx::Integrator::do_mimic()
                             | (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS : 0)
                             );
             checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
-                                            top_global, top, state,
+                                            top_global, &top, state,
                                             &shouldCheckNumberOfBondedInteractions);
         }
 
@@ -654,5 +653,4 @@ void gmx::Integrator::do_mimic()
 
     destroy_enerdata(enerd);
     sfree(enerd);
-    sfree(top);
 }
index eb8e910468fd99643d8d9f5aa061caa7a10c13ab..4fa463095eac9f56d25df4b97b4f5a35a561e651 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -349,18 +349,15 @@ static void init_em(FILE *fplog,
                     const char *title,
                     const t_commrec *cr,
                     const gmx_multisim_t *ms,
-                    gmx::IMDOutputProvider *outputProvider,
                     t_inputrec *ir,
                     const MdrunOptions &mdrunOptions,
                     t_state *state_global, gmx_mtop_t *top_global,
-                    em_state_t *ems, gmx_localtop_t **top,
-                    t_nrnb *nrnb, rvec mu_tot,
-                    t_forcerec *fr, gmx_enerdata_t **enerd,
+                    em_state_t *ems, gmx_localtop_t *top,
+                    t_nrnb *nrnb,
+                    t_forcerec *fr,
                     t_graph **graph, gmx::MDAtoms *mdAtoms, gmx_global_stat_t *gstat,
                     gmx_vsite_t *vsite, gmx::Constraints *constr, gmx_shellfc_t **shellfc,
-                    int nfile, const t_filenm fnm[],
-                    gmx_mdoutf_t *outf, t_mdebin **mdebin,
-                    gmx_wallcycle_t wcycle)
+                    int nfile, const t_filenm fnm[])
 {
     real dvdl_constr;
 
@@ -369,13 +366,8 @@ static void init_em(FILE *fplog,
         fprintf(fplog, "Initiating %s\n", title);
     }
 
-    if (MASTER(cr))
-    {
-        state_global->ngtc = 0;
-
-        /* Initialize lambda variables */
-        initialize_lambdas(fplog, ir, &(state_global->fep_state), state_global->lambda, nullptr);
-    }
+    state_global->ngtc = 0;
+    initialize_lambdas(fplog, *ir, MASTER(cr), &(state_global->fep_state), state_global->lambda, nullptr);
 
     init_nrnb(nrnb);
 
@@ -410,14 +402,15 @@ static void init_em(FILE *fplog,
     auto mdatoms = mdAtoms->mdatoms();
     if (DOMAINDECOMP(cr))
     {
-        *top = dd_init_local_top(top_global);
+        top->useInDomainDecomp_ = true;
+        dd_init_local_top(*top_global, top);
 
         dd_init_local_state(cr->dd, state_global, &ems->s);
 
         /* Distribute the charge groups over the nodes from the master node */
         dd_partition_system(fplog, mdlog, ir->init_step, cr, TRUE, 1,
-                            state_global, top_global, ir,
-                            &ems->s, &ems->f, mdAtoms, *top,
+                            state_global, *top_global, ir,
+                            &ems->s, &ems->f, mdAtoms, top,
                             fr, vsite, constr,
                             nrnb, nullptr, FALSE);
         dd_store_state(cr->dd, &ems->s);
@@ -432,14 +425,13 @@ static void init_em(FILE *fplog,
         state_change_natoms(&ems->s, ems->s.natoms);
         ems->f.resizeWithPadding(ems->s.natoms);
 
-        snew(*top, 1);
-        mdAlgorithmsSetupAtomData(cr, ir, top_global, *top, fr,
+        mdAlgorithmsSetupAtomData(cr, ir, *top_global, top, fr,
                                   graph, mdAtoms,
                                   constr, vsite, shellfc ? *shellfc : nullptr);
 
         if (vsite)
         {
-            set_vsite_top(vsite, *top, mdatoms);
+            set_vsite_top(vsite, top, mdatoms);
         }
     }
 
@@ -479,19 +471,6 @@ static void init_em(FILE *fplog,
         *gstat = nullptr;
     }
 
-    *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, ir, top_global, nullptr, wcycle);
-
-    snew(*enerd, 1);
-    init_enerdata(top_global->groups.grps[egcENER].nr, ir->fepvals->n_lambda,
-                  *enerd);
-
-    if (mdebin != nullptr)
-    {
-        /* Init bin for energy stuff */
-        *mdebin = init_mdebin(mdoutf_get_fp_ene(*outf), top_global, ir, nullptr);
-    }
-
-    clear_rvec(mu_tot);
     calc_shifts(ems->s.box, fr->shift_vec);
 }
 
@@ -736,7 +715,7 @@ static void em_dd_partition_system(FILE *fplog,
 {
     /* Repartition the domain decomposition */
     dd_partition_system(fplog, mdlog, step, cr, FALSE, 1,
-                        nullptr, top_global, ir,
+                        nullptr, *top_global, ir,
                         &ems->s, &ems->f,
                         mdAtoms, top, fr, vsite, constr,
                         nrnb, wcycle, FALSE);
@@ -1078,26 +1057,24 @@ namespace gmx
 void
 Integrator::do_cg()
 {
-    const char       *CG = "Polak-Ribiere Conjugate Gradients";
+    const char        *CG = "Polak-Ribiere Conjugate Gradients";
 
-    gmx_localtop_t   *top;
-    gmx_enerdata_t   *enerd;
-    gmx_global_stat_t gstat;
-    t_graph          *graph;
-    double            tmp, minstep;
-    real              stepsize;
-    real              a, b, c, beta = 0.0;
-    real              epot_repl = 0;
-    real              pnorm;
-    t_mdebin         *mdebin;
-    gmx_bool          converged, foundlower;
-    rvec              mu_tot;
-    gmx_bool          do_log = FALSE, do_ene = FALSE, do_x, do_f;
-    tensor            vir, pres;
-    int               number_steps, neval = 0, nstcg = inputrec->nstcgsteep;
-    gmx_mdoutf_t      outf;
-    int               m, step, nminstep;
-    auto              mdatoms = mdAtoms->mdatoms();
+    gmx_localtop_t     top;
+    gmx_enerdata_t    *enerd;
+    gmx_global_stat_t  gstat;
+    t_graph           *graph;
+    double             tmp, minstep;
+    real               stepsize;
+    real               a, b, c, beta = 0.0;
+    real               epot_repl = 0;
+    real               pnorm;
+    gmx_bool           converged, foundlower;
+    rvec               mu_tot = {0};
+    gmx_bool           do_log = FALSE, do_ene = FALSE, do_x, do_f;
+    tensor             vir, pres;
+    int                number_steps, neval = 0, nstcg = inputrec->nstcgsteep;
+    int                m, step, nminstep;
+    auto               mdatoms = mdAtoms->mdatoms();
 
     GMX_LOG(mdlog.info).asParagraph().
         appendText("Note that activating conjugate gradient energy minimization via the "
@@ -1130,11 +1107,15 @@ Integrator::do_cg()
     em_state_t *s_c   = &s3;
 
     /* Init em and store the local state in s_min */
-    init_em(fplog, mdlog, CG, cr, ms, outputProvider, inputrec, mdrunOptions,
+    init_em(fplog, mdlog, CG, cr, ms, inputrec, mdrunOptions,
             state_global, top_global, s_min, &top,
-            nrnb, mu_tot, fr, &enerd, &graph, mdAtoms, &gstat,
+            nrnb, fr, &graph, mdAtoms, &gstat,
             vsite, constr, nullptr,
-            nfile, fnm, &outf, &mdebin, wcycle);
+            nfile, fnm);
+    gmx_mdoutf *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, inputrec, top_global, nullptr, wcycle);
+    snew(enerd, 1);
+    init_enerdata(top_global->groups.grps[egcENER].nr, inputrec->fepvals->n_lambda, enerd);
+    t_mdebin *mdebin = init_mdebin(mdoutf_get_fp_ene(outf), top_global, inputrec, nullptr);
 
     /* Print to log file */
     print_em_start(fplog, cr, walltime_accounting, wcycle, CG);
@@ -1153,7 +1134,7 @@ Integrator::do_cg()
 
     EnergyEvaluator energyEvaluator {
         fplog, mdlog, cr, ms,
-        top_global, top,
+        top_global, &top,
         inputrec, nrnb, wcycle, gstat,
         vsite, constr, fcd, graph,
         mdAtoms, fr, ppForceWorkload, enerd
@@ -1326,7 +1307,7 @@ Integrator::do_cg()
         if (DOMAINDECOMP(cr) && s_min->s.ddp_count < cr->dd->ddp_count)
         {
             em_dd_partition_system(fplog, mdlog, step, cr, top_global, inputrec,
-                                   s_min, top, mdAtoms, fr, vsite, constr,
+                                   s_min, &top, mdAtoms, fr, vsite, constr,
                                    nrnb, wcycle);
         }
 
@@ -1431,7 +1412,7 @@ Integrator::do_cg()
                 {
                     /* Reload the old state */
                     em_dd_partition_system(fplog, mdlog, -1, cr, top_global, inputrec,
-                                           s_min, top, mdAtoms, fr, vsite, constr,
+                                           s_min, &top, mdAtoms, fr, vsite, constr,
                                            nrnb, wcycle);
                 }
 
@@ -1708,7 +1689,7 @@ Integrator::do_lbfgs()
 {
     static const char *LBFGS = "Low-Memory BFGS Minimizer";
     em_state_t         ems;
-    gmx_localtop_t    *top;
+    gmx_localtop_t     top;
     gmx_enerdata_t    *enerd;
     gmx_global_stat_t  gstat;
     t_graph           *graph;
@@ -1718,13 +1699,11 @@ Integrator::do_lbfgs()
     real               a, b, c, maxdelta, delta;
     real               diag, Epot0;
     real               dgdx, dgdg, sq, yr, beta;
-    t_mdebin          *mdebin;
     gmx_bool           converged;
-    rvec               mu_tot;
+    rvec               mu_tot = {0};
     gmx_bool           do_log, do_ene, do_x, do_f, foundlower, *frozen;
     tensor             vir, pres;
     int                start, end, number_steps;
-    gmx_mdoutf_t       outf;
     int                i, k, m, n, gf, step;
     int                mdof_flags;
     auto               mdatoms = mdAtoms->mdatoms();
@@ -1770,11 +1749,15 @@ Integrator::do_lbfgs()
     neval = 0;
 
     /* Init em */
-    init_em(fplog, mdlog, LBFGS, cr, ms, outputProvider, inputrec, mdrunOptions,
+    init_em(fplog, mdlog, LBFGS, cr, ms, inputrec, mdrunOptions,
             state_global, top_global, &ems, &top,
-            nrnb, mu_tot, fr, &enerd, &graph, mdAtoms, &gstat,
+            nrnb, fr, &graph, mdAtoms, &gstat,
             vsite, constr, nullptr,
-            nfile, fnm, &outf, &mdebin, wcycle);
+            nfile, fnm);
+    gmx_mdoutf *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, inputrec, top_global, nullptr, wcycle);
+    snew(enerd, 1);
+    init_enerdata(top_global->groups.grps[egcENER].nr, inputrec->fepvals->n_lambda, enerd);
+    t_mdebin *mdebin = init_mdebin(mdoutf_get_fp_ene(outf), top_global, inputrec, nullptr);
 
     start = 0;
     end   = mdatoms->homenr;
@@ -1823,7 +1806,7 @@ Integrator::do_lbfgs()
     if (vsite)
     {
         construct_vsites(vsite, state_global->x.rvec_array(), 1, nullptr,
-                         top->idef.iparams, top->idef.il,
+                         top.idef.iparams, top.idef.il,
                          fr->ePBC, fr->bMolPBC, cr, state_global->box);
     }
 
@@ -1834,7 +1817,7 @@ Integrator::do_lbfgs()
     neval++;
     EnergyEvaluator energyEvaluator {
         fplog, mdlog, cr, ms,
-        top_global, top,
+        top_global, &top,
         inputrec, nrnb, wcycle, gstat,
         vsite, constr, fcd, graph,
         mdAtoms, fr, ppForceWorkload, enerd
@@ -2433,18 +2416,16 @@ Integrator::do_lbfgs()
 void
 Integrator::do_steep()
 {
-    const char       *SD = "Steepest Descents";
-    gmx_localtop_t   *top;
+    const char       *SD  = "Steepest Descents";
+    gmx_localtop_t    top;
     gmx_enerdata_t   *enerd;
     gmx_global_stat_t gstat;
     t_graph          *graph;
     real              stepsize;
     real              ustep;
-    gmx_mdoutf_t      outf;
-    t_mdebin         *mdebin;
     gmx_bool          bDone, bAbort, do_x, do_f;
     tensor            vir, pres;
-    rvec              mu_tot;
+    rvec              mu_tot = {0};
     int               nsteps;
     int               count          = 0;
     int               steps_accepted = 0;
@@ -2462,11 +2443,15 @@ Integrator::do_steep()
     em_state_t *s_try = &s1;
 
     /* Init em and store the local state in s_try */
-    init_em(fplog, mdlog, SD, cr, ms, outputProvider, inputrec, mdrunOptions,
+    init_em(fplog, mdlog, SD, cr, ms, inputrec, mdrunOptions,
             state_global, top_global, s_try, &top,
-            nrnb, mu_tot, fr, &enerd, &graph, mdAtoms, &gstat,
+            nrnb, fr, &graph, mdAtoms, &gstat,
             vsite, constr, nullptr,
-            nfile, fnm, &outf, &mdebin, wcycle);
+            nfile, fnm);
+    gmx_mdoutf *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, inputrec, top_global, nullptr, wcycle);
+    snew(enerd, 1);
+    init_enerdata(top_global->groups.grps[egcENER].nr, inputrec->fepvals->n_lambda, enerd);
+    t_mdebin *mdebin = init_mdebin(mdoutf_get_fp_ene(outf), top_global, inputrec, nullptr);
 
     /* Print to log file  */
     print_em_start(fplog, cr, walltime_accounting, wcycle, SD);
@@ -2491,7 +2476,7 @@ Integrator::do_steep()
     }
     EnergyEvaluator energyEvaluator {
         fplog, mdlog, cr, ms,
-        top_global, top,
+        top_global, &top,
         inputrec, nrnb, wcycle, gstat,
         vsite, constr, fcd, graph,
         mdAtoms, fr, ppForceWorkload, enerd
@@ -2608,7 +2593,7 @@ Integrator::do_steep()
             {
                 /* Reload the old state */
                 em_dd_partition_system(fplog, mdlog, count, cr, top_global, inputrec,
-                                       s_min, top, mdAtoms, fr, vsite, constr,
+                                       s_min, &top, mdAtoms, fr, vsite, constr,
                                        nrnb, wcycle);
             }
         }
@@ -2677,14 +2662,13 @@ void
 Integrator::do_nm()
 {
     const char          *NM = "Normal Mode Analysis";
-    gmx_mdoutf_t         outf;
     int                  nnodes, node;
-    gmx_localtop_t      *top;
+    gmx_localtop_t       top;
     gmx_enerdata_t      *enerd;
     gmx_global_stat_t    gstat;
     t_graph             *graph;
     tensor               vir, pres;
-    rvec                 mu_tot;
+    rvec                 mu_tot = {0};
     rvec                *dfdx;
     gmx_bool             bSparse; /* use sparse matrix storage format */
     size_t               sz;
@@ -2714,11 +2698,14 @@ Integrator::do_nm()
     em_state_t     state_work {};
 
     /* Init em and store the local state in state_minimum */
-    init_em(fplog, mdlog, NM, cr, ms, outputProvider, inputrec, mdrunOptions,
+    init_em(fplog, mdlog, NM, cr, ms, inputrec, mdrunOptions,
             state_global, top_global, &state_work, &top,
-            nrnb, mu_tot, fr, &enerd, &graph, mdAtoms, &gstat,
+            nrnb, fr, &graph, mdAtoms, &gstat,
             vsite, constr, &shellfc,
-            nfile, fnm, &outf, nullptr, wcycle);
+            nfile, fnm);
+    gmx_mdoutf *outf = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, inputrec, top_global, nullptr, wcycle);
+    snew(enerd, 1);
+    init_enerdata(top_global->groups.grps[egcENER].nr, inputrec->fepvals->n_lambda, enerd);
 
     std::vector<int>       atom_index = get_atom_index(top_global);
     std::vector<gmx::RVec> fneg(atom_index.size(), {0, 0, 0});
@@ -2794,7 +2781,7 @@ Integrator::do_nm()
     cr->nnodes = 1;
     EnergyEvaluator energyEvaluator {
         fplog, mdlog, cr, ms,
-        top_global, top,
+        top_global, &top,
         inputrec, nrnb, wcycle, gstat,
         vsite, constr, fcd, graph,
         mdAtoms, fr, ppForceWorkload, enerd
@@ -2864,7 +2851,7 @@ Integrator::do_nm()
                                         inputrec,
                                         bNS,
                                         force_flags,
-                                        top,
+                                        &top,
                                         constr,
                                         enerd,
                                         fcd,
index 4a29fc9b97cb8d2eecbed5109e3ee6c5fb1dfc07..a8ae9395ff72f37e43575602d6f71bf3d0b04f63 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2018, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019, 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.
@@ -195,7 +195,6 @@ void gmx::Integrator::do_rerun()
     // t_inputrec is being replaced by IMdpOptionsProvider, so this
     // will go away eventually.
     t_inputrec             *ir   = inputrec;
-    gmx_mdoutf             *outf = nullptr;
     int64_t                 step, step_rel;
     double                  t, lam0[efptNR];
     bool                    isLastStep               = false;
@@ -205,14 +204,12 @@ void gmx::Integrator::do_rerun()
     t_trxstatus            *status;
     rvec                    mu_tot;
     t_trxframe              rerun_fr;
-    gmx_localtop_t         *top;
-    t_mdebin               *mdebin   = nullptr;
+    gmx_localtop_t          top;
     gmx_enerdata_t         *enerd;
     PaddedVector<gmx::RVec> f {};
     gmx_global_stat_t       gstat;
     t_graph                *graph = nullptr;
     gmx_groups_t           *groups;
-    gmx_ekindata_t         *ekind;
     gmx_shellfc_t          *shellfc;
 
     double                  cycles;
@@ -295,10 +292,12 @@ void gmx::Integrator::do_rerun()
         top_global->intermolecularExclusionGroup = genQmmmIndices(*top_global);
     }
 
-    /* Initial values */
-    init_rerun(fplog, cr, outputProvider, ir, oenv, mdrunOptions,
-               state_global, lam0, nrnb, top_global,
-               nfile, fnm, &outf, &mdebin, wcycle);
+    initialize_lambdas(fplog, *ir, MASTER(cr), &state_global->fep_state, state_global->lambda, lam0);
+    init_nrnb(nrnb);
+
+    gmx_mdoutf *outf   = init_mdoutf(fplog, nfile, fnm, mdrunOptions, cr, outputProvider, ir, top_global, oenv, wcycle);
+    t_mdebin   *mdebin = init_mdebin(mdrunOptions.continuationOptions.appendFiles ? nullptr : mdoutf_get_fp_ene(outf),
+                                     top_global, ir, mdoutf_get_fp_dhdl(outf), true);
 
     /* Energy terms and groups */
     snew(enerd, 1);
@@ -306,7 +305,8 @@ void gmx::Integrator::do_rerun()
                   enerd);
 
     /* Kinetic energy data */
-    snew(ekind, 1);
+    std::unique_ptr<gmx_ekindata_t> eKinData = compat::make_unique<gmx_ekindata_t>();
+    gmx_ekindata_t                 *ekind    = eKinData.get();
     init_ekindata(fplog, top_global, &(ir->opts), ekind);
     /* Copy the cos acceleration to the groups struct */
     ekind->cosacc.cos_accel = ir->cos_accel;
@@ -334,7 +334,7 @@ void gmx::Integrator::do_rerun()
 
     if (DOMAINDECOMP(cr))
     {
-        top = dd_init_local_top(top_global);
+        dd_init_local_top(*top_global, &top);
 
         stateInstance = compat::make_unique<t_state>();
         state         = stateInstance.get();
@@ -342,8 +342,8 @@ void gmx::Integrator::do_rerun()
 
         /* Distribute the charge groups over the nodes from the master node */
         dd_partition_system(fplog, mdlog, ir->init_step, cr, TRUE, 1,
-                            state_global, top_global, ir,
-                            state, &f, mdAtoms, top, fr,
+                            state_global, *top_global, ir,
+                            state, &f, mdAtoms, &top, fr,
                             vsite, constr,
                             nrnb, nullptr, FALSE);
         shouldCheckNumberOfBondedInteractions = true;
@@ -358,8 +358,7 @@ void gmx::Integrator::do_rerun()
         /* Copy the pointer to the global state */
         state = state_global;
 
-        snew(top, 1);
-        mdAlgorithmsSetupAtomData(cr, ir, top_global, top, fr,
+        mdAlgorithmsSetupAtomData(cr, ir, *top_global, &top, fr,
                                   &graph, mdAtoms, constr, vsite, shellfc);
     }
 
@@ -388,7 +387,7 @@ void gmx::Integrator::do_rerun()
                         &totalNumberOfBondedInteractions, &bSumEkinhOld, cglo_flags);
     }
     checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
-                                    top_global, top, state,
+                                    top_global, &top, state,
                                     &shouldCheckNumberOfBondedInteractions);
 
     if (MASTER(cr))
@@ -514,7 +513,7 @@ void gmx::Integrator::do_rerun()
                 gmx_fatal(FARGS, "Vsite recalculation with -rerun is not implemented with domain decomposition, "
                           "use a single rank");
             }
-            prepareRerunState(rerun_fr, state_global, constructVsites, vsite, top->idef, ir->delta_t, *fr, graph);
+            prepareRerunState(rerun_fr, state_global, constructVsites, vsite, top.idef, ir->delta_t, *fr, graph);
         }
 
         isLastStep = isLastStep || stopHandler->stoppingAfterCurrentStep(bNS);
@@ -525,8 +524,8 @@ void gmx::Integrator::do_rerun()
             const bool bMasterState = true;
             dd_partition_system(fplog, mdlog, step, cr,
                                 bMasterState, nstglobalcomm,
-                                state_global, top_global, ir,
-                                state, &f, mdAtoms, top, fr,
+                                state_global, *top_global, ir,
+                                state, &f, mdAtoms, &top, fr,
                                 vsite, constr,
                                 nrnb, wcycle,
                                 mdrunOptions.verbose);
@@ -555,7 +554,7 @@ void gmx::Integrator::do_rerun()
             /* Now is the time to relax the shells */
             relax_shell_flexcon(fplog, cr, ms, mdrunOptions.verbose,
                                 enforcedRotation, step,
-                                ir, bNS, force_flags, top,
+                                ir, bNS, force_flags, &top,
                                 constr, enerd, fcd,
                                 state, f.arrayRefWithPadding(), force_vir, mdatoms,
                                 nrnb, wcycle, graph, groups,
@@ -573,7 +572,7 @@ void gmx::Integrator::do_rerun()
             Awh       *awh = nullptr;
             gmx_edsam *ed  = nullptr;
             do_force(fplog, cr, ms, ir, awh, enforcedRotation,
-                     step, nrnb, wcycle, top, groups,
+                     step, nrnb, wcycle, &top, groups,
                      state->box, state->x.arrayRefWithPadding(), &state->hist,
                      f.arrayRefWithPadding(), force_vir, mdatoms, enerd, fcd,
                      state->lambda, graph,
@@ -614,7 +613,7 @@ void gmx::Integrator::do_rerun()
                 shift_self(graph, state->box, as_rvec_array(state->x.data()));
             }
             construct_vsites(vsite, as_rvec_array(state->x.data()), ir->delta_t, as_rvec_array(state->v.data()),
-                             top->idef.iparams, top->idef.il,
+                             top.idef.iparams, top.idef.il,
                              fr->ePBC, fr->bMolPBC, cr, state->box);
 
             if (graph != nullptr)
@@ -640,7 +639,7 @@ void gmx::Integrator::do_rerun()
                             | (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS : 0)
                             );
             checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions,
-                                            top_global, top, state,
+                                            top_global, &top, state,
                                             &shouldCheckNumberOfBondedInteractions);
         }
 
@@ -769,5 +768,4 @@ void gmx::Integrator::do_rerun()
 
     destroy_enerdata(enerd);
     sfree(enerd);
-    sfree(top);
 }
index 110c9e3c3720b31a89c1e9317dd674f2383000cd..f553e9f7bb125564accf86404b1ead4fed1800a9 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2011,2012,2013,2014,2015,2016,2017,2018,2019, 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.
@@ -785,11 +785,6 @@ int Mdrunner::mdrunner()
         gmx_fatal(FARGS, "The .mdp file specified an energy mininization or normal mode algorithm, and these are not compatible with mdrun -rerun");
     }
 
-    if (can_use_allvsall(inputrec, TRUE, cr, fplog) && DOMAINDECOMP(cr))
-    {
-        gmx_fatal(FARGS, "All-vs-all loops do not work with domain decomposition, use a single MPI rank");
-    }
-
     if (!(EEL_PME(inputrec->coulombtype) || EVDW_PME(inputrec->vdwtype)))
     {
         if (domdecOptions.numPmeRanks > 0)
@@ -1462,6 +1457,9 @@ int Mdrunner::mdrunner()
                pmedata,
                EI_DYNAMICS(inputrec->eI) && !isMultiSim(ms));
 
+    // clean up cycle counter
+    wallcycle_destroy(wcycle);
+
     // Free PME data
     if (pmedata)
     {
@@ -1517,11 +1515,11 @@ int Mdrunner::mdrunner()
        wait for that. */
     if (PAR(cr) && MASTER(cr))
     {
-        done_commrec(cr);
         tMPI_Finalize();
     }
+    //TODO free commrec in MPI simulations
+    done_commrec(cr);
 #endif
-
     return rc;
 }
 
index a6aa1ec01ba733fb7634d61e17da6fde586ee0c2..5aaf23de06a4b5987bb051f17b287fcc0909fa34 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -134,7 +134,7 @@ namespace gmx
 void
 Integrator::do_tpi()
 {
-    gmx_localtop_t         *top;
+    gmx_localtop_t          top;
     gmx_groups_t           *groups;
     gmx_enerdata_t         *enerd;
     PaddedVector<gmx::RVec> f {};
@@ -185,7 +185,7 @@ Integrator::do_tpi()
 
     nnodes = cr->nnodes;
 
-    top = gmx_mtop_generate_local_top(top_global, inputrec->efep != efepNO);
+    gmx_mtop_generate_local_top(*top_global, &top, inputrec->efep != efepNO);
 
     groups = &top_global->groups;
 
@@ -274,9 +274,9 @@ Integrator::do_tpi()
     print_start(fplog, cr, walltime_accounting, "Test Particle Insertion");
 
     /* The last charge group is the group to be inserted */
-    cg_tp = top->cgs.nr - 1;
-    a_tp0 = top->cgs.index[cg_tp];
-    a_tp1 = top->cgs.index[cg_tp+1];
+    cg_tp = top.cgs.nr - 1;
+    a_tp0 = top.cgs.index[cg_tp];
+    a_tp1 = top.cgs.index[cg_tp+1];
     if (debug)
     {
         fprintf(debug, "TPI cg %d, atoms %d-%d\n", cg_tp, a_tp0, a_tp1);
@@ -299,7 +299,7 @@ Integrator::do_tpi()
     }
     bRFExcl = (bCharge && EEL_RF(fr->ic->eeltype));
 
-    calc_cgcm(fplog, cg_tp, cg_tp+1, &(top->cgs), state_global->x.rvec_array(), fr->cg_cm);
+    calc_cgcm(fplog, cg_tp, cg_tp+1, &(top.cgs), state_global->x.rvec_array(), fr->cg_cm);
     if (bCavity)
     {
         if (norm(fr->cg_cm[cg_tp]) > 0.5*inputrec->rlist && fplog)
@@ -627,7 +627,7 @@ Integrator::do_tpi()
             clear_mat(pres);
 
             /* Set the charge group center of mass of the test particle */
-            copy_rvec(x_init, fr->cg_cm[top->cgs.nr-1]);
+            copy_rvec(x_init, fr->cg_cm[top.cgs.nr-1]);
 
             /* Calc energy (no forces) on new positions.
              * Since we only need the intermolecular energy
@@ -645,7 +645,7 @@ Integrator::do_tpi()
             std::fenv_t floatingPointEnvironment;
             std::feholdexcept(&floatingPointEnvironment);
             do_force(fplog, cr, ms, inputrec, nullptr, nullptr,
-                     step, nrnb, wcycle, top, &top_global->groups,
+                     step, nrnb, wcycle, &top, &top_global->groups,
                      state_global->box, state_global->x.arrayRefWithPadding(), &state_global->hist,
                      f.arrayRefWithPadding(), force_vir, mdatoms, enerd, fcd,
                      state_global->lambda,
diff --git a/src/gromacs/mdspan/CMakeLists.txt b/src/gromacs/mdspan/CMakeLists.txt
new file mode 100644 (file)
index 0000000..7af2f8f
--- /dev/null
@@ -0,0 +1,37 @@
+#
+# This file is part of the GROMACS molecular simulation package.
+#
+# Copyright (c) 2018, 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.
+
+if (BUILD_TESTING)
+    add_subdirectory(tests)
+endif()
diff --git a/src/gromacs/mdspan/README b/src/gromacs/mdspan/README
new file mode 100644 (file)
index 0000000..f77f094
--- /dev/null
@@ -0,0 +1,25 @@
+This directory contains a stripped-down and modified-for-GROMACS version
+of a reference implementation of the LEWG P0009 proposal, revision 8:
+"mdspan: A Non-Owning Multidimensional Array Reference"
+
+The full version is available from
+https://github.com/ORNL/cpp-proposals-pub/tree/master/P0009
+SHA1 of the commit used is f433984ba897298069b510aa1311145040dd860c.
+
+This work orginated from "Kokkos" and is distributed under the BSD license as
+stated in COPYING.
+
+The following modifications were carried out:
+* reformatted code with uncrustify
+* added GROMACS header to all files
+* added doxygen comments to all files
+* temporarily removed constexpr from functions, so they compile with C++11
+* put all headers from bits/ into this directory
+* use minimial includes in all header files instead of just including mdspan
+* move tests into a subdirectory tests and rename test_foo.cpp to foo.cpp
+* renamed tests and test fixture class to match GROMACS conventions
+* changed variable signature to match proposal P0009r8 where reference
+  implementation differed, (const to const & in constructors of basic_mdspan)
+* Updated the mdspan test to a typed test
+* added test for basic accessor policy
+* added test for mdspan declaration
diff --git a/src/gromacs/mdspan/accessor_policy.h b/src/gromacs/mdspan/accessor_policy.h
new file mode 100644 (file)
index 0000000..d2520e2
--- /dev/null
@@ -0,0 +1,137 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2018, 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.
+ */
+/*
+ * This file is a modified version of original work of Sandia Corporation.
+ * In the spirit of the original code, this particular file can be distributed
+ * on the terms of Sandia Corporation.
+ */
+/*
+ *                         Kokkos v. 2.0
+ *               Copyright (2014) Sandia Corporation
+ *
+ * Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ * the U.S. Government retains certain rights in this software.
+ *
+ * Kokkos is licensed under 3-clause BSD terms of use:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the Corporation nor the names of the
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Questions? Contact Christian R. Trott (crtrott@sandia.gov)
+ */
+/*! \libinternal \file
+ * \brief Declares accessor policies for mdspan.
+ *
+ * Implement ways how to convert a linear offset from a pointer to memory access.
+ * \author David Hollman <dshollm@sandia.gov>
+ * \author Christian Blau <cblau@gwdg.de>
+ * \libinternal
+ * \ingroup mdspan
+ */
+#ifndef MDSPAN_ACCESSOR_POLICY_H
+#define MDSPAN_ACCESSOR_POLICY_H
+
+#include <cstddef>
+
+namespace gmx
+{
+
+/*! \libinternal \brief The most basic memory access model for mdspan.
+ * \tparam ElementType the type held in memory to be accessed
+ */
+template<class ElementType>
+class accessor_basic
+{
+    public:
+        //! Type of element to be accessed.
+        using element_type  = ElementType;
+        //! Pointer to element to be accessed.
+        using pointer       = ElementType*;
+        //! How to determine a memory offset, provided by self accessor.
+        using offset_policy = accessor_basic;
+        //! Type of references.
+        using reference     = ElementType&;
+
+        /*! \brief Shift a pointer by an offset.
+         * \param[in] p Pointer to reference memory location.
+         * \param[in] i offset from memory location.
+         * \returns pointer to offset memory location.
+         */
+        constexpr typename offset_policy::pointer
+        offset( pointer p, ptrdiff_t i ) const noexcept
+        { return typename offset_policy::pointer(p+i); }
+
+        /*! \brief Access element from an offset to given pointer.
+         * \param[in] p Pointer to reference memory location.
+         * \param[in] i offset from memory location.
+         * \returns reference to element stored at offset from memory location.
+         */
+        constexpr reference access( pointer p, ptrdiff_t i ) const noexcept
+        { return p[i]; }
+
+        /*! \brief Decay pointer to pointer to ElementType.
+         * NOTE This function does nothing, because it is the trivial implementation of an accessor.
+         * \returns input pointer as pointer to ElementType
+         */
+        constexpr ElementType* decay( pointer p ) const noexcept
+        { return p; }
+};
+
+}      // namespace gmx
+#endif /* end of include guard: MDSPAN_ACCESSOR_POLICY_H */
diff --git a/src/gromacs/mdspan/extents.h b/src/gromacs/mdspan/extents.h
new file mode 100644 (file)
index 0000000..a7a99b3
--- /dev/null
@@ -0,0 +1,430 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2018, 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.
+ */
+/*
+ * This file is a modified version of original work of Sandia Corporation.
+ * In the spirit of the original code, this particular file can be distributed
+ * on the terms of Sandia Corporation.
+ */
+/*
+ *                          Kokkos v. 2.0
+ *               Copyright (2014) Sandia Corporation
+ *
+ * Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ * the U.S. Government retains certain rights in this software.
+ *
+ * Kokkos is licensed under 3-clause BSD terms of use:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the Corporation nor the names of the
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Questions? Contact Christian R. Trott (crtrott@sandia.gov)
+ */
+/*! \libinternal \file
+ * \brief Declares gmx::extents for mdspan.
+ *
+ * \author Christian Trott <crtrott@sandia.gov>
+ * \author Ronan Keryell <ronan.keryell@xilinx.com>
+ * \author Carter Edwards <hedwards@nvidia.com>
+ * \author David Hollman <dshollm@sandia.gov>
+ * \author Christian Blau <cblau@gwdg.de>
+ * \ingroup mdspan
+ */
+#ifndef MDSPAN_EXTENTS_H
+#define MDSPAN_EXTENTS_H
+
+#include <cstddef>
+
+#include <array>
+
+namespace gmx
+{
+
+/*! \brief Define constant that signals dynamic extent.
+ */
+enum : std::ptrdiff_t {
+    dynamic_extent = -1
+};
+
+template< std::ptrdiff_t ... StaticExtents >
+class extents;
+
+template<std::ptrdiff_t... LHS, std::ptrdiff_t... RHS>
+bool operator==(const extents<LHS...> &lhs,
+                const extents<RHS...> &rhs) noexcept;
+
+template<std::ptrdiff_t... LHS, std::ptrdiff_t... RHS>
+constexpr bool operator!=(const extents<LHS...> &lhs,
+                          const extents<RHS...> &rhs) noexcept;
+
+namespace detail
+{
+
+template< int R, std::ptrdiff_t ... StaticExtents >
+struct extents_analyse;
+
+/*! \libinternal \brief Enable querying extent of specific rank by splitting
+ * a static extents off the variadic template arguments.
+ *
+ */
+template< int R, std::ptrdiff_t E0, std::ptrdiff_t ... StaticExtents >
+struct extents_analyse<R, E0, StaticExtents...> {
+
+    //! The extent analysis of the next lower rank.
+    using next_extents_analyse = extents_analyse<R-1, StaticExtents...>;
+
+    /*! \brief Accumulate the total rank from all extents.
+     * \returns incremented rank of the next extent
+     */
+    static constexpr std::size_t rank() noexcept { return next_extents_analyse::rank()+1; }
+    /*! \brief Accumulate the dynamic rank from all extents.
+     * This extent is static, so hand down query to the next extent analysis.
+     * \returns the dynamic rank of the next extent analysis.
+     */
+    static constexpr std::size_t rank_dynamic() noexcept { return next_extents_analyse::rank_dynamic(); }
+
+    //! Store analysis of the next extent of next lower rank.
+    next_extents_analyse next;
+
+    //! Trivial constructor.
+    extents_analyse() : next() {}
+
+    /*! \brief Construction from dynamic extents hands the extents down
+     * to the next extents analysis of lower rank.
+     * \param[in] de dynamic extents
+     */
+    template<class ... DynamicExtents>
+    extents_analyse(DynamicExtents... de) : next(de ...) {}
+
+    /*! \brief Construct from an array of dynamic extentes and rank.
+     * Hand down the dynamic rank parameters to the next extents analysis rank
+     * \param[in] de dynamic extents
+     * \param[in] r rank to read from the dynamic extent
+     */
+    template<std::size_t Rank>
+    extents_analyse(const std::array<std::ptrdiff_t, Rank> &de, const std::size_t r) : next(de, r) {}
+
+    //! Copy constructor.
+    template<std::ptrdiff_t... OtherStaticExtents>
+    extents_analyse(extents_analyse<R, OtherStaticExtents...> rhs) : next(rhs.next) {}
+
+    //! Assignment operator.
+    template<std::ptrdiff_t... OtherStaticExtents>
+    extents_analyse &operator= (extents_analyse<R, OtherStaticExtents...> rhs)
+    {
+        next = rhs.next;
+        return *this;
+    }
+
+    /*! \brief Report extent of dimension r.
+     * \param[in] r the dimension to query
+     * \returns the extent in dimension r.
+     */
+    constexpr std::ptrdiff_t extent(const std::size_t r) const noexcept
+    {
+        // TODO use early return and if instead of ternary operator
+        // after bumping requirements to C++14
+        return (r == R) ? E0 : next.extent(r);
+    }
+    /*! \brief Report the static extent of dimension r.
+     * \param[in] r the dimension to query
+     * \returns the static extent in dimension r.
+     */
+    static constexpr std::ptrdiff_t static_extent(const std::size_t r) noexcept
+    {
+        // TODO use early return and if instead of ternary operator
+        // after bumping requirements to C++14
+        return (r == R) ? E0 : next_extents_analyse::static_extent(r);
+    }
+};
+
+/*! \libinternal \brief Enable querying extent of specific rank by splitting
+ * a static extent off the variadic template arguments.
+ */
+template< int R, std::ptrdiff_t ... StaticExtents >
+struct extents_analyse<R, dynamic_extent, StaticExtents...> {
+    //! The extent analysis of the next lower rank.
+    using next_extents_analyse = extents_analyse<R-1, StaticExtents...>;
+    /*! \brief Accumulate the total rank from all extents.
+     * \returns incremented rank of the next extent
+     */
+    static constexpr std::size_t rank() noexcept { return next_extents_analyse::rank()+1; }
+    /*! \brief Accumulate the dynamic rank from all extents.
+     * \returns the dynamic rank of the next extent analysis.
+     */
+    static constexpr std::size_t rank_dynamic() noexcept { return next_extents_analyse::rank_dynamic()+1; }
+
+    //! Store analysis of the next extent of next lower rank.
+    next_extents_analyse next;
+    //! The dynamic extent of this rank
+    std::ptrdiff_t       this_extent;
+
+    //! Trivial constructor.
+    extents_analyse() : next(), this_extent(0) {}
+
+    /*! \brief Construction from dynamic extents hands the extents down
+     * to the next extents analysis of lower rank.
+     * \param[in] E the dynamic extent of this rank.
+     * \param[in] de dynamic extents
+     */
+    template<class ... DynamicExtents>
+    extents_analyse(std::ptrdiff_t E, DynamicExtents... de) : next(de ...), this_extent(E) {}
+
+    /*! \brief Construct from an array of dynamic extentes and rank.
+     * Hand down the dynamic rank parameters to the next extents analysis rank
+     * \param[in] de dynamic extents
+     * \param[in] r rank to read from the dynamic extent
+     */
+    template<std::size_t Rank>
+    extents_analyse(const std::array<std::ptrdiff_t, Rank> &de, const std::size_t r) : next(de, r+1), this_extent(de[r]) {}
+
+    //! Copy constructor.
+    template<std::ptrdiff_t... OtherStaticExtents>
+    extents_analyse(extents_analyse<R, OtherStaticExtents...> rhs) : next(rhs.next), this_extent(rhs.extent(R)) {}
+
+    //! Assignment operator.
+    template<std::ptrdiff_t... OtherStaticExtents>
+    extents_analyse &operator= (extents_analyse<R, OtherStaticExtents...> rhs)
+    {
+        next        = rhs.next;
+        this_extent = rhs.extent(R);
+        return *this;
+    }
+
+    /*! \brief Report extent of dimension r.
+     * \param[in] r the dimension to query
+     * \returns the extent in dimension r.
+     */
+    constexpr std::ptrdiff_t extent(const std::size_t r) const noexcept
+    {
+        return (r == R) ? this_extent : next.extent(r); // TODO use early return and if instead of ternary operator after bumping requirements to C++14
+    }
+    /*! \brief Report the static extent of dimension r.
+     * \param[in] r the dimension to query
+     * \returns the static extent in dimension r.
+     */
+    static constexpr std::ptrdiff_t static_extent(const std::size_t r) noexcept
+    {
+        return (r == R) ? dynamic_extent : next_extents_analyse::static_extent(r); // TODO use early return and if instead of ternary operator after bumping requirements to C++14
+    }
+};
+
+/*! \libinternal \brief Specialisation for rank 0 extents analysis.
+ * Ends recursive rank analysis.
+ */
+template<>
+struct extents_analyse<0> {
+    /*! \brief Rank of extent of rank 0.
+     * \returns 0
+     */
+    static constexpr std::size_t rank() noexcept { return 0; }
+    /*! \brief Dynamic rank of extent of rank 0.
+     * \returns 0
+     */
+    static constexpr std::size_t rank_dynamic() noexcept { return 0; }
+
+    //! Trivial constructor.
+    extents_analyse() {}
+
+    //! Construct from array and rank, doing nothing.
+    template<std::size_t Rank>
+    extents_analyse(const std::array<std::ptrdiff_t, Rank> & /*de*/, const std::size_t /*r*/) {}
+
+    //extents_analyse & operator=(extents_analyse) = default;
+
+    /*! \brief Extent of rank 0 is 1, ensuring that product of extents yields required size and not zero.
+     * NOTE changed from ORNL reference implementation in making this static constexpr instead of constexpr .. const
+     */
+    static constexpr std::ptrdiff_t extent(const std::size_t /*r*/) noexcept
+    {
+        return 1;
+    }
+
+    //! Static extent of rank 0 is 1, ensuring that product of extents yields required size and not zero.
+    static constexpr std::ptrdiff_t static_extent(const std::size_t /*r*/) noexcept
+    {
+        return 1;
+    }
+
+};
+}   // namespace detail
+
+
+/*! \libinternal \brief Multidimensional extents with static and dynamic dimensions.
+ *
+ * Describes a multidimensional index space of rank R.
+ * This is equivalent to the Cartesian product space of integer intervals
+ * [0, N_0) x [0, N_1) x ... x [0,N_{R-1} )
+ *
+ * Confer to P0009r8 of the Library Evolution Working Group and mdspan.extents
+ *
+ * \tparam StaticExtents rank number of extents, where the dynamic_extent
+ * constant for static extent is used to signal a dynamic extent.
+ */
+template< std::ptrdiff_t ... StaticExtents >
+class extents
+{
+    private:
+        using extents_analyse_t = detail::extents_analyse<sizeof ... (StaticExtents), StaticExtents...>;
+
+    public:
+        //! Type used to index elements.
+        using index_type = std::ptrdiff_t;
+        //! Trivial constructor
+        constexpr extents() noexcept {}
+        //! Move constructor
+        constexpr extents( extents && ) noexcept = default;
+        //! Copy constructor.
+        constexpr extents( const extents & ) noexcept = default;
+        /*! \brief Construct with dynamic extents.
+         *
+         * Allows for extents(u,v,w..) syntax when setting dynamic extents
+         *
+         * \tparam IndexType type of index
+         * \param[in] dn first dynamic index
+         * \param[in] DynamicExtents parameter pack
+         */
+        template< class ... IndexType >
+        constexpr extents( std::ptrdiff_t dn,
+                           IndexType ...  DynamicExtents ) noexcept
+            : impl( dn, DynamicExtents ... )
+        { static_assert( 1+sizeof ... (DynamicExtents) == rank_dynamic(), "" ); }
+
+        /*! \brief Construct from array of dynamic extents.
+         *
+         * Allows for extents({{u,v,w..}}) syntax when setting dynamic extents
+         *
+         * \param[in] dynamic_extents array of dynamic rank size containing extents
+         */
+        constexpr extents( const std::array<std::ptrdiff_t, extents_analyse_t::rank_dynamic()> dynamic_extents) noexcept
+            : impl(dynamic_extents, 0) {}
+
+        //! Copy constructor
+        template<std::ptrdiff_t... OtherStaticExtents>
+        extents( const extents<OtherStaticExtents...> &other )
+            : impl( other.impl ) {}
+
+        //! Default move assignment
+        extents &operator= ( extents && ) noexcept = default;
+        //! Default copy assignment
+        extents &operator= ( const extents & ) noexcept = default;
+        //! Copy assignment
+        template<std::ptrdiff_t... OtherStaticExtents>
+        extents &operator= ( const extents<OtherStaticExtents...> &other )
+        { impl = other.impl; return *this; }
+        //! Default destructor
+        ~extents() = default;
+
+        // [mdspan.extents.obs]
+        /*! \brief The rank of the extent.
+         * \returns the rank all extents together
+         */
+        static constexpr std::size_t rank() noexcept
+        { return sizeof ... (StaticExtents); }
+        /*! \brief The rank of the dynamic extents.
+         * \returns Only the dynamic extents.
+         */
+        static constexpr std::size_t rank_dynamic() noexcept
+        { return extents_analyse_t::rank_dynamic(); }
+        /*! \brief The rank of the static extents.
+         * \returns Only the static extents.
+         */
+        static constexpr index_type static_extent(std::size_t k) noexcept
+        { return extents_analyse_t::static_extent(rank()-k); }
+        /*! \brief The extent along a specific dimension.
+         * \param[in] k the dimension
+         * \returns the extent along that dimension
+         */
+        constexpr index_type extent(std::size_t k) const noexcept
+        { return impl.extent(rank()-k); }
+    private:
+        //! For copy assignment, extents are friends of extents.
+        template< std::ptrdiff_t... > friend class extents;
+        //! The implementation class.
+        extents_analyse_t impl;
+};
+
+
+/*! \brief Comparison operator.
+ * \returns true if extents are equal
+ * TODO add constexpr when C++14 is required
+ */
+template<std::ptrdiff_t... LHS, std::ptrdiff_t... RHS>
+bool operator==(const extents<LHS...> &lhs,
+                const extents<RHS...> &rhs) noexcept
+{
+    bool equal = lhs.rank() == rhs.rank();
+    for (std::size_t r = 0; r < lhs.rank(); r++)
+    {
+        equal = equal && ( lhs.extent(r) == rhs.extent(r) );
+    }
+    return equal;
+}
+
+/*! \brief Check for non-equality.
+ * \returns true if extents are unequal
+ */
+template<std::ptrdiff_t... LHS, std::ptrdiff_t... RHS>
+constexpr bool operator!=(const extents<LHS...> &lhs,
+                          const extents<RHS...> &rhs) noexcept
+{
+    return !(lhs == rhs);
+}
+
+}      // namespace gmx
+#endif /* end of include guard: MDSPAN_EXTENTS_H */
diff --git a/src/gromacs/mdspan/layouts.h b/src/gromacs/mdspan/layouts.h
new file mode 100644 (file)
index 0000000..7addb27
--- /dev/null
@@ -0,0 +1,228 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2018, 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.
+ */
+/*
+ * This file is a modified version of original work of Sandia Corporation.
+ * In the spirit of the original code, this particular file can be distributed
+ * on the terms of Sandia Corporation.
+ */
+/*
+ *                          Kokkos v. 2.0
+ *               Copyright (2014) Sandia Corporation
+ *
+ * Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ * the U.S. Government retains certain rights in this software.
+ *
+ * Kokkos is licensed under 3-clause BSD terms of use:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the Corporation nor the names of the
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Questions? Contact Christian R. Trott (crtrott@sandia.gov)
+ */
+/*! \libinternal \file
+ * \brief Declares gmx::layout_right for mdspan.
+ *
+ * \author David Hollman <dshollm@sandia.gov>
+ * \author Christian Blau <cblau@gwdg.de>
+ * \ingroup mdspan
+ */
+#ifndef MDSPAN_LAYOUTS_H
+#define MDSPAN_LAYOUTS_H
+#include <cstddef>
+
+#include <type_traits>
+
+namespace gmx
+{
+
+/*! \libinternal \brief Right-aligned array layout indexer.
+ * Carries the mapping class performing the translation from multidimensional
+ * index to one-dimensional number.
+ */
+class layout_right
+{
+
+    public:
+        /*! \libinternal \brief Mapping from multidimensional indices within extents to 1D index.
+         * \tparam Extents the extents of the multidimensional integers for the mapping.
+         */
+        template<class Extents>
+        class mapping
+        {
+            private:
+                //! The extents.
+                Extents m_extents;
+
+            public:
+                //! exposing the type of indices
+                using index_type   = ptrdiff_t;
+                //! exposing the type of the extents
+                using extents_type = Extents;
+                //! Default constructor.
+                constexpr mapping() noexcept = default;
+                //! Default move constructor.
+                constexpr mapping( mapping && ) noexcept = default;
+                //! Default copy constructor.
+                constexpr mapping( const mapping & ) noexcept = default;
+                //! Default move assignment
+                mapping &operator= ( mapping && ) noexcept = default;
+                //! Default copy assignment
+                mapping &operator= ( const mapping & ) noexcept = default;
+                /*! \brief Construct mapping, setting extents
+                 * \param[in] ext the extents
+                 */
+                constexpr mapping( const Extents &ext ) noexcept
+                    : m_extents( ext ) {}
+                /*! \brief Return the extents.
+                 * \returns extents
+                 */
+                constexpr const Extents &extents() const noexcept { return m_extents; }
+
+            private:
+                /* \brief End recursion helper function for static offset calculation.
+                 * \param[in] sum The accumulated offset over all dimensions
+                 * \returns The offset.
+                 */
+                static constexpr index_type
+                offset( const size_t /*r*/, const ptrdiff_t sum)
+                { return sum; }
+
+                /* \brief Statically calculate offset from index and extent.
+                 * For a multidimensional index (i0,i1,..,in), in a right memory
+                 * layout, 'i0' denotes the slowest moving dimension and
+                 * 'in' the fastest moving dimension.
+                 * The overall offset within extents N = (N0,..,Nn) is then
+                 * offest = i0 * N1 * .. * Nn + i1 * N2 * .. * Nn + in-1 * Nn + in
+                 *        = (((i0*N1+i1)*N2+i2)*N3+i3) ...
+                 * \param[in] r current rank
+                 * \param[in] sum current sum up to this rank
+                 * \param[in] i index
+                 * \oaram[in] indices The rest of the paramter pack.
+                 * \returns The offset.
+                 */
+                template<class ... Indices >
+                inline constexpr index_type
+                offset( const size_t r, ptrdiff_t sum, const index_type i, Indices... indices) const noexcept
+                {
+                    return offset( r+1, sum * m_extents.extent(r) + i, indices ...);
+                }
+
+            public:
+                /*! \brief Return the size of the underlying one-dimensional
+                 * data structure, so that the mapping is always valid.
+                 * \todo add constexpr when C++14 is required
+                 *
+                 * \returns number of span elements
+                 */
+                index_type required_span_size() const noexcept
+                {
+                    index_type size = 1;
+                    for (size_t r = 0; r < m_extents.rank(); r++)
+                    {
+                        size *= m_extents.extent(r);
+                    }
+                    return size;
+                }
+
+                /*! \brief Map the multidimensional indices to 1D.
+                 * Requires number of indicies have the same dimensionality as the mapping.
+                 * \tparam Indices type of the indices to be mapped
+                 * \param[in] indices the indices to be mapped
+                 * \returns One-dimensional integer index.
+                 * \todo C++14 activation of constexpr
+                 */
+                template<class ... Indices >
+                typename std::enable_if<sizeof ... (Indices) == Extents::rank(), index_type>::type
+                operator()( Indices ... indices ) const noexcept
+                { return offset( 0, 0, indices ... ); }
+
+                //! Report that this mapping is always unique.
+                static constexpr bool is_always_unique()     noexcept { return true; }
+                //! Report that this mapping is always contiguous.
+                static constexpr bool is_always_contiguous() noexcept { return true; }
+                //! Report that this mapping is always strided.
+                static constexpr bool is_always_strided()    noexcept { return true; }
+
+                //! Report that this mapping is unique.
+                constexpr bool is_unique()     const noexcept { return true; }
+                //! Report that this mapping is contiguous.
+                constexpr bool is_contiguous() const noexcept { return true; }
+                //! Report that this mapping is strided.
+                constexpr bool is_strided()    const noexcept { return true; }
+                /*!\brief Return the stride of dimension r.
+                 * \param[in] R rank of the stride to be queried.
+                 * \returns the stride along dimension r.
+                 * \todo C++14 activation of constexpr
+                 */
+                index_type stride(const size_t R) const noexcept
+                {
+                    ptrdiff_t stride = 1;
+                    for (size_t r = m_extents.rank()-1; r > R; r--)
+                    {
+                        stride *= m_extents.extent(r);
+                    }
+                    return stride;
+                }
+
+        }; // class mapping
+
+};         // class layout_right
+
+}          // namespace gmx
+#endif     /* end of include guard: MDSPAN_LAYOUTS_H */
diff --git a/src/gromacs/mdspan/mdspan.h b/src/gromacs/mdspan/mdspan.h
new file mode 100644 (file)
index 0000000..bca9b00
--- /dev/null
@@ -0,0 +1,278 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2018,2019, 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.
+ */
+/*
+ * This file is a modified version of original work of Sandia Corporation.
+ * In the spirit of the original code, this particular file can be distributed
+ * on the terms of Sandia Corporation.
+ */
+/*
+ *                          Kokkos v. 2.0
+ *               Copyright (2014) Sandia Corporation
+ *
+ * Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ * the U.S. Government retains certain rights in this software.
+ *
+ * Kokkos is licensed under 3-clause BSD terms of use:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the Corporation nor the names of the
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Questions? Contact Christian R. Trott (crtrott@sandia.gov)
+ */
+/*! \libinternal \file
+ * \brief Declares gmx::mdspan
+ *
+ * \author Christian Trott <crtrott@sandia.gov>
+ * \author Ronan Keryell <ronan.keryell@xilinx.com>
+ * \author Carter Edwards <hedwards@nvidia.com>
+ * \author David Hollman <dshollm@sandia.gov>
+ * \author Christian Blau <cblau@gwdg.de>
+ * \inlibraryapi
+ * \ingroup mdspan
+ */
+#ifndef MDSPAN_MDSPAN_H
+#define MDSPAN_MDSPAN_H
+
+#include <array>
+#include <type_traits>
+
+#include "accessor_policy.h"
+#include "extents.h"
+#include "layouts.h"
+
+namespace gmx
+{
+
+/*! \libinternal \brief Multidimensional array indexing and memory access with flexible mapping and access model.
+ *
+ * \tparam ElementType Type of elemnt to be viewed
+ * \tparam Extents The dimensions of the multidimenisonal array to view.
+ * \tparam LayoutPolicy Describes is the memory layout of the multidimensional array; right by default.
+ * \tparam AccessorPolicy Describes memory access model.
+ */
+template<class ElementType, class Extents, class LayoutPolicy = layout_right, class AccessorPolicy = accessor_basic<ElementType> >
+class basic_mdspan
+{
+    public:
+        //! Expose type used to define the extents of the data.
+        using extents_type     = Extents;
+        //! Expose type used to define the layout of the data.
+        using layout_type      = LayoutPolicy;
+        //! Expose type used to define the memory access model of the data.
+        using accessor_type    = AccessorPolicy;
+        //! Expose type used to map multidimensional indices to one-dimensioal indices.
+        using mapping_type     = typename layout_type::template mapping<extents_type>;
+        //! Exposes the type of stored element.
+        using element_type     = typename accessor_type::element_type;
+        //! Expose the underlying type of the stored elements.
+        using value_type       = typename std::remove_cv<element_type>::type;
+        //! Expose the type used for indexing.
+        using index_type       = ptrdiff_t;
+        //! Expose type for index differences.
+        using difference_type  = ptrdiff_t;
+        //! Expose underlying pointer to data type.
+        using pointer          = typename accessor_type::pointer;
+        //! Expose reference to data type.
+        using reference        = typename accessor_type::reference;
+
+        //! Trivial constructor
+        constexpr basic_mdspan() noexcept : acc_(), map_(), ptr_() {}
+        //! Move constructor
+        constexpr basic_mdspan(basic_mdspan &&other) noexcept = default;
+        //! copy constructor
+        constexpr basic_mdspan(const basic_mdspan &other) noexcept = default;
+        //! Copy assignment
+        basic_mdspan &operator=(const basic_mdspan &other) noexcept = default;
+        //! Move assignment
+        basic_mdspan &operator=(basic_mdspan &&other) noexcept = default;
+
+        //! Copy constructor
+        template<class OtherElementType,
+                 class OtherExtents,
+                 class OtherLayoutPolicy,
+                 class OtherAccessor>
+        constexpr basic_mdspan(
+            const basic_mdspan<OtherElementType,
+                               OtherExtents,
+                               OtherLayoutPolicy,
+                               OtherAccessor> &rhs ) noexcept
+            : acc_( rhs.acc_ ),
+              map_( rhs.map_ ),
+              ptr_( rhs.ptr_ )
+        {}
+        //! Copy assignment constructor
+        template<class OtherElementType,
+                 class OtherExtents,
+                 class OtherLayoutPolicy,
+                 class OtherAccessor>
+        basic_mdspan &operator= (
+            const basic_mdspan<OtherElementType,
+                               OtherExtents,
+                               OtherLayoutPolicy,
+                               OtherAccessor> &rhs ) noexcept
+        { acc_ = rhs.acc_; map_ = rhs.map_; ptr_ = rhs.ptr_; return *this; }
+
+        /*!\brief Construct mdspan by setting the dynamic extents and pointer to data.
+         * \param[in] ptr Pointer to data to be accessed by this span
+         * \param[in] DynamicExtents
+         * \tparam IndexType index type to describe dynamic extents
+         */
+        template<class ... IndexType >
+        explicit constexpr basic_mdspan
+            ( pointer ptr, IndexType ... DynamicExtents ) noexcept
+            : acc_(accessor_type()), map_( extents_type(DynamicExtents ...) ), ptr_(ptr) {}
+        /*! \brief Construct from array describing dynamic extents.
+         * \param[in] ptr Pointer to data to be accessed by this span
+         * \param[in] dynamic_extents Array the size of dynamic extents.
+         */
+        constexpr basic_mdspan( pointer ptr, const std::array<ptrdiff_t, extents_type::rank_dynamic()> &dynamic_extents)
+            : acc_(accessor_type()), map_( extents_type(dynamic_extents)), ptr_(ptr) {}
+        /*! \brief Construct from pointer and mapping.
+         * \param[in] ptr Pointer to data to be accessed by this span
+         * \param[in] m Mapping from multidimenisonal indices to one-dimensional offset.
+         */
+        constexpr basic_mdspan( pointer ptr, const mapping_type &m ) noexcept
+            : acc_(accessor_type()), map_( m ), ptr_(ptr) {}
+        /*! \brief Construct with pointer, mapping and accessor.
+         * \param[in] ptr Pointer to data to be accessed by this span
+         * \param[in] m Mapping from multidimenisonal indices to one-dimensional offset.
+         * \param[in] a Accessor implementing memory access model.
+         */
+        constexpr basic_mdspan( pointer ptr, const mapping_type &m, const accessor_type &a ) noexcept
+            : acc_(a), map_( m ), ptr_(ptr) {}
+
+        /*! \brief Brace operator to access multidimenisonal array element.
+         * \param[in] indices The multidimensional indices of the object.
+         * Requires rank() == sizeof...(IndexType). Slicing is implemented via sub_span.
+         * \returns reference to element at indices.
+         */
+        template<class... IndexType >
+        constexpr typename std::enable_if<sizeof ... (IndexType) == extents_type::rank(), reference>::type
+        operator()( IndexType... indices) const noexcept
+        { return acc_.access( ptr_, map_( indices ... ) ); }
+        /*! \brief Canonical bracket operator for one-dimensional arrays.
+         * Allows mdspan to act like array in one-dimension.
+         * Enabled only when rank==1.
+         * \param[in] i one-dimensional index
+         * \returns reference to element stored at position i
+         */
+        template<class IndexType>
+        constexpr typename std::enable_if<std::is_integral<IndexType>::value && 1 == extents_type::rank(), reference>::type
+        operator[]( const IndexType &i ) const noexcept
+        { return acc_.access( ptr_, map_(i) ); }
+        //! Report the rank.
+        static constexpr int rank() noexcept
+        { return extents_type::rank(); }
+        //! Report the dynamic rank.
+        static constexpr int rank_dynamic() noexcept
+        { return extents_type::rank_dynamic(); }
+        /*! \brief Return the static extent.
+         * \param[in] k dimension to query for static extent
+         * \returns static extent along specified dimension
+         */
+        constexpr index_type static_extent( size_t k ) const noexcept
+        { return map_.extents().static_extent( k ); }
+
+        /*! \brief Return the extent.
+         * \param[in] k dimension to query for extent
+         * \returns extent along specified dimension
+         */
+        constexpr index_type extent( int k ) const noexcept
+        { return map_.extents().extent( k ); }
+
+        //! Return all extents
+        constexpr const extents_type &extents() const noexcept
+        { return map_.extents(); }
+        //! Report if mappings for this basic_span is always unique.
+        static constexpr bool is_always_unique()     noexcept { return mapping_type::is_always_unique(); }
+        //! Report if mapping for this basic_span is always strided
+        static constexpr bool is_always_strided()    noexcept { return mapping_type::is_always_strided(); }
+        //! Report if mapping for this basic_span is always is_contiguous
+        static constexpr bool is_always_contiguous() noexcept { return mapping_type::is_always_contiguous(); }
+        //! Report if the currently applied map is unique
+        constexpr bool is_unique() const noexcept  { return map_.is_unique(); }
+        //! Report if the currently applied map is strided
+        constexpr bool is_strided() const noexcept { return map_.is_strided(); }
+        //! Report if the currently applied map is contiguous
+        constexpr bool is_contiguous() const noexcept {return map_.is_contiguous(); }
+        //! Report stride along a specific rank.
+        constexpr index_type stride( size_t r ) const noexcept
+        { return map_.stride(r); }
+        //! Return the currently applied mapping.
+        constexpr mapping_type mapping() const noexcept { return map_; }
+        //! Return the memory access model.
+        constexpr accessor_type accessor() const noexcept { return acc_; }
+        //! Return pointer to underlying data
+        constexpr pointer data() const noexcept { return ptr_; }
+    private:
+        //! The memory access model
+        accessor_type acc_;
+        //! The transformation from multidimenisonal index to memory offset.
+        mapping_type  map_;
+        //! Memory location handle
+        pointer       ptr_;
+};
+
+//! basic_mdspan with wrapped indices, basic_accessor policiy and right-aligned  memory layout.
+template<class T, ptrdiff_t... Indices>
+using mdspan = basic_mdspan<T, extents<Indices...>, layout_right, accessor_basic<T> >;
+
+}      // namespace gmx
+
+#endif /* end of include guard: MDSPAN_MDSPAN_H */
diff --git a/src/gromacs/mdspan/tests/CMakeLists.txt b/src/gromacs/mdspan/tests/CMakeLists.txt
new file mode 100644 (file)
index 0000000..1130a7a
--- /dev/null
@@ -0,0 +1,40 @@
+#
+# This file is part of the GROMACS molecular simulation package.
+#
+# Copyright (c) 2018, 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.
+
+gmx_add_unit_test(MDSpanTests mdspan-test
+                  accessor_policy.cpp
+                  extents.cpp
+                  layouts.cpp
+                  mdspan.cpp
+                 )
diff --git a/src/gromacs/mdspan/tests/accessor_policy.cpp b/src/gromacs/mdspan/tests/accessor_policy.cpp
new file mode 100644 (file)
index 0000000..e604a5f
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2018, 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 Testing gmx::accessor_policy.
+ *
+ * \author Christian Blau <cblau@gwdg.de>
+ */
+#include "gmxpre.h"
+
+#include "gromacs/mdspan/accessor_policy.h"
+
+#include <array>
+
+#include <gtest/gtest.h>
+
+namespace gmx
+{
+
+class BasicAccessorPolicy : public ::testing::Test
+{
+    public:
+        std::array<float, 3>  testdata = {{1., 2., 3.}};
+        accessor_basic<float> acc;
+};
+
+TEST_F(BasicAccessorPolicy, Decay) {
+    EXPECT_EQ(acc.decay(testdata.data()), testdata.data());
+}
+
+TEST_F(BasicAccessorPolicy, Access) {
+    for (size_t i = 0; i < testdata.size(); ++i)
+    {
+        EXPECT_EQ(acc.access(testdata.data(), i), testdata[i]);
+    }
+}
+
+TEST_F(BasicAccessorPolicy, Offset) {
+    for (size_t i = 0; i < testdata.size(); ++i)
+    {
+        EXPECT_EQ(acc.offset(testdata.data(), i), testdata.data() + i );
+    }
+}
+
+TEST_F(BasicAccessorPolicy, CopyAccessor) {
+    const auto newAcc = acc;
+
+    EXPECT_EQ(acc.decay(testdata.data()), newAcc.decay(testdata.data()));
+    for (size_t i = 0; i < testdata.size(); ++i)
+    {
+        EXPECT_EQ(acc.access(testdata.data(), i), newAcc.access(testdata.data(), i));
+    }
+
+    for (size_t i = 0; i < testdata.size(); ++i)
+    {
+        EXPECT_EQ(acc.offset(testdata.data(), i), newAcc.offset(testdata.data(), i));
+    }
+}
+
+} // namespace gmx
diff --git a/src/gromacs/mdspan/tests/extents.cpp b/src/gromacs/mdspan/tests/extents.cpp
new file mode 100644 (file)
index 0000000..b7ccb34
--- /dev/null
@@ -0,0 +1,203 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2018, 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.
+ */
+/*
+ * This file is a modified version of original work of Sandia Corporation.
+ * In the spirit of the original code, this particular file can be distributed
+ * on the terms of Sandia Corporation.
+ */
+/*
+ *                         Kokkos v. 2.0
+ *               Copyright (2014) Sandia Corporation
+ *
+ * Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ * the U.S. Government retains certain rights in this software.
+ *
+ * Kokkos is licensed under 3-clause BSD terms of use:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the Corporation nor the names of the
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Questions? Contact Christian R. Trott (crtrott@sandia.gov)
+ */
+/*! \internal \file
+ * \brief Testing gmx::extents.
+ *
+ * \author Christian Trott <crtrott@sandia.gov>
+ * \author Carter Edwards <hedwards@nvidia.com>
+ * \author David Hollman <dshollm@sandia.gov>
+ * \author Christian Blau <cblau@gwdg.de>
+ */
+#include "gmxpre.h"
+
+#include "gromacs/mdspan/extents.h"
+
+#include <gtest/gtest.h>
+
+namespace gmx
+{
+
+template<ptrdiff_t ... E_STATIC>
+class ExtentsTest
+{
+    public:
+        using extents_type  = gmx::extents<E_STATIC...>;
+
+        extents_type my_extents_explicit;
+        extents_type my_extents_array;
+        extents_type my_extents_copy;
+
+        ExtentsTest()
+        {
+            my_extents_explicit = extents<E_STATIC...>();
+            my_extents_array    = extents<E_STATIC...>(std::array<ptrdiff_t, 0>());
+            my_extents_copy     = extents<E_STATIC...>(my_extents_explicit);
+        }
+
+        template<class ... E>
+        ExtentsTest(E ... e)
+        {
+            my_extents_explicit = extents<E_STATIC...>(e ...);
+            my_extents_array    = extents<E_STATIC...>(std::array<ptrdiff_t, 2>({{e ...}}));
+            my_extents_copy     = extents<E_STATIC...>(my_extents_explicit);
+        }
+
+        void check_rank(ptrdiff_t r)
+        {
+            EXPECT_EQ(my_extents_explicit.rank(), r);
+            EXPECT_EQ(my_extents_array.rank(), r);
+            EXPECT_EQ(my_extents_copy.rank(), r);
+        }
+        void check_rank_dynamic(ptrdiff_t r)
+        {
+            EXPECT_EQ(my_extents_explicit.rank_dynamic(), r);
+            EXPECT_EQ(my_extents_array.rank_dynamic(), r);
+            EXPECT_EQ(my_extents_copy.rank_dynamic(), r);
+        }
+        template<class ... E>
+        void check_extents(E ... e)
+        {
+            std::array<ptrdiff_t, extents_type::rank()> s = {{E_STATIC ...}};
+            std::array<ptrdiff_t, extents_type::rank()> a = {{e ...}};
+            for (size_t r = 0; r < extents_type::rank(); r++)
+            {
+                EXPECT_EQ(my_extents_explicit.static_extent(r), s[r]);
+                EXPECT_EQ(my_extents_explicit.extent(r), a[r]);
+
+                EXPECT_EQ(my_extents_array.static_extent(r), s[r]);
+                EXPECT_EQ(my_extents_array.extent(r), a[r]);
+
+                EXPECT_EQ(my_extents_copy.static_extent(r), s[r]);
+                EXPECT_EQ(my_extents_copy.extent(r), a[r]);
+            }
+            EXPECT_EQ(my_extents_explicit.static_extent(extents_type::rank()+1), 1);
+            EXPECT_EQ(my_extents_explicit.extent(extents_type::rank()+1), 1);
+
+            EXPECT_EQ(my_extents_array.static_extent(extents_type::rank()+1), 1);
+            EXPECT_EQ(my_extents_array.extent(extents_type::rank()+1), 1);
+
+            EXPECT_EQ(my_extents_copy.static_extent(extents_type::rank()+1), 1);
+            EXPECT_EQ(my_extents_copy.extent(extents_type::rank()+1), 1);
+        }
+
+};
+
+TEST(ExtentsTest, Construction) {
+
+    // setting two dynamic extents
+    ExtentsTest<5, dynamic_extent, 3, dynamic_extent, 1> test(4, 2);
+
+    test.check_rank(5);
+    test.check_rank_dynamic(2);
+    test.check_extents(5, 4, 3, 2, 1);
+
+}
+
+TEST(ExtentsTest, PurelyStatic) {
+    ExtentsTest<5, 4, 3> test;
+    test.check_rank(3);
+    test.check_rank_dynamic(0);
+    test.check_extents(5, 4, 3);
+}
+
+TEST(ExtentsTest, RankNought) {
+    // Can construct extents of rank nought
+    ExtentsTest<> test;
+    test.check_rank(0);
+    test.check_rank_dynamic(0);
+}
+TEST(ExtentsTest, Assignment) {
+    extents<5, dynamic_extent, 3, dynamic_extent, 1> e1(4, 2);
+    extents<5, 4, 3, 2, 1> e2;
+    e2 = e1;
+    for (size_t r = 0; r < 5; r++)
+    {
+        EXPECT_EQ(e2.extent(r), e1.extent(r));
+    }
+    extents<dynamic_extent, dynamic_extent, dynamic_extent, dynamic_extent, dynamic_extent> e3(9, 8, 7, 6, 5);
+    for (int r = 0; r < 5; r++)
+    {
+        EXPECT_EQ(e3.extent(r), 9-r);
+    }
+    e3 = e1;
+    for (int r = 0; r < 5; r++)
+    {
+        EXPECT_EQ(e3.extent(r), e1.extent(r));
+    }
+}
+} // namespace gmx
diff --git a/src/gromacs/mdspan/tests/layouts.cpp b/src/gromacs/mdspan/tests/layouts.cpp
new file mode 100644 (file)
index 0000000..bf1c0c6
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2018, 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 Testing gmx::extents.
+ *
+ * \author Christian Trott <crtrott@sandia.gov>
+ * \author David Hollman <dshollm@sandia.gov>
+ * \author Christian Blau <cblau@gwdg.de>
+ */
+#include "gmxpre.h"
+
+#include "gromacs/mdspan/layouts.h"
+
+#include <gtest/gtest.h>
+
+#include "gromacs/mdspan/extents.h"
+
+namespace gmx
+{
+
+template<class Layout, ptrdiff_t ... E_STATIC>
+struct LayoutTests {
+
+    typedef Layout layout_type;
+    typedef extents<E_STATIC...> extents_type;
+    typedef typename Layout::template mapping<extents_type> mapping_type;
+
+    mapping_type my_mapping_explicit, my_mapping_copy;
+
+    template<class ... E>
+    LayoutTests(E ... e)
+    {
+        my_mapping_explicit = mapping_type(extents_type(e ...));
+        my_mapping_copy     = mapping_type(my_mapping_explicit);
+    }
+
+    void check_rank(ptrdiff_t r)
+    {
+        EXPECT_EQ(my_mapping_explicit.extents().rank(), r);
+        EXPECT_EQ(my_mapping_copy.extents().rank(), r);
+    }
+    void check_rank_dynamic(ptrdiff_t r)
+    {
+        EXPECT_EQ(my_mapping_explicit.extents().rank_dynamic(), r);
+        EXPECT_EQ(my_mapping_copy.extents().rank_dynamic(), r);
+    }
+    template<class ... E>
+    void check_extents(E ... e)
+    {
+        std::array<ptrdiff_t, extents_type::rank()> a = {{e ...}};
+        for (size_t r = 0; r < extents_type::rank(); r++)
+        {
+            EXPECT_EQ(my_mapping_explicit.extents().extent(r), a[r]);
+            EXPECT_EQ(my_mapping_copy.extents().extent(r), a[r]);
+        }
+    }
+    template<class ... E>
+    void check_strides(E ... e)
+    {
+        std::array<ptrdiff_t, extents_type::rank()> a = {{e ...}};
+        for (size_t r = 0; r < extents_type::rank(); r++)
+        {
+            EXPECT_EQ(my_mapping_explicit.stride(r), a[r]);
+            EXPECT_EQ(my_mapping_copy.stride(r), a[r]);
+        }
+    }
+    void check_required_span_size(ptrdiff_t size)
+    {
+        EXPECT_EQ(my_mapping_explicit.required_span_size(), size);
+        EXPECT_EQ(my_mapping_copy.required_span_size(), size);
+    }
+
+    void check_properties(bool always_unique, bool always_contiguous, bool always_strided,
+                          bool unique, bool contiguous, bool strided)
+    {
+        EXPECT_EQ(my_mapping_explicit.is_always_unique() ? 1 : 0, always_unique ? 1 : 0);
+        EXPECT_EQ(my_mapping_explicit.is_always_contiguous() ? 1 : 0, always_contiguous ? 1 : 0);
+        EXPECT_EQ(my_mapping_explicit.is_always_strided() ? 1 : 0, always_strided ? 1 : 0);
+        EXPECT_EQ(my_mapping_explicit.is_unique() ? 1 : 0, unique ? 1 : 0);
+        EXPECT_EQ(my_mapping_explicit.is_contiguous() ? 1 : 0, contiguous ? 1 : 0);
+        EXPECT_EQ(my_mapping_explicit.is_strided() ? 1 : 0, strided ? 1 : 0);
+        EXPECT_EQ(my_mapping_copy.is_always_unique() ? 1 : 0, always_unique ? 1 : 0);
+        EXPECT_EQ(my_mapping_copy.is_always_contiguous() ? 1 : 0, always_contiguous ? 1 : 0);
+        EXPECT_EQ(my_mapping_copy.is_always_strided() ? 1 : 0, always_strided ? 1 : 0);
+        EXPECT_EQ(my_mapping_copy.is_unique() ? 1 : 0, unique ? 1 : 0);
+        EXPECT_EQ(my_mapping_copy.is_contiguous() ? 1 : 0, contiguous ? 1 : 0);
+        EXPECT_EQ(my_mapping_copy.is_strided() ? 1 : 0, strided ? 1 : 0);
+    }
+
+    template<class ... E>
+    void check_operator(ptrdiff_t offset, E ... e)
+    {
+        EXPECT_EQ(my_mapping_explicit(e ...), offset);
+        EXPECT_EQ(my_mapping_copy(e ...), offset);
+    }
+
+};
+
+TEST(LayoutTests, LayoutRightConstruction) {
+    LayoutTests<layout_right, 5, dynamic_extent, 3, dynamic_extent, 1> test(4, 2);
+
+    test.check_rank(5);
+    test.check_rank_dynamic(2);
+    test.check_extents(5, 4, 3, 2, 1);
+    test.check_strides(24, 6, 2, 1, 1);
+}
+
+TEST(LayoutTests, LayoutRightProperties) {
+    LayoutTests<layout_right, 5, dynamic_extent, 3, dynamic_extent, 1> test(4, 2);
+
+    test.check_properties(true, true, true, true, true, true);
+}
+
+TEST(LayoutTests, LayoutRightOperator) {
+    LayoutTests<layout_right, 5, dynamic_extent, 3, dynamic_extent, 1> test(4, 2);
+
+    test.check_operator(107, 4, 1, 2, 1, 0);
+    test.check_operator(0, 0, 0, 0, 0, 0);
+}
+
+} // namespace gmx
diff --git a/src/gromacs/mdspan/tests/mdspan.cpp b/src/gromacs/mdspan/tests/mdspan.cpp
new file mode 100644 (file)
index 0000000..bb98daa
--- /dev/null
@@ -0,0 +1,302 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2018, 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.
+ */
+/*
+ * This file is a modified version of original work of Sandia Corporation.
+ * In the spirit of the original code, this particular file can be distributed
+ * on the terms of Sandia Corporation.
+ */
+/*
+ *                         Kokkos v. 2.0
+ *               Copyright (2014) Sandia Corporation
+ *
+ * Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ * the U.S. Government retains certain rights in this software.
+ *
+ * Kokkos is licensed under 3-clause BSD terms of use:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the Corporation nor the names of the
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Questions? Contact Christian R. Trott (crtrott@sandia.gov)
+ */
+/*! \internal \file
+ * \brief Testing gmx::basic_mdspan.
+ *
+ * \author Christian Trott <crtrott@sandia.gov>
+ * \author Carter Edwards <hedwards@nvidia.com>
+ * \author David Hollman <dshollm@sandia.gov>
+ * \author Christian Blau <cblau@gwdg.de>
+ */
+#include "gmxpre.h"
+
+#include "gromacs/mdspan/mdspan.h"
+
+#include <cstdio>
+
+#include <gtest/gtest.h>
+
+namespace gmx
+{
+
+namespace
+{
+
+
+// Test basic_mdspan with a mixture of dynamic and static extents, as well as extent of one.
+// The dynamic extents will be set to 4 and 2 repsectively so that we'll tests
+// a multidimensional array of extent 5 x 4 x 3 x 2 x 1, i.e. 120 elements
+
+//! View on int data with mixed static and dynamic extents
+using mdspan_int   = basic_mdspan < int, extents<5, dynamic_extent, 3, dynamic_extent, 1>, layout_right, accessor_basic < int>>;
+
+TEST(MdSpanTest, MdSpanWrapsBasicMdSpanCorrectly)
+{
+    // Check that mdspan wraps basic_mdspan as expected
+    ::testing::StaticAssertTypeEq < mdspan_int, mdspan < int, 5, dynamic_extent, 3, dynamic_extent, 1>>();
+}
+
+//! View on float data with mixed static and dynamic extents
+using mdspan_float = basic_mdspan < float, extents<5, dynamic_extent, 3, dynamic_extent, 1>, layout_right, accessor_basic < float>>;
+//! Types to be tested
+using MdSpanTypes      = ::testing::Types < mdspan_int, mdspan_float>;
+
+template<class ElementType, class Mapping>
+struct fill_raw_data {
+    static void fill(ElementType* p, Mapping m)
+    {
+        typename Mapping::extents_type e = m.extents();
+        for (ptrdiff_t i0 = 0; i0 < e.extent(0); i0++)
+        {
+            for (ptrdiff_t i1 = 0; i1 < e.extent(1); i1++)
+            {
+                for (ptrdiff_t i2 = 0; i2 < e.extent(2); i2++)
+                {
+                    for (ptrdiff_t i3 = 0; i3 < e.extent(3); i3++)
+                    {
+                        for (ptrdiff_t i4 = 0; i4 < e.extent(4); i4++)
+                        {
+                            p[i0*m.stride(0)+i1*m.stride(1)+i2*m.stride(2)+i3*m.stride(3)+i4*m.stride(4)] =
+                                ElementType(i0*10000+i1*1000+i2*100+i3*10+i4);
+                        }
+                    }
+                }
+            }
+        }
+    }
+};
+template<class MDSPAN>
+struct MdSpanTest : public ::testing::Test
+{
+    using mdspan_type   = MDSPAN;
+    using element_type  = typename mdspan_type::element_type;
+    using extents_type  = typename mdspan_type::extents_type;
+    using mapping_type  = typename mdspan_type::mapping_type;
+    using accessor_type = typename mdspan_type::accessor_type;
+    using pointer_type  = typename mdspan_type::pointer;
+
+    mdspan_type               my_mdspan_extents;
+    mdspan_type               my_mdspan_array;
+    mdspan_type               my_mdspan_mapping;
+    mdspan_type               my_mdspan_map_acc;
+    mdspan_type               my_mdspan_copy;
+
+    std::vector<element_type> rawData;
+
+    template<class ... ED>
+    void SetUp(ED ... e)
+    {
+        mapping_type  map {extents_type(e ...)};
+        accessor_type acc;
+        rawData.resize(map.required_span_size());
+        fill_raw_data<element_type, mapping_type>::fill(rawData.data(), map);
+        pointer_type  p(rawData.data());
+
+        my_mdspan_array   = mdspan_type(p, std::array<ptrdiff_t, sizeof ... (ED)>({{e ...}}));
+        my_mdspan_mapping = mdspan_type(p, map);
+        my_mdspan_map_acc = mdspan_type(p, map, acc);
+        my_mdspan_extents = mdspan_type(p, e ...);
+        my_mdspan_copy    = my_mdspan_mapping;
+    }
+
+    void check_rank(ptrdiff_t r)
+    {
+        EXPECT_EQ(my_mdspan_mapping.rank(), r);
+        EXPECT_EQ(my_mdspan_map_acc.rank(), r);
+        EXPECT_EQ(my_mdspan_extents.rank(), r);
+        EXPECT_EQ(my_mdspan_copy.rank(), r);
+    }
+    void check_rank_dynamic(ptrdiff_t r)
+    {
+        EXPECT_EQ(my_mdspan_mapping.rank_dynamic(), r);
+        EXPECT_EQ(my_mdspan_map_acc.rank_dynamic(), r);
+        EXPECT_EQ(my_mdspan_extents.rank_dynamic(), r);
+        EXPECT_EQ(my_mdspan_copy.rank_dynamic(), r);
+    }
+    template<class ... E>
+    void check_extents(E ... e)
+    {
+        std::array<ptrdiff_t, extents_type::rank()> a {{e ...}};
+        for (size_t r = 0; r < extents_type::rank(); r++)
+        {
+            EXPECT_EQ(my_mdspan_mapping.extent(r), a[r]);
+            EXPECT_EQ(my_mdspan_map_acc.extent(r), a[r]);
+            EXPECT_EQ(my_mdspan_extents.extent(r), a[r]);
+            EXPECT_EQ(my_mdspan_copy.extent(r), a[r]);
+        }
+    }
+    template<class ... E>
+    void check_strides(E ... e)
+    {
+        std::array<ptrdiff_t, extents_type::rank()> a {{e ...}};
+        for (size_t r = 0; r < extents_type::rank(); r++)
+        {
+            EXPECT_EQ(my_mdspan_mapping.stride(r), a[r]);
+            EXPECT_EQ(my_mdspan_map_acc.stride(r), a[r]);
+            EXPECT_EQ(my_mdspan_extents.stride(r), a[r]);
+            EXPECT_EQ(my_mdspan_copy.stride(r), a[r]);
+        }
+    }
+
+    void check_properties_internal(mdspan_type my_mdspan, bool always_unique, bool always_contiguous, bool always_strided,
+                                   bool unique, bool contiguous, bool strided)
+    {
+        EXPECT_EQ(my_mdspan.is_always_unique(), always_unique);
+        EXPECT_EQ(my_mdspan.is_always_contiguous(), always_contiguous);
+        EXPECT_EQ(my_mdspan.is_always_strided(), always_strided);
+        EXPECT_EQ(my_mdspan.is_unique(), unique);
+        EXPECT_EQ(my_mdspan.is_contiguous(), contiguous);
+        EXPECT_EQ(my_mdspan.is_strided(), strided);
+    }
+
+    void check_properties(bool always_unique, bool always_contiguous, bool always_strided,
+                          bool unique, bool contiguous, bool strided)
+    {
+        check_properties_internal(my_mdspan_mapping, always_unique, always_contiguous, always_strided, unique, contiguous, strided);
+        check_properties_internal(my_mdspan_map_acc, always_unique, always_contiguous, always_strided, unique, contiguous, strided);
+        check_properties_internal(my_mdspan_extents, always_unique, always_contiguous, always_strided, unique, contiguous, strided);
+        check_properties_internal(my_mdspan_copy, always_unique, always_contiguous, always_strided, unique, contiguous, strided);
+    }
+
+    void check_operator()
+    {
+        extents_type e = my_mdspan_mapping.extents();
+        for (ptrdiff_t i0 = 0; i0 < e.extent(0); i0++)
+        {
+            for (ptrdiff_t i1 = 0; i1 < e.extent(1); i1++)
+            {
+                for (ptrdiff_t i2 = 0; i2 < e.extent(2); i2++)
+                {
+                    for (ptrdiff_t i3 = 0; i3 < e.extent(3); i3++)
+                    {
+                        for (ptrdiff_t i4 = 0; i4 < e.extent(4); i4++)
+                        {
+                            element_type value = i0*10000+i1*1000+i2*100+i3*10+i4;
+                            EXPECT_EQ(my_mdspan_mapping(i0, i1, i2, i3, i4), value);
+                            EXPECT_EQ(my_mdspan_map_acc(i0, i1, i2, i3, i4), value);
+                            EXPECT_EQ(my_mdspan_extents(i0, i1, i2, i3, i4), value);
+                            EXPECT_EQ(my_mdspan_copy   (i0, i1, i2, i3, i4), value);
+                        }
+                    }
+                }
+            }
+        }
+    }
+};
+
+TYPED_TEST_CASE(MdSpanTest, MdSpanTypes);
+
+TYPED_TEST(MdSpanTest, Rank) {
+    this->SetUp(4, 2);
+    this->check_rank(5);
+}
+
+TYPED_TEST(MdSpanTest, DynamicRank) {
+    this->SetUp(4, 2);
+    this->check_rank_dynamic(2);
+}
+
+TYPED_TEST(MdSpanTest, Extents) {
+    this->SetUp(4, 2);
+    this->check_extents(5, 4, 3, 2, 1);
+}
+
+TYPED_TEST(MdSpanTest, Strides) {
+    this->SetUp(4, 2);
+    this->check_strides(24, 6, 2, 1, 1);
+}
+
+TYPED_TEST(MdSpanTest, Properties) {
+    this->SetUp(4, 2);
+    const bool always_unique     = true;
+    const bool always_contiguous = true;
+    const bool always_strided    = true;
+    const bool unique            = true;
+    const bool contiguous        = true;
+    const bool strided           = true;
+    this->check_properties(always_unique, always_contiguous, always_strided, unique, contiguous, strided);
+}
+
+TYPED_TEST(MdSpanTest, Operator) {
+    this->SetUp(4, 2);
+    this->check_operator();
+}
+
+} // namespace
+
+} // namespace gmx
index 8c7e620f565e9b57930ec313e6b34b5179c38a8f..1d3f9a1a0a8f529e5e9e48349aacfc1714951c7b 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -151,11 +151,6 @@ struct t_forcerec { // NOLINT (clang-analyzer-optin.performance.Padding)
     int nbkernel_elec_modifier;
     int nbkernel_vdw_modifier;
 
-    /* Use special N*N kernels? */
-    gmx_bool bAllvsAll;
-    /* Private work data */
-    void    *AllvsAll_work;
-
     /* Cut-Off stuff.
      * Infinite cut-off's will be GMX_CUTOFF_INF (unlike in t_inputrec: 0).
      */
diff --git a/src/gromacs/mdtypes/group.cpp b/src/gromacs/mdtypes/group.cpp
new file mode 100644 (file)
index 0000000..b0c15ca
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2019, 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 classes from group.h.
+ *
+ * \author Kevin Boyd <kevin.boyd@uconn.edu>
+ * \ingroup module_mdtypes
+ */
+#include "gmxpre.h"
+
+#include "group.h"
+
+gmx_ekindata_t::~gmx_ekindata_t()
+{
+    for (int i = 0; i < nthreads; i++)
+    {
+        sfree(ekin_work_alloc[i]);
+    }
+    sfree(ekin_work_alloc);
+    sfree(ekin_work);
+    sfree(dekindl_work);
+}
index fe27a71fa77c24658e4165dc4f2a615be06d19c6..0dcd497ac16931855a7d7f5981af083205868acb 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2018,2019, 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.
 #ifndef GMX_MDTYPES_GROUP_H
 #define GMX_MDTYPES_GROUP_H
 
+#include <vector>
+
 #include "gromacs/math/vectypes.h"
 #include "gromacs/utility/basedefinitions.h"
 #include "gromacs/utility/real.h"
+#include "gromacs/utility/smalloc.h"
 
-typedef struct {
-    real    Th;             /* Temperature at half step        */
-    real    T;              /* Temperature at full step        */
-    tensor  ekinh;          /* Kinetic energy at half step     */
-    tensor  ekinh_old;      /* Kinetic energy at old half step */
-    tensor  ekinf;          /* Kinetic energy at full step     */
-    real    lambda;         /* Berendsen coupling lambda       */
-    double  ekinscalef_nhc; /* Scaling factor for NHC- full step */
-    double  ekinscaleh_nhc; /* Scaling factor for NHC- half step */
-    double  vscale_nhc;     /* Scaling factor for NHC- velocity */
-} t_grp_tcstat;
+struct t_grp_tcstat{
+    real    Th             = 0;     /* Temperature at half step        */
+    real    T              = 0;     /* Temperature at full step        */
+    tensor  ekinh          = {{0}}; /* Kinetic energy at half step     */
+    tensor  ekinh_old      = {{0}}; /* Kinetic energy at old half step */
+    tensor  ekinf          = {{0}}; /* Kinetic energy at full step     */
+    real    lambda         = 0;     /* Berendsen coupling lambda       */
+    double  ekinscalef_nhc = 0;     /* Scaling factor for NHC- full step */
+    double  ekinscaleh_nhc = 0;     /* Scaling factor for NHC- half step */
+    double  vscale_nhc     = 0;     /* Scaling factor for NHC- velocity */
+};
 
-typedef struct {
+struct t_grp_acc {
     int     nat;    /* Number of atoms in this group           */
     rvec    u;      /* Mean velocities of home particles        */
     rvec    uold;   /* Previous mean velocities of home particles   */
     double  mA;     /* Mass for topology A                             */
     double  mB;     /* Mass for topology B                             */
-} t_grp_acc;
+};
 
-typedef struct {
+struct t_cos_acc{
     real    cos_accel;  /* The acceleration for the cosine profile      */
     real    mvcos;      /* The cos momenta of home particles            */
     real    vcos;       /* The velocity of the cosine profile           */
-} t_cos_acc;
+};
+
+struct gmx_ekindata_t {
+    gmx_bool                  bNEMD;
+    int                       ngtc;            /* The number of T-coupling groups      */
+    int                       nthreads;        /* For size of ekin_work */
+    std::vector<t_grp_tcstat> tcstat;          /* T-coupling data            */
+    tensor                  **ekin_work_alloc; /* Allocated locations for *_work members */
+    tensor                  **ekin_work;       /* Work arrays for tcstat per thread    */
+    real                    **dekindl_work;    /* Work location for dekindl per thread */
+    int                       ngacc;           /* The number of acceleration groups    */
+    std::vector<t_grp_acc>    grpstat;         /* Acceleration data                    */
+    tensor                    ekin;            /* overall kinetic energy               */
+    tensor                    ekinh;           /* overall 1/2 step kinetic energy      */
+    real                      dekindl;         /* dEkin/dlambda at half step           */
+    real                      dekindl_old;     /* dEkin/dlambda at old half step       */
+    t_cos_acc                 cosacc;          /* Cosine acceleration data             */
 
-typedef struct gmx_ekindata_t {
-    gmx_bool         bNEMD;
-    int              ngtc;            /* The number of T-coupling groups      */
-    t_grp_tcstat    *tcstat;          /* T-coupling data            */
-    tensor         **ekin_work_alloc; /* Allocated locations for *_work members */
-    tensor         **ekin_work;       /* Work arrays for tcstat per thread    */
-    real           **dekindl_work;    /* Work location for dekindl per thread */
-    int              ngacc;           /* The number of acceleration groups    */
-    t_grp_acc       *grpstat;         /* Acceleration data                     */
-    tensor           ekin;            /* overall kinetic energy               */
-    tensor           ekinh;           /* overall 1/2 step kinetic energy      */
-    real             dekindl;         /* dEkin/dlambda at half step           */
-    real             dekindl_old;     /* dEkin/dlambda at old half step       */
-    t_cos_acc        cosacc;          /* Cosine acceleration data             */
-} gmx_ekindata_t;
+    ~gmx_ekindata_t();
+};
 
 #define GID(igid, jgid, gnr) (((igid) < (jgid)) ? ((igid)*(gnr)+(jgid)) : ((jgid)*(gnr)+(igid)))
 
index 1516daac57f390b6a9eb3ce6d77f82def066e41f..52b7d11fe367fe2135d627e3f107035a4523ba2b 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -73,6 +73,10 @@ namespace gmx
 struct AwhHistory;
 }
 
+//! Convenience alias for until all is moved in the gmx namespace
+template <class T>
+using PaddedHostVector = gmx::PaddedHostVector<T>;
+
 /*
  * The t_state struct should contain all the (possibly) non-static
  * information required to define the state of the system.
@@ -189,32 +193,32 @@ class t_state
         t_state();
 
         // All things public
-        int                        natoms;         //!< Number of atoms, local + non-local; this is the size of \p x, \p v and \p cg_p, when used
-        int                        ngtc;           //!< The number of temperature coupling groups
-        int                        nnhpres;        //!< The NH-chain length for the MTTK barostat
-        int                        nhchainlength;  //!< The NH-chain length for temperature coupling
-        int                        flags;          //!< Set of bit-flags telling which entries are present, see enum at the top of the file
-        int                        fep_state;      //!< indicates which of the alchemical states we are in
-        std::array<real, efptNR>   lambda;         //!< Free-energy lambda vector
-        matrix                     box;            //!< Matrix of box vectors
-        matrix                     box_rel;        //!< Relative box vectors to preserve box shape
-        matrix                     boxv;           //!< Box velocities for Parrinello-Rahman P-coupling
-        matrix                     pres_prev;      //!< Pressure of the previous step for pcoupl
-        matrix                     svir_prev;      //!< Shake virial for previous step for pcoupl
-        matrix                     fvir_prev;      //!< Force virial of the previous step for pcoupl
-        std::vector<double>        nosehoover_xi;  //!< Nose-Hoover coordinates (ngtc)
-        std::vector<double>        nosehoover_vxi; //!< Nose-Hoover velocities (ngtc)
-        std::vector<double>        nhpres_xi;      //!< Pressure Nose-Hoover coordinates
-        std::vector<double>        nhpres_vxi;     //!< Pressure Nose-Hoover velocities
-        std::vector<double>        therm_integral; //!< Work exterted N-H/V-rescale T-coupling (ngtc)
-        double                     baros_integral; //!< For Berendsen P-coupling conserved quantity
-        real                       veta;           //!< Trotter based isotropic P-coupling
-        real                       vol0;           //!< Initial volume,required for computing MTTK conserved quantity
-        gmx::HostVector<gmx::RVec> x;              //!< The coordinates (natoms)
-        PaddedVector<gmx::RVec>    v;              //!< The velocities (natoms)
-        PaddedVector<gmx::RVec>    cg_p;           //!< p vector for conjugate gradient minimization
-
-        ekinstate_t                ekinstate;      //!< The state of the kinetic energy
+        int                         natoms;         //!< Number of atoms, local + non-local; this is the size of \p x, \p v and \p cg_p, when used
+        int                         ngtc;           //!< The number of temperature coupling groups
+        int                         nnhpres;        //!< The NH-chain length for the MTTK barostat
+        int                         nhchainlength;  //!< The NH-chain length for temperature coupling
+        int                         flags;          //!< Set of bit-flags telling which entries are present, see enum at the top of the file
+        int                         fep_state;      //!< indicates which of the alchemical states we are in
+        std::array<real, efptNR>    lambda;         //!< Free-energy lambda vector
+        matrix                      box;            //!< Matrix of box vectors
+        matrix                      box_rel;        //!< Relative box vectors to preserve box shape
+        matrix                      boxv;           //!< Box velocities for Parrinello-Rahman P-coupling
+        matrix                      pres_prev;      //!< Pressure of the previous step for pcoupl
+        matrix                      svir_prev;      //!< Shake virial for previous step for pcoupl
+        matrix                      fvir_prev;      //!< Force virial of the previous step for pcoupl
+        std::vector<double>         nosehoover_xi;  //!< Nose-Hoover coordinates (ngtc)
+        std::vector<double>         nosehoover_vxi; //!< Nose-Hoover velocities (ngtc)
+        std::vector<double>         nhpres_xi;      //!< Pressure Nose-Hoover coordinates
+        std::vector<double>         nhpres_vxi;     //!< Pressure Nose-Hoover velocities
+        std::vector<double>         therm_integral; //!< Work exterted N-H/V-rescale T-coupling (ngtc)
+        double                      baros_integral; //!< For Berendsen P-coupling conserved quantity
+        real                        veta;           //!< Trotter based isotropic P-coupling
+        real                        vol0;           //!< Initial volume,required for computing MTTK conserved quantity
+        PaddedHostVector<gmx::RVec> x;              //!< The coordinates (natoms)
+        PaddedVector<gmx::RVec>     v;              //!< The velocities (natoms)
+        PaddedVector<gmx::RVec>     cg_p;           //!< p vector for conjugate gradient minimization
+
+        ekinstate_t                 ekinstate;      //!< The state of the kinetic energy
 
         /* History for special algorithms, should be moved to a history struct */
         history_t                         hist;               //!< Time history for restraints
@@ -233,13 +237,13 @@ class t_state
  * TODO: Move the next two structs out of state.h.
  */
 
-typedef struct t_extmass
+struct t_extmass
 {
-    double *Qinv;  /* inverse mass of thermostat -- computed from inputs, but a good place to store */
-    double *QPinv; /* inverse mass of thermostat for barostat -- computed from inputs, but a good place to store */
-    double  Winv;  /* Pressure mass inverse -- computed, not input, but a good place to store. Need to make a matrix later */
-    tensor  Winvm; /* inverse pressure mass tensor, computed       */
-} t_extmass;
+    std::vector<double> Qinv;  /* inverse mass of thermostat -- computed from inputs, but a good place to store */
+    std::vector<double> QPinv; /* inverse mass of thermostat for barostat -- computed from inputs, but a good place to store */
+    double              Winv;  /* Pressure mass inverse -- computed, not input, but a good place to store. Need to make a matrix later */
+    tensor              Winvm; /* inverse pressure mass tensor, computed       */
+};
 
 
 typedef struct
index cb4bca655595f7ae0699006a45f36945144a6491..d3eb3b51cacb4e0eccffce20a13888e75b99a7c0 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2018, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019, 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.
@@ -62,7 +62,7 @@ constexpr int TYPE_INT = 0, TYPE_DOUBLE = 0;
  */
 static void MCL_init_client(const char *) // NOLINT(readability-named-parameter)
 {
-    gmx_fatal(FARGS, "GROMACS is compiled without MiMiC support! Please, recompile with -DGMX_MIMIC=ON");
+    GMX_RELEASE_ASSERT(GMX_MIMIC, "GROMACS is compiled without MiMiC support! Please, recompile with -DGMX_MIMIC=ON");
 }
 
 /*! \brief Stub communication library function to call in case if
@@ -70,7 +70,7 @@ static void MCL_init_client(const char *) // NOLINT(readability-named-parameter)
  */
 static void MCL_send(void *, int, int, int) // NOLINT(readability-named-parameter)
 {
-    gmx_fatal(FARGS, "GROMACS is compiled without MiMiC support! Please, recompile with -DGMX_MIMIC=ON");
+    GMX_RELEASE_ASSERT(GMX_MIMIC, "GROMACS is compiled without MiMiC support! Please, recompile with -DGMX_MIMIC=ON");
 }
 
 /*! \brief Stub communication library function to call in case if
@@ -78,15 +78,15 @@ static void MCL_send(void *, int, int, int) // NOLINT(readability-named-paramete
  */
 static void MCL_receive(void *, int, int, int) // NOLINT(readability-named-parameter)
 {
-    gmx_fatal(FARGS, "GROMACS is compiled without MiMiC support! Please, recompile with -DGMX_MIMIC=ON");
+    GMX_RELEASE_ASSERT(GMX_MIMIC, "GROMACS is compiled without MiMiC support! Please, recompile with -DGMX_MIMIC=ON");
 }
 
 /*! \brief Stub communication library function to call in case if
  * GROMACS is compiled without MiMiC. Calling causes GROMACS to exit!
  */
-static void MCL_destroy() // NOLINT(readability-named-parameter)
+static void MCL_destroy()
 {
-    gmx_fatal(FARGS, "GROMACS is compiled without MiMiC support! Please, recompile with -DGMX_MIMIC=ON");
+    GMX_RELEASE_ASSERT(GMX_MIMIC, "GROMACS is compiled without MiMiC support! Please, recompile with -DGMX_MIMIC=ON");
 }
 #endif
 
@@ -97,8 +97,8 @@ void gmx::MimicCommunicator::init()
     return MCL_init_client(path);
 }
 
-void gmx::MimicCommunicator::sendInitData(gmx_mtop_t                 *mtop,
-                                          HostVector<gmx::RVec>       coords)
+void gmx::MimicCommunicator::sendInitData(gmx_mtop_t                  *mtop,
+                                          PaddedHostVector<gmx::RVec>  coords)
 {
     MCL_send(&mtop->natoms, 1, TYPE_INT, 0);
     MCL_send(&mtop->atomtypes.nr, 1, TYPE_INT, 0);
@@ -239,7 +239,7 @@ int64_t gmx::MimicCommunicator::getStepNumber()
     return steps;
 }
 
-void gmx::MimicCommunicator::getCoords(HostVector<RVec> *x, const int natoms)
+void gmx::MimicCommunicator::getCoords(PaddedHostVector<RVec> *x, const int natoms)
 {
     std::vector<double> coords(natoms * 3);
     MCL_receive(&*coords.begin(), 3 * natoms, TYPE_DOUBLE, 0);
index a419d2faafff28732b7da985e418bb562ccd9a9d..89f72382bcec7bed43d52395c6176a7f5bdd9a2b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2018, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019, 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.
@@ -73,8 +73,8 @@ class MimicCommunicator
          * @param mtop global topology data
          * @param coords coordinates of all atoms
          */
-        void sendInitData(gmx_mtop_t                *mtop,
-                          HostVector<gmx::RVec>      coords);
+        void sendInitData(gmx_mtop_t                  *mtop,
+                          PaddedHostVector<gmx::RVec>  coords);
 
         /*! \brief
          * Gets the number of MD steps to perform from MiMiC
@@ -89,7 +89,7 @@ class MimicCommunicator
          * @param x array of coordinates to fill
          * @param natoms number of atoms in the system
          */
-        void getCoords(HostVector<RVec> *x, int natoms);
+        void getCoords(PaddedHostVector<RVec> *x, int natoms);
 
         /*! \brief
          * Send the potential energy value to MiMiC
index 6b8c75bfec264ee6b73c54c114b8c321746531f3..c8d77e18a9182d932a91b6280080024c5d271d1c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2019, 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.
@@ -45,9 +45,9 @@
 
 #include "gromacs/options/abstractoptionstorage.h"
 #include "gromacs/options/optionflags.h"
+#include "gromacs/utility/any.h"
 #include "gromacs/utility/exceptions.h"
 #include "gromacs/utility/gmxassert.h"
-#include "gromacs/utility/variant.h"
 
 #include "basicoptionstorage.h"
 
@@ -117,7 +117,7 @@ void AbstractOptionStorage::startSet()
     bSetValuesHadErrors_ = false;
 }
 
-void AbstractOptionStorage::appendValue(const Variant &value)
+void AbstractOptionStorage::appendValue(const Any &value)
 {
     GMX_RELEASE_ASSERT(bInSet_, "startSet() not called");
     try
@@ -261,7 +261,7 @@ std::string OptionInfo::formatDescription() const
     return description;
 }
 
-std::vector<Variant> OptionInfo::defaultValues() const
+std::vector<Any> OptionInfo::defaultValues() const
 {
     return option().defaultValues();
 }
@@ -271,7 +271,7 @@ std::vector<std::string> OptionInfo::defaultValuesAsStrings() const
     return option().defaultValuesAsStrings();
 }
 
-std::vector<Variant> OptionInfo::normalizeValues(const std::vector<Variant> &values) const
+std::vector<Any> OptionInfo::normalizeValues(const std::vector<Any> &values) const
 {
     return option().normalizeValues(values);
 }
index 575cd6efaddffba760057f6e1ef5f8fff885bfb4..5bc34cac5db6202934d66fdcd5506ac301dc5f29 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2019, 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.
@@ -66,7 +66,7 @@ namespace gmx
 class AbstractOptionStorage;
 template <typename T> class OptionStorageTemplate;
 class OptionManagerContainer;
-class Variant;
+class Any;
 
 namespace internal
 {
@@ -491,12 +491,12 @@ class OptionInfo
          * Returns the default value(s) of the option.
          *
          * The returned values should all be of the same type, but returning
-         * each as a separate variant is currently simpler.
+         * each as a separate any is currently simpler.
          *
          * Currently, this can only be called before option values have been
          * assigned.
          */
-        std::vector<Variant> defaultValues() const;
+        std::vector<Any> defaultValues() const;
         /*! \brief
          * Returns the default value(s) of the option as strings.
          *
@@ -517,7 +517,7 @@ class OptionInfo
          * value of the option, and the current value in the option is not
          * changed.
          */
-        std::vector<Variant> normalizeValues(const std::vector<Variant> &values) const;
+        std::vector<Any> normalizeValues(const std::vector<Any> &values) const;
 
     protected:
         /*! \cond libapi */
index dd4e2eae764d2a4413f70d05794026bd2ec8724f..7a266bd4513423cb245a5fbb92f1cd4d64b34d32 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2010,2011,2012,2014,2015,2016, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2014,2015,2016,2019, 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.
@@ -55,7 +55,7 @@ namespace gmx
 class AbstractOption;
 class OptionInfo;
 class Options;
-class Variant;
+class Any;
 
 /*! \libinternal \brief
  * Abstract base class for converting, validating, and storing option values.
@@ -140,11 +140,11 @@ class AbstractOptionStorage
          */
         virtual int valueCount() const = 0;
         //! \copydoc OptionInfo::defaultValues()
-        virtual std::vector<Variant> defaultValues() const = 0;
+        virtual std::vector<Any> defaultValues() const = 0;
         //! \copydoc OptionInfo::defaultValuesAsStrings()
         virtual std::vector<std::string> defaultValuesAsStrings() const = 0;
         //! \copydoc OptionInfo::normalizeValues()
-        virtual std::vector<Variant> normalizeValues(const std::vector<Variant> &values) const = 0;
+        virtual std::vector<Any> normalizeValues(const std::vector<Any> &values) const = 0;
 
         /*! \brief
          * Starts adding values from a new source for the option.
@@ -178,7 +178,7 @@ class AbstractOptionStorage
          * This method should only be called between startSet() and
          * finishSet().
          */
-        void appendValue(const Variant &value);
+        void appendValue(const Any &value);
         /*! \brief
          * Performs validation and/or actions once a set of values has been
          * added.
@@ -276,7 +276,7 @@ class AbstractOptionStorage
          *
          * \see OptionStorageTemplate::convertValue()
          */
-        virtual void convertValue(const Variant &value) = 0;
+        virtual void convertValue(const Any &value) = 0;
         /*! \brief
          * Performs validation and/or actions once a set of values has been
          * added.
index fa33e4f1e73abc80ce859bd6d278a2bae15e66fc..57bd2106f9c0206ee2e5dc6e273a50e5fd2cd980 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2018,2019, 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.
@@ -610,9 +610,9 @@ std::string EnumOptionStorage::formatSingleValue(const int &value) const
     return allowed_[value];
 }
 
-Variant EnumOptionStorage::normalizeValue(const int &value) const
+Any EnumOptionStorage::normalizeValue(const int &value) const
 {
-    return Variant::create<std::string>(formatSingleValue(value));
+    return Any::create<std::string>(formatSingleValue(value));
 }
 
 void EnumOptionStorage::initConverter(ConverterType *converter)
index 847af90eb7183972d8ac9d262f321660989566ff..b1dfb5781e45a4e6455ae9ba022596646aa4061c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2018,2019, 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.
@@ -244,7 +244,7 @@ class EnumOptionStorage : public OptionStorageTemplateSimple<int>
         std::string typeString() const override { return "enum"; }
         std::string formatExtraDescription() const override;
         std::string formatSingleValue(const int &value) const override;
-        Variant normalizeValue(const int &value) const override;
+        Any normalizeValue(const int &value) const override;
 
         //! \copydoc EnumOptionInfo::allowedValues()
         const std::vector<std::string> &allowedValues() const { return allowed_; }
index 45cd89a55596a72cb46921893c3053a1f648233d..f9cb896873d49ec42703fbd5f95f9630211f86d8 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2019, 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.
@@ -47,9 +47,9 @@
 
 #include "gromacs/options/abstractoptionstorage.h"
 #include "gromacs/options/options.h"
+#include "gromacs/utility/any.h"
 #include "gromacs/utility/exceptions.h"
 #include "gromacs/utility/gmxassert.h"
-#include "gromacs/utility/variant.h"
 
 #include "options-impl.h"
 
@@ -203,10 +203,10 @@ bool OptionsAssigner::tryStartOption(const char *name)
 
 void OptionsAssigner::appendValue(const std::string &value)
 {
-    appendValue(Variant(value));
+    appendValue(Any(value));
 }
 
-void OptionsAssigner::appendValue(const Variant &value)
+void OptionsAssigner::appendValue(const Any &value)
 {
     AbstractOptionStorage *option = impl_->currentOption_;
     GMX_RELEASE_ASSERT(option != nullptr, "startOption() not called");
@@ -224,7 +224,7 @@ void OptionsAssigner::finishOption()
         if (impl_->currentValueCount_ == 0)
         {
             // Should not throw, otherwise something is wrong.
-            option->appendValue(Variant::create<bool>(!impl_->reverseBoolean_));
+            option->appendValue(Any::create<bool>(!impl_->reverseBoolean_));
         }
         else if (impl_->reverseBoolean_)
         {
index cdefa7258276df7cb263d018d996e6535bbfbaad..a07892fe047ee2959c54cf0b8ca05fa46e04c80f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2010,2011,2012,2013,2014,2015,2016, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2019, 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.
@@ -53,7 +53,7 @@ namespace gmx
 {
 
 class Options;
-class Variant;
+class Any;
 
 /*! \libinternal \brief
  * Decorator class for assigning values to Options.
@@ -167,13 +167,13 @@ class OptionsAssigner
          * OptionStorageTemplate::convertValue() method of the storage class
          * implementing the option where the value is assigned to.
          */
-        void appendValue(const Variant &value);
+        void appendValue(const Any &value);
         /*! \brief
          * Appends a value to the value list of the current option.
          *
          * \param[in] value  Value to assign.
          *
-         * See appendValue(const Variant &) for more details.
+         * See appendValue(const Any &) for more details.
          */
         void appendValue(const std::string &value);
         /*! \brief
index 5659fae1201d8b69e175855d7ecac7b7a61b6597..0081912bcf3f9c769f2a985cce0926890d7f5ea3 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2018,2019, 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.
 #include "gromacs/options/abstractoption.h"
 #include "gromacs/options/abstractoptionstorage.h"
 #include "gromacs/options/valuestore.h"
+#include "gromacs/utility/any.h"
 #include "gromacs/utility/arrayref.h"
 #include "gromacs/utility/basedefinitions.h"
 #include "gromacs/utility/exceptions.h"
 #include "gromacs/utility/gmxassert.h"
-#include "gromacs/utility/variant.h"
 
 #include "valueconverter.h"
 
@@ -102,7 +102,7 @@ class OptionStorageTemplate : public AbstractOptionStorage
         //! \copydoc gmx::AbstractOptionStorage::valueCount()
         int valueCount() const override { return store_->valueCount(); }
         //! \copydoc gmx::AbstractOptionStorage::defaultValues()
-        std::vector<Variant> defaultValues() const override;
+        std::vector<Any> defaultValues() const override;
         /*! \copydoc gmx::AbstractOptionStorage::defaultValuesAsStrings()
          *
          * OptionStorageTemplate implements handling of defaultValueIfSet()
@@ -151,7 +151,7 @@ class OptionStorageTemplate : public AbstractOptionStorage
          * should be considered whether the implementation can be made strongly
          * exception safe.
          */
-        void convertValue(const Variant &value) override = 0;
+        void convertValue(const Any &value) override = 0;
         /*! \brief
          * Processes values for a set after all have been converted.
          *
@@ -257,7 +257,7 @@ class OptionStorageTemplate : public AbstractOptionStorage
         /*! \brief
          * Provides derived classes access to the current list of values.
          *
-         * The non-const variant should only be used from processAll() in
+         * The non-const any should only be used from processAll() in
          * derived classes if necessary.
          */
         ArrayRef<T>       values() { return store_->values(); }
@@ -327,11 +327,11 @@ class OptionStorageTemplateSimple : public OptionStorageTemplate<T>
         {
         }
 
-        std::vector<Variant>
-        normalizeValues(const std::vector<Variant> &values) const override
+        std::vector<Any>
+        normalizeValues(const std::vector<Any> &values) const override
         {
             const_cast<MyBase *>(this)->ensureConverterInitialized();
-            std::vector<Variant> result;
+            std::vector<Any> result;
             result.reserve(values.size());
             for (const auto &value : values)
             {
@@ -367,16 +367,16 @@ class OptionStorageTemplateSimple : public OptionStorageTemplate<T>
          * This can be overridden to serialize a different type than `T`
          * when using the option with KeyValueTreeObject.
          */
-        virtual Variant normalizeValue(const T &value) const
+        virtual Any normalizeValue(const T &value) const
         {
-            return Variant::create<T>(processValue(value));
+            return Any::create<T>(processValue(value));
         }
 
     private:
-        void convertValue(const Variant &variant) override
+        void convertValue(const Any &any) override
         {
             ensureConverterInitialized();
-            this->addValue(processValue(converter_.convert(variant)));
+            this->addValue(processValue(converter_.convert(any)));
         }
         void ensureConverterInitialized()
         {
@@ -472,9 +472,9 @@ std::unique_ptr<IOptionValueStore<T> > OptionStorageTemplate<T>::createStore(
 
 
 template <typename T>
-std::vector<Variant> OptionStorageTemplate<T>::defaultValues() const
+std::vector<Any> OptionStorageTemplate<T>::defaultValues() const
 {
-    std::vector<Variant> result;
+    std::vector<Any> result;
     if (hasFlag(efOption_NoDefaultValue))
     {
         return result;
@@ -483,7 +483,7 @@ std::vector<Variant> OptionStorageTemplate<T>::defaultValues() const
                        "Current option implementation can only provide default values before assignment");
     for (const auto &value : values())
     {
-        result.push_back(Variant::create<T>(value));
+        result.push_back(Any::create<T>(value));
     }
     return normalizeValues(result);
 }
index 336075277337d4cbd74b1bda21434db934499c30..de0037b6040d035e6acb4e385ec56ba29f825fd9 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2010,2011,2012,2013,2014,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013,2014,2016,2018,2019, 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.
@@ -110,13 +110,13 @@ class MockOptionStorage : public gmx::OptionStorageTemplate<std::string>
         {
             return "";
         }
-        std::vector<gmx::Variant>
-        normalizeValues(const std::vector<gmx::Variant> &values) const override
+        std::vector<gmx::Any>
+        normalizeValues(const std::vector<gmx::Any> &values) const override
         {
             return values;
         }
 
-        void convertValue(const gmx::Variant &value) override
+        void convertValue(const gmx::Any &value) override
         {
             convertValue(value.cast<std::string>());
         }
index e8de95d92fe9ec807e3e76ad0cabec773c512d82..ad1df797612571add31c77e5655a308812900ecf 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2019, 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.
@@ -57,9 +57,9 @@
 #include "gromacs/options/basicoptions.h"
 #include "gromacs/options/options.h"
 #include "gromacs/options/optionsection.h"
+#include "gromacs/utility/any.h"
 #include "gromacs/utility/exceptions.h"
 #include "gromacs/utility/stringutil.h"
-#include "gromacs/utility/variant.h"
 
 #include "testutils/testasserts.h"
 
@@ -654,7 +654,7 @@ TEST(OptionsAssignerDoubleTest, StoresValueFromFloat)
     gmx::OptionsAssigner assigner(&options);
     EXPECT_NO_THROW(assigner.start());
     ASSERT_NO_THROW(assigner.startOption("p"));
-    ASSERT_NO_THROW(assigner.appendValue(gmx::Variant::create<float>(2.7)));
+    ASSERT_NO_THROW(assigner.appendValue(gmx::Any::create<float>(2.7)));
     EXPECT_NO_THROW(assigner.finishOption());
     EXPECT_NO_THROW(assigner.finish());
     EXPECT_NO_THROW(options.finish());
index bacc788d34fa4892bf268da062b522443938c24d..aeb94fbe378fb3a4d598c3aa93412bf50a643a34 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2018,2019, 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.
@@ -104,7 +104,7 @@ class TreeAssignHelper
                     assigner_.startOption(prop.key().c_str());
                     try
                     {
-                        assigner_.appendValue(prop.value().asVariant());
+                        assigner_.appendValue(prop.value().asAny());
                     }
                     catch (UserInputError &ex)
                     {
@@ -136,7 +136,7 @@ class TreeAssignHelper
                 assigner_.startOption(key.c_str());
                 for (const KeyValueTreeValue &value : array.values())
                 {
-                    assigner_.appendValue(value.asVariant());
+                    assigner_.appendValue(value.asAny());
                 }
                 assigner_.finishOption();
             }
@@ -250,7 +250,7 @@ class TreeAdjustHelper : private OptionsVisitor
             const std::string &name = option.name();
             if (currentSourceObject_ == nullptr || !currentSourceObject_->keyExists(name))
             {
-                std::vector<Variant> values = option.defaultValues();
+                std::vector<Any> values = option.defaultValues();
                 if (values.size() == 1)
                 {
                     currentObjectBuilder_.addRawValue(name, std::move(values[0]));
@@ -258,7 +258,7 @@ class TreeAdjustHelper : private OptionsVisitor
                 else if (values.size() > 1)
                 {
                     auto arrayBuilder = currentObjectBuilder_.addArray(name);
-                    for (Variant &value : values)
+                    for (Any &value : values)
                     {
                         arrayBuilder.addRawValue(std::move(value));
                     }
@@ -268,19 +268,19 @@ class TreeAdjustHelper : private OptionsVisitor
             {
                 const KeyValueTreeValue &value = (*currentSourceObject_)[name];
                 GMX_RELEASE_ASSERT(!value.isObject(), "Value objects not supported in this context");
-                std::vector<Variant>     values;
+                std::vector<Any>         values;
                 if (value.isArray())
                 {
                     for (const auto &arrayValue : value.asArray().values())
                     {
                         GMX_RELEASE_ASSERT(!value.isObject() && !value.isArray(),
                                            "Complex values not supported in this context");
-                        values.push_back(arrayValue.asVariant());
+                        values.push_back(arrayValue.asAny());
                     }
                 }
                 else
                 {
-                    values.push_back(value.asVariant());
+                    values.push_back(value.asAny());
                 }
                 values = option.normalizeValues(values);
                 if (values.empty())
index 0374890b10cc28db50c00060c840a26c722ff5b3..03c7a72c1274206bfab626e95e8454ff8b0b1a7c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2016, by the GROMACS development team, led by
+ * Copyright (c) 2016,2019, 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.
 #include <map>
 #include <typeindex>
 
+#include "gromacs/utility/any.h"
 #include "gromacs/utility/exceptions.h"
-#include "gromacs/utility/variant.h"
 
 namespace gmx
 {
 
 /*! \libinternal \brief
- * Helper for converting from Variant to a given type.
+ * Helper for converting from Any to a given type.
  *
  * \tparam OutType  Type this converter converts to.
  *
  * Default-constructed converter only supports identity mapping from the a
- * Variant holding `OutType`.  To add support for additional input types,
+ * Any holding `OutType`.  To add support for additional input types,
  * provide conversion functions with addConverter().  To use a non-identity
  * mapping for an `OutType` -> `OutType` conversion, provide an alternative
  * conversion from `OutType` with addConverter().
@@ -71,13 +71,13 @@ class OptionValueConverterSimple
 {
     public:
         /*! \brief
-         * Converts a Variant value to the output type.
+         * Converts a Any value to the output type.
          *
          * \returns  Converted value.
-         * \throws InvalidInputError If the input Variant has a type that is
+         * \throws InvalidInputError If the input Any has a type that is
          *     not recognized by any conversion.
          */
-        OutType convert(const Variant &value) const
+        OutType convert(const Any &value) const
         {
             std::type_index type(value.type());
             auto            iter = converters_.find(type);
@@ -102,7 +102,7 @@ class OptionValueConverterSimple
         void addConverter(std::function<OutType(const InType &)> func)
         {
             converters_[std::type_index(typeid(InType))] =
-                [func] (const Variant &value)
+                [func] (const Any &value)
                 {
                     return func(value.cast<InType>());
                 };
@@ -116,14 +116,14 @@ class OptionValueConverterSimple
         void addCastConversion()
         {
             converters_[std::type_index(typeid(InType))] =
-                [] (const Variant &value)
+                [] (const Any &value)
                 {
                     return static_cast<OutType>(value.cast<InType>());
                 };
         }
 
     private:
-        typedef std::function<OutType(const Variant &value)> ConversionFunction;
+        typedef std::function<OutType(const Any &value)> ConversionFunction;
 
         std::map<std::type_index, ConversionFunction> converters_;
 };
index f9ae38483a80b526a95aa065f69a861044e25bc2..2b6017d56efc99399746ccf8d5847970a76738a5 100644 (file)
@@ -1731,7 +1731,7 @@ static void init_pull_group_index(FILE *fplog, const t_commrec *cr,
     /* In parallel, store we need to extract localWeights from weights at DD time */
     std::vector<real>  &weights = ((cr && PAR(cr)) ? pg->globalWeights : pg->localWeights);
 
-    const gmx_groups_t *groups  = &mtop->groups;
+    const gmx_groups_t &groups  = mtop->groups;
 
     /* Count frozen dimensions and (weighted) mass */
     int    nfrozen = 0;
@@ -1787,13 +1787,13 @@ static void init_pull_group_index(FILE *fplog, const t_commrec *cr,
             }
             else
             {
-                if (groups->grpnr[egcTC] == nullptr)
+                if (groups.grpnr[egcTC] == nullptr)
                 {
                     mbd = ir->delta_t/ir->opts.tau_t[0];
                 }
                 else
                 {
-                    mbd = ir->delta_t/ir->opts.tau_t[groups->grpnr[egcTC][ii]];
+                    mbd = ir->delta_t/ir->opts.tau_t[groups.grpnr[egcTC][ii]];
                 }
             }
             w                   *= m/mbd;
index 5fe30043f99a8bfbd63db06f1b9cdf82ad983780..01c243c4a0f86bdfc78b77f3fac62bfa48786c2d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2016,2018,2019, 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.
@@ -71,14 +71,14 @@ class SelectionFileOptionStorage : public AbstractOptionStorage
         OptionInfo &optionInfo() override { return info_; }
         std::string typeString() const override { return "file"; }
         int valueCount() const override { return 0; }
-        std::vector<Variant> defaultValues() const override { return {}; }
+        std::vector<Any> defaultValues() const override { return {}; }
         std::vector<std::string> defaultValuesAsStrings() const override { return {}; }
-        std::vector<Variant>
-        normalizeValues(const std::vector<Variant> &values) const override { return values; }
+        std::vector<Any>
+        normalizeValues(const std::vector<Any> &values) const override { return values; }
 
     private:
         void clearSet() override;
-        void convertValue(const Variant &value) override;
+        void convertValue(const Any &value) override;
         void processSet() override;
         void processAll() override {}
 
index 2635cbe78a856c4d7d0c8389381b3b0f75321d31..3e43983fbbbc70348870857672683a9853aa1695 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2017,2018,2019, 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.
@@ -84,8 +84,8 @@ std::string SelectionOptionStorage::formatSingleValue(const Selection &value) co
 }
 
 
-std::vector<Variant>
-SelectionOptionStorage::normalizeValues(const std::vector<Variant> & /*values*/) const
+std::vector<Any>
+SelectionOptionStorage::normalizeValues(const std::vector<Any> & /*values*/) const
 {
     GMX_THROW(NotImplementedError("Selection options not supported in this context"));
 }
@@ -125,7 +125,7 @@ void SelectionOptionStorage::addSelections(
 }
 
 
-void SelectionOptionStorage::convertValue(const Variant &value)
+void SelectionOptionStorage::convertValue(const Any &value)
 {
     manager_.convertOptionValue(this, value.cast<std::string>(), false);
 }
@@ -287,7 +287,7 @@ void SelectionFileOptionStorage::clearSet()
     bValueParsed_ = false;
 }
 
-void SelectionFileOptionStorage::convertValue(const Variant &value)
+void SelectionFileOptionStorage::convertValue(const Any &value)
 {
     if (bValueParsed_)
     {
index b6bdcc2f5d60c5e51706f2dcc2d621e5ad6c73f0..3c53237b9d0b82940de0cf0a904b9721494da47f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2018,2019, 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.
@@ -77,8 +77,8 @@ class SelectionOptionStorage : public OptionStorageTemplate<Selection>
         OptionInfo &optionInfo() override { return info_; }
         std::string typeString() const override { return "selection"; }
         std::string formatSingleValue(const Selection &value) const override;
-        std::vector<Variant>
-        normalizeValues(const std::vector<Variant> &values) const override;
+        std::vector<Any>
+        normalizeValues(const std::vector<Any> &values) const override;
 
         /*! \brief
          * Adds selections to the storage.
@@ -128,7 +128,7 @@ class SelectionOptionStorage : public OptionStorageTemplate<Selection>
         void setSelectionFlag(SelectionFlag flag, bool bSet);
 
     private:
-        void convertValue(const Variant &value) override;
+        void convertValue(const Any &value) override;
         void processSetValues(ValueList *values) override;
         void processAll() override;
 
index 8e74f9b0872cebae8854770b08175478032226d3..b10f236a1e61247a3d2e771e00780fab42083120 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2015,2016,2017,2018,2019, 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.
index 34e61ffa9284bafb42da9d761200548990e33906..ac2fe27478218d17c854e43ad788fb9073f12e98 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2017,2018,2019, 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.
index b5644feae4b6b7509c5b53b2b9ae5f0668f84218..6778a9d48463a70ff78d145820fde57e24877d42 100644 (file)
@@ -2,7 +2,7 @@
  * This file is part of the GROMACS molecular simulation package.
  *
  * Copyright (c) 1991-2006 David van der Spoel, Erik Lindahl, Berk Hess, University of Groningen.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
index 92ce8cb343cb6269564c9e1c1225618fb4f81efb..9655d9886800b415eb5dc5b5515063dfd578aedf 100644 (file)
@@ -205,9 +205,8 @@ gmx_wallcycle_t wallcycle_init(FILE *fplog, int resetstep, t_commrec gmx_unused
     return wc;
 }
 
-/* TODO: Should be called from finish_run() or runner()
-   void wallcycle_destroy(gmx_wallcycle_t wc)
-   {
+void wallcycle_destroy(gmx_wallcycle_t wc)
+{
     if (wc == nullptr)
     {
         return;
@@ -226,8 +225,7 @@ gmx_wallcycle_t wallcycle_init(FILE *fplog, int resetstep, t_commrec gmx_unused
         sfree(wc->wcsc);
     }
     sfree(wc);
-   }
- */
+}
 
 static void wallcycle_all_start(gmx_wallcycle_t wc, int ewc, gmx_cycles_t cycle)
 {
index 9468a0b60afd9fa6ef00973c3909bfb6c72eec42..cbf7596544203e8576efc03fad67001c69b51778 100644 (file)
@@ -90,6 +90,9 @@ gmx_wallcycle_t wallcycle_init(FILE *fplog, int resetstep, struct t_commrec *cr)
  * Returns NULL when cycle counting is not supported.
  */
 
+/* cleans up wallcycle structure */
+void wallcycle_destroy(gmx_wallcycle_t wc);
+
 void wallcycle_start(gmx_wallcycle_t wc, int ewc);
 /* Starts the cycle counter (and increases the call count) */
 
index 67b273e4188d5c48f6a9a39105cb5e26c3f16237..b4a410854b828d102897a73cd20b4f369e52c08c 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2013, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -97,7 +97,6 @@ static void comp_tpx(const char *fn1, const char *fn2,
     t_inputrec    *ir[2];
     t_state        state[2];
     gmx_mtop_t     mtop[2];
-    t_topology     top[2];
     int            i;
 
     ff[0] = fn1;
@@ -111,15 +110,7 @@ static void comp_tpx(const char *fn1, const char *fn2,
     if (fn2)
     {
         cmp_inputrec(stdout, ir[0], ir[1], ftol, abstol);
-        /* Convert gmx_mtop_t to t_topology.
-         * We should implement direct mtop comparison,
-         * but it might be useful to keep t_topology comparison as an option.
-         */
-        top[0] = gmx_mtop_t_to_t_topology(&mtop[0], false);
-        top[1] = gmx_mtop_t_to_t_topology(&mtop[1], false);
-        cmp_top(stdout, &top[0], &top[1], ftol, abstol);
-        cmp_groups(stdout, &mtop[0].groups, &mtop[1].groups,
-                   mtop[0].natoms, mtop[1].natoms);
+        compareMtop(stdout, mtop[0], mtop[1], ftol, abstol);
         comp_state(&state[0], &state[1], bRMSD, ftol, abstol);
     }
     else
@@ -134,12 +125,7 @@ static void comp_tpx(const char *fn1, const char *fn2,
             {
                 comp_pull_AB(stdout, ir[0]->pull, ftol, abstol);
             }
-            /* Convert gmx_mtop_t to t_topology.
-             * We should implement direct mtop comparison,
-             * but it might be useful to keep t_topology comparison as an option.
-             */
-            top[0] = gmx_mtop_t_to_t_topology(&mtop[0], true);
-            cmp_top(stdout, &top[0], nullptr, ftol, abstol);
+            compareMtopAB(stdout, mtop[0], ftol, abstol);
         }
     }
 }
@@ -308,22 +294,22 @@ static void chk_bonds(t_idef *idef, int ePBC, rvec *x, matrix box, real tol)
 
 static void chk_trj(const gmx_output_env_t *oenv, const char *fn, const char *tpr, real tol)
 {
-    t_trxframe       fr;
-    t_count          count;
-    t_fr_time        first, last;
-    int              j = -1, new_natoms, natoms;
-    real             old_t1, old_t2;
-    gmx_bool         bShowTimestep = TRUE, newline = FALSE;
-    t_trxstatus     *status;
-    gmx_mtop_t       mtop;
-    gmx_localtop_t  *top = nullptr;
-    t_state          state;
-    t_inputrec       ir;
+    t_trxframe     fr;
+    t_count        count;
+    t_fr_time      first, last;
+    int            j = -1, new_natoms, natoms;
+    real           old_t1, old_t2;
+    gmx_bool       bShowTimestep = TRUE, newline = FALSE;
+    t_trxstatus   *status;
+    gmx_mtop_t     mtop;
+    gmx_localtop_t top;
+    t_state        state;
+    t_inputrec     ir;
 
     if (tpr)
     {
         read_tpx_state(tpr, &ir, &state, &mtop);
-        top = gmx_mtop_generate_local_top(&mtop, ir.efep != efepNO);
+        gmx_mtop_generate_local_top(mtop, &top, ir.efep != efepNO);
     }
     new_natoms = -1;
     natoms     = -1;
@@ -390,7 +376,7 @@ static void chk_trj(const gmx_output_env_t *oenv, const char *fn, const char *tp
         natoms = new_natoms;
         if (tpr)
         {
-            chk_bonds(&top->idef, ir.ePBC, fr.x, fr.box, tol);
+            chk_bonds(&top.idef, ir.ePBC, fr.x, fr.box, tol);
         }
         if (fr.bX)
         {
@@ -455,7 +441,6 @@ static void chk_tps(const char *fn, real vdw_fac, real bon_lo, real bon_hi)
     gmx_bool       bV, bX, bB, bFirst, bOut;
     real           r2, ekin, temp1, temp2, dist2, vdwfac2, bonlo2, bonhi2;
     real          *atom_vdw;
-    gmx_atomprop_t aps;
 
     fprintf(stderr, "Checking coordinate file %s\n", fn);
     read_tps_conf(fn, &top, &ePBC, &x, &v, box, TRUE);
@@ -520,12 +505,12 @@ static void chk_tps(const char *fn, real vdw_fac, real bon_lo, real bon_hi)
                 "relative to sum of Van der Waals distance:\n",
                 vdw_fac, bon_lo, bon_hi);
         snew(atom_vdw, natom);
-        aps = gmx_atomprop_init();
+        AtomProperties aps;
         for (i = 0; (i < natom); i++)
         {
-            gmx_atomprop_query(aps, epropVDW,
-                               *(atoms->resinfo[atoms->atom[i].resind].name),
-                               *(atoms->atomname[i]), &(atom_vdw[i]));
+            aps.setAtomProperty(epropVDW,
+                                *(atoms->resinfo[atoms->atom[i].resind].name),
+                                *(atoms->atomname[i]), &(atom_vdw[i]));
             if (debug)
             {
                 fprintf(debug, "%5d %4s %4s %7g\n", i+1,
@@ -534,7 +519,6 @@ static void chk_tps(const char *fn, real vdw_fac, real bon_lo, real bon_hi)
                         atom_vdw[i]);
             }
         }
-        gmx_atomprop_destroy(aps);
         if (bB)
         {
             set_pbc(&pbc, ePBC, box);
index 24a67a3d6a6058cd7288be9d5a4da14088892c7a..117d094a989775510f5ca106a2262bd31e5fdcc0 100644 (file)
@@ -85,7 +85,6 @@ static void list_tpx(const char *fn,
     t_state       state;
     t_tpxheader   tpx;
     gmx_mtop_t    mtop;
-    gmx_groups_t *groups;
     t_topology    top;
 
     read_tpxheader(fn, &tpx, TRUE);
@@ -144,12 +143,12 @@ static void list_tpx(const char *fn,
             pr_rvecs(stdout, indent, "v", tpx.bV ? state.v.rvec_array() : nullptr, state.natoms);
         }
 
-        groups = &mtop.groups;
+        const gmx_groups_t &groups = mtop.groups;
 
         snew(gcount, egcNR);
         for (i = 0; (i < egcNR); i++)
         {
-            snew(gcount[i], groups->grps[i].nr);
+            snew(gcount[i], groups.grps[i].nr);
         }
 
         for (i = 0; (i < mtop.natoms); i++)
@@ -164,7 +163,7 @@ static void list_tpx(const char *fn,
         {
             atot = 0;
             printf("%-12s: ", gtypes[i]);
-            for (j = 0; (j < groups->grps[i].nr); j++)
+            for (j = 0; (j < groups.grps[i].nr); j++)
             {
                 printf("  %5d", gcount[i][j]);
                 atot += gcount[i][j];
index 14ac3201f0004ef315b891081615d95e142428ed..8a254f657ae3b86e4cfa7393db7aa89deddd3c65 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2014,2015,2018, by the GROMACS development team, led by
+# Copyright (c) 2014,2015,2018,2019, 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.
@@ -49,5 +49,5 @@ gmx_install_headers(
     )
 
 if (BUILD_TESTING)
-#    add_subdirectory(tests)
+    add_subdirectory(tests)
 endif()
index a2512322daf012f952fa9d45fa8fceaddd711177..47dd6acea5719ad519cad56b199c4e00c3c1d7d3 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2018,2019, 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.
@@ -43,6 +43,9 @@
 #include <cstdio>
 #include <cstring>
 
+#include <algorithm>
+
+#include "gromacs/compat/make_unique.h"
 #include "gromacs/math/functions.h"
 #include "gromacs/math/utilities.h"
 #include "gromacs/topology/residuetypes.h"
 #include "gromacs/utility/smalloc.h"
 #include "gromacs/utility/strdb.h"
 
-typedef struct {
-    gmx_bool    bSet;
-    int         nprop, maxprop;
-    char       *db;
-    double      def;
-    char      **atomnm;
-    char      **resnm;
-    gmx_bool   *bAvail;
-    real       *value;
-} aprop_t;
-
-typedef struct gmx_atomprop {
-    gmx_bool           bWarned, bWarnVDW;
-    aprop_t            prop[epropNR];
-    gmx_residuetype_t *restype;
-} gmx_atomprop;
-
-
-
 /* NOTFOUND should be smallest, others larger in increasing priority */
 enum {
     NOTFOUND = -4, WILDCARD, WILDPROT, PROTEIN
 };
 
-/* return number of matching characters,
-   or NOTFOUND if not at least all characters in char *database match */
-static int dbcmp_len(const char *search, const char *database)
+//! Basic entries in AtomProperty.
+struct BaseEntry {
+    //! Default constructor.
+    BaseEntry(const std::string &aName, const std::string &rName)
+        : atomName(aName), residueName(rName), isAvailable(false), value(0.0)
+    {}
+    //! Name for atom.
+    std::string atomName;
+    //! Name for residue.
+    std::string residueName;
+    //! Is property available.
+    bool        isAvailable;
+    //! Value set for property.
+    real        value;
+};
+
+//! Conglomeration of atom property entries.
+struct AtomProperty {
+    //! Has property been set.
+    bool                   isSet = false;
+    //! Database the property is coming from.
+    std::string            db;
+    //! Default value for property.
+    double                 def = 0.0;
+    //! Basic entries for properties.
+    std::vector<BaseEntry> entry;
+};
+
+//! Implementation detail type for Atomproperties.
+class AtomProperties::Impl
 {
-    int i;
+    public:
+        //! Should user be warned about error.
+        bool               bWarned = false;
+        //! Should user be warned about vdW not found.
+        bool               bWarnVDW = false;
+        //! The different atom properties.
+        AtomProperty       prop[epropNR];
+        //! The residue types.
+        ResidueType        restype;
+};
 
-    i = 0;
-    while (search[i] && database[i] && (search[i] == database[i]) )
+/*! \brief
+ * Find number of matching characters in entry.
+ *
+ * If not all characters are matching, return NOTFOUND.
+ * If the length of the database entry is different from the search,
+ * also return NOTFOUND.
+ *
+ * \param[in] search Entry to compare to database.
+ * \param[in] database Name of the database entry to compare to.
+ * \returns Number of matching characters or NOTFOUND.
+ */
+static int compareToDatabase(const std::string &search, const std::string &database)
+{
+    if (database.length() > search.length())
     {
-        i++;
+        return NOTFOUND;
     }
-
-    if (database[i])
+    size_t matches = 0;
+    for (size_t i = 0; i < database.length(); i++)
+    {
+        if (search[i] == database[i])
+        {
+            matches++;
+        }
+    }
+    if (matches == database.length())
     {
-        i = NOTFOUND;
+        return matches;
+    }
+    else
+    {
+        return NOTFOUND;
     }
-    return i;
 }
 
-static int get_prop_index(aprop_t *ap, gmx_residuetype_t *restype,
-                          char *resnm, char *atomnm,
-                          gmx_bool *bExact)
+/*! \brief
+ * Finds the index for the property being searched.
+ *
+ * \param[in] ap Property to search for.
+ * \param[in] restype Residuetypes in database.
+ * \param[in] residueName The name of the residue to look for.
+ * \param[in] atomName The name of the atom to look for.
+ * \param[in] bExact Do we have the correct match.
+ * \returns The index for the property.
+ */
+static int findPropertyIndex(AtomProperty *ap, ResidueType *restype,
+                             const std::string &residueName, const std::string &atomName,
+                             gmx_bool *bExact)
 {
-    int      i, j = NOTFOUND;
-    long int alen, rlen;
-    long int malen, mrlen;
-    gmx_bool bProtein, bProtWild;
-
-    bProtein  = gmx_residuetype_is_protein(restype, resnm);
-    bProtWild = (strcmp(resnm, "AAA") == 0);
-    malen     = NOTFOUND;
-    mrlen     = NOTFOUND;
-    for (i = 0; (i < ap->nprop); i++)
+    int      j = NOTFOUND;
+
+    bool     bProtein  = restype->namedResidueHasType(residueName, "Protein");
+    bool     bProtWild = residueName == "AAA";
+    int      malen     = NOTFOUND;
+    int      mrlen     = NOTFOUND;
+    for (size_t i = 0; (i < ap->entry.size()); i++)
     {
-        rlen = dbcmp_len(resnm, ap->resnm[i]);
+        int rlen = compareToDatabase(residueName, ap->entry[i].residueName);
         if (rlen == NOTFOUND)
         {
-            if ( (strcmp(ap->resnm[i], "*") == 0) ||
-                 (strcmp(ap->resnm[i], "???") == 0) )
+            if ( (ap->entry[i].residueName == "*") ||
+                 (ap->entry[i].residueName == "???")  )
             {
                 rlen = WILDCARD;
             }
-            else if (strcmp(ap->resnm[i], "AAA") == 0)
+            else if (ap->entry[i].residueName == "AAA")
             {
                 rlen = WILDPROT;
             }
         }
-        alen = dbcmp_len(atomnm, ap->atomnm[i]);
+        int alen = compareToDatabase(atomName, ap->entry[i].atomName);
         if ( (alen > NOTFOUND) && (rlen > NOTFOUND))
         {
             if ( ( (alen > malen) && (rlen >= mrlen)) ||
@@ -138,197 +187,173 @@ static int get_prop_index(aprop_t *ap, gmx_residuetype_t *restype,
         }
     }
 
-    *bExact = ((malen == static_cast<long int>(strlen(atomnm))) &&
-               ((mrlen == static_cast<long int>(strlen(resnm))) ||
+    *bExact = ((malen == static_cast<long int>(atomName.length())) &&
+               ((mrlen == static_cast<long int>(residueName.length())) ||
                 ((mrlen == WILDPROT) && bProtWild) ||
                 ((mrlen == WILDCARD) && !bProtein && !bProtWild)));
 
     if (debug)
     {
-        fprintf(debug, "searching residue: %4s atom: %4s\n", resnm, atomnm);
+        fprintf(debug, "searching residue: %4s atom: %4s\n", residueName.c_str(),
+                atomName.c_str());
         if (j == NOTFOUND)
         {
             fprintf(debug, " not successful\n");
         }
         else
         {
-            fprintf(debug, " match: %4s %4s\n", ap->resnm[j], ap->atomnm[j]);
+            fprintf(debug, " match: %4s %4s\n",
+                    ap->entry[j].residueName.c_str(), ap->entry[j].atomName.c_str());
         }
     }
     return j;
 }
 
-static void add_prop(aprop_t *ap, gmx_residuetype_t *restype,
-                     char *resnm, char *atomnm,
-                     real p, int line)
+/*! \brief
+ * Add new property to list.
+ *
+ * \param[in] ap Atomproperty to add.
+ * \param[in] restype Residue type database to use.
+ * \param[in] residueName Name of the residue.
+ * \param[in] atomName Name of the atom.
+ * \param[in] propValue Value of property.
+ * \param[in] line Where to add property.
+ */
+static void addProperty(AtomProperty *ap, ResidueType *restype,
+                        const std::string &residueName, const std::string &atomName,
+                        real propValue, int line)
 {
-    int      i, j;
-    gmx_bool bExact;
-
-    j = get_prop_index(ap, restype, resnm, atomnm, &bExact);
+    bool bExact;
+    int  j = findPropertyIndex(ap, restype, residueName, atomName, &bExact);
 
     if (!bExact)
     {
-        if (ap->nprop >= ap->maxprop)
-        {
-            ap->maxprop += 10;
-            srenew(ap->resnm, ap->maxprop);
-            srenew(ap->atomnm, ap->maxprop);
-            srenew(ap->value, ap->maxprop);
-            srenew(ap->bAvail, ap->maxprop);
-            for (i = ap->nprop; (i < ap->maxprop); i++)
-            {
-                ap->atomnm[i] = nullptr;
-                ap->resnm[i]  = nullptr;
-                ap->value[i]  = 0;
-                ap->bAvail[i] = FALSE;
-            }
-        }
-        ap->atomnm[ap->nprop] = gmx_strdup(atomnm);
-        ap->resnm[ap->nprop]  = gmx_strdup(resnm);
-        j                     = ap->nprop;
-        ap->nprop++;
+        ap->entry.emplace_back(BaseEntry(atomName, residueName));
+
+        j = ap->entry.size() - 1;
     }
-    if (ap->bAvail[j])
+    if (ap->entry[j].isAvailable)
     {
-        if (ap->value[j] == p)
+        if (ap->entry[j].value == propValue)
         {
             fprintf(stderr, "Warning double identical entries for %s %s %g on line %d in file %s\n",
-                    resnm, atomnm, p, line, ap->db);
+                    residueName.c_str(), atomName.c_str(), propValue, line, ap->db.c_str());
         }
         else
         {
             fprintf(stderr, "Warning double different entries %s %s %g and %g on line %d in file %s\n"
                     "Using last entry (%g)\n",
-                    resnm, atomnm, p, ap->value[j], line, ap->db, p);
-            ap->value[j] = p;
+                    residueName.c_str(), atomName.c_str(),
+                    propValue, ap->entry[j].value, line, ap->db.c_str(), propValue);
+            ap->entry[j].value = propValue;
         }
     }
     else
     {
-        ap->bAvail[j] = TRUE;
-        ap->value[j]  = p;
+        ap->entry[j].isAvailable = TRUE;
+        ap->entry[j].value       = propValue;
     }
 }
 
-static void read_prop(gmx_atomprop_t aps, int eprop, double factor)
+/*! \brief
+ * Read property value into structure.
+ *
+ * \param[in] ap Atomproperty to be read in.
+ * \param[in] restype Library of residue types.
+ * \param[in] factor Scaling factor for property.
+ */
+static void readProperty(AtomProperty *ap, ResidueType *restype, double factor)
 {
-    gmx_atomprop *ap2 = static_cast<gmx_atomprop*>(aps);
     char          line[STRLEN], resnm[32], atomnm[32];
-    double        pp;
-    int           line_no;
-    aprop_t      *ap;
-
-    ap = &ap2->prop[eprop];
 
-    gmx::FilePtr fp = gmx::openLibraryFile(ap->db);
-    line_no = 0;
+    gmx::FilePtr  fp      = gmx::openLibraryFile(ap->db);
+    int           line_no = 0;
     while (get_a_line(fp.get(), line, STRLEN))
     {
         line_no++;
+        double pp;
         if (sscanf(line, "%31s %31s %20lf", resnm, atomnm, &pp) == 3)
         {
             pp *= factor;
-            add_prop(ap, aps->restype, resnm, atomnm, pp, line_no);
+            addProperty(ap, restype, resnm, atomnm, pp, line_no);
         }
         else
         {
             fprintf(stderr, "WARNING: Error in file %s at line %d ignored\n",
-                    ap->db, line_no);
+                    ap->db.c_str(), line_no);
         }
     }
-    ap->bSet = TRUE;
+    ap->isSet = TRUE;
 }
 
-static void set_prop(gmx_atomprop_t aps, int eprop)
+/*! \brief
+ * Set value for properties.
+ *
+ * \param[in] ap Atomproperty to set.
+ * \param[in] restype Library of residue types.
+ * \param[in] eprop Which property to set.
+ * \param[in] haveBeenWarned If we already set a warning before
+ * \returns True of warning should be printed.
+ */
+static bool setProperties(AtomProperty *ap, ResidueType *restype, int eprop, bool haveBeenWarned)
 {
-    gmx_atomprop *ap2           = static_cast<gmx_atomprop*>(aps);
-    const char   *fns[epropNR]  = { "atommass.dat", "vdwradii.dat", "dgsolv.dat", "electroneg.dat", "elements.dat" };
-    double        fac[epropNR]  = { 1.0,    1.0,  418.4, 1.0, 1.0 };
-    double        def[epropNR]  = { 12.011, 0.14, 0.0, 2.2, -1 };
-    aprop_t      *ap;
-
-    ap = &ap2->prop[eprop];
-    if (!ap->bSet)
+    const char       *fns[epropNR]  = { "atommass.dat", "vdwradii.dat", "dgsolv.dat", "electroneg.dat", "elements.dat" };
+    double            fac[epropNR]  = { 1.0,    1.0,  418.4, 1.0, 1.0 };
+    double            def[epropNR]  = { 12.011, 0.14, 0.0, 2.2, -1 };
+
+    bool              printWarning = false;
+    if (!ap->isSet)
     {
-        ap->db  = gmx_strdup(fns[eprop]);
+        ap->db  = fns[eprop];
         ap->def = def[eprop];
-        read_prop(aps, eprop, fac[eprop]);
+        readProperty(ap, restype, fac[eprop]);
 
         if (debug)
         {
-            fprintf(debug, "Entries in %s: %d\n", ap->db, ap->nprop);
+            fprintf(debug, "Entries in %s: %zu\n", ap->db.c_str(), ap->entry.size());
         }
 
-        if ( ( (!aps->bWarned) && (eprop == epropMass) ) || (eprop == epropVDW))
+        if ( (!haveBeenWarned && (eprop == epropMass) ) || (eprop == epropVDW))
         {
-            printf("\n"
-                   "WARNING: Masses and atomic (Van der Waals) radii will be guessed\n"
-                   "         based on residue and atom names, since they could not be\n"
-                   "         definitively assigned from the information in your input\n"
-                   "         files. These guessed numbers might deviate from the mass\n"
-                   "         and radius of the atom type. Please check the output\n"
-                   "         files if necessary.\n\n");
-            aps->bWarned = TRUE;
+            printWarning = true;
         }
+
     }
+    return printWarning;
 }
 
-gmx_atomprop_t gmx_atomprop_init()
+AtomProperties::AtomProperties()
+    : impl_(new Impl)
 {
-    gmx_atomprop *aps;
-
-    snew(aps, 1);
-
-    gmx_residuetype_init(&aps->restype);
-    aps->bWarned  = FALSE;
-    aps->bWarnVDW = FALSE;
-
-    return static_cast<gmx_atomprop_t>(aps);
 }
 
-static void destroy_prop(aprop_t *ap)
+AtomProperties::~AtomProperties()
 {
-    int i;
-
-    if (ap->bSet)
-    {
-        sfree(ap->db);
-
-        for (i = 0; i < ap->nprop; i++)
-        {
-            sfree(ap->atomnm[i]);
-            sfree(ap->resnm[i]);
-        }
-        sfree(ap->atomnm);
-        sfree(ap->resnm);
-        sfree(ap->bAvail);
-        sfree(ap->value);
-    }
 }
 
-void gmx_atomprop_destroy(gmx_atomprop_t aps)
+AtomProperty *AtomProperties::prop(int eprop)
 {
-    gmx_atomprop *ap = static_cast<gmx_atomprop*>(aps);
-    int           p;
-
-    if (aps == nullptr)
-    {
-        printf("\nWARNING: gmx_atomprop_destroy called with a NULL pointer\n\n");
-        return;
-    }
-
-    for (p = 0; p < epropNR; p++)
-    {
-        destroy_prop(&ap->prop[p]);
-    }
+    return &impl_->prop[eprop];
+}
 
-    gmx_residuetype_destroy(ap->restype);
+ResidueType *AtomProperties::restype()
+{
+    return &impl_->restype;
+}
 
-    sfree(ap);
+//! Print warning that vdW radii and masses are guessed.
+static void printWarning()
+{
+    printf("\n"
+           "WARNING: Masses and atomic (Van der Waals) radii will be guessed\n"
+           "         based on residue and atom names, since they could not be\n"
+           "         definitively assigned from the information in your input\n"
+           "         files. These guessed numbers might deviate from the mass\n"
+           "         and radius of the atom type. Please check the output\n"
+           "         files if necessary.\n\n");
 }
 
-static void vdw_warning(FILE *fp)
+static void printvdwWarning(FILE *fp)
 {
     if (nullptr != fp)
     {
@@ -340,89 +365,80 @@ static void vdw_warning(FILE *fp)
     }
 }
 
-gmx_bool gmx_atomprop_query(gmx_atomprop_t aps,
-                            int eprop, const char *resnm, const char *atomnm,
-                            real *value)
+bool AtomProperties::setAtomProperty(int                eprop,
+                                     const std::string &residueName,
+                                     const std::string &atomName,
+                                     real              *value)
 {
-    gmx_atomprop *ap = static_cast<gmx_atomprop*>(aps);
     int           j;
-#define MAXQ 32
-    char          atomname[MAXQ], resname[MAXQ];
+    std::string   tmpAtomName, tmpResidueName;
     gmx_bool      bExact;
 
-    set_prop(aps, eprop);
-    if ((strlen(atomnm) > MAXQ-1) || (strlen(resnm) > MAXQ-1))
+    if (setProperties(prop(eprop), restype(), eprop, impl_->bWarned))
     {
-        if (debug)
-        {
-            fprintf(debug, "WARNING: will only compare first %d characters\n",
-                    MAXQ-1);
-        }
+        printWarning();
+        impl_->bWarned = true;
     }
-    if (isdigit(atomnm[0]))
+    if (isdigit(atomName[0]))
     {
-        int i;
         /* put digit after atomname */
-        for (i = 1; i < MAXQ-1 && atomnm[i] != '\0'; i++)
-        {
-            atomname[i-1] = atomnm[i];
-        }
-        atomname[i-1] = atomnm[0];
-        atomname[i]   = '\0';
+        tmpAtomName.append(atomName.substr(1));
+        tmpAtomName.append(1, atomName[0]);
     }
     else
     {
-        strncpy(atomname, atomnm, MAXQ-1);
+        tmpAtomName = atomName;
     }
-    strncpy(resname, resnm, MAXQ-1);
-
-    j = get_prop_index(&(ap->prop[eprop]), ap->restype, resname,
-                       atomname, &bExact);
+    j = findPropertyIndex(&(impl_->prop[eprop]), &impl_->restype, residueName,
+                          tmpAtomName, &bExact);
 
-    if (eprop == epropVDW && !ap->bWarnVDW)
+    if (eprop == epropVDW && !impl_->bWarnVDW)
     {
-        vdw_warning(stdout);
-        ap->bWarnVDW = TRUE;
+        printvdwWarning(stdout);
+        impl_->bWarnVDW = true;
     }
     if (j >= 0)
     {
-        *value = ap->prop[eprop].value[j];
-        return TRUE;
+        *value = impl_->prop[eprop].entry[j].value;
+        return true;
     }
     else
     {
-        *value = ap->prop[eprop].def;
-        return FALSE;
+        *value = impl_->prop[eprop].def;
+        return false;
     }
 }
 
-char *gmx_atomprop_element(gmx_atomprop_t aps, int atomnumber)
-{
-    gmx_atomprop *ap = static_cast<gmx_atomprop*>(aps);
-    int           i;
 
-    set_prop(aps, epropElement);
-    for (i = 0; (i < ap->prop[epropElement].nprop); i++)
+const std::string AtomProperties::elementFromAtomNumber(int atomNumber)
+{
+    if (setProperties(prop(epropElement), restype(), epropElement, impl_->bWarned))
     {
-        if (std::round(ap->prop[epropElement].value[i]) == atomnumber)
+        printWarning();
+        impl_->bWarned = true;
+    }
+    for (const auto &e : prop(epropElement)->entry)
+    {
+        if (std::round(e.value) == atomNumber)
         {
-            return ap->prop[epropElement].atomnm[i];
+            return e.atomName;
         }
     }
-    return nullptr;
+    return "";
 }
 
-int gmx_atomprop_atomnumber(gmx_atomprop_t aps, const char *elem)
+int AtomProperties::atomNumberFromElement(const char *element)
 {
-    gmx_atomprop *ap = static_cast<gmx_atomprop*>(aps);
-    int           i;
-
-    set_prop(aps, epropElement);
-    for (i = 0; (i < ap->prop[epropElement].nprop); i++)
+    if (setProperties(prop(epropElement), restype(), epropElement, impl_->bWarned))
+    {
+        printWarning();
+        impl_->bWarned = true;
+    }
+    for (const auto &e : prop(epropElement)->entry)
     {
-        if (gmx_strcasecmp(ap->prop[epropElement].atomnm[i], elem) == 0)
+        if (gmx_strcasecmp(e.atomName.c_str(), element) == 0)
         {
-            return gmx::roundToInt(ap->prop[epropElement].value[i]);
+            return gmx::roundToInt(e.value);
         }
     }
     return -1;
index 73b95fbd9470060abacd65553b51292d9426627a..32cd835a39d79ae3544f235dcebca76e332c7c3d 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2010,2014,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2014,2018,2019, 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.
 #ifndef GMX_TOPOLOGY_ATOMPROP_H
 #define GMX_TOPOLOGY_ATOMPROP_H
 
+#include <string>
+
 #include "gromacs/utility/basedefinitions.h"
+#include "gromacs/utility/classhelpers.h"
 #include "gromacs/utility/real.h"
 
-/* Abstract type for the atom property database */
-typedef struct gmx_atomprop *gmx_atomprop_t;
-
 enum {
     epropMass, epropVDW, epropDGsol, epropElectroneg, epropElement,
     epropNR
 };
 
-gmx_atomprop_t gmx_atomprop_init();
-/* Initializes and returns the atom properties struct */
-
-void gmx_atomprop_destroy(gmx_atomprop_t aps);
-/* Get rid of memory after use */
+struct AtomProperty;
+class ResidueType;
+/*! \brief
+ * Holds all the atom property information loaded.
+ */
+class AtomProperties
+{
+    public:
+        //! Default constructor.
+        AtomProperties();
+        //! Default destructor
+        ~AtomProperties();
 
-char *gmx_atomprop_element(gmx_atomprop_t aps, int atomnumber);
+        /*! \brief
+         * Get element string from atom number.
+         *
+         * \param[in] atomNumber Atomnumber to check.
+         * \returns Name of the element.
+         *
+         * \todo This should be made const once the lazy
+         * implementation is done properly for the class.
+         */
+        const std::string elementFromAtomNumber(int atomNumber);
+        /*! \brief
+         * Get atom number from element string.
+         *
+         * \param[in] element Name of element.
+         * \returns AtomNumber that was being looked for.
+         *
+         * \todo This should be made const once the lazy
+         * implementation is done properly for the class.
+         */
+        int atomNumberFromElement(const char *element);
+        /*! \brief
+         * Set atom property based on atomname.
+         *
+         * Extract a \p value from the database. Returns true
+         * if this is successful, or false if not. Sets default value
+         * in the later case. The first time this function is called
+         * for this property the database will be initialized.
+         *
+         * \param[in] eprop Property to set.
+         * \param[in] residueName Residue name for entry.
+         * \param[in] atomName Atom name for entry.
+         * \param[out] value New value to set or default.
+         * \returns If the operation has been succesful.
+         */
+        bool setAtomProperty(int                eprop,
+                             const std::string &residueName,
+                             const std::string &atomName,
+                             real              *value);
+        /*! \brief
+         * Get handle to property.
+         *
+         * \param[in] eprop Which property we need a handle to.
+         * \returns Pointer to property entry.
+         */
+        AtomProperty *prop(int eprop);
+        //! Get handle to residuetype library.
+        ResidueType *restype();
 
-int gmx_atomprop_atomnumber(gmx_atomprop_t aps, const char *element);
+    private:
+        //! Implementation pointer.
+        class Impl;
 
-gmx_bool gmx_atomprop_query(gmx_atomprop_t aps,
-                            int eprop, const char *resnm, const char *atomnm,
-                            real *value);
-/* Extract a value from the database. Returns TRUE on succes,
- * FALSE otherwise. In the latter case, value is a deafult value.
- * The first time this function is called for this property
- * the database will be read.
- */
+        gmx::PrivateImplPointer<Impl> impl_;
+};
 
 #endif
index fe3c390cd13469819168027bfd905701c4b84a1b..fa0071a64ce7ee02c71d6a08f995a2f2860f23e1 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -340,7 +340,7 @@ void pr_atomtypes(FILE *fp, int indent, const char *title, const t_atomtypes *at
     }
 }
 
-static void cmp_atom(FILE *fp, int index, const t_atom *a1, const t_atom *a2, real ftol, real abstol)
+static void compareAtom(FILE *fp, int index, const t_atom *a1, const t_atom *a2, real relativeTolerance, real absoluteTolerance)
 {
     if (a2)
     {
@@ -348,39 +348,105 @@ static void cmp_atom(FILE *fp, int index, const t_atom *a1, const t_atom *a2, re
         cmp_us(fp, "atom.ptype", index, a1->ptype, a2->ptype);
         cmp_int(fp, "atom.resind", index, a1->resind, a2->resind);
         cmp_int(fp, "atom.atomnumber", index, a1->atomnumber, a2->atomnumber);
-        cmp_real(fp, "atom.m", index, a1->m, a2->m, ftol, abstol);
-        cmp_real(fp, "atom.q", index, a1->q, a2->q, ftol, abstol);
+        cmp_real(fp, "atom.m", index, a1->m, a2->m, relativeTolerance, absoluteTolerance);
+        cmp_real(fp, "atom.q", index, a1->q, a2->q, relativeTolerance, absoluteTolerance);
         cmp_us(fp, "atom.typeB", index, a1->typeB, a2->typeB);
-        cmp_real(fp, "atom.mB", index, a1->mB, a2->mB, ftol, abstol);
-        cmp_real(fp, "atom.qB", index, a1->qB, a2->qB, ftol, abstol);
+        cmp_real(fp, "atom.mB", index, a1->mB, a2->mB, relativeTolerance, absoluteTolerance);
+        cmp_real(fp, "atom.qB", index, a1->qB, a2->qB, relativeTolerance, absoluteTolerance);
+        cmp_str(fp, "elem", index, a1->elem, a2->elem);
+
     }
     else
     {
         cmp_us(fp, "atom.type", index, a1->type, a1->typeB);
-        cmp_real(fp, "atom.m", index, a1->m, a1->mB, ftol, abstol);
-        cmp_real(fp, "atom.q", index, a1->q, a1->qB, ftol, abstol);
+        cmp_real(fp, "atom.m", index, a1->m, a1->mB, relativeTolerance, absoluteTolerance);
+        cmp_real(fp, "atom.q", index, a1->q, a1->qB, relativeTolerance, absoluteTolerance);
     }
 }
 
-void cmp_atoms(FILE *fp, const t_atoms *a1, const t_atoms *a2, real ftol, real abstol)
+static void compareResinfo(FILE *fp, int residue, const t_resinfo &r1, const t_resinfo &r2)
 {
-    int i;
+    fprintf(fp, "comparing t_resinfo\n");
+    cmp_str(fp, "name", residue, *r1.name, *r2.name);
+    cmp_int(fp, "nr", residue, r1.nr, r2.nr);
+    cmp_uc(fp, "ic", residue, r1.ic, r2.ic);
+    cmp_int(fp, "chainnum", residue, r1.chainnum, r2.chainnum);
+    cmp_uc(fp, "chainid", residue, r1.chainid, r2.chainid);
+    if ((r1.rtp || r2.rtp ) && (!r1.rtp || !r2.rtp))
+    {
+        fprintf(fp, "rtp info is present in topology %d but not in the other\n", r1.rtp ? 1 : 2);
+    }
+    if (r1.rtp && r2.rtp)
+    {
+        cmp_str(fp, "rtp", residue, *r1.rtp, *r2.rtp);
+    }
+}
+
+static void comparePdbinfo(FILE *fp, int pdb, const t_pdbinfo &pdb1, const t_pdbinfo &pdb2, real relativeTolerance,   real absoluteTolerance)
+{
+    fprintf(fp, "comparing t_pdbinfo\n");
+    cmp_int(fp, "type", pdb, pdb1.type, pdb2.type);
+    cmp_int(fp, "atomnr", pdb, pdb1.atomnr, pdb2.atomnr);
+    cmp_uc(fp, "altloc", pdb, pdb1.altloc, pdb2.altloc);
+    cmp_str(fp, "atomnm", pdb, pdb1.atomnm, pdb2.atomnm);
+    cmp_real(fp, "occup", pdb, pdb1.occup, pdb2.occup, relativeTolerance, absoluteTolerance);
+    cmp_real(fp, "bfac", pdb, pdb1.bfac, pdb2.bfac, relativeTolerance, absoluteTolerance);
+    cmp_bool(fp, "bAnistropic", pdb, pdb1.bAnisotropic, pdb2.bAnisotropic);
+    for (int i = 0; i < 6; i++)
+    {
+        std::string buf = gmx::formatString("uij[%d]", i);
+        cmp_int(fp, buf.c_str(), pdb, pdb1.uij[i], pdb2.uij[i]);
+    }
+}
+
 
+void compareAtoms(FILE          *fp,
+                  const t_atoms *a1,
+                  const t_atoms *a2,
+                  real           relativeTolerance,
+                  real           absoluteTolerance)
+{
     fprintf(fp, "comparing atoms\n");
 
     if (a2)
     {
         cmp_int(fp, "atoms->nr", -1, a1->nr, a2->nr);
-        for (i = 0; i < std::min(a1->nr, a2->nr); i++)
+        cmp_int(fp, "atoms->nres", -1, a1->nres, a2->nres);
+        cmp_bool(fp, "atoms->haveMass", -1, a1->haveMass, a2->haveMass);
+        cmp_bool(fp, "atoms->haveCharge", -1, a1->haveCharge, a2->haveCharge);
+        cmp_bool(fp, "atoms->haveType", -1, a1->haveType, a2->haveType);
+        cmp_bool(fp, "atoms->haveBState", -1, a1->haveBState, a2->haveBState);
+        cmp_bool(fp, "atoms->havePdbInfo", -1, a1->havePdbInfo, a2->havePdbInfo);
+        for (int i = 0; i < std::min(a1->nr, a2->nr); i++)
+        {
+            compareAtom(fp, i, &(a1->atom[i]), &(a2->atom[i]), relativeTolerance, absoluteTolerance);
+            if (a1->atomname && a2->atomname)
+            {
+                cmp_str(fp, "atomname", i, *a1->atomname[i], *a2->atomname[i]);
+            }
+            if (a1->havePdbInfo && a2->havePdbInfo)
+            {
+                comparePdbinfo(fp, i, a1->pdbinfo[i], a2->pdbinfo[i], relativeTolerance, absoluteTolerance);
+            }
+            if (a1->haveType && a2->haveType)
+            {
+                cmp_str(fp, "atomtype", i, *a1->atomtype[i], *a2->atomtype[i]);
+            }
+            if (a1->haveBState && a2->haveBState)
+            {
+                cmp_str(fp, "atomtypeB", i, *a1->atomtypeB[i], *a2->atomtypeB[i]);
+            }
+        }
+        for (int i = 0; i < std::min(a1->nres, a2->nres); i++)
         {
-            cmp_atom(fp, i, &(a1->atom[i]), &(a2->atom[i]), ftol, abstol);
+            compareResinfo(fp, i, a1->resinfo[i], a2->resinfo[i]);
         }
     }
     else
     {
-        for (i = 0; (i < a1->nr); i++)
+        for (int i = 0; (i < a1->nr); i++)
         {
-            cmp_atom(fp, i, &(a1->atom[i]), nullptr, ftol, abstol);
+            compareAtom(fp, i, &(a1->atom[i]), nullptr, relativeTolerance, absoluteTolerance);
         }
     }
 }
@@ -398,17 +464,17 @@ void atomsSetMassesBasedOnNames(t_atoms *atoms, gmx_bool printMissingMasses)
     int            maxWarn  = (printMissingMasses ? 10 : 0);
     int            numWarn  = 0;
 
-    gmx_atomprop_t aps      = gmx_atomprop_init();
+    AtomProperties aps;
 
-    gmx_bool       haveMass = TRUE;
+    bool           haveMass = true;
     for (int i = 0; i < atoms->nr; i++)
     {
-        if (!gmx_atomprop_query(aps, epropMass,
-                                *atoms->resinfo[atoms->atom[i].resind].name,
-                                *atoms->atomname[i],
-                                &atoms->atom[i].m))
+        if (!aps.setAtomProperty(epropMass,
+                                 *atoms->resinfo[atoms->atom[i].resind].name,
+                                 *atoms->atomname[i],
+                                 &atoms->atom[i].m))
         {
-            haveMass = FALSE;
+            haveMass = false;
 
             if (numWarn < maxWarn)
             {
@@ -425,6 +491,4 @@ void atomsSetMassesBasedOnNames(t_atoms *atoms, gmx_bool printMissingMasses)
         }
     }
     atoms->haveMass = haveMass;
-
-    gmx_atomprop_destroy(aps);
 }
index 57c43c45091cc3022d3639152ffb86d0f6ad07ed..09ac28df056427488ac7d336cb174a156d749911 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2012,2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2014,2015,2016,2018,2019, 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.
@@ -167,7 +167,19 @@ void pr_atoms(FILE *fp, int indent, const char *title, const t_atoms *atoms,
 void pr_atomtypes(FILE *fp, int indent, const char *title,
                   const t_atomtypes *atomtypes, gmx_bool bShowNumbers);
 
-void cmp_atoms(FILE *fp, const t_atoms *a1, const t_atoms *a2, real ftol, real abstol);
+/*! \brief Compare information in the t_atoms data structure.
+ *
+ * \param[in] fp Pointer to file to write to.
+ * \param[in] a1 Pointer to first data structure to compare.
+ * \param[in] a2 Pointer to second data structure or nullptr.
+ * \param[in] relativeTolerance Relative floating point comparison tolerance.
+ * \param[in] absoluteTolerance Absolute floating point comparison tolerance.
+ */
+void compareAtoms(FILE          *fp,
+                  const t_atoms *a1,
+                  const t_atoms *a2,
+                  real           relativeTolerance,
+                  real           absoluteTolerance);
 
 /*! \brief Set mass for each atom using the atom and residue names using a database
  *
index b3714531547e501dc17a54da73a0c7eb9be2b857..4416300d60331d0680a9b6ea1da9807931f1124e 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2017,2018,2019, 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.
@@ -72,6 +72,13 @@ void init_block(t_block *block)
     block->index[0]     = 0;
 }
 
+void init_block_null(t_block *block)
+{
+    block->nr           = 0;
+    block->nalloc_index = 0;
+    block->index        = nullptr;
+}
+
 void init_blocka(t_blocka *block)
 {
     block->nr           = 0;
@@ -83,6 +90,16 @@ void init_blocka(t_blocka *block)
     block->a            = nullptr;
 }
 
+void init_blocka_null(t_blocka *block)
+{
+    block->nr           = 0;
+    block->nra          = 0;
+    block->nalloc_index = 0;
+    block->index        = nullptr;
+    block->nalloc_a     = 0;
+    block->a            = nullptr;
+}
+
 t_blocka *new_blocka()
 {
     t_blocka *block;
index b8a47faf002f471948c229c0a100ce3575286a14..68a99a6b807ed36fc44f44795907d0e629046065 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2010,2014,2015,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2014,2015,2018,2019, 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.
@@ -215,8 +215,56 @@ struct t_blocka
     int nalloc_a;               /* The allocation size for a            */
 };
 
+/*! \brief
+ * Fully initialize t_block datastructure.
+ *
+ * Initializes a \p block and sets up the first index to zero.
+ *
+ * \param[in,out] block datastructure to initialize.
+ */
 void init_block(t_block *block);
+
+/*! \brief
+ * Fully initialize t_blocka datastructure.
+ *
+ * Initializes a \p block and sets up the first index to zero.
+ * The atom number array is initialized to nullptr.
+ *
+ * \param[in,out] block datastructure to initialize.
+ */
 void init_blocka(t_blocka *block);
+
+/* TODO
+ * In general all t_block datastructures should be avoided
+ * in favour of RangePartitioning. This here is a simple cludge
+ * to use more modern initialization while we move to the use
+ * of RangePartitioning.
+ */
+
+/*! \brief
+ * Minimal initialization of t_block datastructure.
+ *
+ * Performs the equivalent to a snew on a t_block, setting all
+ * values to zero or nullptr. Needed for some cases where the topology
+ * handling expects a block to be valid initialized (e.g. during domain
+ * decomposition) but without the first block set to zero.
+ *
+ * \param[in,out] block datastructure to initialize.
+ */
+void init_block_null(t_block *block);
+
+/*! \brief
+ * Minimal initialization of t_blocka datastructure.
+ *
+ * Performs the equivalent to a snew on a t_blocka, setting all
+ * values to zero or nullptr. Needed for some cases where the topology
+ * handling expects a block to be valid initialized (e.g. during domain
+ * decomposition) but without the first block set to zero.
+ *
+ * \param[in,out] block datastructure to initialize.
+ */
+void init_blocka_null(t_blocka *block);
+
 t_blocka *new_blocka();
 /* allocate new block */
 
index beca6b0355a0f277c69d4664170e8f61b7275955..f7359cf1f817c06b8786c5868fddbf8becef66c5 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -113,16 +113,14 @@ void write_index(const char *outf, t_blocka *b, char **gnames, gmx_bool bDuplica
     gmx_ffclose(out);
 }
 
-void add_grp(t_blocka *b, char ***gnames, int nra, const int a[], const char *name)
+void add_grp(t_blocka *b, char ***gnames, gmx::ArrayRef<const int> a, const std::string &name)
 {
-    int i;
-
     srenew(b->index, b->nr+2);
     srenew(*gnames, b->nr+1);
-    (*gnames)[b->nr] = gmx_strdup(name);
+    (*gnames)[b->nr] = gmx_strdup(name.c_str());
 
-    srenew(b->a, b->nra+nra);
-    for (i = 0; (i < nra); i++)
+    srenew(b->a, b->nra+a.size());
+    for (int i = 0; (i < a.size()); i++)
     {
         b->a[b->nra++] = a[i];
     }
@@ -130,12 +128,19 @@ void add_grp(t_blocka *b, char ***gnames, int nra, const int a[], const char *na
     b->index[b->nr] = b->nra;
 }
 
-/* compare index in `a' with group in `b' at `index',
-   when `index'<0 it is relative to end of `b' */
-static gmx_bool grp_cmp(t_blocka *b, int nra, const int a[], int index)
+/*! \brief
+ * Compare index in groups.
+ *
+ * Checks the index in \p a to the one in \p b at \p index.
+ * If \p index is < 0, it is taken as relative to the end of \p b.
+ *
+ * \param[in] b Block with groups.
+ * \param[in] a New group to compare to.
+ * \param[in] index The index to check.
+ * \returns True if groups are the same.
+ */
+static bool grp_cmp(t_blocka *b, gmx::ArrayRef<const int> a, int index)
 {
-    int i;
-
     if (index < 0)
     {
         index = b->nr-1+index;
@@ -145,75 +150,69 @@ static gmx_bool grp_cmp(t_blocka *b, int nra, const int a[], int index)
         gmx_fatal(FARGS, "no such index group %d in t_blocka (nr=%d)", index, b->nr);
     }
     /* compare sizes */
-    if (nra != b->index[index+1] - b->index[index])
+    if (a.size() != b->index[index+1] - b->index[index])
     {
         return FALSE;
     }
-    for (i = 0; i < nra; i++)
+    for (int i = 0; i < a.size(); i++)
     {
         if (a[i] != b->a[b->index[index]+i])
         {
-            return FALSE;
+            return false;
         }
     }
-    return TRUE;
+    return true;
 }
-
-static void
-p_status(const char *const *restype, int nres,
-         const char *const *typenames, int ntypes)
+//! Print out how many residues of a certain type are present.
+static void p_status(gmx::ArrayRef<const std::string> restype,
+                     gmx::ArrayRef<const std::string> typenames)
 {
-    int   i, j;
-    int * counter;
-
-    snew(counter, ntypes);
-    for (i = 0; i < ntypes; i++)
-    {
-        counter[i] = 0;
-    }
-    for (i = 0; i < nres; i++)
-    {
-        for (j = 0; j < ntypes; j++)
-        {
-            if (!gmx_strcasecmp(restype[i], typenames[j]))
-            {
-                counter[j]++;
-            }
-        }
-    }
-
-    for (i = 0; (i < ntypes); i++)
+    std::vector<int> counter(typenames.size(), 0);
+    std::transform(typenames.begin(), typenames.end(), counter.begin(),
+                   [&restype](const std::string &typenm) {
+                       return std::count_if(restype.begin(), restype.end(),
+                                            [&typenm](const std::string &res) {
+                                                return gmx_strcasecmp(res.c_str(), typenm.c_str()) == 0;
+                                            }
+                                            );
+                   }
+                   );
+
+    for (int i = 0; (i < typenames.size()); i++)
     {
         if (counter[i] > 0)
         {
-            printf("There are: %5d %10s residues\n", counter[i], typenames[i]);
+            printf("There are: %5d %10s residues\n", counter[i], typenames[i].c_str());
         }
     }
-
-    sfree(counter);
 }
 
-
-static int *
-mk_aid(const t_atoms *atoms, const char ** restype, const char * typestring, int *nra, gmx_bool bMatch)
-/* Make an array of ints for all atoms with residuetypes matching typestring, or the opposite if bMatch is false */
+/*! \brief
+ * Return a new group of atoms with \p restype that match \p typestring,
+ * or not matching if \p bMatch.
+ *
+ * \param[in] atoms Atoms data to use.
+ * \param[in] restype Residuetypes to match.
+ * \param[in] typestring Which type the residue should have.
+ * \param[in] bMatch whether to return matching atoms or those that don't.
+ * \returns Vector of atoms that match.
+ */
+static std::vector<int> mk_aid(const t_atoms                   *atoms,
+                               gmx::ArrayRef<const std::string> restype,
+                               const std::string               &typestring,
+                               bool                             bMatch)
 {
-    int     *a;
-    int      i;
-    bool     res;
-
-    snew(a, atoms->nr);
-    *nra = 0;
-    for (i = 0; (i < atoms->nr); i++)
+    std::vector<int> a;
+    for (int i = 0; (i < atoms->nr); i++)
     {
-        res = gmx_strcasecmp(restype[atoms->atom[i].resind], typestring) == 0;
+        bool res = gmx_strcasecmp(restype[atoms->atom[i].resind].c_str(), typestring.c_str()) == 0;
         if (!bMatch)
         {
             res = !res;
         }
         if (res)
         {
-            a[(*nra)++] = i;
+            a.push_back(i);
         }
     }
 
@@ -226,18 +225,17 @@ typedef struct {
     char    *gname;
 } restp_t;
 
-static void analyse_other(const char ** restype, const t_atoms *atoms,
+static void analyse_other(gmx::ArrayRef<std::string> restype, const t_atoms *atoms,
                           t_blocka *gb, char ***gn, gmx_bool bASK, gmx_bool bVerb)
 {
     restp_t *restp = nullptr;
     char   **attp  = nullptr;
     char    *rname, *aname;
-    int     *aid, *aaid;
-    int      i, j, k, l, resind, naid, naaid, natp, nrestp = 0;
+    int      i, resind, natp, nrestp = 0;
 
     for (i = 0; (i < atoms->nres); i++)
     {
-        if (gmx_strcasecmp(restype[i], "Protein") && gmx_strcasecmp(restype[i], "DNA") && gmx_strcasecmp(restype[i], "RNA") && gmx_strcasecmp(restype[i], "Water"))
+        if (gmx_strcasecmp(restype[i].c_str(), "Protein") && gmx_strcasecmp(restype[i].c_str(), "DNA") && gmx_strcasecmp(restype[i].c_str(), "RNA") && gmx_strcasecmp(restype[i].c_str(), "Water"))
         {
             break;
         }
@@ -249,14 +247,14 @@ static void analyse_other(const char ** restype, const t_atoms *atoms,
         {
             printf("Analysing residues not classified as Protein/DNA/RNA/Water and splitting into groups...\n");
         }
-        for (k = 0; (k < atoms->nr); k++)
+        for (int k = 0; (k < atoms->nr); k++)
         {
             resind = atoms->atom[k].resind;
             rname  = *atoms->resinfo[resind].name;
-            if (gmx_strcasecmp(restype[resind], "Protein") && gmx_strcasecmp(restype[resind], "DNA") &&
-                gmx_strcasecmp(restype[resind], "RNA") && gmx_strcasecmp(restype[resind], "Water"))
+            if (gmx_strcasecmp(restype[resind].c_str(), "Protein") && gmx_strcasecmp(restype[resind].c_str(), "DNA") &&
+                gmx_strcasecmp(restype[resind].c_str(), "RNA") && gmx_strcasecmp(restype[resind].c_str(), "Water"))
             {
-
+                int l;
                 for (l = 0; (l < nrestp); l++)
                 {
                     assert(restp);
@@ -275,20 +273,19 @@ static void analyse_other(const char ** restype, const t_atoms *atoms,
                 }
             }
         }
-        for (i = 0; (i < nrestp); i++)
+        for (int i = 0; (i < nrestp); i++)
         {
-            snew(aid, atoms->nr);
-            naid = 0;
-            for (j = 0; (j < atoms->nr); j++)
+            std::vector<int> aid;
+            for (int j = 0; (j < atoms->nr); j++)
             {
                 rname = *atoms->resinfo[atoms->atom[j].resind].name;
                 if ((strcmp(restp[i].rname, rname) == 0 && !restp[i].bNeg) ||
                     (strcmp(restp[i].rname, rname) != 0 &&  restp[i].bNeg))
                 {
-                    aid[naid++] = j;
+                    aid.push_back(j);
                 }
             }
-            add_grp(gb, gn, naid, aid, restp[i].gname);
+            add_grp(gb, gn, aid, restp[i].gname);
             if (bASK)
             {
                 printf("split %s into atoms (y/n) ? ", restp[i].gname);
@@ -296,9 +293,10 @@ static void analyse_other(const char ** restype, const t_atoms *atoms,
                 if (gmx_ask_yesno(bASK))
                 {
                     natp = 0;
-                    for (k = 0; (k < naid); k++)
+                    for (size_t k = 0; (k < aid.size()); k++)
                     {
                         aname = *atoms->atomname[aid[k]];
+                        int l;
                         for (l = 0; (l < natp); l++)
                         {
                             if (strcmp(aname, attp[l]) == 0)
@@ -314,27 +312,24 @@ static void analyse_other(const char ** restype, const t_atoms *atoms,
                     }
                     if (natp > 1)
                     {
-                        for (l = 0; (l < natp); l++)
+                        for (int l = 0; (l < natp); l++)
                         {
-                            snew(aaid, naid);
-                            naaid = 0;
-                            for (k = 0; (k < naid); k++)
+                            std::vector<int> aaid;
+                            for (size_t k = 0; (k < aid.size()); k++)
                             {
                                 aname = *atoms->atomname[aid[k]];
                                 if (strcmp(aname, attp[l]) == 0)
                                 {
-                                    aaid[naaid++] = aid[k];
+                                    aaid.push_back(aid[k]);
                                 }
                             }
-                            add_grp(gb, gn, naaid, aaid, attp[l]);
-                            sfree(aaid);
+                            add_grp(gb, gn, aaid, attp[l]);
                         }
                     }
                     sfree(attp);
                     attp = nullptr;
                 }
             }
-            sfree(aid);
             sfree(restp[i].rname);
             sfree(restp[i].gname);
         }
@@ -369,7 +364,7 @@ typedef struct gmx_help_make_index_group // NOLINT(clang-analyzer-optin.performa
     int compareto;
 } t_gmx_help_make_index_group;
 
-static void analyse_prot(const char ** restype, const t_atoms *atoms,
+static void analyse_prot(gmx::ArrayRef<const std::string> restype, const t_atoms *atoms,
                          t_blocka *gb, char ***gn, gmx_bool bASK, gmx_bool bVerb)
 {
     /* lists of atomnames to be used in constructing index groups: */
@@ -401,8 +396,7 @@ static void analyse_prot(const char ** restype, const t_atoms *atoms,
     const int   num_index_groups = asize(constructing_data);
 
     int         n, j;
-    int        *aid;
-    int         nra, npres;
+    int         npres;
     gmx_bool    match;
     char        ndx_name[STRLEN], *atnm;
     int         i;
@@ -411,13 +405,13 @@ static void analyse_prot(const char ** restype, const t_atoms *atoms,
     {
         printf("Analysing Protein...\n");
     }
-    snew(aid, atoms->nr);
+    std::vector<int> aid;
 
     /* calculate the number of protein residues */
     npres = 0;
     for (i = 0; (i < atoms->nres); i++)
     {
-        if (0 == gmx_strcasecmp(restype[i], "Protein"))
+        if (0 == gmx_strcasecmp(restype[i].c_str(), "Protein"))
         {
             npres++;
         }
@@ -425,10 +419,9 @@ static void analyse_prot(const char ** restype, const t_atoms *atoms,
     /* find matching or complement atoms */
     for (i = 0; (i < num_index_groups); i++)
     {
-        nra = 0;
         for (n = 0; (n < atoms->nr); n++)
         {
-            if (0 == gmx_strcasecmp(restype[atoms->atom[n].resind], "Protein"))
+            if (0 == gmx_strcasecmp(restype[atoms->atom[n].resind].c_str(), "Protein"))
             {
                 match = FALSE;
                 for (j = 0; (j < constructing_data[i].num_defining_atomnames); j++)
@@ -456,15 +449,15 @@ static void analyse_prot(const char ** restype, const t_atoms *atoms,
                 }
                 if (constructing_data[i].bTakeComplement != match)
                 {
-                    aid[nra++] = n;
+                    aid.push_back(n);
                 }
             }
         }
         /* if we want to add this group always or it differs from previous
            group, add it: */
-        if (-1 == constructing_data[i].compareto || !grp_cmp(gb, nra, aid, constructing_data[i].compareto-i) )
+        if (-1 == constructing_data[i].compareto || !grp_cmp(gb, aid, constructing_data[i].compareto-i) )
         {
-            add_grp(gb, gn, nra, aid, constructing_data[i].group_name);
+            add_grp(gb, gn, aid, constructing_data[i].group_name);
         }
     }
 
@@ -476,7 +469,7 @@ static void analyse_prot(const char ** restype, const t_atoms *atoms,
             if (gmx_ask_yesno(bASK))
             {
                 int resind;
-                nra = 0;
+                aid.clear();
                 for (n = 0; ((atoms->atom[n].resind < npres) && (n < atoms->nr)); )
                 {
                     resind = atoms->atom[n].resind;
@@ -492,18 +485,18 @@ static void analyse_prot(const char ** restype, const t_atoms *atoms,
                         }
                         if (constructing_data[i].bTakeComplement != match)
                         {
-                            aid[nra++] = n;
+                            aid.push_back(n);
                         }
                     }
                     /* copy the residuename to the tail of the groupname */
-                    if (nra > 0)
+                    if (!aid.empty())
                     {
                         t_resinfo *ri;
                         ri = &atoms->resinfo[resind];
                         sprintf(ndx_name, "%s_%s%d%c",
                                 constructing_data[i].group_name, *ri->name, ri->nr, ri->ic == ' ' ? '\0' : ri->ic);
-                        add_grp(gb, gn, nra, aid, ndx_name);
-                        nra = 0;
+                        add_grp(gb, gn, aid, ndx_name);
+                        aid.clear();
                     }
                 }
             }
@@ -512,19 +505,18 @@ static void analyse_prot(const char ** restype, const t_atoms *atoms,
         if (gmx_ask_yesno(bASK))
         {
             /* Make swap sidechain C=O index */
-            int resind, hold;
-            nra = 0;
-            for (n = 0; ((atoms->atom[n].resind < npres) && (n < atoms->nr)); )
+            aid.clear();
+            for (int n = 0; ((atoms->atom[n].resind < npres) && (n < atoms->nr)); )
             {
-                resind = atoms->atom[n].resind;
-                hold   = -1;
+                int resind = atoms->atom[n].resind;
+                int hold   = -1;
                 for (; ((atoms->atom[n].resind == resind) && (n < atoms->nr)); n++)
                 {
                     if (strcmp("CA", *atoms->atomname[n]) == 0)
                     {
-                        aid[nra++] = n;
-                        hold       = nra;
-                        nra       += 2;
+                        aid.push_back(n);
+                        hold = aid.size();
+                        aid.resize(aid.size() + 3);
                     }
                     else if (strcmp("C", *atoms->atomname[n]) == 0)
                     {
@@ -552,141 +544,117 @@ static void analyse_prot(const char ** restype, const t_atoms *atoms,
                     }
                     else
                     {
-                        aid[nra++] = n;
+                        aid.push_back(n);
                     }
                 }
             }
             /* copy the residuename to the tail of the groupname */
-            if (nra > 0)
+            if (!aid.empty())
             {
-                add_grp(gb, gn, nra, aid, "SwapSC-CO");
+                add_grp(gb, gn, aid, "SwapSC-CO");
             }
         }
     }
-    sfree(aid);
 }
 
 
 void analyse(const t_atoms *atoms, t_blocka *gb, char ***gn, gmx_bool bASK, gmx_bool bVerb)
 {
-    gmx_residuetype_t*rt = nullptr;
     char             *resnm;
-    int              *aid;
-    const char    **  restype;
-    int               nra;
-    int               i, k;
-    int               ntypes;
-    char           ** p_typename;
+    int               i;
     int               iwater, iion;
     int               nwater, nion;
-    bool              found;
 
     if (bVerb)
     {
         printf("Analysing residue names:\n");
     }
     /* Create system group, every single atom */
-    snew(aid, atoms->nr);
+    std::vector<int> aid(atoms->nr);
     for (i = 0; i < atoms->nr; i++)
     {
         aid[i] = i;
     }
-    add_grp(gb, gn, atoms->nr, aid, "System");
-    sfree(aid);
+    add_grp(gb, gn, aid, "System");
 
     /* For every residue, get a pointer to the residue type name */
-    gmx_residuetype_init(&rt);
-    assert(rt);
+    ResidueType              rt;
 
-    snew(restype, atoms->nres);
-    ntypes     = 0;
-    p_typename = nullptr;
+    std::vector<std::string> restype;
+    std::vector<std::string> previousTypename;
     if (atoms->nres > 0)
     {
         int i = 0;
 
         resnm = *atoms->resinfo[i].name;
-        gmx_residuetype_get_type(rt, resnm, &(restype[i]));
-        snew(p_typename, ntypes+1);
-        p_typename[ntypes] = gmx_strdup(restype[i]);
-        ntypes++;
+        restype.emplace_back(rt.typeNameForIndexedResidue(resnm));
+        previousTypename.push_back(restype[i]);
 
         for (i = 1; i < atoms->nres; i++)
         {
             resnm = *atoms->resinfo[i].name;
-            gmx_residuetype_get_type(rt, resnm, &(restype[i]));
+            restype.emplace_back(rt.typeNameForIndexedResidue(resnm));
 
             /* Note that this does not lead to a N*N loop, but N*K, where
              * K is the number of residue _types_, which is small and independent of N.
              */
-            found = false;
-            for (k = 0; k < ntypes && !found; k++)
+            bool found = false;
+            for (size_t k = 0; k < previousTypename.size() && !found; k++)
             {
-                found = strcmp(restype[i], p_typename[k]) == 0;
+                found = strcmp(restype[i].c_str(), previousTypename[k].c_str()) == 0;
             }
             if (!found)
             {
-                srenew(p_typename, ntypes+1);
-                p_typename[ntypes] = gmx_strdup(restype[i]);
-                ntypes++;
+                previousTypename.push_back(restype[i]);
             }
         }
     }
 
     if (bVerb)
     {
-        p_status(restype, atoms->nres, p_typename, ntypes);
+        p_status(restype, previousTypename);
     }
 
-    for (k = 0; k < ntypes; k++)
+    for (int k = 0; k < gmx::index(previousTypename.size()); k++)
     {
-        aid = mk_aid(atoms, restype, p_typename[k], &nra, TRUE);
+        aid = mk_aid(atoms, restype, previousTypename[k], TRUE);
 
         /* Check for special types to do fancy stuff with */
 
-        if (!gmx_strcasecmp(p_typename[k], "Protein") && nra > 0)
+        if (!gmx_strcasecmp(previousTypename[k].c_str(), "Protein") && !aid.empty())
         {
-            sfree(aid);
             /* PROTEIN */
             analyse_prot(restype, atoms, gb, gn, bASK, bVerb);
 
             /* Create a Non-Protein group */
-            aid = mk_aid(atoms, restype, "Protein", &nra, FALSE);
-            if ((nra > 0) && (nra < atoms->nr))
+            aid = mk_aid(atoms, restype, "Protein", FALSE);
+            if ((!aid.empty()) && (static_cast<int>(aid.size()) < atoms->nr))
             {
-                add_grp(gb, gn, nra, aid, "non-Protein");
+                add_grp(gb, gn, aid, "non-Protein");
             }
-            sfree(aid);
         }
-        else if (!gmx_strcasecmp(p_typename[k], "Water") && nra > 0)
+        else if (!gmx_strcasecmp(previousTypename[k].c_str(), "Water") && !aid.empty())
         {
-            add_grp(gb, gn, nra, aid, p_typename[k]);
+            add_grp(gb, gn, aid, previousTypename[k]);
             /* Add this group as 'SOL' too, for backward compatibility with older gromacs versions */
-            add_grp(gb, gn, nra, aid, "SOL");
+            add_grp(gb, gn, aid, "SOL");
 
-            sfree(aid);
 
             /* Solvent, create a negated group too */
-            aid = mk_aid(atoms, restype, "Water", &nra, FALSE);
-            if ((nra > 0) && (nra < atoms->nr))
+            aid = mk_aid(atoms, restype, "Water", FALSE);
+            if ((!aid.empty()) && (static_cast<int>(aid.size()) < atoms->nr))
             {
-                add_grp(gb, gn, nra, aid, "non-Water");
+                add_grp(gb, gn, aid, "non-Water");
             }
-            sfree(aid);
         }
-        else if (nra > 0)
+        else if (!aid.empty())
         {
             /* Other groups */
-            add_grp(gb, gn, nra, aid, p_typename[k]);
-            sfree(aid);
+            add_grp(gb, gn, aid, previousTypename[k]);
             analyse_other(restype, atoms, gb, gn, bASK, bVerb);
         }
-        sfree(p_typename[k]);
     }
 
-    sfree(p_typename);
-    sfree(restype);
-    gmx_residuetype_destroy(rt);
 
     /* Create a merged water_and_ions group */
     iwater = -1;
index 904947fe11355b91723d1dc8ccb9995ad60ef337..148fcc8a6dfb472a67e8831307c7fcd090c8a13c 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2010,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2014,2015,2016,2017,2018,2019, 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.
@@ -39,6 +39,7 @@
 
 #include <stdio.h>
 
+#include "gromacs/utility/arrayref.h"
 #include "gromacs/utility/basedefinitions.h"
 
 struct t_atoms;
@@ -91,7 +92,15 @@ t_cluster_ndx *cluster_index(FILE *fplog, const char *ndx);
 void write_index(const char *outf, struct t_blocka *b, char **gnames, gmx_bool bDuplicate, int natoms);
 /* Writes index blocks to outf (writes an indexfile) */
 
-void add_grp(struct t_blocka *b, char ***gnames, int nra, const int a[], const char *name);
+/*! \brief
+ * Add a new group with \p name to \p b.
+ *
+ * \param[in] b Block struct to add group to.
+ * \param[in] gnames Names of groups.
+ * \param[in] a Group to add to Block.
+ * \param[in] name Group name.
+ */
+void add_grp(struct t_blocka *b, char ***gnames, gmx::ArrayRef<const int> a, const std::string &name);
 /* Ads group a with name name to block b and namelist gnames */
 
 void analyse(const t_atoms *atoms, struct t_blocka *gb, char ***gn,
index aff5c43eac33ed90b9b6f57b47dbdbe8ce0a66e9..39b69dce4448f066465a290ccbb760b4e80f3dad 100644 (file)
@@ -1,7 +1,8 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2008,2009,2010,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2008,2009,2010,
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, 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.
@@ -216,101 +217,103 @@ void gmx_mtop_remove_chargegroups(gmx_mtop_t *mtop)
     }
 }
 
-typedef struct gmx_mtop_atomloop_all
+AtomIterator::AtomIterator(const gmx_mtop_t &mtop, int globalAtomNumber)
+    : mtop_(&mtop), mblock_(0),
+      atoms_(&mtop.moltype[mtop.molblock[0].type].atoms),
+      currentMolecule_(0), highestResidueNumber_(mtop.maxresnr),
+      localAtomNumber_(0), globalAtomNumber_(globalAtomNumber)
 {
-    const gmx_mtop_t *mtop;
-    size_t            mblock;
-    const t_atoms    *atoms;
-    int               mol;
-    int               maxresnr;
-    int               at_local;
-    int               at_global;
-} t_gmx_mtop_atomloop_all;
-
-gmx_mtop_atomloop_all_t
-gmx_mtop_atomloop_all_init(const gmx_mtop_t *mtop)
-{
-    struct gmx_mtop_atomloop_all *aloop;
-
-    snew(aloop, 1);
-
-    aloop->mtop         = mtop;
-    aloop->mblock       = 0;
-    aloop->atoms        =
-        &mtop->moltype[mtop->molblock[aloop->mblock].type].atoms;
-    aloop->mol          = 0;
-    aloop->maxresnr     = mtop->maxresnr;
-    aloop->at_local     = -1;
-    aloop->at_global    = -1;
-
-    return aloop;
+    GMX_ASSERT(globalAtomNumber == 0 || globalAtomNumber == mtop.natoms,
+               "Starting at other atoms not implemented yet");
 }
 
-static void gmx_mtop_atomloop_all_destroy(gmx_mtop_atomloop_all_t aloop)
+AtomIterator &AtomIterator::operator++()
 {
-    sfree(aloop);
-}
+    localAtomNumber_++;
+    globalAtomNumber_++;
 
-gmx_bool gmx_mtop_atomloop_all_next(gmx_mtop_atomloop_all_t aloop,
-                                    int *at_global, const t_atom **atom)
-{
-    if (aloop == nullptr)
+    if (localAtomNumber_ >= atoms_->nr)
     {
-        gmx_incons("gmx_mtop_atomloop_all_next called without calling gmx_mtop_atomloop_all_init");
-    }
-
-    aloop->at_local++;
-    aloop->at_global++;
-
-    if (aloop->at_local >= aloop->atoms->nr)
-    {
-        if (aloop->atoms->nres <= aloop->mtop->maxres_renum)
+        if (atoms_->nres <= mtop_->maxresnr)
         {
             /* Single residue molecule, increase the count with one */
-            aloop->maxresnr += aloop->atoms->nres;
+            highestResidueNumber_ += atoms_->nres;
         }
-        aloop->mol++;
-        aloop->at_local = 0;
-        if (aloop->mol >= aloop->mtop->molblock[aloop->mblock].nmol)
+        currentMolecule_++;
+        localAtomNumber_ = 0;
+        if (currentMolecule_ >= mtop_->molblock[mblock_].nmol)
         {
-            aloop->mblock++;
-            if (aloop->mblock >= aloop->mtop->molblock.size())
+            mblock_++;
+            if (mblock_ >= mtop_->molblock.size())
             {
-                gmx_mtop_atomloop_all_destroy(aloop);
-                return FALSE;
+                return *this;
             }
-            aloop->atoms = &aloop->mtop->moltype[aloop->mtop->molblock[aloop->mblock].type].atoms;
-            aloop->mol   = 0;
+            atoms_           = &mtop_->moltype[mtop_->molblock[mblock_].type].atoms;
+            currentMolecule_ = 0;
         }
     }
+    return *this;
+}
 
-    *at_global = aloop->at_global;
-    *atom      = &aloop->atoms->atom[aloop->at_local];
+AtomIterator AtomIterator::operator++(int)
+{
+    AtomIterator temp = *this;
+    ++(*this);
+    return temp;
+}
 
-    return TRUE;
+bool AtomIterator::operator==(const AtomIterator &o) const
+{
+    return mtop_ == o.mtop_ && globalAtomNumber_ == o.globalAtomNumber_;
+}
+
+bool AtomIterator::operator!=(const AtomIterator &o) const
+{
+    return !(*this == o);
+}
+
+const t_atom &AtomProxy::atom() const
+{
+    return it_->atoms_->atom[it_->localAtomNumber_];
+}
+
+int AtomProxy::globalAtomNumber() const
+{
+    return it_->globalAtomNumber_;
+}
+
+const char *AtomProxy::atomName() const
+{
+    return *(it_->atoms_->atomname[it_->localAtomNumber_]);
 }
 
-void gmx_mtop_atomloop_all_names(gmx_mtop_atomloop_all_t aloop,
-                                 char **atomname, int *resnr, char **resname)
+const char *AtomProxy::residueName() const
 {
-    int resind_mol;
+    int residueIndexInMolecule = it_->atoms_->atom[it_->localAtomNumber_].resind;
+    return *(it_->atoms_->resinfo[residueIndexInMolecule].name);
+}
 
-    *atomname  = *(aloop->atoms->atomname[aloop->at_local]);
-    resind_mol = aloop->atoms->atom[aloop->at_local].resind;
-    *resnr     = aloop->atoms->resinfo[resind_mol].nr;
-    if (aloop->atoms->nres <= aloop->mtop->maxres_renum)
+int AtomProxy::residueNumber() const
+{
+    int residueIndexInMolecule = it_->atoms_->atom[it_->localAtomNumber_].resind;
+    if (it_->atoms_->nres <= it_->mtop_->maxres_renum)
     {
-        *resnr = aloop->maxresnr + 1 + resind_mol;
+        return it_->highestResidueNumber_ + 1 + residueIndexInMolecule;
+    }
+    else
+    {
+        return it_->atoms_->resinfo[residueIndexInMolecule].nr;
     }
-    *resname  = *(aloop->atoms->resinfo[resind_mol].name);
 }
 
-void gmx_mtop_atomloop_all_moltype(gmx_mtop_atomloop_all_t   aloop,
-                                   const gmx_moltype_t     **moltype,
-                                   int                      *at_mol)
+const gmx_moltype_t &AtomProxy::moleculeType() const
 {
-    *moltype = &aloop->mtop->moltype[aloop->mtop->molblock[aloop->mblock].type];
-    *at_mol  = aloop->at_local;
+    return it_->mtop_->moltype[it_->mtop_->molblock[it_->mblock_].type];
+}
+
+int AtomProxy::atomNumberInMol() const
+{
+    return it_->localAtomNumber_;
 }
 
 typedef struct gmx_mtop_atomloop_block
@@ -962,15 +965,14 @@ static void copyIdefFromMtop(const gmx_mtop_t &mtop,
 
     if (freeEnergyInteractionsAtEnd && gmx_mtop_bondeds_free_energy(&mtop))
     {
-        std::vector<real>       qA(mtop.natoms);
-        std::vector<real>       qB(mtop.natoms);
-        gmx_mtop_atomloop_all_t aloop = gmx_mtop_atomloop_all_init(&mtop);
-        const t_atom           *atom;
-        int                     ag = 0;
-        while (gmx_mtop_atomloop_all_next(aloop, &ag, &atom))
+        std::vector<real>          qA(mtop.natoms);
+        std::vector<real>          qB(mtop.natoms);
+        for (const AtomProxy &atomP : AtomRange(mtop))
         {
-            qA[ag] = atom->q;
-            qB[ag] = atom->qB;
+            const t_atom &local = atomP.atom();
+            int           index = atomP.globalAtomNumber();
+            qA[index] = local.q;
+            qB[index] = local.qB;
         }
         gmx_sort_ilist_fe(idef, qA.data(), qB.data());
     }
@@ -1128,17 +1130,12 @@ static void gen_local_top(const gmx_mtop_t  &mtop,
     }
 }
 
-gmx_localtop_t *
-gmx_mtop_generate_local_top(const gmx_mtop_t *mtop,
+void
+gmx_mtop_generate_local_top(const gmx_mtop_t &mtop,
+                            gmx_localtop_t   *top,
                             bool              freeEnergyInteractionsAtEnd)
 {
-    gmx_localtop_t *top;
-
-    snew(top, 1);
-
-    gen_local_top(*mtop, freeEnergyInteractionsAtEnd, true, top);
-
-    return top;
+    gen_local_top(mtop, freeEnergyInteractionsAtEnd, true, top);
 }
 
 /*! \brief Fills an array with molecule begin/end atom indices
@@ -1233,15 +1230,14 @@ t_topology gmx_mtop_t_to_t_topology(gmx_mtop_t *mtop, bool freeMTop)
 std::vector<int> get_atom_index(const gmx_mtop_t *mtop)
 {
 
-    std::vector<int>          atom_index;
-    gmx_mtop_atomloop_all_t   aloop = gmx_mtop_atomloop_all_init(mtop);
-    const t_atom             *atom;
-    int                       at_global;
-    while (gmx_mtop_atomloop_all_next(aloop, &at_global, &atom))
+    std::vector<int>             atom_index;
+    for (const AtomProxy &atomP : AtomRange(*mtop))
     {
-        if (atom->ptype == eptAtom)
+        const t_atom &local = atomP.atom();
+        int           index = atomP.globalAtomNumber();
+        if (local.ptype == eptAtom)
         {
-            atom_index.push_back(at_global);
+            atom_index.push_back(index);
         }
     }
     return atom_index;
index 3e9c8079934fa8821360065004242c187df4f725..f33e7600bee24ec8b38aa17a62b5652eca0bf5aa 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2012,2013,2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2018,2019, 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.
@@ -43,7 +43,6 @@
 
 #include "gromacs/topology/topology.h"
 #include "gromacs/utility/basedefinitions.h"
-#include "gromacs/utility/gmxassert.h"
 
 struct gmx_localtop_t;
 struct t_atom;
@@ -86,49 +85,102 @@ int gmx_mtop_nres(const gmx_mtop_t *mtop);
 /* Removes the charge groups, i.e. makes single atom charge groups, in mtop */
 void gmx_mtop_remove_chargegroups(gmx_mtop_t *mtop);
 
-/* Abstract type for atom loop over all atoms */
-typedef struct gmx_mtop_atomloop_all *gmx_mtop_atomloop_all_t;
-
-/* Initialize an atom loop over all atoms in the system.
- * The order of the atoms will be as in the state struct.
- * Only use this when you really need to loop over all atoms,
- * i.e. when you use groups which might differ per molecule,
- * otherwise use gmx_mtop_atomloop_block.
+class AtomIterator;
+
+//! Proxy object returned from AtomIterator
+class AtomProxy
+{
+    public:
+        //! Default constructor.
+        AtomProxy(const AtomIterator* it) : it_(it) {}
+        //! Access current global atom number.
+        int globalAtomNumber() const;
+        //! Access current t_atom struct.
+        const t_atom &atom() const;
+        //! Access current name of the atom.
+        const char *atomName() const;
+        //! Access current name of the residue the atom is in.
+        const char *residueName() const;
+        //! Access current residue number.
+        int residueNumber() const;
+        //! Access current molecule type.
+        const gmx_moltype_t &moleculeType() const;
+        //! Access the position of the current atom in the molecule.
+        int atomNumberInMol() const;
+    private:
+        const AtomIterator* it_;
+};
+
+//! Wrapper around proxy object to implement operator->
+template <typename T>
+class ProxyPtr
+{
+    public:
+        //! Construct with proxy object.
+        ProxyPtr(T t) : t_(t) {}
+        //! Member of pointer operator.
+        T* operator->() { return &t_; }
+    private:
+        T t_;
+};
+
+/*! \brief
+ * Object that allows looping over all atoms in an mtop.
  */
-gmx_mtop_atomloop_all_t
-gmx_mtop_atomloop_all_init(const gmx_mtop_t *mtop);
-
-/* Loop to the next atom.
- * When not at the end:
- *   returns TRUE and at_global,
- *   writes the global atom number in *at_global
- *   and sets the pointer atom to the t_atom struct of that atom.
- * When at the end, destroys aloop and returns FALSE.
- * Use as:
- * gmx_mtop_atomloop_all_t aloop;
- * aloop = gmx_mtop_atomloop_all_init(mtop)
- * while (gmx_mtop_atomloop_all_next(aloop,&at_global,&atom)) {
- *     ...
- * }
- */
-gmx_bool
-gmx_mtop_atomloop_all_next(gmx_mtop_atomloop_all_t aloop,
-                           int *at_global, const t_atom **atom);
-
-/* Return the atomname, the residue number and residue name
- * of the current atom in the loop.
- */
-void
-gmx_mtop_atomloop_all_names(gmx_mtop_atomloop_all_t aloop,
-                            char **atomname, int *resnr, char **resname);
-
-/* Return the a pointer to the moltype struct of the current atom
- * in the loop and the atom number in the molecule.
- */
-void
-gmx_mtop_atomloop_all_moltype(gmx_mtop_atomloop_all_t aloop,
-                              const gmx_moltype_t **moltype, int *at_mol);
-
+class AtomIterator
+{
+    public:
+        //! Construct from topology and optionalally a global atom number.
+        explicit AtomIterator(const gmx_mtop_t &mtop, int globalAtomNumber = 0);
+
+        //! Prefix increment.
+        AtomIterator &operator++();
+        //! Postfix increment.
+        AtomIterator operator++(int);
+
+        //! Equality comparison.
+        bool operator==(const AtomIterator &o) const;
+        //! Non-equal comparison.
+        bool operator!=(const AtomIterator &o) const;
+
+        //! Dereference operator. Returns proxy.
+        AtomProxy operator*() const { return {this}; }
+        //! Member of pointer operator.
+        ProxyPtr<AtomProxy> operator->() const { return {this}; };
+
+    private:
+        //! Global topology.
+        const gmx_mtop_t *mtop_;
+        //! Current molecule block.
+        size_t            mblock_;
+        //! The atoms of the current molecule.
+        const t_atoms    *atoms_;
+        //! The current molecule.
+        int               currentMolecule_;
+        //! Current highest number for residues.
+        int               highestResidueNumber_;
+        //! Current local atom number.
+        int               localAtomNumber_;
+        //! Global current atom number.
+        int               globalAtomNumber_;
+
+        friend class AtomProxy;
+};
+
+//! Range over all atoms of topology.
+class AtomRange
+{
+    public:
+        //! Default constructor.
+        explicit AtomRange(const gmx_mtop_t &mtop) :
+            begin_(mtop), end_(mtop, mtop.natoms) {}
+        //! Iterator to begin of range.
+        AtomIterator &begin() { return begin_; }
+        //! Iterator to end of range.
+        AtomIterator &end() { return end_; }
+    private:
+        AtomIterator begin_, end_;
+};
 
 /* Abstract type for atom loop over atoms in all molecule blocks */
 typedef struct gmx_mtop_atomloop_block *gmx_mtop_atomloop_block_t;
@@ -217,12 +269,20 @@ t_atoms
 gmx_mtop_global_atoms(const gmx_mtop_t *mtop);
 
 
-/* Generate a 'local' topology for the whole system.
+/*! \brief
+ * Populate a 'local' topology for the whole system.
+ *
  * When freeEnergyInteractionsAtEnd == true, the free energy interactions will
  * be sorted to the end.
+ *
+ * \param[in]     mtop                        The global topology used to populate the local one.
+ * \param[in,out] top                         New local topology populated from global \p mtop.
+ * \param[in]     freeEnergyInteractionsAtEnd If free energy interactions will be sorted.
  */
-gmx_localtop_t *
-gmx_mtop_generate_local_top(const gmx_mtop_t *mtop, bool freeEnergyInteractionsAtEnd);
+void
+gmx_mtop_generate_local_top(const gmx_mtop_t &mtop,
+                            gmx_localtop_t   *top,
+                            bool              freeEnergyInteractionsAtEnd);
 
 
 /*!\brief Creates and returns a struct with begin/end atom indices of all molecules
index ee8156cba6ba0422d146d33cf7228143cda53c8d..21cc485fe4689e8dab81180635429ac5dde77d75 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2010,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2013,2014,2015,2016,2017,2018,2019, 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.
 #include <cassert>
 #include <cstdio>
 
+#include <algorithm>
+#include <iterator>
+#include <string>
+
+#include "gromacs/utility/arrayref.h"
 #include "gromacs/utility/cstringutil.h"
 #include "gromacs/utility/fatalerror.h"
 #include "gromacs/utility/futil.h"
 #include "gromacs/utility/smalloc.h"
 #include "gromacs/utility/strdb.h"
 
-const char gmx_residuetype_undefined[] = "Other";
+//! Definition for residue type that is not known.
+const std::string c_undefinedResidueType = "Other";
+
+//! Single ResidueType entry object
+struct ResidueTypeEntry
+{
+    //! Default constructor creates complete object.
+    ResidueTypeEntry(const std::string &rName, const std::string &rType)
+        : residueName(rName), residueType(rType)
+    {}
+    //! Name of the residue in the entry.
+    std::string residueName;
+    //! Type of the residue in the entry.
+    std::string residueType;
+};
 
-struct gmx_residuetype_t
+//! Implementation detail for ResidueTypes
+class ResidueType::Impl
 {
-    int      n;
-    char **  resname;
-    char **  restype;
+    public:
+        //! Storage object for entries.
+        std::vector<ResidueTypeEntry> entry;
 };
 
-int
-gmx_residuetype_init(gmx_residuetype_t **prt)
+ResidueType::ResidueType()
+    : impl_(new Impl)
 {
     char                    line[STRLEN];
     char                    resname[STRLEN], restype[STRLEN], dum[STRLEN];
-    gmx_residuetype_t      *rt;
-
-    snew(rt, 1);
-    *prt = rt;
-
-    rt->n        = 0;
-    rt->resname  = nullptr;
-    rt->restype  = nullptr;
 
-    gmx::FilePtr db = gmx::openLibraryFile("residuetypes.dat");
+    gmx::FilePtr            db = gmx::openLibraryFile("residuetypes.dat");
 
     while (get_a_line(db.get(), line, STRLEN))
     {
@@ -78,184 +90,98 @@ gmx_residuetype_init(gmx_residuetype_t **prt)
         {
             if (sscanf(line, "%1000s %1000s %1000s", resname, restype, dum) != 2)
             {
-                gmx_fatal(FARGS, "Incorrect number of columns (2 expected) for line in residuetypes.dat");
+                gmx_fatal(FARGS, "Incorrect number of columns (2 expected) for line in residuetypes.dat  ");
             }
-            gmx_residuetype_add(rt, resname, restype);
+            addResidue(resname, restype);
         }
     }
-
-    return 0;
 }
 
-int
-gmx_residuetype_destroy(gmx_residuetype_t *rt)
+ResidueType::~ResidueType()
 {
-    int i;
-
-    for (i = 0; i < rt->n; i++)
-    {
-        sfree(rt->resname[i]);
-        sfree(rt->restype[i]);
-    }
-    sfree(rt->resname);
-    sfree(rt->restype);
-    sfree(rt);
-
-    return 0;
 }
 
-/* Return 0 if the name was found, otherwise -1.
- * p_restype is set to a pointer to the type name, or 'Other' if we did not find it.
+/*! \brief
+ * Find a residue entry by the residue name.
+ *
+ * \param[in] entries Currently registered residue entries in the database.
+ * \param[in] residueName Name of a residue to compare to database.
+ * \returns A pointer to the entry that was found, or nullptr.
  */
-int
-gmx_residuetype_get_type(gmx_residuetype_t *rt, const char * resname, const char ** p_restype)
+static gmx::ArrayRef<const ResidueTypeEntry>::iterator
+residueEntryByResidueName(gmx::ArrayRef<const ResidueTypeEntry> entries, const std::string &residueName)
 {
-    int    i, rc;
-
-    rc = -1;
-    for (i = 0; i < rt->n && rc; i++)
-    {
-        rc = gmx_strcasecmp(rt->resname[i], resname);
-    }
-
-    *p_restype = (rc == 0) ? rt->restype[i-1] : gmx_residuetype_undefined;
-
-    return rc;
+    return std::find_if(entries.begin(), entries.end(),
+                        [&residueName](const ResidueTypeEntry &old)
+                        { return gmx::equalCaseInsensitive(residueName, old.residueName); });
 }
 
-int
-gmx_residuetype_add(gmx_residuetype_t *rt, const char *newresname, const char *newrestype)
+bool ResidueType::nameIndexedInResidueTypes(const std::string &residueName)
 {
-    bool          found;
-    const char *  p_oldtype;
-
-    found = (gmx_residuetype_get_type(rt, newresname, &p_oldtype) == 0);
-
-    if (found && gmx_strcasecmp(p_oldtype, newrestype))
-    {
-        fprintf(stderr, "Warning: Residue '%s' already present with type '%s' in database, ignoring new type '%s'.",
-                newresname, p_oldtype, newrestype);
-    }
-
-    if (!found)
-    {
-        srenew(rt->resname, rt->n+1);
-        srenew(rt->restype, rt->n+1);
-        rt->resname[rt->n] = gmx_strdup(newresname);
-        rt->restype[rt->n] = gmx_strdup(newrestype);
-        rt->n++;
-    }
-
-    return 0;
+    return residueEntryByResidueName(impl_->entry, residueName) != nullptr;
 }
 
-int
-gmx_residuetype_get_alltypes(gmx_residuetype_t   *rt,
-                             const char ***       p_typenames,
-                             int *                ntypes)
+void ResidueType::addResidue(const std::string &residueName, const std::string &residueType)
 {
-    int          n           = 0;
-    const char **my_typename = nullptr;
+    gmx::ArrayRef<const ResidueTypeEntry> temp(impl_->entry);
+    auto found = residueEntryByResidueName(temp, residueName);
 
-    if (rt->n > 0)
+    if (found != temp.end())
     {
-        int         i = 0;
-        const char *p = rt->restype[i];
-        snew(my_typename, n+1);
-        my_typename[n] = p;
-        n              = 1;
-
-        for (i = 1; i < rt->n; i++)
+        if (!gmx::equalCaseInsensitive(found->residueType, residueType))
         {
-            p = rt->restype[i];
-            bool bFound = false;
-            for (int j = 0; j < n && !bFound; j++)
-            {
-                bFound = (gmx_strcasecmp(p, my_typename[j]) == 0);
-            }
-            if (!bFound)
-            {
-                srenew(my_typename, n+1);
-                my_typename[n] = p;
-                n++;
-            }
+            fprintf(stderr, "Warning: Residue '%s' already present with type '%s' in database, ignoring new type '%s'.\n",
+                    residueName.c_str(), found->residueType.c_str(), residueType.c_str());
         }
     }
-    *ntypes      = n;
-    *p_typenames = my_typename;
-
-    return 0;
-}
-
-gmx_bool
-gmx_residuetype_is_protein(gmx_residuetype_t *rt, const char *resnm)
-{
-    gmx_bool    rc;
-    const char *p_type;
-
-    rc = gmx_residuetype_get_type(rt, resnm, &p_type) == 0 &&
-        gmx_strcasecmp(p_type, "Protein") == 0;
-    return rc;
+    else
+    {
+        impl_->entry.emplace_back(residueName, residueType);
+    }
 }
 
-gmx_bool
-gmx_residuetype_is_dna(gmx_residuetype_t *rt, const char *resnm)
+bool ResidueType::namedResidueHasType(const std::string &residueName, const std::string &residueType)
 {
-    gmx_bool    rc;
-    const char *p_type;
-
-    rc = gmx_residuetype_get_type(rt, resnm, &p_type) == 0 &&
-        gmx_strcasecmp(p_type, "DNA") == 0;
-    return rc;
+    gmx::ArrayRef<const ResidueTypeEntry> temp(impl_->entry);
+    auto found = residueEntryByResidueName(temp, residueName);
+    return  ((found != temp.end()) &&
+             gmx::equalCaseInsensitive(residueType, found->residueType));
 }
 
-gmx_bool
-gmx_residuetype_is_rna(gmx_residuetype_t *rt, const char *resnm)
+int ResidueType::numberOfEntries() const
 {
-    gmx_bool    rc;
-    const char *p_type;
-
-    rc = gmx_residuetype_get_type(rt, resnm, &p_type) == 0 &&
-        gmx_strcasecmp(p_type, "RNA") == 0;
-    return rc;
+    return impl_->entry.size();
 }
 
-/* Return the size of the arrays */
-int
-gmx_residuetype_get_size(gmx_residuetype_t *rt)
+int ResidueType::indexFromResidueName(const std::string &residueName) const
 {
-    return rt->n;
+    gmx::ArrayRef<const ResidueTypeEntry> temp(impl_->entry);
+    auto found = residueEntryByResidueName(temp, residueName);
+    return (found != temp.end()) ? std::distance(temp.begin(), found) : -1;
 }
 
-/* Search for a residuetype with name resnm within the
- * gmx_residuetype database. Return the index if found,
- * otherwise -1.
- */
-int
-gmx_residuetype_get_index(gmx_residuetype_t *rt, const char *resnm)
+const std::string ResidueType::nameFromResidueIndex(int index) const
 {
-    int i, rc;
-
-    rc = -1;
-    for (i = 0; i < rt->n && rc; i++)
+    if (index >= 0 && index < static_cast<int>(impl_->entry.size()))
     {
-        rc = gmx_strcasecmp(rt->resname[i], resnm);
+        return impl_->entry[index].residueName;
+    }
+    else
+    {
+        return "";
     }
-
-    return (0 == rc) ? i-1 : -1;
 }
 
-/* Return the name of the residuetype with the given index, or
- * NULL if not found. */
-const char *
-gmx_residuetype_get_name(gmx_residuetype_t *rt, int index)
+const std::string ResidueType::typeNameForIndexedResidue(const std::string &residueName)
 {
-    if (index >= 0 && index < rt->n)
+    gmx::ArrayRef<const ResidueTypeEntry> temp(impl_->entry);
+    auto found = residueEntryByResidueName(temp, residueName);
+    if (found != temp.end())
     {
-        return rt->resname[index];
+        return found->residueType;
     }
     else
     {
-        return nullptr;
+        return c_undefinedResidueType;
     }
 }
index 355fb0b999a1c1c07cce8b2c493c27b29ef5206c..8b439b5011a8da52464876d76f857fdd2a7f8719 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2010,2014,2018, by the GROMACS development team, led by
+ * Copyright (c) 2010,2014,2018,2019, 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.
 #ifndef GMX_TOPOLOGY_RESIDUETYPES_H
 #define GMX_TOPOLOGY_RESIDUETYPES_H
 
-#include "gromacs/utility/basedefinitions.h"
-
-typedef struct gmx_residuetype_t gmx_residuetype_t;
-
-int
-gmx_residuetype_init(gmx_residuetype_t **rt);
-
-int
-gmx_residuetype_destroy(gmx_residuetype_t *rt);
+#include <string>
 
-int
-gmx_residuetype_get_type(gmx_residuetype_t *rt, const char *resname, const char **p_restype);
-
-int
-gmx_residuetype_add(gmx_residuetype_t *rt, const char *newresname, const char *newrestype);
-
-int
-gmx_residuetype_get_alltypes(gmx_residuetype_t   *rt,
-                             const char        ***p_typenames,
-                             int                 *ntypes);
+#include "gromacs/utility/basedefinitions.h"
+#include "gromacs/utility/classhelpers.h"
 
-gmx_bool
-gmx_residuetype_is_protein(gmx_residuetype_t *rt, const char *resnm);
+struct ResidueTypeEntry;
 
-gmx_bool
-gmx_residuetype_is_dna(gmx_residuetype_t *rt, const char *resnm);
+class ResidueType
+{
+    public:
+        //! Default constructor.
+        ResidueType();
+        //! Default destructor.
+        ~ResidueType();
 
-gmx_bool
-gmx_residuetype_is_rna(gmx_residuetype_t *rt, const char *resnm);
+        //! Get handle to underlying residue type data.
+        ResidueTypeEntry *ResidueTypes();
 
-int
-gmx_residuetype_get_size(gmx_residuetype_t *rt);
+        //! Get number of entries in ResidueTypes.
+        int numberOfEntries() const;
+        /*! \brief
+         * Return true if residue \p residueName is found or false otherwise.
+         *
+         * \param[in] residueName Residue name to search database for.
+         * \returns true if successful.
+         */
+        bool nameIndexedInResidueTypes(const std::string &residueName);
+        /*! \brief
+         * Add entry to ResidueTypes if unique.
+         *
+         * \param[in] residueName Name of new residue.
+         * \param[in] residueType Type of new residue.
+         */
+        void addResidue(const std::string &residueName, const std::string &residueType);
+        /*! \brief
+         * Checks if the indicated \p residueName if of \p residueType.
+         *
+         * \param[in] residueName Residue that should be checked.
+         * \param[in] residueType Which ResidueType the residue should have.
+         * \returns If the check was successful.
+         */
+        bool namedResidueHasType(const std::string &residueName, const std::string &residueType);
+        /*! \brief
+         * Get index to entry in ResidueTypes with name \p residueName.
+         *
+         * \param[in] residueName Name of the residue being searched.
+         * \returns The index or -1 if not found.
+         */
+        int indexFromResidueName(const std::string &residueName) const;
+        /*! \brief
+         * Get the name of the entry in ResidueTypes with \p index.
+         *
+         * \param[in] index Which entry should be returned.
+         * \returns The name of the entry at \p index, or nullptr.
+         */
+        const std::string nameFromResidueIndex(int index) const;
+        /*! \brief
+         * Get name of residue type for already defined residue.
+         *
+         *
+         * \param[in] residueName Name of the residue to search for.
+         * \returns Type name or UndefineResidueName if not found.
+         */
+        const std::string typeNameForIndexedResidue(const std::string &residueName);
 
-int
-gmx_residuetype_get_index(gmx_residuetype_t *rt, const char *resnm);
+    private:
+        //! Implementation pointer.
+        class Impl;
 
-const char *
-gmx_residuetype_get_name(gmx_residuetype_t *rt, int index);
+        gmx::PrivateImplPointer<Impl> impl_;
+};
 
 #endif
diff --git a/src/gromacs/topology/tests/CMakeLists.txt b/src/gromacs/topology/tests/CMakeLists.txt
new file mode 100644 (file)
index 0000000..8f6ed01
--- /dev/null
@@ -0,0 +1,37 @@
+#
+# This file is part of the GROMACS molecular simulation package.
+#
+# Copyright (c) 2019, 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.
+
+gmx_add_unit_test(TopologyTest topology-test
+  mtop.cpp)
+
diff --git a/src/gromacs/topology/tests/mtop.cpp b/src/gromacs/topology/tests/mtop.cpp
new file mode 100644 (file)
index 0000000..f68ab4c
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2019, 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 test of mtop routines
+ *
+ * \author Roland Schulz <roland.schulz@intel.com>
+ * \ingroup module_topology
+ */
+#include "gmxpre.h"
+
+#include <gtest/gtest.h>
+
+#include "gromacs/topology/mtop_util.h"
+
+namespace gmx
+{
+namespace
+{
+
+/*! \brief Initializes a basic topology with 9 atoms with settle*/
+void createBasicTop(gmx_mtop_t* mtop)
+{
+    gmx_moltype_t     moltype;
+    moltype.atoms.nr             = NRAL(F_SETTLE);
+    std::vector<int> &iatoms     = moltype.ilist[F_SETTLE].iatoms;
+    const int         settleType = 0;
+    iatoms.push_back(settleType);
+    iatoms.push_back(0);
+    iatoms.push_back(1);
+    iatoms.push_back(2);
+    mtop->moltype.push_back(moltype);
+
+    mtop->molblock.resize(1);
+    mtop->molblock[0].type = 0;
+    mtop->molblock[0].nmol = 3;
+    mtop->natoms           = moltype.atoms.nr * mtop->molblock[0].nmol;
+    gmx_mtop_finalize(mtop);
+}
+
+TEST(MtopTest, RangeBasedLoop)
+{
+    gmx_mtop_t mtop;
+    createBasicTop(&mtop);
+    int        count = 0;
+    for (const AtomProxy &atomP : AtomRange(mtop))
+    {
+        EXPECT_EQ(atomP.globalAtomNumber(), count);
+        ++count;
+    }
+    EXPECT_EQ(count, 9);
+}
+
+TEST(MtopTest, Operators)
+{
+    gmx_mtop_t   mtop;
+    createBasicTop(&mtop);
+    AtomIterator it(mtop);
+    AtomIterator otherIt(mtop);
+    EXPECT_EQ((*it).globalAtomNumber(), 0);
+    EXPECT_EQ(it->globalAtomNumber(), 0);
+    EXPECT_TRUE (it == otherIt);
+    EXPECT_FALSE(it != otherIt);
+    ++it;
+    EXPECT_EQ(it->globalAtomNumber(), 1);
+    it++;
+    EXPECT_EQ(it->globalAtomNumber(), 2);
+    EXPECT_TRUE (it != otherIt);
+    EXPECT_FALSE(it == otherIt);
+}
+
+}  // namespace
+
+}  // namespace gmx
index 2dc6509752b9d215b46567d08bab98f232a5657d..aacebf36edb7a7ca827bd2314698d4dcf5d12604 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -47,6 +47,7 @@
 #include "gromacs/topology/idef.h"
 #include "gromacs/topology/ifunc.h"
 #include "gromacs/topology/symtab.h"
+#include "gromacs/utility/arrayref.h"
 #include "gromacs/utility/compare.h"
 #include "gromacs/utility/gmxassert.h"
 #include "gromacs/utility/smalloc.h"
@@ -172,30 +173,23 @@ void done_top_mtop(t_topology *top, gmx_mtop_t *mtop)
     }
 }
 
-void init_localtop(gmx_localtop_t *top)
+gmx_localtop_t::gmx_localtop_t()
 {
-    init_block(&top->cgs);
-    init_blocka(&top->excls);
-    init_idef(&top->idef);
-    init_atomtypes(&top->atomtypes);
+    init_block_null(&cgs);
+    init_blocka_null(&excls);
+    init_idef(&idef);
+    init_atomtypes(&atomtypes);
 }
 
-void done_localtop(gmx_localtop_t *top)
+gmx_localtop_t::~gmx_localtop_t()
 {
-    if (top == nullptr)
+    if (!useInDomainDecomp_)
     {
-        return;
+        done_idef(&idef);
+        done_block(&cgs);
+        done_blocka(&excls);
+        done_atomtypes(&atomtypes);
     }
-    done_idef(&top->idef);
-    done_block(&top->cgs);
-    done_blocka(&top->excls);
-    done_atomtypes(&top->atomtypes);
-}
-
-void done_and_sfree_localtop(gmx_localtop_t *top)
-{
-    done_localtop(top);
-    sfree(top);
 }
 
 bool gmx_mtop_has_masses(const gmx_mtop_t *mtop)
@@ -419,33 +413,8 @@ void pr_top(FILE *fp, int indent, const char *title, const t_topology *top,
     }
 }
 
-static void cmp_ilist(FILE *fp, int ftype, const t_ilist *il1, const t_ilist *il2)
-{
-    int  i;
-    char buf[256];
-
-    fprintf(fp, "comparing ilist %s\n", interaction_function[ftype].name);
-    sprintf(buf, "%s->nr", interaction_function[ftype].name);
-    cmp_int(fp, buf, -1, il1->nr, il2->nr);
-    sprintf(buf, "%s->iatoms", interaction_function[ftype].name);
-    if (((il1->nr > 0) && (!il1->iatoms)) ||
-        ((il2->nr > 0) && (!il2->iatoms)) ||
-        ((il1->nr != il2->nr)))
-    {
-        fprintf(fp, "Comparing radically different topologies - %s is different\n",
-                buf);
-    }
-    else
-    {
-        for (i = 0; (i < il1->nr); i++)
-        {
-            cmp_int(fp, buf, i, il1->iatoms[i], il2->iatoms[i]);
-        }
-    }
-}
-
 static void cmp_iparm(FILE *fp, const char *s, t_functype ft,
-                      const t_iparams &ip1, const t_iparams &ip2, real ftol, real abstol)
+                      const t_iparams &ip1, const t_iparams &ip2, real relativeTolerance, real absoluteTolerance)
 {
     int      i;
     gmx_bool bDiff;
@@ -453,7 +422,7 @@ static void cmp_iparm(FILE *fp, const char *s, t_functype ft,
     bDiff = FALSE;
     for (i = 0; i < MAXFORCEPARAM && !bDiff; i++)
     {
-        bDiff = !equal_real(ip1.generic.buf[i], ip2.generic.buf[i], ftol, abstol);
+        bDiff = !equal_real(ip1.generic.buf[i], ip2.generic.buf[i], relativeTolerance, absoluteTolerance);
     }
     if (bDiff)
     {
@@ -465,7 +434,7 @@ static void cmp_iparm(FILE *fp, const char *s, t_functype ft,
 }
 
 static void cmp_iparm_AB(FILE *fp, const char *s, t_functype ft,
-                         const t_iparams &ip1, real ftol, real abstol)
+                         const t_iparams &ip1, real relativeTolerance, real absoluteTolerance)
 {
     int      nrfpA, nrfpB, p0, i;
     gmx_bool bDiff;
@@ -487,7 +456,7 @@ static void cmp_iparm_AB(FILE *fp, const char *s, t_functype ft,
     bDiff = FALSE;
     for (i = 0; i < nrfpB && !bDiff; i++)
     {
-        bDiff = !equal_real(ip1.generic.buf[p0+i], ip1.generic.buf[nrfpA+i], ftol, abstol);
+        bDiff = !equal_real(ip1.generic.buf[p0+i], ip1.generic.buf[nrfpA+i], relativeTolerance, absoluteTolerance);
     }
     if (bDiff)
     {
@@ -496,7 +465,7 @@ static void cmp_iparm_AB(FILE *fp, const char *s, t_functype ft,
     }
 }
 
-static void cmp_cmap(FILE *fp, const gmx_cmap_t *cmap1, const gmx_cmap_t *cmap2, real ftol, real abstol)
+static void cmp_cmap(FILE *fp, const gmx_cmap_t *cmap1, const gmx_cmap_t *cmap2, real relativeTolerance, real absoluteTolerance)
 {
     int cmap1_ngrid = (cmap1 ? cmap1->cmapdata.size() : 0);
     int cmap2_ngrid = (cmap2 ? cmap2->cmapdata.size() : 0);
@@ -520,46 +489,12 @@ static void cmp_cmap(FILE *fp, const gmx_cmap_t *cmap1, const gmx_cmap_t *cmap2,
 
             for (i = 0; i < 4*cmap1->grid_spacing*cmap1->grid_spacing; i++)
             {
-                cmp_real(fp, "", i, cmap1->cmapdata[g].cmap[i], cmap2->cmapdata[g].cmap[i], ftol, abstol);
+                cmp_real(fp, "", i, cmap1->cmapdata[g].cmap[i], cmap2->cmapdata[g].cmap[i], relativeTolerance, absoluteTolerance);
             }
         }
     }
 }
 
-static void cmp_idef(FILE *fp, const t_idef *id1, const t_idef *id2, real ftol, real abstol)
-{
-    int  i;
-    char buf1[64], buf2[64];
-
-    fprintf(fp, "comparing idef\n");
-    if (id2)
-    {
-        cmp_int(fp, "idef->ntypes", -1, id1->ntypes, id2->ntypes);
-        cmp_int(fp, "idef->atnr",  -1, id1->atnr, id2->atnr);
-        for (i = 0; (i < std::min(id1->ntypes, id2->ntypes)); i++)
-        {
-            sprintf(buf1, "idef->functype[%d]", i);
-            sprintf(buf2, "idef->iparam[%d]", i);
-            cmp_int(fp, buf1, i, static_cast<int>(id1->functype[i]), static_cast<int>(id2->functype[i]));
-            cmp_iparm(fp, buf2, id1->functype[i],
-                      id1->iparams[i], id2->iparams[i], ftol, abstol);
-        }
-        cmp_real(fp, "fudgeQQ", -1, id1->fudgeQQ, id2->fudgeQQ, ftol, abstol);
-        cmp_cmap(fp, id1->cmap_grid, id2->cmap_grid, ftol, abstol);
-        for (i = 0; (i < F_NRE); i++)
-        {
-            cmp_ilist(fp, i, &(id1->il[i]), &(id2->il[i]));
-        }
-    }
-    else
-    {
-        for (i = 0; (i < id1->ntypes); i++)
-        {
-            cmp_iparm_AB(fp, "idef->iparam", id1->functype[i], id1->iparams[i], ftol, abstol);
-        }
-    }
-}
-
 static void cmp_block(FILE *fp, const t_block *b1, const t_block *b2, const char *s)
 {
     char buf[32];
@@ -580,49 +515,180 @@ static void cmp_blocka(FILE *fp, const t_blocka *b1, const t_blocka *b2, const c
     cmp_int(fp, buf, -1, b1->nra, b2->nra);
 }
 
-void cmp_top(FILE *fp, const t_topology *t1, const t_topology *t2, real ftol, real abstol)
+static void compareFfparams(FILE *fp, const gmx_ffparams_t &ff1, const gmx_ffparams_t &ff2, real relativeTolerance, real absoluteTolerance)
 {
-    fprintf(fp, "comparing top\n");
-    if (t2)
+    fprintf(fp, "comparing force field parameters\n");
+    cmp_int(fp, "numTypes", -1, ff1.numTypes(), ff2.numTypes());
+    cmp_int(fp, "atnr", -1, ff1.atnr, ff1.atnr);
+    cmp_double(fp, "reppow", -1, ff1.reppow, ff2.reppow, relativeTolerance, absoluteTolerance);
+    cmp_real(fp, "fudgeQQ", -1, ff1.fudgeQQ, ff2.fudgeQQ, relativeTolerance, absoluteTolerance);
+    cmp_cmap(fp, &ff1.cmap_grid, &ff2.cmap_grid, relativeTolerance, absoluteTolerance);
+    for (int i = 0; i < std::min(ff1.numTypes(), ff2.numTypes()); i++)
     {
-        cmp_idef(fp, &(t1->idef), &(t2->idef), ftol, abstol);
-        cmp_atoms(fp, &(t1->atoms), &(t2->atoms), ftol, abstol);
-        cmp_block(fp, &t1->cgs, &t2->cgs, "cgs");
-        cmp_block(fp, &t1->mols, &t2->mols, "mols");
-        cmp_bool(fp, "bIntermolecularInteractions", -1, t1->bIntermolecularInteractions, t2->bIntermolecularInteractions);
-        cmp_blocka(fp, &t1->excls, &t2->excls, "excls");
+        std::string buf = gmx::formatString("ffparams->functype[%d]", i);
+        cmp_int(fp, buf.c_str(), i, ff1.functype[i], ff2.functype[i]);
+        buf = gmx::formatString("ffparams->iparams[%d]", i);
+        cmp_iparm(fp, buf.c_str(), ff1.functype[i], ff1.iparams[i], ff2.iparams[i], relativeTolerance, absoluteTolerance);
     }
-    else
+
+}
+
+static void compareFfparamAB(FILE *fp, const gmx_ffparams_t &ff1, real relativeTolerance,   real absoluteTolerance)
+{
+    fprintf(fp, "comparing free energy parameters\n");
+    for (int i = 0; i < ff1.numTypes(); i++)
     {
-        cmp_idef(fp, &(t1->idef), nullptr, ftol, abstol);
-        cmp_atoms(fp, &(t1->atoms), nullptr, ftol, abstol);
+        std::string buf = gmx::formatString("ffparams->iparams[%d]", i);
+        cmp_iparm_AB(fp, buf.c_str(), ff1.functype[i], ff1.iparams[i], relativeTolerance, absoluteTolerance);
+    }
+}
+static void compareInteractionLists(FILE *fp, const InteractionLists *il1, const InteractionLists *il2)
+{
+    fprintf(fp, "comparing InteractionLists\n");
+    if ((il1 || il2) && (!il1 || !il2))
+    {
+        fprintf(fp, "InteractionLists are present in topology %d but not in the other\n", il1 ? 1 : 2);
+    }
+    if (il1 && il2)
+    {
+        for (int i = 0; i < F_NRE; i++)
+        {
+            cmp_int(fp, "InteractionList size", i, il1->at(i).size(), il2->at(i).size());
+            int nr = std::min(il1->at(i).size(), il2->at(i).size());
+            for (int j = 0; j < nr; j++)
+            {
+                cmp_int(fp, "InteractionList entry", j, il1->at(i).iatoms.at(j), il2->at(i).iatoms.at(j));
+            }
+        }
     }
 }
 
-void cmp_groups(FILE *fp, const gmx_groups_t *g0, const gmx_groups_t *g1,
-                int natoms0, int natoms1)
+static void compareMoltypes(FILE *fp, gmx::ArrayRef<const gmx_moltype_t> mt1, gmx::ArrayRef<const gmx_moltype_t> mt2, real relativeTolerance, real absoluteTolerance)
 {
-    char buf[32];
+    fprintf(fp, "comparing molecule types\n");
+    cmp_int(fp, "moltype size", -1, mt1.size(), mt2.size());
+    for (int i = 0; i < std::min(mt1.size(), mt2.size()); i++)
+    {
+        cmp_str(fp, "Name", i, *mt1[i].name, *mt2[i].name);
+        compareAtoms(fp, &mt1[i].atoms, &mt2[i].atoms, relativeTolerance, absoluteTolerance);
+        compareInteractionLists(fp, &mt1[i].ilist, &mt2[i].ilist);
+        std::string buf = gmx::formatString("cgs[%d]", i);
+        cmp_block(fp, &mt1[i].cgs, &mt2[i].cgs, buf.c_str());
+        buf = gmx::formatString("excls[%d]", i);
+        cmp_blocka(fp, &mt1[i].excls, &mt2[i].excls, buf.c_str());
+    }
+}
+
+static void compareMoletypeAB(FILE *fp, gmx::ArrayRef<const gmx_moltype_t> mt1, real relativeTolerance, real absoluteTolerance)
+{
+    fprintf(fp, "comparing free energy molecule types\n");
+    for (int i = 0; i < mt1.size(); i++)
+    {
+        compareAtoms(fp, &mt1[i].atoms, nullptr, relativeTolerance, absoluteTolerance);
+    }
+}
+static void compareMolblocks(FILE *fp, gmx::ArrayRef<const gmx_molblock_t> mb1, gmx::ArrayRef<const gmx_molblock_t> mb2)
+{
+    fprintf(fp, "comparing molecule blocks\n");
+    cmp_int(fp, "molblock size", -1, mb1.size(), mb2.size());
+    int nr = std::min(mb1.size(), mb2.size());
+    for (int i = 0; i < nr; i++)
+    {
+        cmp_int(fp, "type", i, mb1[i].type, mb2[i].type);
+        cmp_int(fp, "nmol", i, mb1[i].nmol, mb2[i].nmol);
+        // Only checking size of restraint vectors for now
+        cmp_int(fp, "posres_xA size", i, mb1[i].posres_xA.size(), mb2[i].posres_xA.size());
+        cmp_int(fp, "posres_xB size", i, mb1[i].posres_xB.size(), mb2[i].posres_xB.size());
+    }
+
+}
 
+static void compareAtomtypes(FILE *fp, const t_atomtypes &at1, const t_atomtypes &at2)
+{
+    fprintf(fp, "comparing atomtypes\n");
+    cmp_int(fp, "nr", -1, at1.nr, at2.nr);
+    int nr = std::min(at1.nr, at2.nr);
+    for (int i = 0; i < nr; i++)
+    {
+        cmp_int(fp, "atomtype", i, at1.atomnumber[i], at2.atomnumber[i]);
+    }
+}
+
+static void compareIntermolecularExclusions(FILE *fp, gmx::ArrayRef<const int> ime1, gmx::ArrayRef<const int> ime2)
+{
+    fprintf(fp, "comparing intermolecular exclusions\n");
+    cmp_int(fp, "exclusion number", -1, ime1.size(), ime2.size());
+    int nr = std::min(ime1.size(), ime2.size());
+    for (int i = 0; i < nr; i++)
+    {
+        cmp_int(fp, "exclusion", i, ime1[i], ime2[i]);
+    }
+}
+
+static void compareBlockIndices(FILE *fp, gmx::ArrayRef<const MoleculeBlockIndices> mbi1, gmx::ArrayRef<const MoleculeBlockIndices> mbi2)
+{
+    fprintf(fp, "comparing moleculeBlockIndices\n");
+    cmp_int(fp, "size", -1, mbi1.size(), mbi2.size());
+    int nr = std::min(mbi1.size(), mbi2.size());
+    for (int i = 0; i < nr; i++)
+    {
+        cmp_int(fp, "numAtomsPerMolecule", i, mbi1[i].numAtomsPerMolecule, mbi2[i].numAtomsPerMolecule);
+        cmp_int(fp, "globalAtomStart", i, mbi1[i].globalAtomStart, mbi2[i].globalAtomStart);
+        cmp_int(fp, "globalAtomEnd", i, mbi1[i].globalAtomEnd, mbi2[i].globalAtomEnd);
+        cmp_int(fp, "globalResidueStart", i, mbi1[i].globalResidueStart, mbi2[i].globalResidueStart);
+        cmp_int(fp, "moleculeIndexStart", i, mbi1[i].moleculeIndexStart, mbi2[i].moleculeIndexStart);
+    }
+}
+
+void compareMtop(FILE *fp, const gmx_mtop_t &mtop1, const gmx_mtop_t &mtop2, real relativeTolerance, real absoluteTolerance)
+{
+    fprintf(fp, "comparing mtop topology\n");
+    cmp_str(fp, "Name", -1, *mtop1.name, *mtop2.name);
+    cmp_int(fp, "natoms", -1, mtop1.natoms, mtop2.natoms);
+    cmp_int(fp, "maxres_renum", -1, mtop1.maxres_renum, mtop2.maxres_renum);
+    cmp_int(fp, "maxresnr", -1, mtop1.maxresnr, mtop2.maxresnr);
+    cmp_bool(fp, "bIntermolecularInteractions", -1, mtop1.bIntermolecularInteractions, mtop2.bIntermolecularInteractions);
+    cmp_bool(fp, "haveMoleculeIndices", -1, mtop1.haveMoleculeIndices, mtop2.haveMoleculeIndices);
+
+    compareFfparams(fp, mtop1.ffparams, mtop2.ffparams, relativeTolerance, absoluteTolerance);
+    compareMoltypes(fp, mtop1.moltype, mtop2.moltype, relativeTolerance, absoluteTolerance);
+    compareMolblocks(fp, mtop1.molblock, mtop2.molblock);
+    compareInteractionLists(fp, mtop1.intermolecular_ilist.get(), mtop2.intermolecular_ilist.get());
+    compareAtomtypes(fp, mtop1.atomtypes, mtop2.atomtypes);
+    compareAtomGroups(fp, mtop1.groups, mtop2.groups, mtop1.natoms, mtop2.natoms);
+    compareIntermolecularExclusions(fp, mtop1.intermolecularExclusionGroup, mtop2.intermolecularExclusionGroup);
+    compareBlockIndices(fp, mtop1.moleculeBlockIndices, mtop2.moleculeBlockIndices);
+}
+
+void compareMtopAB(FILE *fp, const gmx_mtop_t &mtop1, real relativeTolerance, real absoluteTolerance)
+{
+    fprintf(fp, "comparing topAB\n");
+    compareFfparamAB(fp, mtop1.ffparams, relativeTolerance, absoluteTolerance);
+    compareMoletypeAB(fp, mtop1.moltype, relativeTolerance, absoluteTolerance);
+}
+
+void compareAtomGroups(FILE *fp, const gmx_groups_t &g0, const gmx_groups_t &g1,
+                       int natoms0, int natoms1)
+{
     fprintf(fp, "comparing groups\n");
 
     for (int i = 0; i < egcNR; i++)
     {
-        sprintf(buf, "grps[%d].nr", i);
-        cmp_int(fp, buf, -1, g0->grps[i].nr, g1->grps[i].nr);
-        if (g0->grps[i].nr == g1->grps[i].nr)
+        std::string buf = gmx::formatString("grps[%d].nr", i);
+        cmp_int(fp, buf.c_str(), -1, g0.grps[i].nr, g1.grps[i].nr);
+        if (g0.grps[i].nr == g1.grps[i].nr)
         {
-            for (int j = 0; j < g0->grps[i].nr; j++)
+            for (int j = 0; j < g0.grps[i].nr; j++)
             {
-                sprintf(buf, "grps[%d].name[%d]", i, j);
-                cmp_str(fp, buf, -1,
-                        *g0->grpname[g0->grps[i].nm_ind[j]],
-                        *g1->grpname[g1->grps[i].nm_ind[j]]);
+                buf = gmx::formatString("grps[%d].name[%d]", i, j);
+                cmp_str(fp, buf.c_str(), -1,
+                        *g0.grpname[g0.grps[i].nm_ind[j]],
+                        *g1.grpname[g1.grps[i].nm_ind[j]]);
             }
         }
-        cmp_int(fp, "ngrpnr", i, g0->ngrpnr[i], g1->ngrpnr[i]);
-        if (g0->ngrpnr[i] == g1->ngrpnr[i] && natoms0 == natoms1 &&
-            (g0->grpnr[i] != nullptr || g1->grpnr[i] != nullptr))
+        cmp_int(fp, "ngrpnr", i, g0.ngrpnr[i], g1.ngrpnr[i]);
+        if (g0.ngrpnr[i] == g1.ngrpnr[i] && natoms0 == natoms1 &&
+            (g0.grpnr[i] != nullptr || g1.grpnr[i] != nullptr))
         {
             for (int j = 0; j < natoms0; j++)
             {
@@ -635,9 +701,9 @@ void cmp_groups(FILE *fp, const gmx_groups_t *g0, const gmx_groups_t *g1,
      */
 }
 
-int getGroupType(const gmx_groups_t *group, int type, int atom)
+int getGroupType(const gmx_groups_t &group, int type, int atom)
 {
-    return (group->grpnr[type] ? group->grpnr[type][atom] : 0);
+    return (group.grpnr[type] ? group.grpnr[type][atom] : 0);
 }
 
 void copy_moltype(const gmx_moltype_t *src, gmx_moltype_t *dst)
index d958ffe750cbbd38a812e58f33e3e548c81dd804..87ee01aefad346a27315489cf9b837f7c12afde7 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2011,2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2011,2014,2015,2016,2018,2019, 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.
@@ -118,7 +118,7 @@ typedef struct gmx_groups_t
  * \param[in] type  Type of group to check.
  * \param[in] atom  Atom to check if it has an entry.
  */
-int getGroupType (const gmx_groups_t *group, int type, int atom);
+int getGroupType (const gmx_groups_t &group, int type, int atom);
 
 /* The global, complete system topology struct, based on molecule types.
  * This structure should contain no data that is O(natoms) in memory.
@@ -171,14 +171,29 @@ struct gmx_mtop_t //NOLINT(clang-analyzer-optin.performance.Padding)
     std::vector<MoleculeBlockIndices> moleculeBlockIndices;
 };
 
-/* The mdrun node-local topology struct, completely written out */
-typedef struct gmx_localtop_t
+/* \brief
+ * The fully written out topology for a domain over its lifetime
+ *
+ * Also used in some analysis code.
+ */
+struct gmx_localtop_t
 {
-    t_idef        idef;         /* The interaction function definition  */
-    t_atomtypes   atomtypes;    /* Atomtype properties                  */
-    t_block       cgs;          /* The charge groups                    */
-    t_blocka      excls;        /* The exclusions                       */
-} gmx_localtop_t;
+    //! Constructor used for normal operation, manages own resources.
+    gmx_localtop_t();
+
+    ~gmx_localtop_t();
+
+    //! The interaction function definition
+    t_idef        idef;
+    //! Atomtype properties
+    t_atomtypes   atomtypes;
+    //! The charge groups
+    t_block       cgs;
+    //! The exclusions
+    t_blocka      excls;
+    //! Flag for domain decomposition so we don't free already freed memory.
+    bool          useInDomainDecomp_ = false;
+};
 
 /* The old topology struct, completely written out, used in analysis tools */
 typedef struct t_topology
@@ -200,19 +215,6 @@ void done_top(t_topology *top);
 // Frees both t_topology and gmx_mtop_t when the former has been created from
 // the latter.
 void done_top_mtop(t_topology *top, gmx_mtop_t *mtop);
-/*! \brief
- * Properly initialize local topology.
- *
- * \param[in] top Pointer to topology to initialize.
- */
-void init_localtop(gmx_localtop_t *top);
-/*! \brief
- * Properly clear up local topology,
- *
- * \param[in] top Pointer to topology to clear up.
- */
-void done_localtop(gmx_localtop_t *top);
-void done_and_sfree_localtop(gmx_localtop_t *top);
 
 bool gmx_mtop_has_masses(const gmx_mtop_t *mtop);
 bool gmx_mtop_has_charges(const gmx_mtop_t *mtop);
@@ -225,12 +227,38 @@ void pr_mtop(FILE *fp, int indent, const char *title, const gmx_mtop_t *mtop,
 void pr_top(FILE *fp, int indent, const char *title, const t_topology *top,
             gmx_bool bShowNumbers, gmx_bool bShowParameters);
 
-void cmp_top(FILE *fp, const t_topology *t1, const t_topology *t2, real ftol, real abstol);
-void cmp_groups(FILE *fp, const gmx_groups_t *g0, const gmx_groups_t *g1,
-                int natoms0, int natoms1);
+/*! \brief Compare two mtop topologies.
+ *
+ * \param[in] fp File pointer to write to.
+ * \param[in] mtop1 First topology to compare.
+ * \param[in] mtop2 Second topology to compare.
+ * \param[in] relativeTolerance Relative tolerance for comparison.
+ * \param[in] absoluteTolerance Absolute tolerance for comparison.
+ */
+void compareMtop(FILE *fp, const gmx_mtop_t &mtop1, const gmx_mtop_t &mtop2, real relativeTolerance, real absoluteTolerance);
+
+/*! \brief Check perturbation parameters in topology.
+ *
+ * \param[in] fp File pointer to write to.
+ * \param[in] mtop1 Topology to check perturbation parameters in.
+ * \param[in] relativeTolerance Relative tolerance for comparison.
+ * \param[in] absoluteTolerance Absolute tolerance for comparison.
+ */
+void compareMtopAB(FILE *fp, const gmx_mtop_t &mtop1, real relativeTolerance, real absoluteTolerance);
+
+/*! \brief Compare groups.
+ *
+ * \param[in] fp File pointer to write to.
+ * \param[in] g0 First group for comparison.
+ * \param[in] g1 Second group for comparison.
+ * \param[in] natoms0 Number of atoms for first group.
+ * \param[in] natoms1 Number of atoms for second group.
+ */
+void compareAtomGroups(FILE *fp, const gmx_groups_t &g0, const gmx_groups_t &g1,
+                       int natoms0, int natoms1);
 
-//! Deleter for gmx_localtop_t, needed until it has a proper destructor.
-using ExpandedTopologyPtr = gmx::unique_cptr<gmx_localtop_t, done_and_sfree_localtop>;
+//! Typedef for gmx_localtop in analysis tools.
+using ExpandedTopologyPtr = std::unique_ptr<gmx_localtop_t>;
 
 void copy_moltype(const gmx_moltype_t *src, gmx_moltype_t *dst);
 
index 5c752d89d14dc6f12206c3763ee449f71e2fb946..a22c45e257040465a45251ad685a6cce5ace8271 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2018,2019, 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.
@@ -68,7 +68,7 @@ void comp_frame(FILE *fp, t_trxframe *fr1, t_trxframe *fr2,
     }
     if (cmp_bool(fp, "bAtoms", -1, fr1->bAtoms, fr2->bAtoms))
     {
-        cmp_atoms(fp, fr1->atoms, fr2->atoms, ftol, abstol);
+        compareAtoms(fp, fr1->atoms, fr2->atoms, ftol, abstol);
     }
     if (cmp_bool(fp, "bPrec", -1, fr1->bPrec, fr2->bPrec))
     {
index 2080c657ab029a469b7f38f04838f56c3e188e29..5c23093395a082b9e25f2175075d4d16047a81c8 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -234,7 +234,7 @@ FreeVolume::initAnalysis(const TrajectoryAnalysisSettings &settings,
     // Initiate variable
     cutoff_               = 0;
     int            nnovdw = 0;
-    gmx_atomprop_t aps    = gmx_atomprop_init();
+    AtomProperties aps;
     auto           atoms  = top.copyAtoms();
 
     // Compute total mass
@@ -258,10 +258,10 @@ FreeVolume::initAnalysis(const TrajectoryAnalysisSettings &settings,
 
         // Lookup the Van der Waals radius of this atom
         int resnr = atoms->atom[i].resind;
-        if (gmx_atomprop_query(aps, epropVDW,
-                               *(atoms->resinfo[resnr].name),
-                               *(atoms->atomname[i]),
-                               &value))
+        if (aps.setAtomProperty(epropVDW,
+                                *(atoms->resinfo[resnr].name),
+                                *(atoms->atomname[i]),
+                                &value))
         {
             vdw_radius_.push_back(value);
             if (value > cutoff_)
@@ -281,7 +281,6 @@ FreeVolume::initAnalysis(const TrajectoryAnalysisSettings &settings,
             vdw_radius_.push_back(0.0);
         }
     }
-    gmx_atomprop_destroy(aps);
 
     // Increase cutoff by proberadius to make sure we do not miss
     // anything
index a33148e5901e14f9d975e009e431c84d96535f01..c10b32b648b9af5e4c4abbfe269926da5eedc630 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2006, The GROMACS development team.
- * Copyright (c) 2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019, 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.
@@ -564,7 +564,7 @@ Sasa::initAnalysis(const TrajectoryAnalysisSettings &settings,
 
     // TODO: Not exception-safe, but nice solution would be to have a C++
     // atom properties class...
-    gmx_atomprop_t      aps = gmx_atomprop_init();
+    AtomProperties      aps;
 
     ArrayRef<const int> atomIndices = surfaceSel_.atomIndices();
     int                 ndefault    = 0;
@@ -573,9 +573,9 @@ Sasa::initAnalysis(const TrajectoryAnalysisSettings &settings,
         const int ii     = atomIndices[i];
         const int resind = atoms_->atom[ii].resind;
         real      radius;
-        if (!gmx_atomprop_query(aps, epropVDW,
-                                *(atoms_->resinfo[resind].name),
-                                *(atoms_->atomname[ii]), &radius))
+        if (!aps.setAtomProperty(epropVDW,
+                                 *(atoms_->resinfo[resind].name),
+                                 *(atoms_->atomname[ii]), &radius))
         {
             ndefault++;
         }
@@ -583,9 +583,9 @@ Sasa::initAnalysis(const TrajectoryAnalysisSettings &settings,
         if (bDGsol)
         {
             real dgsFactor;
-            if (!gmx_atomprop_query(aps, epropDGsol,
-                                    *(atoms_->resinfo[resind].name),
-                                    *(atoms_->atomtype[ii]), &dgsFactor))
+            if (!aps.setAtomProperty(epropDGsol,
+                                     *(atoms_->resinfo[resind].name),
+                                     *(atoms_->atomtype[ii]), &dgsFactor))
             {
                 dgsFactor = dgsDefault_;
             }
@@ -596,7 +596,6 @@ Sasa::initAnalysis(const TrajectoryAnalysisSettings &settings,
     {
         fprintf(stderr, "WARNING: could not find a Van der Waals radius for %d atoms\n", ndefault);
     }
-    gmx_atomprop_destroy(aps);
 
     // Pre-compute mapping from the output groups to the calculation group,
     // and store it in the selection ID map for easy lookup.
index 917e7c1741aac9a889d896dbfd32cd62a18c8954..f7a292e649ae45c2871808fdff958a54eee87f49 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2018, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019, 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.
@@ -107,7 +107,8 @@ const gmx_localtop_t *TopologyInformation::expandedTopology() const
     // Do lazy initialization
     if (expandedTopology_ == nullptr && hasTopology())
     {
-        expandedTopology_.reset(gmx_mtop_generate_local_top(mtop_.get(), false));
+        expandedTopology_ = gmx::compat::make_unique<gmx_localtop_t>();
+        gmx_mtop_generate_local_top(*mtop_, expandedTopology_.get(), false);
     }
 
     return expandedTopology_.get();
similarity index 93%
rename from src/gromacs/utility/variant.cpp
rename to src/gromacs/utility/any.cpp
index 05c3ff59d822588dddc37325bf00b65df3d1c73e..39b82eaa3fa6a84fe5165ccbf63ef7abf7ad88be 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2017,2018,2019, 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.
  */
 /*! \internal \file
  * \brief
- * Implements functionality from variant.h.
+ * Implements functionality from any.h.
  *
  * \author Teemu Murtola <teemu.murtola@gmail.com>
  * \ingroup module_utility
  */
 #include "gmxpre.h"
 
-#include "variant.h"
+#include "any.h"
 
 #include <string>
 
@@ -52,7 +52,7 @@ namespace gmx
 {
 
 //! \cond libapi
-std::string simpleValueToString(const Variant &value)
+std::string simpleValueToString(const Any &value)
 {
     if (value.isType<bool>())
     {
similarity index 81%
rename from src/gromacs/utility/variant.h
rename to src/gromacs/utility/any.h
index 5cd738bcdab972be71b9b20fb1c63548f9192a1c..05ece95265f890771a6b7f7769f7d48aa9911361 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2018,2019, 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.
  */
 /*! \libinternal \file
  * \brief
- * Declares gmx::Variant.
+ * Declares gmx::Any.
  *
  * \author Teemu Murtola <teemu.murtola@gmail.com>
  * \inlibraryapi
  * \ingroup module_utility
  */
-#ifndef GMX_UTILITY_VARIANT_H
-#define GMX_UTILITY_VARIANT_H
+#ifndef GMX_UTILITY_ANY_H
+#define GMX_UTILITY_ANY_H
 
 #include <memory>
 #include <string>
@@ -59,11 +59,11 @@ namespace gmx
 /*! \libinternal \brief
  * Represents a dynamically typed value of an arbitrary type.
  *
- * To create a variant, either initialize it as empty, or with the create()
+ * To create a any, either initialize it as empty, or with the create()
  * method (or the equivalent constructor, if the type parameter can be deduced
  * and is clear to the reader from the context).
  *
- * To query the type of the contents in the variant, use isEmpty(), type(), and
+ * To query the type of the contents in the any, use isEmpty(), type(), and
  * isType().
  *
  * To access the value, you need to know the type as a compile-time constant
@@ -76,11 +76,11 @@ namespace gmx
  *
  * \ingroup module_utility
  */
-class Variant
+class Any
 {
     public:
         /*! \brief
-         * Creates a variant that holds the given value.
+         * Creates a any that holds the given value.
          *
          * \throws std::bad_alloc if out of memory.
          *
@@ -88,9 +88,9 @@ class Variant
          * contrary to the templated constructor.
          */
         template <typename T>
-        static Variant create(const T &value) { return Variant(value); }
+        static Any create(const T &value) { return Any(value); }
         /*! \brief
-         * Creates a variant that holds the given value.
+         * Creates a any that holds the given value.
          *
          * \throws std::bad_alloc if out of memory.
          *
@@ -98,40 +98,40 @@ class Variant
          * method avoids copying when move-construction is possible.
          */
         template <typename T>
-        static Variant create(T &&value) { return Variant(std::forward<T>(value)); }
+        static Any create(T &&value) { return Any(std::forward<T>(value)); }
 
-        //! Creates an empty variant value.
-        Variant() {}
+        //! Creates an empty any value.
+        Any() {}
         /*! \brief
-         * Creates a variant that holds the given value.
+         * Creates a any that holds the given value.
          *
          * \throws std::bad_alloc if out of memory.
          */
-        template <typename T, typename = typename std::enable_if<!std::is_same<T, Variant>::value>::type>
-        explicit Variant(T &&value)
+        template <typename T, typename = typename std::enable_if<!std::is_same<T, Any>::value>::type>
+        explicit Any(T &&value)
             : content_(new Content<typename std::decay<T>::type>(std::forward<T>(value)))
         {
         }
         /*! \brief
-         * Creates a deep copy of a variant.
+         * Creates a deep copy of a any.
          *
          * \throws std::bad_alloc if out of memory.
          */
-        Variant(const Variant &other) : content_(other.cloneContent()) {}
-        //! Move-constructs a variant.
-        Variant(Variant &&other) noexcept : content_(std::move(other.content_)) {}
+        Any(const Any &other) : content_(other.cloneContent()) {}
+        //! Move-constructs a any.
+        Any(Any &&other) noexcept : content_(std::move(other.content_)) {}
         /*! \brief
-         * Assigns the variant.
+         * Assigns the any.
          *
          * \throws std::bad_alloc if out of memory.
          */
-        Variant &operator=(const Variant &other)
+        Any &operator=(const Any &other)
         {
             content_ = other.cloneContent();
             return *this;
         }
-        //! Move-assigns the variant.
-        Variant &operator=(Variant &&other) noexcept
+        //! Move-assigns the any.
+        Any &operator=(Any &&other) noexcept
         {
             content_ = std::move(other.content_);
             return *this;
@@ -168,9 +168,9 @@ class Variant
         /*! \brief
          * Gets the value when the type is known.
          *
-         * \tparam T  Type to get (which must match what the variant stores).
+         * \tparam T  Type to get (which must match what the any stores).
          *
-         * Asserts if the variant is empty or does not contain the requested type.
+         * Asserts if the any is empty or does not contain the requested type.
          */
         template <typename T>
         const T &cast() const
@@ -197,9 +197,9 @@ class Variant
         /*! \brief
          * Gets the value when the type is known as a modifiable reference.
          *
-         * \tparam T  Type to get (which must match what the variant stores).
+         * \tparam T  Type to get (which must match what the any stores).
          *
-         * Asserts if the variant is empty or does not contain the requested type.
+         * Asserts if the any is empty or does not contain the requested type.
          */
         template <typename T>
         T &castRef()
@@ -242,14 +242,14 @@ class Variant
 
 //! \cond libapi
 /*! \brief
- * Converts a Variant value to a string.
+ * Converts a Any value to a string.
  *
  * As the name suggests, only some types of "simple" values (such as int) are
  * supported.  Asserts for unsupported types.
  *
  * \ingroup module_utility
  */
-std::string simpleValueToString(const Variant &value);
+std::string simpleValueToString(const Any &value);
 //! \endcond
 
 } // namespace gmx
index e331c0f8811e50f543d5e542c1240c57a8116a45..21fc96e7ac9c1779bcc80d67a61e4599629278f0 100644 (file)
@@ -814,6 +814,7 @@ std::string getCoolQuote()
         { "Why would the backup server database get corrupted anyway?", "Stefan Fleischmann -- system administrator, physicist, optimist." },
         { "Teaching quantum computing is like teaching computer science at Hogwarts.", "Thomas Sterling, ISC2018 keynote" },
         { "It is unfortunate that the authors did not make better use of all the electric power energy that went into these massive computations.", "An anonymous referee" },
+        { "Doctor, doctor, it hurts when I hit myself in the head with the hammer! - So don't do it!", "Bjarne Stroustrup at CppCon2015" },
         { "This is extremely unlikely.", "Berk Hess" },
         { "Nothing is more anarchic than power.", "Pier Paolo Pasolini" },
     };
diff --git a/src/gromacs/utility/defaultinitializationallocator.h b/src/gromacs/utility/defaultinitializationallocator.h
new file mode 100644 (file)
index 0000000..a9e8ac2
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2019, 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.
+ */
+/*! \libinternal \file
+ * \brief Declares an allocator that can use default initialization instead
+ * of values initialization. This is useful for improving performance of
+ * resize() in standard vectors for buffers in performance critical code.
+ *
+ * \author Berk Hess <hess@kth.se>
+ * \inlibraryapi
+ * \ingroup module_utility
+ */
+#ifndef GMX_UTILITY_DEFAULTINITIALIZATIONALLOCATOR_H
+#define GMX_UTILITY_DEFAULTINITIALIZATIONALLOCATOR_H
+
+#include <memory>
+
+namespace gmx
+{
+
+/*! \libinternal \brief Allocator adaptor that interposes construct() calls to
+ * convert value initialization into default initialization.
+ *
+ * This can be used to avoid initialization e.g. on resize() in std::vector.
+ */
+template <typename T, typename A = std::allocator<T> >
+class DefaultInitializationAllocator : public A
+{
+    typedef std::allocator_traits<A> a_t;
+    public:
+        template <typename U> struct rebind {
+            using other =
+                    DefaultInitializationAllocator < U, typename a_t::template rebind_alloc < U>>;
+        };
+
+        using A::A;
+
+        /*! \brief Constructs an object and default initializes */
+        template <typename U>
+        void construct(U* ptr)
+        noexcept(std::is_nothrow_default_constructible<U>::value) {
+            ::new(static_cast<void*>(ptr))U;
+        }
+
+        /*! \brief Constructs an object and value initializes */
+        template <typename U, typename ... Args>
+        void construct(U* ptr, Args && ... args)
+        {
+            a_t::construct(static_cast<A &>(*this),
+                           ptr, std::forward<Args>(args) ...);
+        }
+};
+
+}      // namespace gmx
+
+#endif // GMX_UTILITY_DEFAULTINITIALIZATIONALLOCATOR_H
diff --git a/src/gromacs/utility/enumerationhelpers.h b/src/gromacs/utility/enumerationhelpers.h
new file mode 100644 (file)
index 0000000..0bfcabc
--- /dev/null
@@ -0,0 +1,278 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2019, 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.
+ */
+/*! \libinternal
+ * \file
+ * \brief Defines helper types for class enumerations.
+ *
+ * These helper types facilitate iterating over class enums, and
+ * maintaining a type-safe and value-safe matching list of names. The
+ * code is closely based on the public-domain code by Guilherme
+ * R. Lampert, found in commit c94c18a of
+ * https://github.com/glampert/enum_helpers/blob/master/enum_helpers.hpp
+ * Thanks Guilherme!
+ *
+ * NOTE This functionality only works for enumerations of monotonically
+ * increasing values, starting with the value zero.
+ *
+ * Usage example:
+ *
+ *  enum class Foo
+ *  {
+ *      Bar, Baz, Fooz,
+ *      Count
+ *  };
+ *
+ *  EnumerationWrapper<Foo> iter;
+ *
+ *  for (Foo c : iter)
+ *  {
+ *      'c' is a constant from Foo
+ *  }
+ *
+ *  const EnumerationArray<Foo, std::string> FooStrings = { { "Bar", "Baz", "Fooz" } };
+ *
+ *  print(FooStrings[Foo::Bar]);
+ *  print(FooStrings[Foo::Baz]);
+ *  ...
+ *
+ * \author Mark Abraham <mark.j.abraham@gmail.com>
+ * \inlibraryapi
+ * \ingroup module_utility
+ */
+#ifndef GMX_UTILITY_ENUMHELPERS_H
+#define GMX_UTILITY_ENUMHELPERS_H
+
+#include <cstddef>
+
+#include <iterator>
+#include <type_traits>
+
+#include "gromacs/utility/gmxassert.h"
+
+namespace gmx
+{
+
+/*! \libinternal
+ * \brief Allows iterating sequential enumerators.
+ *
+ * You can also provide an increment step > 1 if each constant is
+ * spaced by a larger value.  Terminating constant is assumed to be a
+ * 'Count' member, which is never iterated. A different name for the
+ * terminating constant can also be specified on declaration.
+ *
+ * NOTE This functionality only works for enumerations of monotonically
+ * increasing values, starting with the value zero.
+ *
+ * See file documentation for usage example.
+ *
+ * \tparam  EnumType   The enum (class) type.
+ * \tparam  Last       Last constant or number thereof (assumes a default 'Count' member).
+ * \tparam  Step       Step increment.
+ */
+template
+<
+    typename EnumType,
+    EnumType Last     = EnumType::Count,
+    unsigned int Step = 1
+>
+class EnumerationIterator final
+    : public              std::iterator<std::forward_iterator_tag, EnumType>
+{
+    public:
+        //! Convenience alias
+        using IntegerType = typename std::underlying_type<EnumType>::type;
+
+        constexpr EnumerationIterator() noexcept :
+        m_current { 0 } // Assumes 0 is the first constant
+        { }
+        //! Copy constructor
+        constexpr EnumerationIterator(const EnumType index) noexcept
+        : m_current(static_cast<IntegerType>(index))
+        { }
+        //! Pre-increment operator
+        EnumerationIterator operator++()
+        {
+            m_current += Step;
+            return *this;
+        }
+        //! Post-increment operator
+        EnumerationIterator operator++(int)
+        {
+            EnumerationIterator old_val { *this };
+            m_current += Step;
+            return old_val;
+        }
+        //! Dereference operator
+        EnumType operator*() const
+        {
+            GMX_ASSERT(m_current < static_cast<IntegerType>(Last), "dereferencing out of range");
+            return static_cast<EnumType>(m_current);
+        }
+
+        /*!@{*/
+        //! Comparision operators
+        bool operator== (const EnumerationIterator other) const noexcept { return m_current == other.m_current; }
+        bool operator!= (const EnumerationIterator other) const noexcept { return m_current != other.m_current; }
+        bool operator<  (const EnumerationIterator other) const noexcept { return m_current <  other.m_current; }
+        bool operator>  (const EnumerationIterator other) const noexcept { return m_current >  other.m_current; }
+        bool operator<= (const EnumerationIterator other) const noexcept { return m_current <= other.m_current; }
+        bool operator>= (const EnumerationIterator other) const noexcept { return m_current >= other.m_current; }
+        /*!@}*/
+
+    private:
+        IntegerType m_current;
+};
+
+/*! \libinternal
+ * \brief Allows constructing iterators for looping over sequential enumerators.
+ *
+ * These are particularly useful for range-based for statements.
+ *
+ * You can also provide an increment step > 1 if each constant is
+ * spaced by a larger value.  Terminating constant is assumed to be a
+ * 'Count' member, which is never iterated. A different name for the
+ * terminating constant can also be specified on declaration.
+ *
+ * See file documentation for usage example.
+ *
+ * \tparam  EnumType   The enum (class) type.
+ * \tparam  Last       Last constant or number thereof (assumes a default 'Count' member).
+ * \tparam  Step       Step increment.
+ */
+template
+<
+    typename EnumType,
+    EnumType Last     = EnumType::Count,
+    unsigned int Step = 1
+>
+class EnumerationWrapper final
+{
+    public:
+        //! Convenience alias.
+        using IteratorType = EnumerationIterator<EnumType, Last, Step>;
+
+        //! Functions required for range-based for statements to work.
+        /*!@{*/
+        IteratorType begin() const { return IteratorType {}; }
+        IteratorType end()   const { return IteratorType { Last }; }
+        /*!@}*/
+};
+
+/*! \libinternal
+ * \brief Wrapper for a C-style array with size and indexing defined
+ * by an enum. Useful for declaring arrays of enum names for debug
+ * or other printing.
+ *
+ * See file documentation for usage example.
+ *
+ * \tparam  EnumType   The enum (class) type.
+ * \tparam  DataType   Type of the data stored in the array.
+ * \tparam  ArraySize  Size in entries of the array.
+ */
+template
+<
+    typename EnumType,                   // The enum (class) type.
+    typename DataType,                   // Type of the data stored in the array.
+    EnumType ArraySize = EnumType::Count // Size in entries of the array.
+>
+struct EnumerationArray final
+{
+    //! Convenience alias
+    using EnumerationWrapperType = EnumerationWrapper<EnumType, ArraySize>;
+
+    /*! \brief Data for names.
+     *
+     * Data is kept public so we can use direct aggregate
+     * initialization just like in a plain C-style array. */
+    DataType m_elements[std::size_t(ArraySize)];
+
+    //! Returns an object that provides iterators over the keys.
+    static constexpr EnumerationWrapperType keys() { return EnumerationWrapperType {}; }
+    //! Returns the size of the enumeration.
+    static constexpr std::size_t size() { return std::size_t(ArraySize); }
+
+    /*!@{*/
+    //! Array access with asserts:
+    DataType &operator[](const std::size_t index)
+    {
+        GMX_ASSERT(index < size(), "index out of range");
+        return m_elements[index];
+    }
+    const DataType &operator[](const std::size_t index) const
+    {
+        GMX_ASSERT(index < size(), "index out of range");
+        return m_elements[index];
+    }
+
+    DataType &operator[](const EnumType index)
+    {
+        GMX_ASSERT(std::size_t(index) < size(), "index out of range");
+        return m_elements[std::size_t(index)];
+    }
+    const DataType &operator[](const EnumType index) const
+    {
+        GMX_ASSERT(std::size_t(index) < size(), "index out of range");
+        return m_elements[std::size_t(index)];
+    }
+    /*!@}*/
+
+    /*!@{*/
+    //! Range iterators (unchecked)
+    using iterator               = DataType *;
+    using const_iterator         = const DataType *;
+    using reverse_iterator       = std::reverse_iterator<iterator>;
+    using const_reverse_iterator = std::reverse_iterator<const_iterator>;
+    /*!@}*/
+
+    /*!@{*/
+    //! Getters for forward iterators for ranges
+    iterator               begin()        { return &m_elements[0];      }
+    iterator               end()          { return &m_elements[size()]; }
+    const_iterator         begin()  const { return &m_elements[0];      }
+    const_iterator         end()    const { return &m_elements[size()]; }
+    /*!@}*/
+
+    /*!@{*/
+    //! Getters for reverse iterators for ranges
+    reverse_iterator       rbegin()       { return reverse_iterator { end() }; }
+    reverse_iterator       rend()         { return reverse_iterator { begin() }; }
+    const_reverse_iterator rbegin() const { return const_reverse_iterator { end() }; }
+    const_reverse_iterator rend()   const { return const_reverse_iterator { begin() }; }
+    /*!@}*/
+};
+
+} // namespace gmx
+
+#endif
index 293289d663ab49777fff640f98a546b457f269f0..0ce225ea75539b6a321aae3a5d5afd7cd47883ad 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2018,2019, 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.
@@ -71,8 +71,8 @@
 #include <utility>
 #include <vector>
 
+#include "gromacs/utility/any.h"
 #include "gromacs/utility/real.h"
-#include "gromacs/utility/variant.h"
 
 namespace gmx
 {
@@ -184,13 +184,13 @@ class KeyValueTreeValue
         template <typename T>
         const T                  &cast() const { return value_.cast<T>(); }
 
-        //! Returns the raw Variant value (always possible).
-        const Variant            &asVariant() const { return value_; }
+        //! Returns the raw Any value (always possible).
+        const Any            &asAny() const { return value_; }
 
     private:
-        explicit KeyValueTreeValue(Variant &&value) : value_(std::move(value)) {}
+        explicit KeyValueTreeValue(Any &&value) : value_(std::move(value)) {}
 
-        Variant             value_;
+        Any             value_;
 
         friend class KeyValueTreeBuilder;
         friend class KeyValueTreeObjectBuilder;
@@ -350,7 +350,7 @@ void compareKeyValueTrees(TextWriter               *writer,
 static inline std::string
 simpleValueToString(const KeyValueTreeValue &value)
 {
-    return simpleValueToString(value.asVariant());
+    return simpleValueToString(value.asAny());
 }
 
 //! \endcond
index 145f4935d266c6af4faa407c8781e8eeabb5c619..d5c16dce8591a2f4b0901361528956758a834af2 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2016,2017, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2019, 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.
@@ -56,9 +56,9 @@
 #include <utility>
 #include <vector>
 
+#include "gromacs/utility/any.h"
 #include "gromacs/utility/gmxassert.h"
 #include "gromacs/utility/keyvaluetree.h"
-#include "gromacs/utility/variant.h"
 
 namespace gmx
 {
@@ -92,7 +92,7 @@ class KeyValueTreeBuilder
         template <typename T>
         static KeyValueTreeValue createValue(const T &value)
         {
-            return KeyValueTreeValue(Variant::create<T>(value));
+            return KeyValueTreeValue(Any::create<T>(value));
         }
         /*! \brief
          * Helper function for other builders to create default-constructed
@@ -101,7 +101,7 @@ class KeyValueTreeBuilder
         template <typename T>
         static KeyValueTreeValue createValue()
         {
-            return KeyValueTreeValue(Variant::create<T>(T()));
+            return KeyValueTreeValue(Any::create<T>(T()));
         }
 
         KeyValueTreeObject root_;
@@ -131,10 +131,10 @@ class KeyValueTreeValueBuilder
         template <typename T>
         void setValue(const T &value)
         {
-            value_ = Variant::create<T>(value);
+            value_ = Any::create<T>(value);
         }
-        //! Assigns a Variant value to the built value.
-        void setVariantValue(Variant &&value)
+        //! Assigns a Any value to the built value.
+        void setAnyValue(Any &&value)
         {
             value_ = std::move(value);
         }
@@ -161,7 +161,7 @@ class KeyValueTreeValueBuilder
         KeyValueTreeValue build() { return KeyValueTreeValue(std::move(value_)); }
 
     private:
-        Variant value_;
+        Any value_;
 };
 
 class KeyValueTreeArrayBuilderBase
@@ -173,11 +173,11 @@ class KeyValueTreeArrayBuilderBase
         {
         }
 
-        //! Appends a raw Variant value to the array.
-        KeyValueTreeValue &addRawValue(Variant &&value)
+        //! Appends a raw Any value to the array.
+        KeyValueTreeValue &addRawValue(Any &&value)
         {
             KeyValueTreeValueBuilder builder;
-            builder.setVariantValue(std::move(value));
+            builder.setAnyValue(std::move(value));
             array_->values_.push_back(builder.build());
             return array_->values_.back();
         }
@@ -285,8 +285,8 @@ class KeyValueTreeObjectBuilder
         {
             addProperty(key, std::move(value));
         }
-        //! Adds a property with given key from a Variant value.
-        void addRawValue(const std::string &key, Variant &&value)
+        //! Adds a property with given key from a Any value.
+        void addRawValue(const std::string &key, Any &&value)
         {
             addProperty(key, KeyValueTreeValue(std::move(value)));
         }
@@ -439,13 +439,13 @@ inline KeyValueTreeObjectBuilder KeyValueTreeBuilder::rootObject()
 
 inline KeyValueTreeObjectBuilder KeyValueTreeValueBuilder::createObject()
 {
-    value_ = Variant::create<KeyValueTreeObject>(KeyValueTreeObject());
+    value_ = Any::create<KeyValueTreeObject>(KeyValueTreeObject());
     return KeyValueTreeObjectBuilder(&value_.castRef<KeyValueTreeObject>());
 }
 
 inline KeyValueTreeArrayBuilder KeyValueTreeValueBuilder::createArray()
 {
-    value_ = Variant::create<KeyValueTreeArray>(KeyValueTreeArray());
+    value_ = Any::create<KeyValueTreeArray>(KeyValueTreeArray());
     return KeyValueTreeArrayBuilder(&value_.castRef<KeyValueTreeArray>());
 }
 
index d183901634618f5aae763137fc8381c24ed8b8f3..ff884942f6461cd6ccfaa81d9e345d4c85986ecc 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2018,2019, 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.
@@ -565,24 +565,24 @@ void KeyValueTreeTransformRuleBuilder::setKeyMatchType(StringCompareType keyMatc
     data_->keyMatchRule_ = true;
 }
 
-void KeyValueTreeTransformRuleBuilder::addTransformToVariant(
-        const std::function<Variant(const Variant &)> &transform)
+void KeyValueTreeTransformRuleBuilder::addTransformToAny(
+        const std::function<Any(const Any &)> &transform)
 {
     data_->transform_ =
         [transform] (KeyValueTreeValueBuilder *builder, const KeyValueTreeValue &value)
         {
-            builder->setVariantValue(transform(value.asVariant()));
+            builder->setAnyValue(transform(value.asAny()));
         };
 }
 
 void KeyValueTreeTransformRuleBuilder::addTransformToObject(
-        const std::function<void(KeyValueTreeObjectBuilder *, const Variant &)> &transform)
+        const std::function<void(KeyValueTreeObjectBuilder *, const Any &)> &transform)
 {
     data_->transform_ =
         [transform] (KeyValueTreeValueBuilder *builder, const KeyValueTreeValue &value)
         {
             KeyValueTreeObjectBuilder obj = builder->createObject();
-            transform(&obj, value.asVariant());
+            transform(&obj, value.asAny());
         };
 }
 
index b40cd161824414bcc74cb24793d6e66abc5a81c3..577c147db054a13db3d764f5d3149ddfb11bd288 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2018,2019, 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.
@@ -50,9 +50,9 @@
 #include <typeindex>
 #include <vector>
 
+#include "gromacs/utility/any.h"
 #include "gromacs/utility/classhelpers.h"
 #include "gromacs/utility/keyvaluetree.h"
-#include "gromacs/utility/variant.h"
 
 namespace gmx
 {
@@ -201,10 +201,10 @@ class KeyValueTreeTransformRuleBuilder
                  */
                 void transformWith(std::function<ToType(const FromType &)> transform)
                 {
-                    builder_->addTransformToVariant(
-                            [transform] (const Variant &value)
+                    builder_->addTransformToAny(
+                            [transform] (const Any &value)
                             {
-                                return Variant::create<ToType>(transform(value.cast<FromType>()));
+                                return Any::create<ToType>(transform(value.cast<FromType>()));
                             });
                 }
         };
@@ -234,7 +234,7 @@ class KeyValueTreeTransformRuleBuilder
                 void transformWith(std::function<void(KeyValueTreeObjectBuilder *, const FromType &)> transform)
                 {
                     builder_->addTransformToObject(
-                            [transform] (KeyValueTreeObjectBuilder *builder, const Variant &value)
+                            [transform] (KeyValueTreeObjectBuilder *builder, const Any &value)
                             {
                                 transform(builder, value.cast<FromType>());
                             });
@@ -346,8 +346,8 @@ class KeyValueTreeTransformRuleBuilder
         void setExpectedType(const std::type_index &type);
         void setToPath(const KeyValueTreePath &path);
         void setKeyMatchType(StringCompareType keyMatchType);
-        void addTransformToVariant(const std::function<Variant(const Variant &)> &transform);
-        void addTransformToObject(const std::function<void(KeyValueTreeObjectBuilder *, const Variant &)> &transform);
+        void addTransformToAny(const std::function<Any(const Any &)> &transform);
+        void addTransformToObject(const std::function<void(KeyValueTreeObjectBuilder *, const Any &)> &transform);
 
         class Data;
 
index 232c4c44a0d489f23ccdf8d612f448226a9b5b6b..783055c48a49fbf2a8c5ad208f9eb0af097f69af 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -44,6 +44,7 @@
 #include "gromacs/utility/baseversion.h"
 #include "gromacs/utility/cstringutil.h"
 #include "gromacs/utility/smalloc.h"
+#include "gromacs/utility/stringutil.h"
 
 typedef struct {
     const char *key;
@@ -212,11 +213,6 @@ void please_cite(FILE *fp, const char *key)
           "Flexible constraints: an adiabatic treatment of quantum degrees of freedom, with application to the flexible and polarizable MCDHO model for water",
           "J. Chem. Phys.",
           116, 2002, "9602-9610" },
-        { "Hetenyi2002b",
-          "Csaba Hetenyi and David van der Spoel",
-          "Efficient docking of peptides to proteins without prior knowledge of the binding site.",
-          "Prot. Sci.",
-          11, 2002, "1729-1737" },
         { "Hess2003",
           "B. Hess and R.M. Scheek",
           "Orientation restraints in molecular dynamics simulations using time and ensemble averaging",
@@ -438,15 +434,17 @@ writeSourceDoi(FILE *fp)
         /* Not a release build, return without printing anything */
         return;
     }
-
-    const char *doiString = wrap_lines(gmxDOI(), LINE_WIDTH, 0, FALSE);
+    gmx::TextLineWrapper wrapper;
+    wrapper.settings().setLineLength(LINE_WIDTH);
+    wrapper.settings().setFirstLineIndent(0);
+    const std::string doiString = wrapper.wrapToString(gmxDOI());
 
     if (fp == nullptr)
     {
         return;
     }
     fprintf(fp, "\n++++ PLEASE CITE THE DOI FOR THIS VERSION OF GROMACS ++++\n");
-    fprintf(fp, "%s%s\n", "https://doi.org/", doiString);
+    fprintf(fp, "%s%s\n", "https://doi.org/", doiString.c_str());
     fprintf(fp, "-------- -------- --- Thank You --- -------- --------\n\n");
     fflush(fp);
 }
index 70196a130e02840ccccc80629179be98fb3e32a1..42d2981859b28d02d3a5221e9a8decdefac509ed 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2011,2012,2013,2014,2015,2016,2017,2018,2019, 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.
@@ -314,6 +314,13 @@ replaceAllWords(const std::string &input, const std::string &from,
     return replaceInternal(input, from.c_str(), to.c_str(), true);
 }
 
+bool equalCaseInsensitive(const std::string &source, const std::string &target)
+{
+    return source.length() == target.length() &&
+           std::equal(source.begin(), source.end(), target.begin(),
+                      [](const char &s, const char &t)
+                      { return std::tolower(s) == std::tolower(t); });
+}
 
 /********************************************************************
  * TextLineWrapperSettings
index b3cca7e3e3c899575cb74d290048672e874823c2..6c83fc07241cd6c40208e53498d0c45af562ad6d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2011,2012,2013,2014,2015,2016,2017,2018,2019, 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.
@@ -430,6 +430,19 @@ std::string replaceAllWords(const std::string &input,
 std::string replaceAllWords(const std::string &input,
                             const std::string &from, const std::string &to);
 
+/*! \brief Return whether two strings are equal, ignoring case.
+ *
+ * Checks if two strings have the same length and if all characters
+ * in them match when compared case insensitive.
+ * Characters are converted by using std::tolower.
+ *
+ * \param[in] source Search string to compare against \p target.
+ * \param[in] target String to be matched to \p source.
+ * \returns True if the strings match.
+ */
+bool equalCaseInsensitive(const std::string &source,
+                          const std::string &target);
+
 class TextLineWrapper;
 
 /*! \brief
index 6697980f4592d3562b2b3a82fe642e5067acdccb..c88bf29fcea871c7b5d34440c6db9f47efd55411 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+# Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, 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.
@@ -36,6 +36,8 @@ gmx_add_unit_test(UtilityUnitTests utility-test
                   alignedallocator.cpp
                   arrayref.cpp
                   bitmask32.cpp bitmask64.cpp bitmask128.cpp
+                  defaultinitializationallocator.cpp
+                  enumerationhelpers.cpp
                   keyvaluetreeserializer.cpp
                   keyvaluetreetransform.cpp
                   gmxregex.cpp
diff --git a/src/gromacs/utility/tests/defaultinitializationallocator.cpp b/src/gromacs/utility/tests/defaultinitializationallocator.cpp
new file mode 100644 (file)
index 0000000..1b517f1
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2019, 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 Tests for gmx::DefaultInitializationAllocator used in std::vector
+ *
+ * \author Berk Hess <hess@kth.se>
+ * \ingroup module_utility
+ */
+
+#include "gmxpre.h"
+
+#include "gromacs/utility/defaultinitializationallocator.h"
+
+#include <gtest/gtest.h>
+
+#include "gromacs/utility/gmxassert.h"
+
+
+namespace gmx
+{
+namespace test
+{
+namespace
+{
+
+TEST(DefaultInitializationAllocator, PerformsValueInitialization)
+{
+    std::vector < int, DefaultInitializationAllocator < int>> v;
+
+    v.resize(1, 2);
+    EXPECT_EQ(v[0], 2);
+}
+
+TEST(DefaultInitializationAllocator, PerformsNoInitialization)
+{
+    std::vector < int, DefaultInitializationAllocator < int>> v {
+        1, 2, 3
+    };
+
+    const int *oldData = v.data();
+    v.resize(0);
+    v.resize(3);
+    GMX_RELEASE_ASSERT(v.data() == oldData,
+                       "According to the C++ standard std::vector will not reallocate when the capacity is sufficient");
+    // The allocation is the same, so the default initialization should
+    // not have changed the contents
+    EXPECT_EQ(v[0], 1);
+    EXPECT_EQ(v[1], 2);
+    EXPECT_EQ(v[2], 3);
+}
+
+} // namespace
+} // namespace test
+} // namespace gmx
diff --git a/src/gromacs/utility/tests/enumerationhelpers.cpp b/src/gromacs/utility/tests/enumerationhelpers.cpp
new file mode 100644 (file)
index 0000000..f819266
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2019, 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 Tests for enumeration helpers
+ *
+ * \author Mark Abraham <mark.j.abraham@gmail.com>
+ * \ingroup module_utility
+ */
+#include "gmxpre.h"
+
+#include "gromacs/utility/enumerationhelpers.h"
+
+#include <iostream>
+
+#include <gtest/gtest.h>
+
+namespace gmx
+{
+namespace
+{
+
+//! Type to use in testing
+enum class Foo
+{
+    Bar, Baz, Fooz,
+    Count
+};
+
+TEST(EnumerationHelpersTest, EnumerationWrapperWorks)
+{
+    EnumerationWrapper<Foo> iter;
+
+    // Range-based for works
+    int i = 0;
+    for (Foo c : iter)
+    {
+        EXPECT_EQ(static_cast<int>(c), i++);
+    }
+
+    // Normal iterators work
+    i = 0;
+    for (auto c = iter.begin(); c != iter.end(); ++c)
+    {
+        EXPECT_EQ(static_cast<int>(*c), i++);
+    }
+
+    auto a = std::begin(iter);
+    auto b = std::begin(iter);
+
+    ASSERT_EQ(a, b);
+    ASSERT_EQ(*(a++), Foo::Bar);
+    ASSERT_EQ(*(++b), Foo::Baz);
+}
+
+TEST(EnumerationHelpersTest, EnumerationArrayWorks)
+{
+    using FooArray = EnumerationArray<Foo, std::string>;
+    const FooArray FooStrings { {
+                                    "Bar", "Baz", "Fooz"
+                                } };
+
+    // Keys give you the constants associated with each array index.
+    int i = 0;
+    for (auto k : FooArray::keys())
+    {
+        EXPECT_EQ(static_cast<int>(k), i++);
+    }
+
+    // Using iterators and operator[] gives the array values.
+    i = 0;
+    for (const auto &s : FooStrings)
+    {
+        EXPECT_EQ(s, FooStrings[i++]);
+    }
+
+    // Using reverse iterators gives the array values.
+    i = 2;
+    for (auto s = FooStrings.rbegin(); s != FooStrings.rend(); ++s)
+    {
+        EXPECT_EQ((*s), FooStrings[i--]);
+    }
+
+    // Incrementing iterators works
+    auto x = std::begin(FooStrings);
+    EXPECT_EQ(*x, "Bar");
+    ++x;
+    EXPECT_EQ(*x, "Baz");
+    ++x;
+    EXPECT_EQ(*x, "Fooz");
+
+    // Operator[] can be used with enumeration values.
+    EXPECT_EQ(FooStrings[Foo::Bar], "Bar");
+    EXPECT_EQ(FooStrings[Foo::Baz], "Baz");
+    EXPECT_EQ(FooStrings[Foo::Fooz], "Fooz");
+}
+
+} // namespace
+} // namespace gmx
index d56eb87a25503404f17f3cbe7b754fbbcf57290b..b1fe546037485bf70778ade3bcfe09bca4fddae1 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2018, by the GROMACS development team, led by
+# Copyright (c) 2010,2011,2012,2013,2014,2015,2016,2018,2019, 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.
@@ -50,8 +50,7 @@ elseif(GMX_BUILD_MDRUN_ONLY)
         ${GMX_STDLIB_LIBRARIES})
     set(BINARY_NAME "mdrun${GMX_BINARY_SUFFIX}")
     set_target_properties(mdrun PROPERTIES
-        OUTPUT_NAME "${BINARY_NAME}"
-        COMPILE_FLAGS "${OpenMP_C_FLAGS}")
+        OUTPUT_NAME "${BINARY_NAME}")
     install(TARGETS mdrun DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT mdrun)
     file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/gmx-completion-${BINARY_NAME}.bash
          "complete -o nospace -F _gmx_mdrun_compl ${BINARY_NAME}")
@@ -78,8 +77,7 @@ else()
     endif()
     set(BINARY_NAME "gmx${GMX_BINARY_SUFFIX}")
     set_target_properties(gmx PROPERTIES
-        OUTPUT_NAME "${BINARY_NAME}"
-        COMPILE_FLAGS "${OpenMP_C_FLAGS}")
+        OUTPUT_NAME "${BINARY_NAME}")
     install(TARGETS gmx
             RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
 
index ead9b6d4e511d7bf2cb01c8893e110269821199b..4e3381216633846c9ab428bee8b6dbd17b85f823 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, 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.
 #include "gromacs/commandline/cmdlinemodulemanager.h"
 #include "gromacs/commandline/cmdlineoptionsmodule.h"
 #include "gromacs/gmxana/gmx_ana.h"
+#include "gromacs/gmxpreprocess/editconf.h"
 #include "gromacs/gmxpreprocess/genconf.h"
+#include "gromacs/gmxpreprocess/genion.h"
+#include "gromacs/gmxpreprocess/genrestr.h"
 #include "gromacs/gmxpreprocess/grompp.h"
 #include "gromacs/gmxpreprocess/insert-molecules.h"
 #include "gromacs/gmxpreprocess/pdb2gmx.h"
@@ -214,7 +217,7 @@ void registerLegacyModules(gmx::CommandLineModuleManager *manager)
                    "Multiply a conformation in 'random' orientations");
     registerModule(manager, &gmx_genion, "genion",
                    "Generate monoatomic ions on energetically favorable positions");
-    registerModule(manager, &gmx_genpr, "genrestr",
+    registerModule(manager, &gmx_genrestr, "genrestr",
                    "Generate position restraints or distance restraints for index groups");
     registerModule(manager, &gmx_make_edi, "make_edi",
                    "Generate input files for essential dynamics sampling");
@@ -231,8 +234,6 @@ void registerLegacyModules(gmx::CommandLineModuleManager *manager)
     registerModule(manager, &gmx_xpm2ps, "xpm2ps",
                    "Convert XPM (XPixelMap) matrices to postscript or XPM");
 
-    registerModule(manager, &gmx_anadock, "anadock",
-                   "Cluster structures from Autodock runs");
     registerModule(manager, &gmx_anaeig, "anaeig",
                    "Analyze eigenvectors/normal modes");
     registerModule(manager, &gmx_analyze, "analyze",
@@ -278,8 +279,6 @@ void registerLegacyModules(gmx::CommandLineModuleManager *manager)
                    "Analyze density of states and properties based on that");
     registerModule(manager, &gmx_dyecoupl, "dyecoupl",
                    "Extract dye dynamics from trajectories");
-    registerModule(manager, &gmx_dyndom, "dyndom",
-                   "Interpolate and extrapolate structure rotations");
     registerModule(manager, &gmx_enemat, "enemat",
                    "Extract an energy matrix from an energy file");
     registerModule(manager, &gmx_energy, "energy",
@@ -304,8 +303,6 @@ void registerLegacyModules(gmx::CommandLineModuleManager *manager)
                    "Calculate residue contact maps");
     registerModule(manager, &gmx_mindist, "mindist",
                    "Calculate the minimum distance between two groups");
-    registerModule(manager, &gmx_morph, "morph",
-                   "Interpolate linearly between conformations");
     registerModule(manager, &gmx_msd, "msd",
                    "Calculates mean square displacements");
     registerModule(manager, &gmx_nmeig, "nmeig",
@@ -418,10 +415,8 @@ void registerLegacyModules(gmx::CommandLineModuleManager *manager)
             manager->addModuleGroup("Tools");
         group.addModule("analyze");
         group.addModule("awh");
-        group.addModule("dyndom");
         group.addModule("filter");
         group.addModule("lie");
-        group.addModule("morph");
         group.addModule("pme_error");
         group.addModule("sham");
         group.addModule("spatial");
@@ -475,7 +470,6 @@ void registerLegacyModules(gmx::CommandLineModuleManager *manager)
     {
         gmx::CommandLineModuleGroup group =
             manager->addModuleGroup("Structural properties");
-        group.addModule("anadock");
         group.addModule("bundle");
         group.addModule("clustsize");
         group.addModule("disre");
index 37b0c0e4620577e0e64625236635011fb27ec3d3..b9dfb915f8185ad0cb3f25ed4115f83702349e0f 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+# Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -38,7 +38,6 @@ add_library(mdrun_test_objlib OBJECT
     energyreader.cpp
     energycomparison.cpp
     moduletest.cpp
-    simulationdatabase.cpp
     terminationhelper.cpp
     trajectorycomparison.cpp
     trajectoryreader.cpp
@@ -77,30 +76,16 @@ gmx_add_gtest_executable(
     ${exename}
     # files with code for tests
     minimize.cpp
+    normalmodes.cpp
     rerun.cpp
-    # pseudo-library for code for testing mdrun
-    $<TARGET_OBJECTS:mdrun_test_objlib>
-    # pseudo-library for code for mdrun
-    $<TARGET_OBJECTS:mdrun_objlib>
-    )
-gmx_register_gtest_test(${testname} ${exename} OPENMP_THREADS 2 INTEGRATION_TEST)
-
-# To permit other end-to-end tests to run with multiple OpenMP
-# threads, test cases that still use the group scheme are separated.
-set(testname "LegacyGroupSchemeMdrunTests")
-set(exename "legacy-mdrun-test")
-
-gmx_add_gtest_executable(
-    ${exename}
-    # When TPI supports the Verlet scheme, move this into
-    # MdrunNonIntegratorTest
+    simple_mdrun.cpp
     tpitest.cpp
     # pseudo-library for code for testing mdrun
     $<TARGET_OBJECTS:mdrun_test_objlib>
     # pseudo-library for code for mdrun
     $<TARGET_OBJECTS:mdrun_objlib>
     )
-gmx_register_gtest_test(${testname} ${exename} INTEGRATION_TEST)
+gmx_register_gtest_test(${testname} ${exename} OPENMP_THREADS 2 INTEGRATION_TEST)
 
 # Tests that only make sense to run with multiple ranks and/or real
 # MPI are implemented here.
index 90c0d57a0816c1844a0baccfeddbd4d0e33e7a86..98adef1b21bfdba3e277d5ecb58b5e08836c56b2 100644 (file)
 
 #include "testutils/cmdlinetest.h"
 #include "testutils/refdata.h"
+#include "testutils/simulationdatabase.h"
 
 #include "energycomparison.h"
 #include "energyreader.h"
 #include "moduletest.h"
-#include "simulationdatabase.h"
 
 namespace gmx
 {
index af14a7ddb492e765cc74bffa88e1a3760bef4a63..c35e54891586412590cf49788dd3325b86bac268 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2018, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019, 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.
 
 #include "testutils/mpitest.h"
 #include "testutils/refdata.h"
+#include "testutils/simulationdatabase.h"
 #include "testutils/testasserts.h"
 
 #include "energycomparison.h"
 #include "energyreader.h"
 #include "moduletest.h"
-#include "simulationdatabase.h"
 
 namespace gmx
 {
@@ -95,7 +95,7 @@ std::unordered_map<std::string, FloatingPointTolerance> potentialEnergyTolerance
          relativeToleranceAsPrecisionDependentUlp(-1, 10, 200)
      },
      {
-         "spc5",
+         "tip3p5",
          relativeToleranceAsPrecisionDependentUlp(-50, 150, 3800)
      },
      {
@@ -189,7 +189,7 @@ TEST_P(EnergyMinimizationTest, WithinTolerances)
 std::vector<std::string> unconstrainedSystemsToTest_g = { "argon12", "glycine_no_constraints_vacuo" };
 std::vector<std::string> minimizersToTest_g           = { "steep", "cg", "l-bfgs" };
 
-std::vector<std::string> constrainedSystemsToTest_g        = { "spc5", "glycine_vacuo", "alanine_vsite_vacuo" };
+std::vector<std::string> constrainedSystemsToTest_g        = { "tip3p5", "glycine_vacuo", "alanine_vsite_vacuo" };
 std::vector<std::string> minimizersToTestWithConstraints_g = { "steep", "cg" };
 //! \}
 
index 88e64ffd8db114b7ea3b6698e4ea76b3699d2e25..e3560d288450a8f5d185419cbc27cf783e657177 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
@@ -47,6 +47,7 @@
 
 #include <cstdio>
 
+#include "gromacs/gmxana/gmx_ana.h"
 #include "gromacs/gmxpreprocess/grompp.h"
 #include "gromacs/hardware/detecthardware.h"
 #include "gromacs/options/basicoptions.h"
@@ -92,10 +93,13 @@ GMX_TEST_OPTIONS(MdrunTestOptions, options)
 }       // namespace
 
 SimulationRunner::SimulationRunner(TestFileManager *fileManager) :
+    fullPrecisionTrajectoryFileName_(fileManager->getTemporaryFilePath(".trr")),
     mdpOutputFileName_(fileManager->getTemporaryFilePath("output.mdp")),
     tprFileName_(fileManager->getTemporaryFilePath(".tpr")),
     logFileName_(fileManager->getTemporaryFilePath(".log")),
     edrFileName_(fileManager->getTemporaryFilePath(".edr")),
+    mtxFileName_(fileManager->getTemporaryFilePath(".mtx")),
+
     nsteps_(-2),
     fileManager_(*fileManager)
 {
@@ -136,6 +140,14 @@ SimulationRunner::useStringAsNdxFile(const char *ndxString)
     gmx::TextWriter::writeFileFromString(ndxFileName_, ndxString);
 }
 
+void
+SimulationRunner::useTopG96AndNdxFromDatabase(const std::string &name)
+{
+    topFileName_ = gmx::test::TestFileManager::getInputFilePath(name + ".top");
+    groFileName_ = gmx::test::TestFileManager::getInputFilePath(name + ".g96");
+    ndxFileName_ = gmx::test::TestFileManager::getInputFilePath(name + ".ndx");
+}
+
 void
 SimulationRunner::useTopGroAndNdxFromDatabase(const std::string &name)
 {
@@ -208,6 +220,28 @@ SimulationRunner::callGrompp()
     return callGrompp(CommandLine());
 }
 
+int
+SimulationRunner::callNmeig()
+{
+    /* Conforming to style guide by not passing a non-const reference
+       to this function. Passing a non-const reference might make it
+       easier to write code that incorrectly re-uses callerRef after
+       the call to this function. */
+
+    CommandLine caller;
+    caller.append("nmeig");
+    caller.addOption("-s", tprFileName_);
+    caller.addOption("-f", mtxFileName_);
+    // Ignore the overall translation and rotation in the
+    // first six eigenvectors.
+    caller.addOption("-first", "7");
+    // No need to check more than a number of output values.
+    caller.addOption("-last", "50");
+    caller.addOption("-xvg", "none");
+
+    return gmx_nmeig(caller.argc(), caller.argv());
+}
+
 int
 SimulationRunner::callMdrun(const CommandLine &callerRef)
 {
@@ -223,6 +257,7 @@ SimulationRunner::callMdrun(const CommandLine &callerRef)
 
     caller.addOption("-g", logFileName_);
     caller.addOption("-e", edrFileName_);
+    caller.addOption("-mtx", mtxFileName_);
     caller.addOption("-o", fullPrecisionTrajectoryFileName_);
     caller.addOption("-x", reducedPrecisionTrajectoryFileName_);
 
index edba08915b5e30da553d19beda86fbbace90a4f3..450decba483299a58d9271bcfe69c594869ecb6e 100644 (file)
@@ -98,6 +98,8 @@ class SimulationRunner
         void useStringAsMdpFile(const std::string &mdpString);
         //! Use a string as -n input to grompp
         void useStringAsNdxFile(const char *ndxString);
+        //! Use a standard .top and .g96 file as input to grompp
+        void useTopG96AndNdxFromDatabase(const std::string &name);
         //! Use a standard .top and .gro file as input to grompp
         void useTopGroAndNdxFromDatabase(const std::string &name);
         //! Use a standard .gro file as input to grompp
@@ -110,6 +112,8 @@ class SimulationRunner
         int callGromppOnThisRank(const CommandLine &callerRef);
         //! Convenience wrapper for a default call to \c callGromppOnThisRank
         int callGromppOnThisRank();
+        //! Calls nmeig for testing
+        int callNmeig();
         //! Calls mdrun for testing with a customized command line
         int callMdrun(const CommandLine &callerRef);
         /*! \brief Convenience wrapper for calling mdrun for testing
@@ -137,6 +141,7 @@ class SimulationRunner
         std::string tprFileName_;
         std::string logFileName_;
         std::string edrFileName_;
+        std::string mtxFileName_;
         std::string cptFileName_;
         std::string swapFileName_;
         int         nsteps_;
diff --git a/src/programs/mdrun/tests/normalmodes.cpp b/src/programs/mdrun/tests/normalmodes.cpp
new file mode 100644 (file)
index 0000000..a58da53
--- /dev/null
@@ -0,0 +1,168 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2018, 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
+ * Tests for the normal modes functionality.
+ *
+ * \author David van der Spoel <david.vanderspoel@icm.uu.se>
+ * \ingroup module_mdrun_integration_tests
+ */
+#include "gmxpre.h"
+
+#include <map>
+#include <memory>
+#include <string>
+#include <tuple>
+#include <vector>
+
+#include <gtest/gtest.h>
+
+#include "gromacs/compat/make_unique.h"
+#include "gromacs/options/filenameoption.h"
+#include "gromacs/topology/idef.h"
+#include "gromacs/topology/ifunc.h"
+#include "gromacs/trajectory/energyframe.h"
+#include "gromacs/trajectory/trajectoryframe.h"
+#include "gromacs/utility/basenetwork.h"
+#include "gromacs/utility/filestream.h"
+#include "gromacs/utility/stringutil.h"
+
+#include "testutils/mpitest.h"
+#include "testutils/refdata.h"
+#include "testutils/simulationdatabase.h"
+#include "testutils/testasserts.h"
+#include "testutils/xvgtest.h"
+
+#include "energycomparison.h"
+#include "energyreader.h"
+#include "moduletest.h"
+
+namespace gmx
+{
+namespace test
+{
+namespace
+{
+
+//! Helper type
+using MdpField = MdpFieldValues::value_type;
+
+/*! \brief Test fixture base for normal mode analysis
+ *
+ * This test ensures mdrun can run a normal mode analys, reaching
+ * a reproducible eigenvalues following diagonalization.
+ *
+ * The choices for tolerance are arbitrary but sufficient. */
+class NormalModesTest : public MdrunTestFixture,
+                        public ::testing::WithParamInterface <
+                        std::tuple < std::string, std::string>>
+{
+};
+
+TEST_P(NormalModesTest, WithinTolerances)
+{
+    auto params         = GetParam();
+    auto simulationName = std::get<0>(params);
+    auto integrator     = std::get<1>(params);
+    SCOPED_TRACE(formatString("Comparing normal modes for '%s'",
+                              simulationName.c_str()));
+
+    // TODO At some point we should also test PME-only ranks.
+    int numRanksAvailable = getNumberOfTestMpiRanks();
+    if (!isNumberOfPpRanksSupported(simulationName, numRanksAvailable))
+    {
+        fprintf(stdout, "Test system '%s' cannot run with %d ranks.\n"
+                "The supported numbers are: %s\n",
+                simulationName.c_str(), numRanksAvailable,
+                reportNumbersOfPpRanksSupported(simulationName).c_str());
+        return;
+    }
+    auto mdpFieldValues = prepareMdpFieldValues(simulationName.c_str(),
+                                                integrator.c_str(),
+                                                "no", "no");
+    mdpFieldValues["nsteps"]      = "1";
+    mdpFieldValues["rcoulomb"]    = "5.6";
+    mdpFieldValues["rlist"]       = "5.6";
+    mdpFieldValues["rvdw"]        = "5.6";
+    mdpFieldValues["constraints"] = "none";
+    mdpFieldValues.insert(MdpField("coulombtype", "Cut-off"));
+    mdpFieldValues.insert(MdpField("vdwtype", "Cut-off"));
+
+    // prepare the .tpr file
+    {
+        CommandLine caller;
+        runner_.useTopG96AndNdxFromDatabase(simulationName);
+        runner_.useStringAsMdpFile(prepareMdpFileContents(mdpFieldValues));
+        EXPECT_EQ(0, runner_.callGrompp(caller));
+    }
+    // Do mdrun, preparing to check the normal modes later
+    {
+        CommandLine mdrunCaller;
+        ASSERT_EQ(0, runner_.callMdrun(mdrunCaller));
+    }
+    // Now run gmx nmeig and check the output
+    {
+        ASSERT_EQ(0, runner_.callNmeig());
+        TestReferenceData refData;
+        auto              checker  = refData.rootChecker()
+                .checkCompound("System", simulationName)
+                .checkCompound("Integrator", integrator);
+        auto          settings = XvgMatchSettings();
+        TextInputFile input("eigenval.xvg");
+        checkXvgFile(&input, &checker, settings);
+    }
+}
+
+//! Containers of systems and integrators to test.
+//! \{
+std::vector<std::string> systemsToTest_g     = { "scaled-water", "villin", "spc-dimer", "one-tip5p", "sw-dimer" };
+std::vector<std::string> integratorsToTest_g = { "nm" };
+
+//! \}
+
+// The time for OpenCL kernel compilation means these tests might time
+// out. If that proves to be a problem, these can be disabled for
+// OpenCL builds. However, once that compilation is cached for the
+// lifetime of the whole test binary process, these tests should run in
+// such configurations.
+#if GMX_DOUBLE
+INSTANTIATE_TEST_CASE_P(NormalModesWorks, NormalModesTest,
+                            ::testing::Combine(::testing::ValuesIn(systemsToTest_g),
+                                                   ::testing::ValuesIn(integratorsToTest_g)));
+#endif
+} // namespace
+} // namespace test
+} // namespace gmx
diff --git a/src/programs/mdrun/tests/refdata/Angles1_SimpleMdrunTest_WithinTolerances_0.xml b/src/programs/mdrun/tests/refdata/Angles1_SimpleMdrunTest_WithinTolerances_0.xml
new file mode 100644 (file)
index 0000000..e6b945d
--- /dev/null
@@ -0,0 +1,316 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Simulation Name="angles1">
+    <Mdrun Name="md">
+      <Energy Name="Kinetic En.">
+        <Real Name="Time 0.000000 Step 0 in frame 0">8.8827049229659867</Real>
+        <Real Name="Time 0.004000 Step 4 in frame 1">8.6853411978925212</Real>
+        <Real Name="Time 0.008000 Step 8 in frame 2">9.0476379091109891</Real>
+        <Real Name="Time 0.012000 Step 12 in frame 3">9.8917199248001868</Real>
+        <Real Name="Time 0.016000 Step 16 in frame 4">10.970729795432797</Real>
+        <Real Name="Time 0.020000 Step 20 in frame 5">11.969598016517697</Real>
+        <Real Name="Time 0.024000 Step 24 in frame 6">12.620267943889669</Real>
+        <Real Name="Time 0.028000 Step 28 in frame 7">12.784778605942707</Real>
+        <Real Name="Time 0.032000 Step 32 in frame 8">12.481797526143797</Real>
+        <Real Name="Time 0.036000 Step 36 in frame 9">11.859180066366713</Real>
+        <Real Name="Time 0.040000 Step 40 in frame 10">11.133173167819335</Real>
+        <Real Name="Time 0.044000 Step 44 in frame 11">10.519456636414786</Real>
+        <Real Name="Time 0.048000 Step 48 in frame 12">10.175948192781643</Real>
+        <Real Name="Time 0.050000 Step 50 in frame 13">10.141536444106846</Real>
+      </Energy>
+      <Energy Name="Pressure">
+        <Real Name="Time 0.000000 Step 0 in frame 0">0.050796915464453078</Real>
+        <Real Name="Time 0.004000 Step 4 in frame 1">0.049668265065138079</Real>
+        <Real Name="Time 0.008000 Step 8 in frame 2">0.051740106421168025</Real>
+        <Real Name="Time 0.012000 Step 12 in frame 3">0.056567100356897236</Real>
+        <Real Name="Time 0.016000 Step 16 in frame 4">0.062737560105270318</Real>
+        <Real Name="Time 0.020000 Step 20 in frame 5">0.06844971929851254</Real>
+        <Real Name="Time 0.024000 Step 24 in frame 6">0.072170660789039956</Real>
+        <Real Name="Time 0.028000 Step 28 in frame 7">0.073111436629933163</Real>
+        <Real Name="Time 0.032000 Step 32 in frame 8">0.071378799507418461</Real>
+        <Real Name="Time 0.036000 Step 36 in frame 9">0.067818279739479667</Real>
+        <Real Name="Time 0.040000 Step 40 in frame 10">0.063666513878523082</Real>
+        <Real Name="Time 0.044000 Step 44 in frame 11">0.060156895239239817</Real>
+        <Real Name="Time 0.048000 Step 48 in frame 12">0.058192497060544725</Real>
+        <Real Name="Time 0.050000 Step 50 in frame 13">0.057995708953366192</Real>
+      </Energy>
+      <Energy Name="Potential">
+        <Real Name="Time 0.000000 Step 0 in frame 0">4.1472047198540372</Real>
+        <Real Name="Time 0.004000 Step 4 in frame 1">4.3456029525254678</Real>
+        <Real Name="Time 0.008000 Step 8 in frame 2">3.9826669068573985</Real>
+        <Real Name="Time 0.012000 Step 12 in frame 3">3.1365732905082528</Real>
+        <Real Name="Time 0.016000 Step 16 in frame 4">2.0549883062523469</Real>
+        <Real Name="Time 0.020000 Step 20 in frame 5">1.053909305545295</Real>
+        <Real Name="Time 0.024000 Step 24 in frame 6">0.40206460374619313</Real>
+        <Real Name="Time 0.028000 Step 28 in frame 7">0.23763430982967265</Real>
+        <Real Name="Time 0.032000 Step 32 in frame 8">0.54173749646261815</Real>
+        <Real Name="Time 0.036000 Step 36 in frame 9">1.1660367172497461</Real>
+        <Real Name="Time 0.040000 Step 40 in frame 10">1.8937346262503456</Real>
+        <Real Name="Time 0.044000 Step 44 in frame 11">2.5086918336925299</Real>
+        <Real Name="Time 0.048000 Step 48 in frame 12">2.852711964582892</Real>
+        <Real Name="Time 0.050000 Step 50 in frame 13">2.8985177691300135</Real>
+      </Energy>
+      <Vector Name="Time 0.000000 Step 0 F[0]">
+        <Real Name="X">10.938095074317319</Real>
+        <Real Name="Y">-9.6849636829809604</Real>
+        <Real Name="Z">14.9477673456121</Real>
+      </Vector>
+      <Vector Name="Time 0.000000 Step 0 F[1]">
+        <Real Name="X">-358.95983701890032</Real>
+        <Real Name="Y">-72.184737465987098</Real>
+        <Real Name="Z">5.2427273882850791</Real>
+      </Vector>
+      <Vector Name="Time 0.000000 Step 0 F[2]">
+        <Real Name="X">504.44011431612421</Real>
+        <Real Name="Y">-30.492879467234754</Real>
+        <Real Name="Z">132.02668359243958</Real>
+      </Vector>
+      <Vector Name="Time 0.000000 Step 0 F[3]">
+        <Real Name="X">-156.41837237154124</Real>
+        <Real Name="Y">112.36258061620281</Real>
+        <Real Name="Z">-152.21717832633675</Real>
+      </Vector>
+      <Vector Name="Time 0.004000 Step 4 F[0]">
+        <Real Name="X">20.435838614386633</Real>
+        <Real Name="Y">-17.686356823439912</Real>
+        <Real Name="Z">28.095606243064644</Real>
+      </Vector>
+      <Vector Name="Time 0.004000 Step 4 F[1]">
+        <Real Name="X">-393.58451331352791</Real>
+        <Real Name="Y">-74.845578585694341</Real>
+        <Real Name="Z">-13.392242553088089</Real>
+      </Vector>
+      <Vector Name="Time 0.004000 Step 4 F[2]">
+        <Real Name="X">529.98619683151344</Real>
+        <Real Name="Y">-19.588183147046106</Real>
+        <Real Name="Z">140.73458818251191</Real>
+      </Vector>
+      <Vector Name="Time 0.004000 Step 4 F[3]">
+        <Real Name="X">-156.83752213237216</Real>
+        <Real Name="Y">112.12011855618036</Real>
+        <Real Name="Z">-155.43795187248847</Real>
+      </Vector>
+      <Vector Name="Time 0.008000 Step 8 F[0]">
+        <Real Name="X">23.175091525779919</Real>
+        <Real Name="Y">-19.684699303050994</Real>
+        <Real Name="Z">32.068217603600317</Real>
+      </Vector>
+      <Vector Name="Time 0.008000 Step 8 F[1]">
+        <Real Name="X">-384.67295235829749</Real>
+        <Real Name="Y">-74.107890253924694</Real>
+        <Real Name="Z">-21.330768782037424</Real>
+      </Vector>
+      <Vector Name="Time 0.008000 Step 8 F[2]">
+        <Real Name="X">508.23023246865938</Real>
+        <Real Name="Y">-11.323306055502048</Real>
+        <Real Name="Z">138.18426885013943</Real>
+      </Vector>
+      <Vector Name="Time 0.008000 Step 8 F[3]">
+        <Real Name="X">-146.73237163614181</Real>
+        <Real Name="Y">105.11589561247773</Real>
+        <Real Name="Z">-148.92171767170231</Real>
+      </Vector>
+      <Vector Name="Time 0.012000 Step 12 F[0]">
+        <Real Name="X">19.606862325228409</Real>
+        <Real Name="Y">-16.414806546801842</Real>
+        <Real Name="Z">27.313596732132655</Real>
+      </Vector>
+      <Vector Name="Time 0.012000 Step 12 F[1]">
+        <Real Name="X">-335.63542363030876</Real>
+        <Real Name="Y">-68.955808848547065</Real>
+        <Real Name="Z">-18.44424868720855</Real>
+      </Vector>
+      <Vector Name="Time 0.012000 Step 12 F[2]">
+        <Real Name="X">443.40685745535319</Real>
+        <Real Name="Y">-6.6985698054608456</Real>
+        <Real Name="Z">124.1640033656024</Real>
+      </Vector>
+      <Vector Name="Time 0.012000 Step 12 F[3]">
+        <Real Name="X">-127.37829615027287</Real>
+        <Real Name="Y">92.069185200809756</Real>
+        <Real Name="Z">-133.03335141052651</Real>
+      </Vector>
+      <Vector Name="Time 0.016000 Step 16 F[0]">
+        <Real Name="X">10.936701481888193</Real>
+        <Real Name="Y">-9.0594222620341984</Real>
+        <Real Name="Z">15.337114133364635</Real>
+      </Vector>
+      <Vector Name="Time 0.016000 Step 16 F[1]">
+        <Real Name="X">-254.29369565940516</Real>
+        <Real Name="Y">-58.536578272057184</Real>
+        <Real Name="Z">-6.7734573229946236</Real>
+      </Vector>
+      <Vector Name="Time 0.016000 Step 16 F[2]">
+        <Real Name="X">344.4276213065869</Real>
+        <Real Name="Y">-6.5739101403710727</Real>
+        <Real Name="Z">100.47506026189879</Real>
+      </Vector>
+      <Vector Name="Time 0.016000 Step 16 F[3]">
+        <Real Name="X">-101.0706271290699</Real>
+        <Real Name="Y">74.169910674462457</Real>
+        <Real Name="Z">-109.0387170722688</Real>
+      </Vector>
+      <Vector Name="Time 0.020000 Step 20 F[0]">
+        <Real Name="X">-1.1487885143590644</Real>
+        <Real Name="Y">0.94425702845751291</Real>
+        <Real Name="Z">-1.6210190752303417</Real>
+      </Vector>
+      <Vector Name="Time 0.020000 Step 20 F[1]">
+        <Real Name="X">-151.33525622409871</Real>
+        <Real Name="Y">-42.597492262017155</Real>
+        <Real Name="Z">10.276839538853924</Real>
+      </Vector>
+      <Vector Name="Time 0.020000 Step 20 F[2]">
+        <Real Name="X">223.13701175223176</Real>
+        <Real Name="Y">-11.261469518677318</Real>
+        <Real Name="Z">70.282144298824107</Real>
+      </Vector>
+      <Vector Name="Time 0.020000 Step 20 F[3]">
+        <Real Name="X">-70.652967013773974</Real>
+        <Real Name="Y">52.914704752236958</Real>
+        <Real Name="Z">-78.937964762447692</Real>
+      </Vector>
+      <Vector Name="Time 0.024000 Step 24 F[0]">
+        <Real Name="X">-14.792631934835677</Real>
+        <Real Name="Y">12.084501645102721</Real>
+        <Real Name="Z">-20.985856455180208</Real>
+      </Vector>
+      <Vector Name="Time 0.024000 Step 24 F[1]">
+        <Real Name="X">-38.508823233299573</Real>
+        <Real Name="Y">-21.773206178588957</Real>
+        <Real Name="Z">28.978581607086344</Real>
+      </Vector>
+      <Vector Name="Time 0.024000 Step 24 F[2]">
+        <Real Name="X">92.311360568250592</Real>
+        <Real Name="Y">-20.243825211273709</Real>
+        <Real Name="Z">37.199039838943072</Real>
+      </Vector>
+      <Vector Name="Time 0.024000 Step 24 F[3]">
+        <Real Name="X">-39.009905400115343</Real>
+        <Real Name="Y">29.932529744759947</Real>
+        <Real Name="Z">-45.191764990849208</Real>
+      </Vector>
+      <Vector Name="Time 0.028000 Step 28 F[0]">
+        <Real Name="X">-28.233093664967807</Real>
+        <Real Name="Y">22.92859444472731</Real>
+        <Real Name="Z">-40.223321948721754</Real>
+      </Vector>
+      <Vector Name="Time 0.028000 Step 28 F[1]">
+        <Real Name="X">73.021460992109311</Real>
+        <Real Name="Y">2.4029740292514781</Real>
+        <Real Name="Z">46.15342995506451</Real>
+      </Vector>
+      <Vector Name="Time 0.028000 Step 28 F[2]">
+        <Real Name="X">-36.130408162563846</Real>
+        <Real Name="Y">-32.154073025311916</Real>
+        <Real Name="Z">4.4691445584323635</Real>
+      </Vector>
+      <Vector Name="Time 0.028000 Step 28 F[3]">
+        <Real Name="X">-8.6579591645776546</Real>
+        <Real Name="Y">6.8225045513331253</Real>
+        <Real Name="Z">-10.399252564775118</Real>
+      </Vector>
+      <Vector Name="Time 0.032000 Step 32 F[0]">
+        <Real Name="X">-39.97789984097686</Real>
+        <Real Name="Y">32.241671576985929</Real>
+        <Real Name="Z">-57.119576941001135</Real>
+      </Vector>
+      <Vector Name="Time 0.032000 Step 32 F[1]">
+        <Real Name="X">173.85168027656647</Real>
+        <Real Name="Y">27.749078001711162</Real>
+        <Real Name="Z">59.637350464835151</Real>
+      </Vector>
+      <Vector Name="Time 0.032000 Step 32 F[2]">
+        <Real Name="X">-152.36496859639158</Real>
+        <Real Name="Y">-45.012821768681185</Real>
+        <Real Name="Z">-25.518087185941891</Real>
+      </Vector>
+      <Vector Name="Time 0.032000 Step 32 F[3]">
+        <Real Name="X">18.49118816080194</Real>
+        <Real Name="Y">-14.977927810015906</Real>
+        <Real Name="Z">23.000313662107878</Real>
+      </Vector>
+      <Vector Name="Time 0.036000 Step 36 F[0]">
+        <Real Name="X">-48.881612139197181</Real>
+        <Real Name="Y">39.065295762634229</Real>
+        <Real Name="Z">-69.938279010926436</Real>
+      </Vector>
+      <Vector Name="Time 0.036000 Step 36 F[1]">
+        <Real Name="X">256.91883657637214</Real>
+        <Real Name="Y">51.827136837357685</Real>
+        <Real Name="Z">68.316578380756738</Real>
+      </Vector>
+      <Vector Name="Time 0.036000 Step 36 F[2]">
+        <Real Name="X">-249.22935104064919</Real>
+        <Real Name="Y">-56.609707958967739</Real>
+        <Real Name="Z">-51.324820635516417</Real>
+      </Vector>
+      <Vector Name="Time 0.036000 Step 36 F[3]">
+        <Real Name="X">41.192126603474236</Real>
+        <Real Name="Y">-34.282724641024174</Real>
+        <Real Name="Z">52.946521265686115</Real>
+      </Vector>
+      <Vector Name="Time 0.040000 Step 40 F[0]">
+        <Real Name="X">-54.149503868648566</Real>
+        <Real Name="Y">42.755819150349467</Real>
+        <Real Name="Z">-77.469738353419245</Real>
+      </Vector>
+      <Vector Name="Time 0.040000 Step 40 F[1]">
+        <Real Name="X">317.55427307025371</Real>
+        <Real Name="Y">72.337791383415436</Real>
+        <Real Name="Z">71.871971514297229</Real>
+      </Vector>
+      <Vector Name="Time 0.040000 Step 40 F[2]">
+        <Real Name="X">-322.20372287496099</Real>
+        <Real Name="Y">-64.891170578042846</Real>
+        <Real Name="Z">-72.27849537849221</Real>
+      </Vector>
+      <Vector Name="Time 0.040000 Step 40 F[3]">
+        <Real Name="X">58.798953673355882</Real>
+        <Real Name="Y">-50.202439955722056</Real>
+        <Real Name="Z">77.876262217614226</Real>
+      </Vector>
+      <Vector Name="Time 0.044000 Step 44 F[0]">
+        <Real Name="X">-55.30214765388515</Real>
+        <Real Name="Y">42.989286333517626</Real>
+        <Real Name="Z">-79.007731097948096</Real>
+      </Vector>
+      <Vector Name="Time 0.044000 Step 44 F[1]">
+        <Real Name="X">353.20119046090213</Real>
+        <Real Name="Y">87.420405578975277</Real>
+        <Real Name="Z">70.415575063717398</Real>
+      </Vector>
+      <Vector Name="Time 0.044000 Step 44 F[2]">
+        <Real Name="X">-369.03341302494488</Real>
+        <Real Name="Y">-68.257569667105031</Real>
+        <Real Name="Z">-88.161363599526965</Real>
+      </Vector>
+      <Vector Name="Time 0.044000 Step 44 F[3]">
+        <Real Name="X">71.134370217927881</Real>
+        <Real Name="Y">-62.152122245387858</Real>
+        <Real Name="Z">96.753519633757662</Real>
+      </Vector>
+      <Vector Name="Time 0.048000 Step 48 F[0]">
+        <Real Name="X">-52.13141853615042</Real>
+        <Real Name="Y">39.743487788303739</Real>
+        <Real Name="Z">-74.292830164081394</Real>
+      </Vector>
+      <Vector Name="Time 0.048000 Step 48 F[1]">
+        <Real Name="X">363.0139691466951</Real>
+        <Real Name="Y">95.826941958577009</Real>
+        <Real Name="Z">64.166722501371126</Real>
+      </Vector>
+      <Vector Name="Time 0.048000 Step 48 F[2]">
+        <Real Name="X">-389.2319923561339</Real>
+        <Real Name="Y">-65.735297034854213</Real>
+        <Real Name="Z">-98.914481786706801</Real>
+      </Vector>
+      <Vector Name="Time 0.048000 Step 48 F[3]">
+        <Real Name="X">78.349441745589218</Real>
+        <Real Name="Y">-69.835132712026535</Real>
+        <Real Name="Z">109.04058944941707</Real>
+      </Vector>
+    </Mdrun>
+  </Simulation>
+</ReferenceData>
diff --git a/src/programs/mdrun/tests/refdata/Angles1_SimpleMdrunTest_WithinTolerances_1.xml b/src/programs/mdrun/tests/refdata/Angles1_SimpleMdrunTest_WithinTolerances_1.xml
new file mode 100644 (file)
index 0000000..61caff3
--- /dev/null
@@ -0,0 +1,316 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Simulation Name="angles1">
+    <Mdrun Name="md-vv">
+      <Energy Name="Kinetic En.">
+        <Real Name="Time 0.000000 Step 0 in frame 0">8.9391563133906793</Real>
+        <Real Name="Time 0.004000 Step 4 in frame 1">8.672068382555647</Real>
+        <Real Name="Time 0.008000 Step 8 in frame 2">8.975918149383503</Real>
+        <Real Name="Time 0.012000 Step 12 in frame 3">9.7927683894995514</Real>
+        <Real Name="Time 0.016000 Step 16 in frame 4">10.883100553613275</Real>
+        <Real Name="Time 0.020000 Step 20 in frame 5">11.924969433487275</Real>
+        <Real Name="Time 0.024000 Step 24 in frame 6">12.633456867318333</Real>
+        <Real Name="Time 0.028000 Step 28 in frame 7">12.851048714886538</Real>
+        <Real Name="Time 0.032000 Step 32 in frame 8">12.58102385678621</Real>
+        <Real Name="Time 0.036000 Step 36 in frame 9">11.964056077156558</Real>
+        <Real Name="Time 0.040000 Step 40 in frame 10">11.218083083060089</Real>
+        <Real Name="Time 0.044000 Step 44 in frame 11">10.567428789368687</Real>
+        <Real Name="Time 0.048000 Step 48 in frame 12">10.182372549748186</Real>
+        <Real Name="Time 0.050000 Step 50 in frame 13">10.118035846218756</Real>
+      </Energy>
+      <Energy Name="Pressure">
+        <Real Name="Time 0.000000 Step 0 in frame 0">0.051119740159421841</Real>
+        <Real Name="Time 0.004000 Step 4 in frame 1">0.049592362726324835</Real>
+        <Real Name="Time 0.008000 Step 8 in frame 2">0.051329967549776645</Real>
+        <Real Name="Time 0.012000 Step 12 in frame 3">0.056001232998098956</Real>
+        <Real Name="Time 0.016000 Step 16 in frame 4">0.062236440769716052</Real>
+        <Real Name="Time 0.020000 Step 20 in frame 5">0.06819450488137796</Real>
+        <Real Name="Time 0.024000 Step 24 in frame 6">0.072246083380951245</Real>
+        <Real Name="Time 0.028000 Step 28 in frame 7">0.073490410957126703</Real>
+        <Real Name="Time 0.032000 Step 32 in frame 8">0.071946238319492595</Real>
+        <Real Name="Time 0.036000 Step 36 in frame 9">0.068418026989956096</Real>
+        <Real Name="Time 0.040000 Step 40 in frame 10">0.064152082387663359</Real>
+        <Real Name="Time 0.044000 Step 44 in frame 11">0.060431230300392935</Real>
+        <Real Name="Time 0.048000 Step 48 in frame 12">0.058229235590145312</Real>
+        <Real Name="Time 0.050000 Step 50 in frame 13">0.057861317695901665</Real>
+      </Energy>
+      <Energy Name="Potential">
+        <Real Name="Time 0.000000 Step 0 in frame 0">4.1472047198540372</Real>
+        <Real Name="Time 0.004000 Step 4 in frame 1">4.4149217832200334</Real>
+        <Real Name="Time 0.008000 Step 8 in frame 2">4.1108352256843359</Real>
+        <Real Name="Time 0.012000 Step 12 in frame 3">3.2930164829357831</Real>
+        <Real Name="Time 0.016000 Step 16 in frame 4">2.2013970593427996</Real>
+        <Real Name="Time 0.020000 Step 20 in frame 5">1.1584108045547079</Real>
+        <Real Name="Time 0.024000 Step 24 in frame 6">0.44933660978657469</Real>
+        <Real Name="Time 0.028000 Step 28 in frame 7">0.23181125259333402</Real>
+        <Real Name="Time 0.032000 Step 32 in frame 8">0.5024481720916194</Real>
+        <Real Name="Time 0.036000 Step 36 in frame 9">1.1203230657139849</Real>
+        <Real Name="Time 0.040000 Step 40 in frame 10">1.8672122477644266</Real>
+        <Real Name="Time 0.044000 Step 44 in frame 11">2.5185540376704454</Real>
+        <Real Name="Time 0.048000 Step 48 in frame 12">2.9039247534827046</Real>
+        <Real Name="Time 0.050000 Step 50 in frame 13">2.9682628134981011</Real>
+      </Energy>
+      <Vector Name="Time 0.000000 Step 0 F[0]">
+        <Real Name="X">10.938095074317319</Real>
+        <Real Name="Y">-9.6849636829809604</Real>
+        <Real Name="Z">14.9477673456121</Real>
+      </Vector>
+      <Vector Name="Time 0.000000 Step 0 F[1]">
+        <Real Name="X">-358.95983701890032</Real>
+        <Real Name="Y">-72.184737465987098</Real>
+        <Real Name="Z">5.2427273882850791</Real>
+      </Vector>
+      <Vector Name="Time 0.000000 Step 0 F[2]">
+        <Real Name="X">504.44011431612421</Real>
+        <Real Name="Y">-30.492879467234754</Real>
+        <Real Name="Z">132.02668359243958</Real>
+      </Vector>
+      <Vector Name="Time 0.000000 Step 0 F[3]">
+        <Real Name="X">-156.41837237154124</Real>
+        <Real Name="Y">112.36258061620281</Real>
+        <Real Name="Z">-152.21717832633675</Real>
+      </Vector>
+      <Vector Name="Time 0.004000 Step 4 F[0]">
+        <Real Name="X">21.155933650930336</Real>
+        <Real Name="Y">-18.30217112282849</Real>
+        <Real Name="Z">29.0872615288202</Real>
+      </Vector>
+      <Vector Name="Time 0.004000 Step 4 F[1]">
+        <Real Name="X">-398.44571972757416</Real>
+        <Real Name="Y">-75.278904772517194</Real>
+        <Real Name="Z">-14.56996388508238</Real>
+      </Vector>
+      <Vector Name="Time 0.004000 Step 4 F[2]">
+        <Real Name="X">535.37129474483072</Real>
+        <Real Name="Y">-19.334396863248223</Real>
+        <Real Name="Z">142.04876684081597</Real>
+      </Vector>
+      <Vector Name="Time 0.004000 Step 4 F[3]">
+        <Real Name="X">-158.08150866818687</Real>
+        <Real Name="Y">112.91547275859391</Real>
+        <Real Name="Z">-156.56606448455378</Real>
+      </Vector>
+      <Vector Name="Time 0.008000 Step 8 F[0]">
+        <Real Name="X">24.510088216175738</Real>
+        <Real Name="Y">-20.802794779922351</Real>
+        <Real Name="Z">33.921241153170826</Real>
+      </Vector>
+      <Vector Name="Time 0.008000 Step 8 F[1]">
+        <Real Name="X">-393.74461098406653</Real>
+        <Real Name="Y">-75.022625052227227</Real>
+        <Real Name="Z">-23.585410607289134</Real>
+      </Vector>
+      <Vector Name="Time 0.008000 Step 8 F[2]">
+        <Real Name="X">518.27939480574969</Real>
+        <Real Name="Y">-10.771865418744383</Real>
+        <Real Name="Z">140.74566748023204</Real>
+      </Vector>
+      <Vector Name="Time 0.008000 Step 8 F[3]">
+        <Real Name="X">-149.04487203785891</Real>
+        <Real Name="Y">106.59728525089396</Real>
+        <Real Name="Z">-151.08149802611374</Real>
+      </Vector>
+      <Vector Name="Time 0.012000 Step 12 F[0]">
+        <Real Name="X">21.373956477946891</Real>
+        <Real Name="Y">-17.876293502758351</Real>
+        <Real Name="Z">29.785527758153542</Real>
+      </Vector>
+      <Vector Name="Time 0.012000 Step 12 F[1]">
+        <Real Name="X">-347.79714180428039</Real>
+        <Real Name="Y">-70.389381013981478</Real>
+        <Real Name="Z">-21.433137459147801</Real>
+      </Vector>
+      <Vector Name="Time 0.012000 Step 12 F[2]">
+        <Real Name="X">456.890557439281</Real>
+        <Real Name="Y">-5.8127238448001677</Real>
+        <Real Name="Z">127.68017675056926</Real>
+      </Vector>
+      <Vector Name="Time 0.012000 Step 12 F[3]">
+        <Real Name="X">-130.46737211294752</Real>
+        <Real Name="Y">94.078398361539996</Real>
+        <Real Name="Z">-136.03256704957499</Real>
+      </Vector>
+      <Vector Name="Time 0.016000 Step 16 F[0]">
+        <Real Name="X">12.910266776578091</Real>
+        <Real Name="Y">-10.68271258479351</Real>
+        <Real Name="Z">18.11527408507898</Real>
+      </Vector>
+      <Vector Name="Time 0.016000 Step 16 F[1]">
+        <Real Name="X">-268.15085850941546</Real>
+        <Real Name="Y">-60.469286219319308</Real>
+        <Real Name="Z">-10.015696681484254</Real>
+      </Vector>
+      <Vector Name="Time 0.016000 Step 16 F[2]">
+        <Real Name="X">359.82537543352231</Real>
+        <Real Name="Y">-5.3687566061117895</Real>
+        <Real Name="Z">104.51228741840357</Real>
+      </Vector>
+      <Vector Name="Time 0.016000 Step 16 F[3]">
+        <Real Name="X">-104.58478370068499</Real>
+        <Real Name="Y">76.520755410224609</Real>
+        <Real Name="Z">-112.6118648219983</Real>
+      </Vector>
+      <Vector Name="Time 0.020000 Step 20 F[0]">
+        <Real Name="X">0.80043849865756767</Real>
+        <Real Name="Y">-0.65729315673919175</Real>
+        <Real Name="Z">1.1304577556443514</Real>
+      </Vector>
+      <Vector Name="Time 0.020000 Step 20 F[1]">
+        <Real Name="X">-165.43787640016933</Real>
+        <Real Name="Y">-44.92051537226294</Real>
+        <Real Name="Z">7.2694825113200752</Real>
+      </Vector>
+      <Vector Name="Time 0.020000 Step 20 F[2]">
+        <Real Name="X">238.88010227908927</Real>
+        <Real Name="Y">-9.8358893758006953</Real>
+        <Real Name="Z">74.379767907759998</Real>
+      </Vector>
+      <Vector Name="Time 0.020000 Step 20 F[3]">
+        <Real Name="X">-74.242664377577512</Real>
+        <Real Name="Y">55.413697904802831</Real>
+        <Real Name="Z">-82.779708174724419</Real>
+      </Vector>
+      <Vector Name="Time 0.024000 Step 24 F[0]">
+        <Real Name="X">-13.073130849008304</Real>
+        <Real Name="Y">10.672643181667585</Real>
+        <Real Name="Z">-18.568736736583428</Real>
+      </Vector>
+      <Vector Name="Time 0.024000 Step 24 F[1]">
+        <Real Name="X">-51.544852442012825</Real>
+        <Real Name="Y">-24.287756917116472</Real>
+        <Real Name="Z">26.593970257182065</Real>
+      </Vector>
+      <Vector Name="Time 0.024000 Step 24 F[2]">
+        <Real Name="X">106.99514991091363</Real>
+        <Real Name="Y">-18.781853356148474</Real>
+        <Real Name="Z">40.969682247310217</Real>
+      </Vector>
+      <Vector Name="Time 0.024000 Step 24 F[3]">
+        <Real Name="X">-42.377166619892492</Real>
+        <Real Name="Y">32.396967091597361</Real>
+        <Real Name="Z">-48.99491576790885</Real>
+      </Vector>
+      <Vector Name="Time 0.028000 Step 28 F[0]">
+        <Real Name="X">-26.905038476440723</Real>
+        <Real Name="Y">21.845277606154198</Real>
+        <Real Name="Z">-38.390846834012301</Real>
+      </Vector>
+      <Vector Name="Time 0.028000 Step 28 F[1]">
+        <Real Name="X">62.094432049682808</Real>
+        <Real Name="Y">-0.044286053734932551</Real>
+        <Real Name="Z">44.625457490257261</Real>
+      </Vector>
+      <Vector Name="Time 0.028000 Step 28 F[2]">
+        <Real Name="X">-23.604852725028373</Real>
+        <Real Name="Y">-30.895338557029298</Real>
+        <Real Name="Z">7.6545036386917591</Real>
+      </Vector>
+      <Vector Name="Time 0.028000 Step 28 F[3]">
+        <Real Name="X">-11.58454084821372</Real>
+        <Real Name="Y">9.0943470046100323</Real>
+        <Real Name="Z">-13.889114294936725</Real>
+      </Vector>
+      <Vector Name="Time 0.032000 Step 32 F[0]">
+        <Real Name="X">-39.153576176776852</Real>
+        <Real Name="Y">31.587908763363291</Real>
+        <Real Name="Z">-56.048764515112126</Real>
+      </Vector>
+      <Vector Name="Time 0.032000 Step 32 F[1]">
+        <Real Name="X">165.75016431507885</Real>
+        <Real Name="Y">25.641188819994188</Real>
+        <Real Name="Z">59.048848583403377</Real>
+      </Vector>
+      <Vector Name="Time 0.032000 Step 32 F[2]">
+        <Real Name="X">-142.73430156268535</Real>
+        <Real Name="Y">-44.205851656460204</Real>
+        <Real Name="Z">-23.041879721999415</Real>
+      </Vector>
+      <Vector Name="Time 0.032000 Step 32 F[3]">
+        <Real Name="X">16.13771342438336</Real>
+        <Real Name="Y">-13.023245926897276</Real>
+        <Real Name="Z">20.04179565370816</Real>
+      </Vector>
+      <Vector Name="Time 0.036000 Step 36 F[0]">
+        <Real Name="X">-48.627076294478371</Real>
+        <Real Name="Y">38.900467024609185</Real>
+        <Real Name="Z">-69.731012708786722</Real>
+      </Vector>
+      <Vector Name="Time 0.036000 Step 36 F[1]">
+        <Real Name="X">252.04290680189882</Real>
+        <Real Name="Y">50.297911484235428</Real>
+        <Real Name="Z">68.639903632959374</Real>
+      </Vector>
+      <Vector Name="Time 0.036000 Step 36 F[2]">
+        <Real Name="X">-242.88428065303333</Real>
+        <Real Name="Y">-56.465779566734703</Real>
+        <Real Name="Z">-49.578175305145407</Real>
+      </Vector>
+      <Vector Name="Time 0.036000 Step 36 F[3]">
+        <Real Name="X">39.468450145612891</Real>
+        <Real Name="Y">-32.73259894210991</Real>
+        <Real Name="Z">50.669284380972755</Real>
+      </Vector>
+      <Vector Name="Time 0.040000 Step 40 F[0]">
+        <Real Name="X">-54.492010685444257</Real>
+        <Real Name="Y">43.098098771003073</Real>
+        <Real Name="Z">-78.159865677919839</Real>
+      </Vector>
+      <Vector Name="Time 0.040000 Step 40 F[1]">
+        <Real Name="X">316.03744056063238</Real>
+        <Real Name="Y">71.560639740861617</Real>
+        <Real Name="Z">73.021940746216785</Real>
+      </Vector>
+      <Vector Name="Time 0.040000 Step 40 F[2]">
+        <Real Name="X">-319.24940869807375</Real>
+        <Real Name="Y">-65.551158527427845</Real>
+        <Real Name="Z">-71.223753583128143</Real>
+      </Vector>
+      <Vector Name="Time 0.040000 Step 40 F[3]">
+        <Real Name="X">57.703978822885588</Real>
+        <Real Name="Y">-49.107579984436853</Real>
+        <Real Name="Z">76.361678514831198</Real>
+      </Vector>
+      <Vector Name="Time 0.044000 Step 44 F[0]">
+        <Real Name="X">-56.237726655826592</Real>
+        <Real Name="Y">43.818958810715507</Real>
+        <Real Name="Z">-80.57179817058514</Real>
+      </Vector>
+      <Vector Name="Time 0.044000 Step 44 F[1]">
+        <Real Name="X">354.97220769636726</Real>
+        <Real Name="Y">87.486479467141166</Real>
+        <Real Name="Z">72.29474684442927</Real>
+      </Vector>
+      <Vector Name="Time 0.044000 Step 44 F[2]">
+        <Real Name="X">-369.36237946334654</Real>
+        <Real Name="Y">-69.775803839351028</Real>
+        <Real Name="Z">-87.743936626605645</Real>
+      </Vector>
+      <Vector Name="Time 0.044000 Step 44 F[3]">
+        <Real Name="X">70.627898422805856</Real>
+        <Real Name="Y">-61.529634438505653</Real>
+        <Real Name="Z">96.020987952761516</Real>
+      </Vector>
+      <Vector Name="Time 0.048000 Step 48 F[0]">
+        <Real Name="X">-53.630108119971887</Real>
+        <Real Name="Y">41.007814115633622</Real>
+        <Real Name="Z">-76.660498889407634</Real>
+      </Vector>
+      <Vector Name="Time 0.048000 Step 48 F[1]">
+        <Real Name="X">367.84884771898669</Real>
+        <Real Name="Y">96.742918562017806</Real>
+        <Real Name="Z">66.692696725481014</Real>
+      </Vector>
+      <Vector Name="Time 0.048000 Step 48 F[2]">
+        <Real Name="X">-392.5859940785673</Real>
+        <Real Name="Y">-68.078169935686844</Real>
+        <Real Name="Z">-99.089175489421223</Real>
+      </Vector>
+      <Vector Name="Time 0.048000 Step 48 F[3]">
+        <Real Name="X">78.367254479552514</Real>
+        <Real Name="Y">-69.672562741964583</Real>
+        <Real Name="Z">109.05697765334784</Real>
+      </Vector>
+    </Mdrun>
+  </Simulation>
+</ReferenceData>
index 6899c4fb173218d21ca15ba95e708c742fe6709b..5a8f1ba94c8cbea20c058927c37b896d49628c9d 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0"?>
 <?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
 <ReferenceData>
-  <Simulation Name="spc5">
+  <Simulation Name="tip3p5">
     <Minimizer Name="steep">
       <Energy Name="Potential">
         <Real Name="Time 0.000000 Step 0 in frame 0">-9.6231425679441998</Real>
index 8e75a6a95365f06ed6273012d451f37a7ad5c3d6..8f66944976d29968bd1457b62808c4e40fb3e653 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0"?>
 <?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
 <ReferenceData>
-  <Simulation Name="spc5">
+  <Simulation Name="tip3p5">
     <Minimizer Name="cg">
       <Energy Name="Potential">
         <Real Name="Time 0.000000 Step 0 in frame 0">-9.6231425679441998</Real>
diff --git a/src/programs/mdrun/tests/refdata/NormalModesWorks_NormalModesTest_WithinTolerances_0.xml b/src/programs/mdrun/tests/refdata/NormalModesWorks_NormalModesTest_WithinTolerances_0.xml
new file mode 100644 (file)
index 0000000..11948dd
--- /dev/null
@@ -0,0 +1,74 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <System Name="scaled-water">
+    <Integrator Name="nm">
+      <XvgLegend Name="Legend">
+        <String Name="XvgLegend"><![CDATA[
+]]></String>
+      </XvgLegend>
+      <XvgData Name="Data">
+        <Sequence Name="Row0">
+          <Int Name="Length">2</Int>
+          <Real>7</Real>
+          <Real>0.068698</Real>
+        </Sequence>
+        <Sequence Name="Row1">
+          <Int Name="Length">2</Int>
+          <Real>8</Real>
+          <Real>0.311942</Real>
+        </Sequence>
+        <Sequence Name="Row2">
+          <Int Name="Length">2</Int>
+          <Real>9</Real>
+          <Real>0.318822</Real>
+        </Sequence>
+        <Sequence Name="Row3">
+          <Int Name="Length">2</Int>
+          <Real>10</Real>
+          <Real>0.916834</Real>
+        </Sequence>
+        <Sequence Name="Row4">
+          <Int Name="Length">2</Int>
+          <Real>11</Real>
+          <Real>3.24034</Real>
+        </Sequence>
+        <Sequence Name="Row5">
+          <Int Name="Length">2</Int>
+          <Real>12</Real>
+          <Real>13.6069</Real>
+        </Sequence>
+        <Sequence Name="Row6">
+          <Int Name="Length">2</Int>
+          <Real>13</Real>
+          <Real>14.2014</Real>
+        </Sequence>
+        <Sequence Name="Row7">
+          <Int Name="Length">2</Int>
+          <Real>14</Real>
+          <Real>39.3613</Real>
+        </Sequence>
+        <Sequence Name="Row8">
+          <Int Name="Length">2</Int>
+          <Real>15</Real>
+          <Real>5257.53</Real>
+        </Sequence>
+        <Sequence Name="Row9">
+          <Int Name="Length">2</Int>
+          <Real>16</Real>
+          <Real>5280.78</Real>
+        </Sequence>
+        <Sequence Name="Row10">
+          <Int Name="Length">2</Int>
+          <Real>17</Real>
+          <Real>5315.76</Real>
+        </Sequence>
+        <Sequence Name="Row11">
+          <Int Name="Length">2</Int>
+          <Real>18</Real>
+          <Real>5340.06</Real>
+        </Sequence>
+      </XvgData>
+    </Integrator>
+  </System>
+</ReferenceData>
diff --git a/src/programs/mdrun/tests/refdata/NormalModesWorks_NormalModesTest_WithinTolerances_1.xml b/src/programs/mdrun/tests/refdata/NormalModesWorks_NormalModesTest_WithinTolerances_1.xml
new file mode 100644 (file)
index 0000000..6b404dc
--- /dev/null
@@ -0,0 +1,234 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <System Name="villin">
+    <Integrator Name="nm">
+      <XvgLegend Name="Legend">
+        <String Name="XvgLegend"><![CDATA[
+]]></String>
+      </XvgLegend>
+      <XvgData Name="Data">
+        <Sequence Name="Row0">
+          <Int Name="Length">2</Int>
+          <Real>7</Real>
+          <Real>0.753154</Real>
+        </Sequence>
+        <Sequence Name="Row1">
+          <Int Name="Length">2</Int>
+          <Real>8</Real>
+          <Real>1.13727</Real>
+        </Sequence>
+        <Sequence Name="Row2">
+          <Int Name="Length">2</Int>
+          <Real>9</Real>
+          <Real>1.64238</Real>
+        </Sequence>
+        <Sequence Name="Row3">
+          <Int Name="Length">2</Int>
+          <Real>10</Real>
+          <Real>5.21099</Real>
+        </Sequence>
+        <Sequence Name="Row4">
+          <Int Name="Length">2</Int>
+          <Real>11</Real>
+          <Real>7.63161</Real>
+        </Sequence>
+        <Sequence Name="Row5">
+          <Int Name="Length">2</Int>
+          <Real>12</Real>
+          <Real>10.1597</Real>
+        </Sequence>
+        <Sequence Name="Row6">
+          <Int Name="Length">2</Int>
+          <Real>13</Real>
+          <Real>12.7895</Real>
+        </Sequence>
+        <Sequence Name="Row7">
+          <Int Name="Length">2</Int>
+          <Real>14</Real>
+          <Real>13.432</Real>
+        </Sequence>
+        <Sequence Name="Row8">
+          <Int Name="Length">2</Int>
+          <Real>15</Real>
+          <Real>16.4345</Real>
+        </Sequence>
+        <Sequence Name="Row9">
+          <Int Name="Length">2</Int>
+          <Real>16</Real>
+          <Real>19.3931</Real>
+        </Sequence>
+        <Sequence Name="Row10">
+          <Int Name="Length">2</Int>
+          <Real>17</Real>
+          <Real>23.6003</Real>
+        </Sequence>
+        <Sequence Name="Row11">
+          <Int Name="Length">2</Int>
+          <Real>18</Real>
+          <Real>27.9563</Real>
+        </Sequence>
+        <Sequence Name="Row12">
+          <Int Name="Length">2</Int>
+          <Real>19</Real>
+          <Real>29.88</Real>
+        </Sequence>
+        <Sequence Name="Row13">
+          <Int Name="Length">2</Int>
+          <Real>20</Real>
+          <Real>31.9625</Real>
+        </Sequence>
+        <Sequence Name="Row14">
+          <Int Name="Length">2</Int>
+          <Real>21</Real>
+          <Real>35.1576</Real>
+        </Sequence>
+        <Sequence Name="Row15">
+          <Int Name="Length">2</Int>
+          <Real>22</Real>
+          <Real>41.2246</Real>
+        </Sequence>
+        <Sequence Name="Row16">
+          <Int Name="Length">2</Int>
+          <Real>23</Real>
+          <Real>42.7061</Real>
+        </Sequence>
+        <Sequence Name="Row17">
+          <Int Name="Length">2</Int>
+          <Real>24</Real>
+          <Real>46.6857</Real>
+        </Sequence>
+        <Sequence Name="Row18">
+          <Int Name="Length">2</Int>
+          <Real>25</Real>
+          <Real>50.9545</Real>
+        </Sequence>
+        <Sequence Name="Row19">
+          <Int Name="Length">2</Int>
+          <Real>26</Real>
+          <Real>54.8514</Real>
+        </Sequence>
+        <Sequence Name="Row20">
+          <Int Name="Length">2</Int>
+          <Real>27</Real>
+          <Real>56.3073</Real>
+        </Sequence>
+        <Sequence Name="Row21">
+          <Int Name="Length">2</Int>
+          <Real>28</Real>
+          <Real>63.2007</Real>
+        </Sequence>
+        <Sequence Name="Row22">
+          <Int Name="Length">2</Int>
+          <Real>29</Real>
+          <Real>64.6087</Real>
+        </Sequence>
+        <Sequence Name="Row23">
+          <Int Name="Length">2</Int>
+          <Real>30</Real>
+          <Real>72.6079</Real>
+        </Sequence>
+        <Sequence Name="Row24">
+          <Int Name="Length">2</Int>
+          <Real>31</Real>
+          <Real>73.9597</Real>
+        </Sequence>
+        <Sequence Name="Row25">
+          <Int Name="Length">2</Int>
+          <Real>32</Real>
+          <Real>79.2567</Real>
+        </Sequence>
+        <Sequence Name="Row26">
+          <Int Name="Length">2</Int>
+          <Real>33</Real>
+          <Real>83.2</Real>
+        </Sequence>
+        <Sequence Name="Row27">
+          <Int Name="Length">2</Int>
+          <Real>34</Real>
+          <Real>94.9563</Real>
+        </Sequence>
+        <Sequence Name="Row28">
+          <Int Name="Length">2</Int>
+          <Real>35</Real>
+          <Real>97.5064</Real>
+        </Sequence>
+        <Sequence Name="Row29">
+          <Int Name="Length">2</Int>
+          <Real>36</Real>
+          <Real>103.01</Real>
+        </Sequence>
+        <Sequence Name="Row30">
+          <Int Name="Length">2</Int>
+          <Real>37</Real>
+          <Real>111.783</Real>
+        </Sequence>
+        <Sequence Name="Row31">
+          <Int Name="Length">2</Int>
+          <Real>38</Real>
+          <Real>126.957</Real>
+        </Sequence>
+        <Sequence Name="Row32">
+          <Int Name="Length">2</Int>
+          <Real>39</Real>
+          <Real>139.565</Real>
+        </Sequence>
+        <Sequence Name="Row33">
+          <Int Name="Length">2</Int>
+          <Real>40</Real>
+          <Real>141.97</Real>
+        </Sequence>
+        <Sequence Name="Row34">
+          <Int Name="Length">2</Int>
+          <Real>41</Real>
+          <Real>151.782</Real>
+        </Sequence>
+        <Sequence Name="Row35">
+          <Int Name="Length">2</Int>
+          <Real>42</Real>
+          <Real>174.771</Real>
+        </Sequence>
+        <Sequence Name="Row36">
+          <Int Name="Length">2</Int>
+          <Real>43</Real>
+          <Real>176.954</Real>
+        </Sequence>
+        <Sequence Name="Row37">
+          <Int Name="Length">2</Int>
+          <Real>44</Real>
+          <Real>186.777</Real>
+        </Sequence>
+        <Sequence Name="Row38">
+          <Int Name="Length">2</Int>
+          <Real>45</Real>
+          <Real>189.704</Real>
+        </Sequence>
+        <Sequence Name="Row39">
+          <Int Name="Length">2</Int>
+          <Real>46</Real>
+          <Real>198.895</Real>
+        </Sequence>
+        <Sequence Name="Row40">
+          <Int Name="Length">2</Int>
+          <Real>47</Real>
+          <Real>211.611</Real>
+        </Sequence>
+        <Sequence Name="Row41">
+          <Int Name="Length">2</Int>
+          <Real>48</Real>
+          <Real>216.338</Real>
+        </Sequence>
+        <Sequence Name="Row42">
+          <Int Name="Length">2</Int>
+          <Real>49</Real>
+          <Real>232.757</Real>
+        </Sequence>
+        <Sequence Name="Row43">
+          <Int Name="Length">2</Int>
+          <Real>50</Real>
+          <Real>240.872</Real>
+        </Sequence>
+      </XvgData>
+    </Integrator>
+  </System>
+</ReferenceData>
diff --git a/src/programs/mdrun/tests/refdata/NormalModesWorks_NormalModesTest_WithinTolerances_2.xml b/src/programs/mdrun/tests/refdata/NormalModesWorks_NormalModesTest_WithinTolerances_2.xml
new file mode 100644 (file)
index 0000000..a69c1e1
--- /dev/null
@@ -0,0 +1,74 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <System Name="spc-dimer">
+    <Integrator Name="nm">
+      <XvgLegend Name="Legend">
+        <String Name="XvgLegend"><![CDATA[
+]]></String>
+      </XvgLegend>
+      <XvgData Name="Data">
+        <Sequence Name="Row0">
+          <Int Name="Length">2</Int>
+          <Real>7</Real>
+          <Real>94.3948</Real>
+        </Sequence>
+        <Sequence Name="Row1">
+          <Int Name="Length">2</Int>
+          <Real>8</Real>
+          <Real>919.878</Real>
+        </Sequence>
+        <Sequence Name="Row2">
+          <Int Name="Length">2</Int>
+          <Real>9</Real>
+          <Real>1327.45</Real>
+        </Sequence>
+        <Sequence Name="Row3">
+          <Int Name="Length">2</Int>
+          <Real>10</Real>
+          <Real>2022.46</Real>
+        </Sequence>
+        <Sequence Name="Row4">
+          <Int Name="Length">2</Int>
+          <Real>11</Real>
+          <Real>6385.63</Real>
+        </Sequence>
+        <Sequence Name="Row5">
+          <Int Name="Length">2</Int>
+          <Real>12</Real>
+          <Real>16960.8</Real>
+        </Sequence>
+        <Sequence Name="Row6">
+          <Int Name="Length">2</Int>
+          <Real>13</Real>
+          <Real>82239.7</Real>
+        </Sequence>
+        <Sequence Name="Row7">
+          <Int Name="Length">2</Int>
+          <Real>14</Real>
+          <Real>87417.2</Real>
+        </Sequence>
+        <Sequence Name="Row8">
+          <Int Name="Length">2</Int>
+          <Real>15</Real>
+          <Real>347356</Real>
+        </Sequence>
+        <Sequence Name="Row9">
+          <Int Name="Length">2</Int>
+          <Real>16</Real>
+          <Real>359346</Real>
+        </Sequence>
+        <Sequence Name="Row10">
+          <Int Name="Length">2</Int>
+          <Real>17</Real>
+          <Real>367766</Real>
+        </Sequence>
+        <Sequence Name="Row11">
+          <Int Name="Length">2</Int>
+          <Real>18</Real>
+          <Real>371723</Real>
+        </Sequence>
+      </XvgData>
+    </Integrator>
+  </System>
+</ReferenceData>
diff --git a/src/programs/mdrun/tests/refdata/NormalModesWorks_NormalModesTest_WithinTolerances_3.xml b/src/programs/mdrun/tests/refdata/NormalModesWorks_NormalModesTest_WithinTolerances_3.xml
new file mode 100644 (file)
index 0000000..e5d6782
--- /dev/null
@@ -0,0 +1,29 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <System Name="one-tip5p">
+    <Integrator Name="nm">
+      <XvgLegend Name="Legend">
+        <String Name="XvgLegend"><![CDATA[
+]]></String>
+      </XvgLegend>
+      <XvgData Name="Data">
+        <Sequence Name="Row0">
+          <Int Name="Length">2</Int>
+          <Real>7</Real>
+          <Real>146045</Real>
+        </Sequence>
+        <Sequence Name="Row1">
+          <Int Name="Length">2</Int>
+          <Real>8</Real>
+          <Real>522628</Real>
+        </Sequence>
+        <Sequence Name="Row2">
+          <Int Name="Length">2</Int>
+          <Real>9</Real>
+          <Real>537704</Real>
+        </Sequence>
+      </XvgData>
+    </Integrator>
+  </System>
+</ReferenceData>
diff --git a/src/programs/mdrun/tests/refdata/NormalModesWorks_NormalModesTest_WithinTolerances_4.xml b/src/programs/mdrun/tests/refdata/NormalModesWorks_NormalModesTest_WithinTolerances_4.xml
new file mode 100644 (file)
index 0000000..d267b8f
--- /dev/null
@@ -0,0 +1,74 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <System Name="sw-dimer">
+    <Integrator Name="nm">
+      <XvgLegend Name="Legend">
+        <String Name="XvgLegend"><![CDATA[
+]]></String>
+      </XvgLegend>
+      <XvgData Name="Data">
+        <Sequence Name="Row0">
+          <Int Name="Length">2</Int>
+          <Real>7</Real>
+          <Real>284.327</Real>
+        </Sequence>
+        <Sequence Name="Row1">
+          <Int Name="Length">2</Int>
+          <Real>8</Real>
+          <Real>526.814</Real>
+        </Sequence>
+        <Sequence Name="Row2">
+          <Int Name="Length">2</Int>
+          <Real>9</Real>
+          <Real>2029.22</Real>
+        </Sequence>
+        <Sequence Name="Row3">
+          <Int Name="Length">2</Int>
+          <Real>10</Real>
+          <Real>5524.43</Real>
+        </Sequence>
+        <Sequence Name="Row4">
+          <Int Name="Length">2</Int>
+          <Real>11</Real>
+          <Real>8944.04</Real>
+        </Sequence>
+        <Sequence Name="Row5">
+          <Int Name="Length">2</Int>
+          <Real>12</Real>
+          <Real>9695.26</Real>
+        </Sequence>
+        <Sequence Name="Row6">
+          <Int Name="Length">2</Int>
+          <Real>13</Real>
+          <Real>13450.1</Real>
+        </Sequence>
+        <Sequence Name="Row7">
+          <Int Name="Length">2</Int>
+          <Real>14</Real>
+          <Real>40808.3</Real>
+        </Sequence>
+        <Sequence Name="Row8">
+          <Int Name="Length">2</Int>
+          <Real>15</Real>
+          <Real>100111</Real>
+        </Sequence>
+        <Sequence Name="Row9">
+          <Int Name="Length">2</Int>
+          <Real>16</Real>
+          <Real>384375</Real>
+        </Sequence>
+        <Sequence Name="Row10">
+          <Int Name="Length">2</Int>
+          <Real>17</Real>
+          <Real>480009</Real>
+        </Sequence>
+        <Sequence Name="Row11">
+          <Int Name="Length">2</Int>
+          <Real>18</Real>
+          <Real>496826</Real>
+        </Sequence>
+      </XvgData>
+    </Integrator>
+  </System>
+</ReferenceData>
index fe0743dce909da69fc2bbbd91933c6f0c553a8b2..29d9a49c013e39a6bfeb0bfcee8abe1dbae09ef8 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, 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.
 #include "gromacs/utility/stringutil.h"
 
 #include "testutils/mpitest.h"
+#include "testutils/simulationdatabase.h"
 #include "testutils/testasserts.h"
 
 #include "energycomparison.h"
 #include "energyreader.h"
 #include "mdruncomparison.h"
 #include "moduletest.h"
-#include "simulationdatabase.h"
 #include "trajectorycomparison.h"
 #include "trajectoryreader.h"
 
@@ -262,11 +262,11 @@ TEST_P(MdrunRerunTest, WithinTolerances)
 // tests can run in such configurations.
 #if GMX_GPU != GMX_GPU_OPENCL
 INSTANTIATE_TEST_CASE_P(NormalMdrunIsReproduced, MdrunRerunTest,
-                            ::testing::Combine(::testing::Values("argon12", "spc5", "alanine_vsite_vacuo"),
+                            ::testing::Combine(::testing::Values("argon12", "tip3p5", "alanine_vsite_vacuo"),
                                                    ::testing::Values("md", "md-vv", "bd", "sd")));
 #else
 INSTANTIATE_TEST_CASE_P(DISABLED_NormalMdrunIsReproduced, MdrunRerunTest,
-                            ::testing::Combine(::testing::Values("argon12", "spc5", "alanine_vsite_vacuo"),
+                            ::testing::Combine(::testing::Values("argon12", "tip3p5", "alanine_vsite_vacuo"),
                                                    ::testing::Values("md", "md-vv", "bd", "sd")));
 #endif
 
diff --git a/src/programs/mdrun/tests/simple_mdrun.cpp b/src/programs/mdrun/tests/simple_mdrun.cpp
new file mode 100644 (file)
index 0000000..b2fb82e
--- /dev/null
@@ -0,0 +1,209 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2019, 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
+ * Simple tests for the mdrun functionality.
+ *
+ * \author David van der Spoel <david.vanderspoel@icm.uu.se>
+ * \ingroup module_mdrun_integration_tests
+ */
+#include "gmxpre.h"
+
+#include <map>
+#include <memory>
+#include <string>
+#include <tuple>
+#include <unordered_map>
+#include <vector>
+
+#include <gtest/gtest.h>
+
+#include "gromacs/compat/make_unique.h"
+#include "gromacs/options/filenameoption.h"
+#include "gromacs/topology/idef.h"
+#include "gromacs/topology/ifunc.h"
+#include "gromacs/trajectory/trajectoryframe.h"
+#include "gromacs/utility/basenetwork.h"
+#include "gromacs/utility/filestream.h"
+#include "gromacs/utility/strconvert.h"
+#include "gromacs/utility/stringutil.h"
+
+#include "testutils/mpitest.h"
+#include "testutils/refdata.h"
+#include "testutils/simulationdatabase.h"
+#include "testutils/testasserts.h"
+#include "testutils/xvgtest.h"
+
+#include "energycomparison.h"
+#include "moduletest.h"
+#include "trajectoryreader.h"
+
+namespace gmx
+{
+namespace test
+{
+namespace
+{
+
+/*! \brief Database of enerngy tolerances for MD integrator on the various systems. */
+std::unordered_map<std::string, FloatingPointTolerance> energyToleranceForSystem_g =
+{{
+     {
+         "angles1",
+         relativeToleranceAsFloatingPoint(1, 1e-4)
+     }
+ }};
+
+/*! \brief Database of pressure
+   tolerances for MD integrator on the various systems. */
+std::unordered_map<std::string, FloatingPointTolerance> pressureToleranceForSystem_g =
+{{
+     {
+         "angles1",
+         relativeToleranceAsFloatingPoint(1, 1e-4)
+     }
+ }};
+
+//! Helper type
+using MdpField = MdpFieldValues::value_type;
+
+/*! \brief Test fixture base for simple mdrun systems
+ *
+ * This test ensures mdrun can run a simulation, reaching
+ * reproducible energies.
+ *
+ * The choices for tolerance are arbitrary but sufficient. */
+class SimpleMdrunTest : public MdrunTestFixture,
+                        public ::testing::WithParamInterface <
+                        std::tuple < std::string, std::string>>
+{
+};
+
+TEST_P(SimpleMdrunTest, WithinTolerances)
+{
+    auto params         = GetParam();
+    auto simulationName = std::get<0>(params);
+    auto integrator     = std::get<1>(params);
+    SCOPED_TRACE(formatString("Comparing simple mdrun for '%s'",
+                              simulationName.c_str()));
+
+    // TODO At some point we should also test PME-only ranks.
+    int numRanksAvailable = getNumberOfTestMpiRanks();
+    if (!isNumberOfPpRanksSupported(simulationName, numRanksAvailable))
+    {
+        fprintf(stdout, "Test system '%s' cannot run with %d ranks.\n"
+                "The supported numbers are: %s\n",
+                simulationName.c_str(), numRanksAvailable,
+                reportNumbersOfPpRanksSupported(simulationName).c_str());
+        return;
+    }
+    auto mdpFieldValues = prepareMdpFieldValues(simulationName.c_str(),
+                                                integrator.c_str(),
+                                                "no", "no");
+    mdpFieldValues["nsteps"]        = "50";
+    mdpFieldValues["nstfout"]       = "4";
+    mdpFieldValues["constraints"]   = "none";
+    mdpFieldValues["nstcalcenergy"] = "4";
+    mdpFieldValues.insert(MdpField("coulombtype", "Cut-off"));
+    mdpFieldValues.insert(MdpField("vdwtype", "Cut-off"));
+
+    // Prepare the .tpr file
+    {
+        CommandLine caller;
+        runner_.useTopGroAndNdxFromDatabase(simulationName);
+        runner_.useStringAsMdpFile(prepareMdpFileContents(mdpFieldValues));
+        EXPECT_EQ(0, runner_.callGrompp(caller));
+    }
+    // Do mdrun
+    {
+        CommandLine      mdrunCaller;
+        ASSERT_EQ(0, runner_.callMdrun(mdrunCaller));
+        EnergyTolerances energiesToMatch
+        {{
+             {
+                 interaction_function[F_EPOT].longname, energyToleranceForSystem_g.at(simulationName)
+             },
+             {
+                 interaction_function[F_EKIN].longname, energyToleranceForSystem_g.at(simulationName)
+             },
+             {
+                 interaction_function[F_PRES].longname, pressureToleranceForSystem_g.at(simulationName)
+             },
+         }};
+        TestReferenceData refData;
+        auto              checker = refData.rootChecker()
+                .checkCompound("Simulation", simulationName)
+                .checkCompound("Mdrun", integrator);
+        checkEnergiesAgainstReferenceData(runner_.edrFileName_,
+                                          energiesToMatch,
+                                          &checker);
+        // Now check the forces
+        TrajectoryFrameReader reader(runner_.fullPrecisionTrajectoryFileName_);
+        checker.setDefaultTolerance(relativeToleranceAsFloatingPoint(1, 1e-4));
+        do
+        {
+            auto frame = reader.frame();
+            auto force = frame.f();
+            int  atom  = 0;
+            for (auto &f : force)
+            {
+                std::string forceName = frame.frameName() + " F[" + toString(atom) + "]";
+
+                checker.checkVector(f, forceName.c_str());
+                atom++;
+            }
+        }
+        while (reader.readNextFrame());
+    }
+}
+
+//! Containers of systems to test.
+//! \{
+std::vector<std::string> systemsToTest_g = { "angles1" };
+std::vector<std::string> md_g            = { "md", "md-vv" };
+//! \}
+
+// The time for OpenCL kernel compilation means these tests might time
+// out. If that proves to be a problem, these can be disabled for
+// OpenCL builds. However, once that compilation is cached for the
+// lifetime of the whole test binary process, these tests should run in
+// such configurations.
+#if GMX_DOUBLE
+INSTANTIATE_TEST_CASE_P(Angles1, SimpleMdrunTest, ::testing::Combine(::testing::ValuesIn(systemsToTest_g), ::testing::ValuesIn(md_g)));
+#endif
+} // namespace
+} // namespace test
+} // namespace gmx
diff --git a/src/programs/mdrun/tests/spc-and-methanol.gro b/src/programs/mdrun/tests/spc-and-methanol.gro
deleted file mode 100644 (file)
index 4e937af..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-
- 6
-    1MeOH   Me1    1   1.970   1.460   1.209 -0.8587 -0.1344 -0.0643
-    1MeOH    O2    2   1.978   1.415   1.082  0.0623 -0.1787  0.0036
-    1MeOH    H3    3   1.905   1.460   1.030 -0.5020 -0.9564  0.0997
-    2SOL     OW    4   1.555   1.511   0.703   0.869   1.245   1.665
-    2SOL    HW1    5   1.498   1.495   0.784   0.169   0.275   1.565
-    2SOL    HW2    6   1.496   1.521   0.623   0.269   2.275   1.465
-   3.01000   3.01000   3.01000
diff --git a/src/programs/mdrun/tests/spc-and-methanol.ndx b/src/programs/mdrun/tests/spc-and-methanol.ndx
deleted file mode 100644 (file)
index d59ec6d..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-[ System ]
-   1    2    3    4    5   6
-[ Methanol ]
-   1    2    3
-[ SOL ]
-   4    5    6
diff --git a/src/programs/mdrun/tests/spc-and-methanol.top b/src/programs/mdrun/tests/spc-and-methanol.top
deleted file mode 100644 (file)
index 7f78ad6..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#include "gromos43a1.ff/forcefield.itp"
-#include "gromos43a1.ff/methanol.itp"
-#include "gromos43a1.ff/spc.itp"
-
-[ system ]
-; Name
-spc-and-methanol
-
-[ molecules ]
-; Compound  #mols
-Methanol    1
-SOL         1
index 195983f14f3d19ade35506aae937aee69d018061..40390a0a04a71c9450548b14ca2613b5b8e16bdc 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2013,2014,2015,2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2018,2019, 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.
@@ -80,7 +80,6 @@ TEST_F(CompelTest, SwapCanRun)
     const std::string mdpContents = R"(
         dt                       = 0.005
         nsteps                   = 2
-        define                   = -DPOSRES
         tcoupl                   = Berendsen
         tc-grps                  = System
         tau-t                    = 0.5
index e3dc3115f9e349b93c026503708be9c71d96eb53..1258a57f9d6a32580345c66f9aec23e1088df294 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2018, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019, 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.
@@ -118,7 +118,7 @@ TEST_P(TpiTest, ReproducesOutput)
         rtpi                     = 0.05
         nstlog                   = 0
         nstenergy                = 0
-        cutoff-scheme            = group
+        cutoff-scheme            = Verlet
         nstlist                  = 10
         ns_type                  = grid
         rlist                    = 0.9
@@ -139,7 +139,8 @@ TEST_P(TpiTest, ReproducesOutput)
     runTest();
 }
 
-INSTANTIATE_TEST_CASE_P(Simple, TpiTest, ::testing::Values(1993, 2994));
+// Should be re-enabled when TPI supports the Verlet scheme
+INSTANTIATE_TEST_CASE_P(DISABLED_Simple, TpiTest, ::testing::Values(1993, 2994));
 
 }  // namespace
 }  // namespace test
index f5439d8d942c81c7e9bb71f68a098b1b49f98b51..cbf3ebcb5c358ba2004ded597730f463ac9dfc9e 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2019, 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.
@@ -60,9 +60,9 @@ typedef char bmchar;
 
 #define XTextHeight(font) ((font)->max_bounds.ascent+(font)->max_bounds.descent)
 #define XDrawCircle(disp, win, gc, x, y, rad) \
-    XDrawArc(disp, win, gc, x-rad, y-rad, 2*rad, 2*rad, 0, 64*360)
+    XDrawArc(disp, win, gc, (x)-(rad), (y)-(rad), 2*(rad), 2*(rad), 0, 64*360)
 #define XFillCircle(disp, win, gc, x, y, rad) \
-    XFillArc(disp, win, gc, x-rad, y-rad, 2*rad, 2*rad, 0, 64*360)
+    XFillArc(disp, win, gc, (x)-(rad), (y)-(rad), 2*(rad), 2*(rad), 0, 64*360)
 
 #ifdef NEED_XSTUFF
 
index 8695978f12271963df28b263c7ca3ac8f67407d6..13766c0fcab2ef8b1ea35c5bb608b3eaf596d748 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017,2019, 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.
@@ -79,7 +79,7 @@ static void add_object(t_manager *man, eObject eO, int ai, int aj)
     man->obj[man->nobj-1].z     = 0.0;
 }
 
-static void add_bonds(t_manager *man, t_functype func[],
+static void add_bonds(t_manager *man, const t_functype func[],
                       t_ilist *b, bool bB[])
 {
     bool        *bH = man->bHydro;
@@ -155,7 +155,7 @@ static int which_atom(t_manager *man, int x, int y)
         {
             if (man->bVis[i])
             {
-                return (int) i;
+                return i;
             }
         }
     }
@@ -205,7 +205,6 @@ static void hide_label(t_x11 *x11, t_manager *man, int x, int y)
 void set_file(t_x11 *x11, t_manager *man, const char *trajectory,
               const char *status)
 {
-    gmx_atomprop_t    aps;
     t_tpxheader       sh;
     t_atoms          *at;
     bool             *bB;
@@ -246,7 +245,7 @@ void set_file(t_x11 *x11, t_manager *man, const char *trajectory,
     man->title.text = gmx_strdup(gmx::formatString("%s: %s", *man->top.name, gmx::getCoolQuote().c_str()).c_str());
     man->view       = init_view(man->box);
     at              = &(man->top.atoms);
-    aps             = gmx_atomprop_init();
+    AtomProperties aps;
     for (i = 0; (i < man->natom); i++)
     {
         char      *aname = *(at->atomname[i]);
@@ -267,18 +266,17 @@ void set_file(t_x11 *x11, t_manager *man, const char *trajectory,
         {
             man->vdw[i] = 0;
         }
-        else if (!gmx_atomprop_query(aps, epropVDW, *ri->name, aname, &(man->vdw[i])))
+        else if (!aps.setAtomProperty(epropVDW, *ri->name, aname, &(man->vdw[i])))
         {
             man->vdw[i] = 0;
         }
     }
-    gmx_atomprop_destroy(aps);
     add_bpl(man, &(man->top.idef), bB);
     for (i = 0; (i < man->natom); i++)
     {
         if (!bB[i])
         {
-            add_object(man, eOSingle, (int) i, 0);
+            add_object(man, eOSingle, i, 0);
         }
     }
     sfree(bB);
@@ -395,7 +393,7 @@ static bool step_man(t_manager *man, int *nat)
     return bEof;
 }
 
-static void HandleClient(t_x11 *x11, t_manager *man, long data[])
+static void HandleClient(t_x11 *x11, t_manager *man, const long data[])
 {
     int  ID, button, x, y;
     bool bPos;
index f5a7d551fc8b1cd72dfb9697edfece0db5634924..ed30a55a8bf200b3b39a2a91f1f1ed4028ad2ea5 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2019, 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.
@@ -166,7 +166,7 @@ extern void set_file(t_x11 *x11, t_manager *man, const char *trajectory,
 
 extern void map_man(t_x11 *x11, t_manager *man);
 
-extern void move_man(t_x11 *x11, t_manager *man, int width, int height);
+
 
 extern bool toggle_animate (t_x11 *x11, t_manager *man);
 
index 73804b25dbf456c351baef90eac819af57412b86..5bcc6993b69900749a5457cc0040bee70854b34f 100644 (file)
@@ -48,6 +48,7 @@ set(TESTUTILS_SOURCES
     mpitest.cpp
     refdata.cpp
     refdata-xml.cpp
+    simulationdatabase.cpp
     stdiohelper.cpp
     stringtest.cpp
     testasserts.cpp
index c2cdc40520734e132782066db68231deefa73f82..6d6a3b5efeadee714ac924ac0e2a1885d3817e82 100644 (file)
@@ -55,6 +55,7 @@
 #include "gromacs/commandline/cmdlineoptionsmodule.h"
 #include "gromacs/commandline/cmdlineprogramcontext.h"
 #include "gromacs/utility/arrayref.h"
+#include "gromacs/utility/futil.h"
 #include "gromacs/utility/gmxassert.h"
 #include "gromacs/utility/strconvert.h"
 #include "gromacs/utility/stringstream.h"
@@ -441,6 +442,21 @@ void CommandLineTestBase::setInputFile(
     setInputFile(option, filename.c_str());
 }
 
+void CommandLineTestBase::setModifiableInputFile(
+        const char *option, const std::string &filename)
+{
+    setModifiableInputFile(option, filename.c_str());
+}
+
+void CommandLineTestBase::setModifiableInputFile(
+        const char *option, const char *filename)
+{
+    std::string originalFileName   = gmx::test::TestFileManager::getInputFilePath(filename);
+    std::string modifiableFileName = fileManager().getTemporaryFilePath(filename);
+    gmx_file_copy(originalFileName.c_str(), modifiableFileName.c_str(), true);
+    impl_->cmdline_.addOption(option, modifiableFileName);
+}
+
 void CommandLineTestBase::setInputFileContents(
         const char *option, const char *extension, const std::string &contents)
 {
@@ -470,6 +486,26 @@ void CommandLineTestBase::setOutputFile(
     impl_->helper_.setOutputFile(&impl_->cmdline_, option, filename, matcher);
 }
 
+void CommandLineTestBase::setInputAndOutputFile(
+        const char *option, const char *filename,
+        const ITextBlockMatcherSettings &matcher)
+{
+    std::string originalFileName   = gmx::test::TestFileManager::getInputFilePath(filename);
+    std::string modifiableFileName = fileManager().getTemporaryFilePath(filename);
+    gmx_file_copy(originalFileName.c_str(), modifiableFileName.c_str(), true);
+    impl_->helper_.setOutputFile(&impl_->cmdline_, option, filename, matcher);
+}
+
+void CommandLineTestBase::setInputAndOutputFile(
+        const char *option, const char *filename,
+        const IFileMatcherSettings &matcher)
+{
+    std::string originalFileName   = gmx::test::TestFileManager::getInputFilePath(filename);
+    std::string modifiableFileName = fileManager().getTemporaryFilePath(filename);
+    gmx_file_copy(originalFileName.c_str(), modifiableFileName.c_str(), true);
+    impl_->helper_.setOutputFile(&impl_->cmdline_, option, filename, matcher);
+}
+
 CommandLine &CommandLineTestBase::commandLine()
 {
     return impl_->cmdline_;
index 1065022fd40dd12b252c9c1389f72caa5332cf56..4febb0d70e645ff95f8a431d37c66067be9c7577 100644 (file)
@@ -389,6 +389,17 @@ class CommandLineTestBase : public ::testing::Test
         void setInputFile(const char *option, const char *filename);
         //! \copydoc setInputFile(const char *, const char *);
         void setInputFile(const char *option, const std::string &filename);
+        /*! \brief
+         * Sets an input file that may be modified. The file is copied to a
+         * temporary file, which is used as the test input
+         *
+         * \param[in]     option    Option to set.
+         * \param[in]     filename  Name of the input file.
+         *
+         */
+        void setModifiableInputFile(const char *option, const char *filename);
+        //! \copydoc setModifiableInputFile(const char *, const char *);
+        void setModifiableInputFile(const char *option, const std::string &filename);
         /*! \brief
          * Generates and sets an input file.
          *
@@ -419,6 +430,15 @@ class CommandLineTestBase : public ::testing::Test
          */
         void setOutputFile(const char *option, const char *filename,
                            const IFileMatcherSettings &matcher);
+        /*! \brief
+         * Sets a file parameter that is used for input and modified as output. The input file
+         * is copied to a temporary file that is used as input and can be modified.
+         */
+        void setInputAndOutputFile(const char *option, const char *filename,
+                                   const ITextBlockMatcherSettings &matcher);
+        //! \copydoc setInputAndOutputFile(const char *, const char *, const ITextBlockMatcherSettings&);
+        void setInputAndOutputFile(const char *option, const char *filename,
+                                   const IFileMatcherSettings &matcher);
 
         /*! \brief
          * Returns the internal CommandLine object used to construct the
index af51f8a0280b788e618b0a4dfd18e91aa9858720..98043304be8de5e236f1b4e6e534c5401e6f8db4 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2011,2012,2013,2014,2015,2016,2017,2018,2019, 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.
 
 #include "gromacs/options/basicoptions.h"
 #include "gromacs/options/ioptionscontainer.h"
+#include "gromacs/utility/any.h"
 #include "gromacs/utility/exceptions.h"
 #include "gromacs/utility/gmxassert.h"
 #include "gromacs/utility/keyvaluetree.h"
 #include "gromacs/utility/path.h"
 #include "gromacs/utility/real.h"
 #include "gromacs/utility/stringutil.h"
-#include "gromacs/utility/variant.h"
 
 #include "testutils/refdata-checkers.h"
 #include "testutils/refdata-impl.h"
@@ -976,35 +976,35 @@ void TestReferenceChecker::checkVector(const double value[3], const char *id)
 }
 
 
-void TestReferenceChecker::checkVariant(const Variant &variant, const char *id)
+void TestReferenceChecker::checkAny(const Any &any, const char *id)
 {
-    if (variant.isType<bool>())
+    if (any.isType<bool>())
     {
-        checkBoolean(variant.cast<bool>(), id);
+        checkBoolean(any.cast<bool>(), id);
     }
-    else if (variant.isType<int>())
+    else if (any.isType<int>())
     {
-        checkInteger(variant.cast<int>(), id);
+        checkInteger(any.cast<int>(), id);
     }
-    else if (variant.isType<int64_t>())
+    else if (any.isType<int64_t>())
     {
-        checkInt64(variant.cast<int64_t>(), id);
+        checkInt64(any.cast<int64_t>(), id);
     }
-    else if (variant.isType<float>())
+    else if (any.isType<float>())
     {
-        checkFloat(variant.cast<float>(), id);
+        checkFloat(any.cast<float>(), id);
     }
-    else if (variant.isType<double>())
+    else if (any.isType<double>())
     {
-        checkDouble(variant.cast<double>(), id);
+        checkDouble(any.cast<double>(), id);
     }
-    else if (variant.isType<std::string>())
+    else if (any.isType<std::string>())
     {
-        checkString(variant.cast<std::string>(), id);
+        checkString(any.cast<std::string>(), id);
     }
     else
     {
-        GMX_THROW(TestException("Unsupported variant type"));
+        GMX_THROW(TestException("Unsupported any type"));
     }
 }
 
@@ -1033,7 +1033,7 @@ void TestReferenceChecker::checkKeyValueTreeValue(const KeyValueTreeValue &value
     }
     else
     {
-        checkVariant(value.asVariant(), id);
+        checkAny(value.asAny(), id);
     }
 }
 
index c1040949d737bc54c3b04bcad96b24f78b19fe5e..d6c04e448e11e6bd106c1384e99e3ecb262898dc 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2011,2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+ * Copyright (c) 2011,2012,2013,2014,2015,2016,2017,2018,2019, 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.
@@ -58,7 +58,7 @@ namespace gmx
 class IOptionsContainer;
 class KeyValueTreeObject;
 class KeyValueTreeValue;
-class Variant;
+class Any;
 
 namespace test
 {
@@ -374,8 +374,8 @@ class TestReferenceChecker
         void checkVector(const double value[3], const char *id);
         //! Check a single floating-point value from a string.
         void checkRealFromString(const std::string &value, const char *id);
-        //! Checks a variant value that contains a supported simple type.
-        void checkVariant(const Variant &value, const char *id);
+        //! Checks a any value that contains a supported simple type.
+        void checkAny(const Any &value, const char *id);
         //! Checks a key-value tree rooted at a object.
         void checkKeyValueTreeObject(const KeyValueTreeObject &tree, const char *id);
         //! Checks a generic key-value tree value.
similarity index 86%
rename from src/programs/mdrun/tests/simulationdatabase.cpp
rename to src/testutils/simulationdatabase.cpp
index bc25a861399e0f1c38fbf8ffcf8817b5a218cd62..2d94ad2a4f1201e329fff1bd26b693b7bf8d1861 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2016,2018, by the GROMACS development team, led by
+ * Copyright (c) 2016,2018,2019, 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.
@@ -37,7 +37,7 @@
  * Implements declarations from in simulationdatabase.h
  *
  * \author Mark Abraham <mark.j.abraham@gmail.com>
- * \ingroup module_mdrun_integration_tests
+ * \ingroup module_testutils
  */
 #include "gmxpre.h"
 
@@ -88,15 +88,15 @@ const MdpFileValues mdpFileValueDatabase_g
     },
     // Simple system with 5 water molecules, fairly widely separated
     {
-        "spc5", { { {
-                        "compressibility", "5e-10"
-                    },
+        "tip3p5", { { {
+                          "compressibility", "5e-10"
+                      },
+                      {
+                          "tau-p", "1000"
+                      } },
                     {
-                        "tau-p", "1000"
-                    } },
-                  {
-                      1, 2, 3, 4, 5, 6, 8, 9
-                  } }
+                        1, 2, 3, 4, 5, 6, 8, 9
+                    } }
     },
     // Simple system with 5832 argon atoms, suitable for normal pressure coupling
     {
@@ -168,6 +168,57 @@ const MdpFileValues mdpFileValueDatabase_g
                                               1, 2, 3, 4, 5, 6, 7, 8, 9
                                           } }
     },
+    // Simple mdrun tests of energy
+    {
+        "angles1", { { },
+                     {
+                         1, 2
+                     } }
+    },
+    // Scaled water for NMA
+    {
+        "scaled-water", { { },
+                          {
+                              1, 2, 3, 4, 5, 6
+                          } }
+    },
+    // Villin for NMA
+    {
+        "villin", { { },
+                    {
+                        1, 2, 3, 4, 5, 6
+                    } }
+    },
+    // SPC-Dimer for NMA
+    {
+        "spc-dimer", { { },
+                       {
+                           1, 2, 3, 4, 5, 6
+                       } }
+    },
+    // SW-Dimer for NMA
+    {
+        "sw-dimer", { { {
+                            "nstcalcenergy", "1"
+                        } },
+                      {
+                          1, 2, 3, 4, 5, 6
+                      } }
+    },
+    // TIP5P for NMA
+    {
+        "one-tip5p", { { },
+                       {
+                           1, 2, 3, 4, 5, 6
+                       } }
+    },
+    // ICE-Binding protein for NMA
+    {
+        "ice-binding", { { },
+                         {
+                             1, 2, 3, 4, 5, 6
+                         } }
+    },
     // Nonanol molecule in vacuo, topology suitable for testing FEP
     // on KE, angles, dihedral restraints, coulomb and vdw
     {
@@ -229,6 +280,9 @@ MdpFieldValues prepareDefaultMdpFieldValues(const char *simulationName)
     mdpFieldValues.insert(MdpField("compressibility", "5e-5"));
     mdpFieldValues.insert(MdpField("constraints", "none"));
     mdpFieldValues.insert(MdpField("other", ""));
+    mdpFieldValues.insert(MdpField("rcoulomb", "0.7"));
+    mdpFieldValues.insert(MdpField("rvdw", "0.7"));
+    mdpFieldValues.insert(MdpField("nstcalcenergy", "100"));
 
     return mdpFieldValues;
 }
@@ -289,8 +343,8 @@ prepareMdpFileContents(const MdpFieldValues &mdpFieldValues)
      * energies were not computed with those from rerun on the same
      * coordinates.
      */
-    return formatString(R"(rcoulomb                = 0.7
-                           rvdw                    = 0.7
+    return formatString(R"(rcoulomb                = %s
+                           rvdw                    = %s
                            rlist                   = -1
                            bd-fric                 = 1000
                            verlet-buffer-tolerance = 0.000001
@@ -315,7 +369,10 @@ prepareMdpFileContents(const MdpFieldValues &mdpFieldValues)
                            constraint-algorithm    = lincs
                            lincs-order             = 2
                            lincs-iter              = 5
+                           nstcalcenergy           = %s
                            %s)",
+                        mdpFieldValues.at("rcoulomb").c_str(),
+                        mdpFieldValues.at("rvdw").c_str(),
                         mdpFieldValues.at("nsteps").c_str(),
                         mdpFieldValues.at("integrator").c_str(),
                         mdpFieldValues.at("tcoupl").c_str(),
@@ -324,6 +381,7 @@ prepareMdpFileContents(const MdpFieldValues &mdpFieldValues)
                         mdpFieldValues.at("tau-p").c_str(),
                         mdpFieldValues.at("compressibility").c_str(),
                         mdpFieldValues.at("constraints").c_str(),
+                        mdpFieldValues.at("nstcalcenergy").c_str(),
                         mdpFieldValues.at("other").c_str());
 }
 
similarity index 93%
rename from src/programs/mdrun/tests/simulationdatabase.h
rename to src/testutils/simulationdatabase.h
index a3d4d89083f217dbd68ab268673ea3e6ebbb43cd..ae61dbc9407916dd52d18e957da707d7b488d2be 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2018, by the GROMACS development team, led by
+ * Copyright (c) 2018,2019, 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.
  * To help us fund GROMACS development, we humbly ask that you cite
  * the research papers on the package. Check out http://www.gromacs.org.
  */
-/*! \libinternal
+/*! \libinternal \file
  *
  * \brief Functionality for testing whether calls to mdrun produce the
  * same energy and force quantities when they should do so.
+ * \author Mark Abraham <mark.j.abraham@gmail.com>
+ * \inlibraryapi
+ * \ingroup module_testutils
  */
-#ifndef GMX_MDRUN_TESTS_SIMULATIONDATABASE_H
-#define GMX_MDRUN_TESTS_SIMULATIONDATABASE_H
+#ifndef GMX_TESTUTILS__SIMULATIONDATABASE_H
+#define GMX_TESTUTILS__SIMULATIONDATABASE_H
 
 #include <map>
 #include <string>
@@ -73,7 +76,7 @@ using MdpFieldValues = std::map<std::string, std::string>;
  * comparisons is available, whose \c simulationName keys are
  *     - argon12
  *     - argon5832
- *     - spc5
+ *     - tip3p5
  *     - spc216
  *     - alanine_vsite_vacuo
  *     - alanine_vsite_solvated
diff --git a/src/testutils/simulationdatabase/angles1.gro b/src/testutils/simulationdatabase/angles1.gro
new file mode 100644 (file)
index 0000000..e35137d
--- /dev/null
@@ -0,0 +1,7 @@
+This_incredible_box_of_butane
+    4
+    1BUT     C1    1   1.459   1.683   1.495  0.2896  0.6955 -0.1160
+    1BUT     C2    2   1.268   1.546   1.546  0.2706 -0.0710 -0.1176
+    1BUT     C3    3   1.304   1.427   1.684 -0.1283 -0.1121  0.2082
+    1BUT     C4    4   1.113   1.302   1.788 -0.4224 -0.5246  0.0316
+  12.46298  12.46298  12.46298
diff --git a/src/testutils/simulationdatabase/angles1.top b/src/testutils/simulationdatabase/angles1.top
new file mode 100644 (file)
index 0000000..cb0f737
--- /dev/null
@@ -0,0 +1,72 @@
+;
+;      User beckers (20078)
+;      Tue Jan  4 11:14:03 1994
+;      System
+;
+#define ANGLES
+[ defaults ]
+; nbfunc       comb-rule       gen-pairs       fudgeLJ fudgeQQ
+  1            1               no              1.0     1.0
+
+[ atomtypes ]
+;name        mass      charge   ptype            c6           c12
+#ifdef LJ
+  CH2    14.02700       0.000       A   0.90975E-02    0.35333E-04
+  CH3    15.03500       0.000       A   0.88765E-02    0.26150E-04
+#else          
+  CH2    14.02700       0.000       A   0.0            0.0
+  CH3    15.03500       0.000       A   0.0            0.0
+#endif
+
+[ moleculetype ]
+;             name    nrexcl
+            butane   3
+
+[ atoms ]
+;   nr    type   resnr  residu    atom    cgnr        charge          mass
+     1     CH3       1     BUT      C1       1
+     2     CH2       1     BUT      C2       2
+     3     CH2       1     BUT      C3       3
+     4     CH3       1     BUT      C4       4
+
+[ bonds ]
+;  ai    aj funct           c0           c1
+#ifdef BONDS     
+    1     2     1 1.530000e-01         3.347000e+05 
+    2     3     1 1.530000e-01         3.347000e+05 
+    3     4     1 1.530000e-01         3.347000e+05 
+#endif
+#ifdef G96BONDS
+    1     2     2 1.530000e-01         14297920.0
+    2     3     2 1.530000e-01         14297920.0
+    3     4     2 1.530000e-01         14297920.0
+#endif
+
+[ angles ]
+;  ai    aj    ak funct           c0           c1
+#ifdef ANGLES
+    1     2     3     1 1.110000e+02   4.602000e+02 
+    4     3     2     1 1.110000e+02   4.602000e+02 
+#endif
+#ifdef G96ANGLES
+    1     2     3     2 1.110000e+02   528
+    4     3     2     2 1.110000e+02   528
+#endif
+
+[ dihedrals ]
+;  ai    aj    ak    al funct   c0      c1           c2
+#ifdef DIHS
+    1     2     3     4     1          0.0     5.857600e+00 3.000000e+00 
+#endif
+#ifdef RYCKAERTS
+    1     2     3     4     3 9.2789   12.156  -13.120 -3.0597 26.240 -31.495
+#endif
+
+[ system ]
+; The name of the system to be simulated
+This_incredible_box_of_butane
+
+[ molecules ]
+; Molname             Number
+Butane                 1
+
diff --git a/src/testutils/simulationdatabase/butane1.ndx b/src/testutils/simulationdatabase/butane1.ndx
new file mode 100644 (file)
index 0000000..779e460
--- /dev/null
@@ -0,0 +1,2 @@
+[ System ]
+   1    2    3    4
diff --git a/src/testutils/simulationdatabase/mindist.ndx b/src/testutils/simulationdatabase/mindist.ndx
new file mode 100644 (file)
index 0000000..3b54e32
--- /dev/null
@@ -0,0 +1,12 @@
+[ atom1 ]
+1
+[ atom2 ]
+2
+[ atom3 ]
+3
+[ atoms12 ]
+1 2
+[ atoms23 ]
+2 3
+[ atoms123 ]
+1 2 3
diff --git a/src/testutils/simulationdatabase/mindist_coords.gro b/src/testutils/simulationdatabase/mindist_coords.gro
new file mode 100644 (file)
index 0000000..5205564
--- /dev/null
@@ -0,0 +1,6 @@
+mindist_beads
+    3
+    1A        A    1   1.000   3.000   3.000
+    2A        A    2   4.000   3.000   3.000
+    2B        B    3   4.500   3.000   3.000
+   5.00000   5.00000   5.00000
\ No newline at end of file
diff --git a/src/testutils/simulationdatabase/one-tip5p.g96 b/src/testutils/simulationdatabase/one-tip5p.g96
new file mode 100644 (file)
index 0000000..5500254
--- /dev/null
@@ -0,0 +1,13 @@
+TITLE
+1 TIP5P
+END
+POSITION
+    1 SOL   OW         1    0.320905924    1.613866529    0.603274297
+    1 SOL   HW1        2    0.377193341    1.643166954    0.674936910
+    1 SOL   HW2        3    0.257900736    1.554966518    0.644788793
+    1 SOL   LP1        4    0.288185980    1.668227613    0.573706149
+    1 SOL   LP2        5    0.358259894    1.579923712    0.554771064
+END
+BOX
+   12.500070000   12.500070000   12.500070000
+END
diff --git a/src/testutils/simulationdatabase/one-tip5p.ndx b/src/testutils/simulationdatabase/one-tip5p.ndx
new file mode 100644 (file)
index 0000000..94e0adf
--- /dev/null
@@ -0,0 +1,2 @@
+[ System ]
+   1    2    3    4    5
diff --git a/src/testutils/simulationdatabase/one-tip5p.top b/src/testutils/simulationdatabase/one-tip5p.top
new file mode 100644 (file)
index 0000000..28b0a3f
--- /dev/null
@@ -0,0 +1,56 @@
+#include "oplsaa.ff/forcefield.itp"
+
+; original reference: [M. W. Mahoney and W. L. Jorgensen, J. Chem. Phys. 112 , 2000]
+;
+; Note that there are various issues with tip5p and the different forcefields.
+; Discussion is here: http://redmine.gromacs.org/issues/1348
+
+[ moleculetype ]
+; molname       nrexcl
+SOL             2
+
+[ atoms ]
+; id    at type res nr  residu name     at name         cg nr   charge
+1       opls_118     1       SOL              OW             1       0
+2       opls_119     1       SOL             HW1             1       0.241
+3       opls_119     1       SOL             HW2             1       0.241
+4       opls_120     1       SOL             LP1             1      -0.241
+5       opls_120     1       SOL             LP2             1      -0.241
+
+[ bonds ]
+; i     j       funct   length  force.c.
+1       2       1       0.09572 502416.0 0.09572        502416.0
+1       3       1       0.09572 502416.0 0.09572        502416.0
+
+[ angles ]
+; i     j       k       funct   angle   force.c.
+2       1       3       1       104.52  628.02  104.52  628.02
+
+[ virtual_sites3 ]
+; The position of the virtual site is computed as follows:
+;
+; The distance from OW to L is 0.07 nm, the geometry is tetrahedral
+; (109.47 deg)
+; Therefore, a = b = 0.07 * cos (109.47/2) / | xOH1 + xOH2 |
+;            c = 0.07 * sin (109.47/2) / | xOH1 X xOH2 |
+;
+; Using | xOH1 X xOH2 | = | xOH1 | | xOH2 | sin (H1-O-H2)
+;       | xOH1 + xOH2 | = 2 | xOH1 | cos (H1-O-H2)
+; Vsite pos x4 = x1 + a*x21 + b*x31 + c*(x21 X x31)
+
+; Vsite from                    funct   a       b               c
+4       1       2       3       4       -0.344908  -0.344908  -6.4437903493
+5       1       2       3       4       -0.344908  -0.344908   6.4437903493
+
+[ exclusions ]
+1       2       3       4       5
+2       1       3       4       5
+3       1       2       4       5
+4       1       2       3       5
+5       1       2       3       4
+
+[ system ]
+1 TIP5P
+
+[ molecules ]
+SOL 1
diff --git a/src/testutils/simulationdatabase/scaled-water.g96 b/src/testutils/simulationdatabase/scaled-water.g96
new file mode 100644 (file)
index 0000000..4aee8f4
--- /dev/null
@@ -0,0 +1,14 @@
+TITLE
+2 scaled waters
+END
+POSITION
+    1 SOL   OW         1    0.914818904   17.114674936   24.974532564
+    1 SOL   HW1        2    1.207239659   16.434171182   24.367718701
+    1 SOL   HW2        3    1.794362088   17.256320895    0.323592571
+    2 SOL   OW         4    2.688663748   14.887261002   23.182636745
+    2 SOL   HW1        5    2.999853477   14.939893657   22.278872288
+    2 SOL   HW2        6    2.760097525   13.938314213   23.286543655
+END
+BOX
+   25.001000000   25.001000000   25.001000000
+END
diff --git a/src/testutils/simulationdatabase/scaled-water.ndx b/src/testutils/simulationdatabase/scaled-water.ndx
new file mode 100644 (file)
index 0000000..03ad1d8
--- /dev/null
@@ -0,0 +1,6 @@
+[ System ]
+   1    2    3    4    5    6
+[ Water ]
+   1    2    3    4    5    6
+[ SOL ]
+   1    2    3    4    5    6
diff --git a/src/testutils/simulationdatabase/scaled-water.top b/src/testutils/simulationdatabase/scaled-water.top
new file mode 100644 (file)
index 0000000..e7add3c
--- /dev/null
@@ -0,0 +1,34 @@
+[ defaults ]
+; nbfunc        comb-rule       gen-pairs       fudgeLJ fudgeQQ
+1               3               yes             0.5     0.5
+
+[ atomtypes ]
+; full atom descriptions are available in ffoplsaa.atp
+; name  bond_type    mass    charge   ptype   sigma      epsilon
+ OW   O  8      15.99940     0.000       A    3          50
+ HW   H  1       1.00800     0.000       A    0.00000e+00  0.00000e+00
+
+[ moleculetype ]
+; molname       nrexcl
+SOL             2
+
+[ atoms ]
+; id    at type res nr  residu name     at name         cg nr   charge
+1       OW     1       SOL              OW             1      -0.6
+2       HW     1       SOL             HW1             1       0.3
+3       HW     1       SOL             HW2             1       0.3
+
+[ bonds ]
+; i     j       funct   length  force.c.
+1       2       1       0.9572 5024.0
+1       3       1       0.9572 5024.0
+
+[ angles ]
+; i     j       k       funct   angle   force.c.
+2       1       3       1       100.0  6.0
+
+[ system ]
+2 scaled waters
+
+[ molecules ]
+SOL 2
index 5ad1a6e3bb7f3e6382c1a4a1d9e904afaa1c8607..11013a3a1b49c485e8f6b8f9554a1ab3817a5af2 100644 (file)
@@ -6,4 +6,4 @@
     2SOL     OW    4   1.555   1.511   0.703   0.869   1.245   1.665
     2SOL    HW1    5   1.498   1.495   0.784   0.169   0.275   1.565
     2SOL    HW2    6   1.496   1.521   0.623   0.269   2.275   1.465
-   30.0000   30.0000   30.0000
+    3.0100    3.0100    3.0100
diff --git a/src/testutils/simulationdatabase/spc-dimer.g96 b/src/testutils/simulationdatabase/spc-dimer.g96
new file mode 100644 (file)
index 0000000..c2f22e4
--- /dev/null
@@ -0,0 +1,14 @@
+TITLE
+flex spc dimer
+END
+POSITION
+    1 SOL   OW         1    0.107010772    1.683192707    2.473043682
+    1 SOL   HW1        2    0.160090735    1.615077199    2.417969596
+    1 SOL   HW2        3    0.171349747    1.729056724    2.533939606
+    2 SOL   OW         4    0.257783861    1.504703191    2.331507471
+    2 SOL   HW1        5    0.283683457    1.519119514    2.235567800
+    2 SOL   HW2        6    0.256584968    1.405914249    2.349461497
+END
+BOX
+   12.500100000   12.500100000   12.500100000
+END
diff --git a/src/testutils/simulationdatabase/spc-dimer.ndx b/src/testutils/simulationdatabase/spc-dimer.ndx
new file mode 100644 (file)
index 0000000..903d4be
--- /dev/null
@@ -0,0 +1,2 @@
+[ System ]
+   1    2    3    4    5    6
diff --git a/src/testutils/simulationdatabase/spc-dimer.top b/src/testutils/simulationdatabase/spc-dimer.top
new file mode 100644 (file)
index 0000000..dc95762
--- /dev/null
@@ -0,0 +1,13 @@
+; 
+; Topology file for SPC
+;
+#define FLEXIBLE
+#include "oplsaa.ff/forcefield.itp"
+#include "oplsaa.ff/spc.itp"
+
+[ system ]
+flex spc dimer
+
+[ molecules ]
+SOL 2
+
diff --git a/src/testutils/simulationdatabase/spc5.ndx b/src/testutils/simulationdatabase/spc5.ndx
new file mode 100644 (file)
index 0000000..f4d5754
--- /dev/null
@@ -0,0 +1,3 @@
+[ water ]
+1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
+
diff --git a/src/testutils/simulationdatabase/spc5.pdb b/src/testutils/simulationdatabase/spc5.pdb
new file mode 100644 (file)
index 0000000..bdfa478
--- /dev/null
@@ -0,0 +1,572 @@
+REMARK    GENERATED BY TRJCONV
+TITLE     water t=   0.00000 step= 0
+REMARK    THIS IS A SIMULATION BOX
+CRYST1   18.621   18.621   18.621  90.00  90.00  90.00 P 1           1
+MODEL        1
+ATOM      1  OW  SOL     1      15.330   9.890   2.320  1.00  0.00           O
+ATOM      2  HW1 SOL     1      14.660   9.590   1.570  1.00  0.00           H
+ATOM      3  HW2 SOL     1      16.140  10.370   1.940  1.00  0.00           H
+ATOM      4  OW  SOL     2       2.280   7.430  11.030  1.00  0.00           O
+ATOM      5  HW1 SOL     2       1.510   8.060  11.060  1.00  0.00           H
+ATOM      6  HW2 SOL     2       2.870   7.560  11.840  1.00  0.00           H
+ATOM      7  OW  SOL     3      12.700   6.440   2.270  1.00  0.00           O
+ATOM      8  HW1 SOL     3      12.510   7.190   1.580  1.00  0.00           H
+ATOM      9  HW2 SOL     3      13.090   5.670   1.730  1.00  0.00           H
+ATOM     10  OW  SOL     4       4.350  18.020   9.590  1.00  0.00           O
+ATOM     11  HW1 SOL     4       4.350  18.060  10.600  1.00  0.00           H
+ATOM     12  HW2 SOL     4       3.370  18.160   9.350  1.00  0.00           H
+ATOM     13  OW  SOL     5       3.080  11.360   9.950  1.00  0.00           O
+ATOM     14  HW1 SOL     5       2.890  12.320  10.040  1.00  0.00           H
+ATOM     15  HW2 SOL     5       3.360  11.090  10.880  1.00  0.00           H
+TER
+ENDMDL
+REMARK    GENERATED BY TRJCONV
+TITLE     water t=   0.00400 step= 20
+REMARK    THIS IS A SIMULATION BOX
+CRYST1   18.621   18.621   18.621  90.00  90.00  90.00 P 1           1
+MODEL        2
+ATOM      1  OW  SOL     1      15.360   9.890   2.320  1.00  0.00           O
+ATOM      2  HW1 SOL     1      14.740   9.620   1.560  1.00  0.00           H
+ATOM      3  HW2 SOL     1      16.160  10.400   1.920  1.00  0.00           H
+ATOM      4  OW  SOL     2       2.280   7.430  11.000  1.00  0.00           O
+ATOM      5  HW1 SOL     2       1.530   8.190  11.010  1.00  0.00           H
+ATOM      6  HW2 SOL     2       2.860   7.650  11.850  1.00  0.00           H
+ATOM      7  OW  SOL     3      12.670   6.450   2.280  1.00  0.00           O
+ATOM      8  HW1 SOL     3      12.500   7.180   1.640  1.00  0.00           H
+ATOM      9  HW2 SOL     3      13.140   5.720   1.750  1.00  0.00           H
+ATOM     10  OW  SOL     4       4.330  18.040   9.590  1.00  0.00           O
+ATOM     11  HW1 SOL     4       4.280  18.100  10.610  1.00  0.00           H
+ATOM     12  HW2 SOL     4       3.360  18.140   9.330  1.00  0.00           H
+ATOM     13  OW  SOL     5       3.080  11.340   9.940  1.00  0.00           O
+ATOM     14  HW1 SOL     5       2.820  12.330  10.000  1.00  0.00           H
+ATOM     15  HW2 SOL     5       3.280  11.140  10.900  1.00  0.00           H
+TER
+ENDMDL
+REMARK    GENERATED BY TRJCONV
+TITLE     water t=   0.00800 step= 40
+REMARK    THIS IS A SIMULATION BOX
+CRYST1   18.621   18.621   18.621  90.00  90.00  90.00 P 1           1
+MODEL        3
+ATOM      1  OW  SOL     1      15.400   9.890   2.330  1.00  0.00           O
+ATOM      2  HW1 SOL     1      14.800   9.670   1.540  1.00  0.00           H
+ATOM      3  HW2 SOL     1      16.130  10.390   1.880  1.00  0.00           H
+ATOM      4  OW  SOL     2       2.280   7.430  10.970  1.00  0.00           O
+ATOM      5  HW1 SOL     2       1.670   8.180  10.950  1.00  0.00           H
+ATOM      6  HW2 SOL     2       2.800   7.680  11.790  1.00  0.00           H
+ATOM      7  OW  SOL     3      12.650   6.450   2.290  1.00  0.00           O
+ATOM      8  HW1 SOL     3      12.520   7.210   1.650  1.00  0.00           H
+ATOM      9  HW2 SOL     3      13.190   5.770   1.750  1.00  0.00           H
+ATOM     10  OW  SOL     4       4.310  18.050   9.590  1.00  0.00           O
+ATOM     11  HW1 SOL     4       4.220  18.120  10.590  1.00  0.00           H
+ATOM     12  HW2 SOL     4       3.330  18.130   9.280  1.00  0.00           H
+ATOM     13  OW  SOL     5       3.080  11.330   9.930  1.00  0.00           O
+ATOM     14  HW1 SOL     5       2.770  12.310   9.910  1.00  0.00           H
+ATOM     15  HW2 SOL     5       3.210  11.140  10.970  1.00  0.00           H
+TER
+ENDMDL
+REMARK    GENERATED BY TRJCONV
+TITLE     water t=   0.01200 step= 60
+REMARK    THIS IS A SIMULATION BOX
+CRYST1   18.621   18.621   18.621  90.00  90.00  90.00 P 1           1
+MODEL        4
+ATOM      1  OW  SOL     1      15.430   9.890   2.350  1.00  0.00           O
+ATOM      2  HW1 SOL     1      14.800   9.690   1.530  1.00  0.00           H
+ATOM      3  HW2 SOL     1      16.160  10.410   1.830  1.00  0.00           H
+ATOM      4  OW  SOL     2       2.290   7.440  10.950  1.00  0.00           O
+ATOM      5  HW1 SOL     2       1.660   8.260  10.840  1.00  0.00           H
+ATOM      6  HW2 SOL     2       2.810   7.660  11.810  1.00  0.00           H
+ATOM      7  OW  SOL     3      12.620   6.450   2.290  1.00  0.00           O
+ATOM      8  HW1 SOL     3      12.530   7.250   1.650  1.00  0.00           H
+ATOM      9  HW2 SOL     3      13.230   5.840   1.750  1.00  0.00           H
+ATOM     10  OW  SOL     4       4.290  18.070   9.590  1.00  0.00           O
+ATOM     11  HW1 SOL     4       4.170  18.160  10.600  1.00  0.00           H
+ATOM     12  HW2 SOL     4       3.350  18.150   9.230  1.00  0.00           H
+ATOM     13  OW  SOL     5       3.070  11.320   9.930  1.00  0.00           O
+ATOM     14  HW1 SOL     5       2.760  12.250   9.790  1.00  0.00           H
+ATOM     15  HW2 SOL     5       3.120  11.170  10.900  1.00  0.00           H
+TER
+ENDMDL
+REMARK    GENERATED BY TRJCONV
+TITLE     water t=   0.01600 step= 80
+REMARK    THIS IS A SIMULATION BOX
+CRYST1   18.621   18.621   18.621  90.00  90.00  90.00 P 1           1
+MODEL        5
+ATOM      1  OW  SOL     1      15.460   9.890   2.350  1.00  0.00           O
+ATOM      2  HW1 SOL     1      14.790   9.690   1.640  1.00  0.00           H
+ATOM      3  HW2 SOL     1      16.180  10.400   1.840  1.00  0.00           H
+ATOM      4  OW  SOL     2       2.290   7.450  10.930  1.00  0.00           O
+ATOM      5  HW1 SOL     2       1.670   8.260  10.730  1.00  0.00           H
+ATOM      6  HW2 SOL     2       2.820   7.600  11.810  1.00  0.00           H
+ATOM      7  OW  SOL     3      12.600   6.450   2.290  1.00  0.00           O
+ATOM      8  HW1 SOL     3      12.540   7.240   1.730  1.00  0.00           H
+ATOM      9  HW2 SOL     3      13.260   5.880   1.760  1.00  0.00           H
+ATOM     10  OW  SOL     4       4.260  18.090   9.590  1.00  0.00           O
+ATOM     11  HW1 SOL     4       4.110  18.190  10.590  1.00  0.00           H
+ATOM     12  HW2 SOL     4       3.340  18.200   9.170  1.00  0.00           H
+ATOM     13  OW  SOL     5       3.060  11.310   9.920  1.00  0.00           O
+ATOM     14  HW1 SOL     5       2.740  12.260   9.670  1.00  0.00           H
+ATOM     15  HW2 SOL     5       3.060  11.200  10.950  1.00  0.00           H
+TER
+ENDMDL
+REMARK    GENERATED BY TRJCONV
+TITLE     water t=   0.02000 step= 100
+REMARK    THIS IS A SIMULATION BOX
+CRYST1   18.621   18.621   18.621  90.00  90.00  90.00 P 1           1
+MODEL        6
+ATOM      1  OW  SOL     1      15.500   9.880   2.360  1.00  0.00           O
+ATOM      2  HW1 SOL     1      14.720   9.690   1.710  1.00  0.00           H
+ATOM      3  HW2 SOL     1      16.210  10.380   1.840  1.00  0.00           H
+ATOM      4  OW  SOL     2       2.290   7.460  10.910  1.00  0.00           O
+ATOM      5  HW1 SOL     2       1.740   8.210  10.680  1.00  0.00           H
+ATOM      6  HW2 SOL     2       2.760   7.580  11.780  1.00  0.00           H
+ATOM      7  OW  SOL     3      12.590   6.450   2.290  1.00  0.00           O
+ATOM      8  HW1 SOL     3      12.510   7.330   1.770  1.00  0.00           H
+ATOM      9  HW2 SOL     3      13.260   5.880   1.780  1.00  0.00           H
+ATOM     10  OW  SOL     4       4.230  18.100   9.590  1.00  0.00           O
+ATOM     11  HW1 SOL     4       4.040  18.240  10.580  1.00  0.00           H
+ATOM     12  HW2 SOL     4       3.340  18.280   9.130  1.00  0.00           H
+ATOM     13  OW  SOL     5       3.050  11.290   9.900  1.00  0.00           O
+ATOM     14  HW1 SOL     5       2.750  12.200   9.610  1.00  0.00           H
+ATOM     15  HW2 SOL     5       3.020  11.270  10.950  1.00  0.00           H
+TER
+ENDMDL
+REMARK    GENERATED BY TRJCONV
+TITLE     water t=   0.02400 step= 120
+REMARK    THIS IS A SIMULATION BOX
+CRYST1   18.621   18.621   18.621  90.00  90.00  90.00 P 1           1
+MODEL        7
+ATOM      1  OW  SOL     1      15.520   9.880   2.380  1.00  0.00           O
+ATOM      2  HW1 SOL     1      14.710   9.720   1.780  1.00  0.00           H
+ATOM      3  HW2 SOL     1      16.250  10.350   1.790  1.00  0.00           H
+ATOM      4  OW  SOL     2       2.300   7.460  10.880  1.00  0.00           O
+ATOM      5  HW1 SOL     2       1.710   8.320  10.660  1.00  0.00           H
+ATOM      6  HW2 SOL     2       2.720   7.630  11.830  1.00  0.00           H
+ATOM      7  OW  SOL     3      12.580   6.450   2.280  1.00  0.00           O
+ATOM      8  HW1 SOL     3      12.480   7.350   1.850  1.00  0.00           H
+ATOM      9  HW2 SOL     3      13.260   5.880   1.800  1.00  0.00           H
+ATOM     10  OW  SOL     4       4.200  18.110   9.590  1.00  0.00           O
+ATOM     11  HW1 SOL     4       3.960  18.290  10.570  1.00  0.00           H
+ATOM     12  HW2 SOL     4       3.350  18.380   9.120  1.00  0.00           H
+ATOM     13  OW  SOL     5       3.040  11.280   9.890  1.00  0.00           O
+ATOM     14  HW1 SOL     5       2.760  12.170   9.550  1.00  0.00           H
+ATOM     15  HW2 SOL     5       3.000  11.340  10.870  1.00  0.00           H
+TER
+ENDMDL
+REMARK    GENERATED BY TRJCONV
+TITLE     water t=   0.02800 step= 140
+REMARK    THIS IS A SIMULATION BOX
+CRYST1   18.621   18.621   18.621  90.00  90.00  90.00 P 1           1
+MODEL        8
+ATOM      1  OW  SOL     1      15.550   9.870   2.390  1.00  0.00           O
+ATOM      2  HW1 SOL     1      14.740   9.770   1.820  1.00  0.00           H
+ATOM      3  HW2 SOL     1      16.220  10.270   1.740  1.00  0.00           H
+ATOM      4  OW  SOL     2       2.310   7.460  10.860  1.00  0.00           O
+ATOM      5  HW1 SOL     2       1.770   8.270  10.690  1.00  0.00           H
+ATOM      6  HW2 SOL     2       2.650   7.670  11.810  1.00  0.00           H
+ATOM      7  OW  SOL     3      12.570   6.450   2.280  1.00  0.00           O
+ATOM      8  HW1 SOL     3      12.460   7.360   1.900  1.00  0.00           H
+ATOM      9  HW2 SOL     3      13.250   5.900   1.760  1.00  0.00           H
+ATOM     10  OW  SOL     4       4.170  18.130   9.590  1.00  0.00           O
+ATOM     11  HW1 SOL     4       3.900  18.320  10.550  1.00  0.00           H
+ATOM     12  HW2 SOL     4       3.360  18.490   9.080  1.00  0.00           H
+ATOM     13  OW  SOL     5       3.030  11.260   9.870  1.00  0.00           O
+ATOM     14  HW1 SOL     5       2.750  12.170   9.480  1.00  0.00           H
+ATOM     15  HW2 SOL     5       3.000  11.380  10.930  1.00  0.00           H
+TER
+ENDMDL
+REMARK    GENERATED BY TRJCONV
+TITLE     water t=   0.03200 step= 160
+REMARK    THIS IS A SIMULATION BOX
+CRYST1   18.621   18.621   18.621  90.00  90.00  90.00 P 1           1
+MODEL        9
+ATOM      1  OW  SOL     1      15.580   9.870   2.410  1.00  0.00           O
+ATOM      2  HW1 SOL     1      14.710   9.800   1.840  1.00  0.00           H
+ATOM      3  HW2 SOL     1      16.240  10.190   1.690  1.00  0.00           H
+ATOM      4  OW  SOL     2       2.320   7.470  10.850  1.00  0.00           O
+ATOM      5  HW1 SOL     2       1.750   8.270  10.670  1.00  0.00           H
+ATOM      6  HW2 SOL     2       2.620   7.650  11.790  1.00  0.00           H
+ATOM      7  OW  SOL     3      12.560   6.440   2.280  1.00  0.00           O
+ATOM      8  HW1 SOL     3      12.430   7.410   1.890  1.00  0.00           H
+ATOM      9  HW2 SOL     3      13.220   5.970   1.670  1.00  0.00           H
+ATOM     10  OW  SOL     4       4.140  18.140   9.590  1.00  0.00           O
+ATOM     11  HW1 SOL     4       3.860  18.340  10.560  1.00  0.00           H
+ATOM     12  HW2 SOL     4       3.410  18.590   9.050  1.00  0.00           H
+ATOM     13  OW  SOL     5       3.020  11.250   9.850  1.00  0.00           O
+ATOM     14  HW1 SOL     5       2.760  12.100   9.430  1.00  0.00           H
+ATOM     15  HW2 SOL     5       3.000  11.340  10.850  1.00  0.00           H
+TER
+ENDMDL
+REMARK    GENERATED BY TRJCONV
+TITLE     water t=   0.03600 step= 180
+REMARK    THIS IS A SIMULATION BOX
+CRYST1   18.621   18.621   18.621  90.00  90.00  90.00 P 1           1
+MODEL       10
+ATOM      1  OW  SOL     1      15.600   9.860   2.420  1.00  0.00           O
+ATOM      2  HW1 SOL     1      14.720   9.830   1.920  1.00  0.00           H
+ATOM      3  HW2 SOL     1      16.300  10.110   1.700  1.00  0.00           H
+ATOM      4  OW  SOL     2       2.320   7.470  10.830  1.00  0.00           O
+ATOM      5  HW1 SOL     2       1.690   8.290  10.610  1.00  0.00           H
+ATOM      6  HW2 SOL     2       2.670   7.590  11.830  1.00  0.00           H
+ATOM      7  OW  SOL     3      12.550   6.440   2.270  1.00  0.00           O
+ATOM      8  HW1 SOL     3      12.380   7.350   1.930  1.00  0.00           H
+ATOM      9  HW2 SOL     3      13.170   6.050   1.550  1.00  0.00           H
+ATOM     10  OW  SOL     4       4.100  18.160   9.590  1.00  0.00           O
+ATOM     11  HW1 SOL     4       3.840  18.330  10.570  1.00  0.00           H
+ATOM     12  HW2 SOL     4       3.450  18.680   9.020  1.00  0.00           H
+ATOM     13  OW  SOL     5       3.010  11.230   9.830  1.00  0.00           O
+ATOM     14  HW1 SOL     5       2.740  12.100   9.370  1.00  0.00           H
+ATOM     15  HW2 SOL     5       2.970  11.290  10.840  1.00  0.00           H
+TER
+ENDMDL
+REMARK    GENERATED BY TRJCONV
+TITLE     water t=   0.04000 step= 200
+REMARK    THIS IS A SIMULATION BOX
+CRYST1   18.621   18.621   18.621  90.00  90.00  90.00 P 1           1
+MODEL       11
+ATOM      1  OW  SOL     1      15.610   9.850   2.430  1.00  0.00           O
+ATOM      2  HW1 SOL     1      14.700   9.840   1.980  1.00  0.00           H
+ATOM      3  HW2 SOL     1      16.340  10.050   1.750  1.00  0.00           H
+ATOM      4  OW  SOL     2       2.320   7.470  10.820  1.00  0.00           O
+ATOM      5  HW1 SOL     2       1.730   8.200  10.620  1.00  0.00           H
+ATOM      6  HW2 SOL     2       2.690   7.530  11.770  1.00  0.00           H
+ATOM      7  OW  SOL     3      12.560   6.430   2.260  1.00  0.00           O
+ATOM      8  HW1 SOL     3      12.260   7.380   1.970  1.00  0.00           H
+ATOM      9  HW2 SOL     3      13.090   6.110   1.470  1.00  0.00           H
+ATOM     10  OW  SOL     4       4.070  18.180   9.600  1.00  0.00           O
+ATOM     11  HW1 SOL     4       3.790  18.310  10.570  1.00  0.00           H
+ATOM     12  HW2 SOL     4       3.460  18.760   9.010  1.00  0.00           H
+ATOM     13  OW  SOL     5       3.000  11.220   9.800  1.00  0.00           O
+ATOM     14  HW1 SOL     5       2.700  12.090   9.380  1.00  0.00           H
+ATOM     15  HW2 SOL     5       2.910  11.260  10.870  1.00  0.00           H
+TER
+ENDMDL
+REMARK    GENERATED BY TRJCONV
+TITLE     water t=   0.04400 step= 220
+REMARK    THIS IS A SIMULATION BOX
+CRYST1   18.621   18.621   18.621  90.00  90.00  90.00 P 1           1
+MODEL       12
+ATOM      1  OW  SOL     1      15.630   9.850   2.450  1.00  0.00           O
+ATOM      2  HW1 SOL     1      14.710   9.860   1.970  1.00  0.00           H
+ATOM      3  HW2 SOL     1      16.390  10.020   1.750  1.00  0.00           H
+ATOM      4  OW  SOL     2       2.330   7.470  10.810  1.00  0.00           O
+ATOM      5  HW1 SOL     2       1.680   8.270  10.670  1.00  0.00           H
+ATOM      6  HW2 SOL     2       2.710   7.520  11.750  1.00  0.00           H
+ATOM      7  OW  SOL     3      12.560   6.430   2.250  1.00  0.00           O
+ATOM      8  HW1 SOL     3      12.130   7.350   2.040  1.00  0.00           H
+ATOM      9  HW2 SOL     3      13.020   6.140   1.390  1.00  0.00           H
+ATOM     10  OW  SOL     4       4.040  18.200   9.600  1.00  0.00           O
+ATOM     11  HW1 SOL     4       3.720  18.300  10.570  1.00  0.00           H
+ATOM     12  HW2 SOL     4       3.460  18.820   9.060  1.00  0.00           H
+ATOM     13  OW  SOL     5       2.990  11.210   9.780  1.00  0.00           O
+ATOM     14  HW1 SOL     5       2.660  12.080   9.430  1.00  0.00           H
+ATOM     15  HW2 SOL     5       2.830  11.220  10.750  1.00  0.00           H
+TER
+ENDMDL
+REMARK    GENERATED BY TRJCONV
+TITLE     water t=   0.04800 step= 240
+REMARK    THIS IS A SIMULATION BOX
+CRYST1   18.621   18.621   18.621  90.00  90.00  90.00 P 1           1
+MODEL       13
+ATOM      1  OW  SOL     1      15.630   9.840   2.470  1.00  0.00           O
+ATOM      2  HW1 SOL     1      14.790   9.880   1.930  1.00  0.00           H
+ATOM      3  HW2 SOL     1      16.360  10.010   1.770  1.00  0.00           H
+ATOM      4  OW  SOL     2       2.330   7.460  10.790  1.00  0.00           O
+ATOM      5  HW1 SOL     2       1.700   8.270  10.770  1.00  0.00           H
+ATOM      6  HW2 SOL     2       2.720   7.540  11.770  1.00  0.00           H
+ATOM      7  OW  SOL     3      12.560   6.440   2.240  1.00  0.00           O
+ATOM      8  HW1 SOL     3      12.040   7.270   2.140  1.00  0.00           H
+ATOM      9  HW2 SOL     3      12.960   6.170   1.340  1.00  0.00           H
+ATOM     10  OW  SOL     4       4.010  18.220   9.600  1.00  0.00           O
+ATOM     11  HW1 SOL     4       3.660  18.270  10.550  1.00  0.00           H
+ATOM     12  HW2 SOL     4       3.410  18.880   9.100  1.00  0.00           H
+ATOM     13  OW  SOL     5       2.980  11.210   9.760  1.00  0.00           O
+ATOM     14  HW1 SOL     5       2.600  12.110   9.460  1.00  0.00           H
+ATOM     15  HW2 SOL     5       2.740  11.150  10.780  1.00  0.00           H
+TER
+ENDMDL
+REMARK    GENERATED BY TRJCONV
+TITLE     water t=   0.05200 step= 260
+REMARK    THIS IS A SIMULATION BOX
+CRYST1   18.621   18.621   18.621  90.00  90.00  90.00 P 1           1
+MODEL       14
+ATOM      1  OW  SOL     1      15.640   9.830   2.490  1.00  0.00           O
+ATOM      2  HW1 SOL     1      14.820   9.880   1.850  1.00  0.00           H
+ATOM      3  HW2 SOL     1      16.360  10.030   1.800  1.00  0.00           H
+ATOM      4  OW  SOL     2       2.330   7.460  10.780  1.00  0.00           O
+ATOM      5  HW1 SOL     2       1.730   8.230  10.850  1.00  0.00           H
+ATOM      6  HW2 SOL     2       2.720   7.520  11.690  1.00  0.00           H
+ATOM      7  OW  SOL     3      12.570   6.430   2.220  1.00  0.00           O
+ATOM      8  HW1 SOL     3      11.940   7.270   2.180  1.00  0.00           H
+ATOM      9  HW2 SOL     3      12.890   6.240   1.290  1.00  0.00           H
+ATOM     10  OW  SOL     4       3.980  18.240   9.600  1.00  0.00           O
+ATOM     11  HW1 SOL     4       3.620  18.200  10.560  1.00  0.00           H
+ATOM     12  HW2 SOL     4       3.360  18.890   9.130  1.00  0.00           H
+ATOM     13  OW  SOL     5       2.960  11.210   9.740  1.00  0.00           O
+ATOM     14  HW1 SOL     5       2.570  12.090   9.480  1.00  0.00           H
+ATOM     15  HW2 SOL     5       2.710  11.050  10.740  1.00  0.00           H
+TER
+ENDMDL
+REMARK    GENERATED BY TRJCONV
+TITLE     water t=   0.05600 step= 280
+REMARK    THIS IS A SIMULATION BOX
+CRYST1   18.621   18.621   18.621  90.00  90.00  90.00 P 1           1
+MODEL       15
+ATOM      1  OW  SOL     1      15.630   9.830   2.500  1.00  0.00           O
+ATOM      2  HW1 SOL     1      14.850   9.850   1.850  1.00  0.00           H
+ATOM      3  HW2 SOL     1      16.420  10.070   1.850  1.00  0.00           H
+ATOM      4  OW  SOL     2       2.330   7.460  10.770  1.00  0.00           O
+ATOM      5  HW1 SOL     2       1.660   8.280  10.860  1.00  0.00           H
+ATOM      6  HW2 SOL     2       2.790   7.440  11.700  1.00  0.00           H
+ATOM      7  OW  SOL     3      12.570   6.430   2.210  1.00  0.00           O
+ATOM      8  HW1 SOL     3      11.950   7.210   2.190  1.00  0.00           H
+ATOM      9  HW2 SOL     3      12.840   6.320   1.220  1.00  0.00           H
+ATOM     10  OW  SOL     4       3.960  18.270   9.590  1.00  0.00           O
+ATOM     11  HW1 SOL     4       3.630  18.110  10.550  1.00  0.00           H
+ATOM     12  HW2 SOL     4       3.290  18.870   9.130  1.00  0.00           H
+ATOM     13  OW  SOL     5       2.940  11.220   9.730  1.00  0.00           O
+ATOM     14  HW1 SOL     5       2.540  12.100   9.490  1.00  0.00           H
+ATOM     15  HW2 SOL     5       2.720  10.970  10.660  1.00  0.00           H
+TER
+ENDMDL
+REMARK    GENERATED BY TRJCONV
+TITLE     water t=   0.06000 step= 300
+REMARK    THIS IS A SIMULATION BOX
+CRYST1   18.621   18.621   18.621  90.00  90.00  90.00 P 1           1
+MODEL       16
+ATOM      1  OW  SOL     1      15.620   9.840   2.510  1.00  0.00           O
+ATOM      2  HW1 SOL     1      14.850   9.800   1.850  1.00  0.00           H
+ATOM      3  HW2 SOL     1      16.440  10.110   1.970  1.00  0.00           H
+ATOM      4  OW  SOL     2       2.320   7.460  10.770  1.00  0.00           O
+ATOM      5  HW1 SOL     2       1.680   8.210  10.830  1.00  0.00           H
+ATOM      6  HW2 SOL     2       2.840   7.380  11.660  1.00  0.00           H
+ATOM      7  OW  SOL     3      12.570   6.420   2.200  1.00  0.00           O
+ATOM      8  HW1 SOL     3      11.960   7.220   2.210  1.00  0.00           H
+ATOM      9  HW2 SOL     3      12.800   6.370   1.230  1.00  0.00           H
+ATOM     10  OW  SOL     4       3.940  18.290   9.590  1.00  0.00           O
+ATOM     11  HW1 SOL     4       3.640  18.030  10.520  1.00  0.00           H
+ATOM     12  HW2 SOL     4       3.180  18.830   9.130  1.00  0.00           H
+ATOM     13  OW  SOL     5       2.920  11.220   9.710  1.00  0.00           O
+ATOM     14  HW1 SOL     5       2.500  12.140   9.530  1.00  0.00           H
+ATOM     15  HW2 SOL     5       2.700  10.920  10.710  1.00  0.00           H
+TER
+ENDMDL
+REMARK    GENERATED BY TRJCONV
+TITLE     water t=   0.06400 step= 320
+REMARK    THIS IS A SIMULATION BOX
+CRYST1   18.621   18.621   18.621  90.00  90.00  90.00 P 1           1
+MODEL       17
+ATOM      1  OW  SOL     1      15.610   9.840   2.520  1.00  0.00           O
+ATOM      2  HW1 SOL     1      14.850   9.760   1.820  1.00  0.00           H
+ATOM      3  HW2 SOL     1      16.460  10.180   2.030  1.00  0.00           H
+ATOM      4  OW  SOL     2       2.320   7.460  10.760  1.00  0.00           O
+ATOM      5  HW1 SOL     2       1.640   8.220  10.830  1.00  0.00           H
+ATOM      6  HW2 SOL     2       2.820   7.400  11.610  1.00  0.00           H
+ATOM      7  OW  SOL     3      12.570   6.410   2.190  1.00  0.00           O
+ATOM      8  HW1 SOL     3      11.950   7.250   2.270  1.00  0.00           H
+ATOM      9  HW2 SOL     3      12.800   6.370   1.210  1.00  0.00           H
+ATOM     10  OW  SOL     4       3.920  18.310   9.580  1.00  0.00           O
+ATOM     11  HW1 SOL     4       3.620  17.970  10.500  1.00  0.00           H
+ATOM     12  HW2 SOL     4       3.090  18.740   9.170  1.00  0.00           H
+ATOM     13  OW  SOL     5       2.890  11.230   9.700  1.00  0.00           O
+ATOM     14  HW1 SOL     5       2.490  12.130   9.620  1.00  0.00           H
+ATOM     15  HW2 SOL     5       2.720  10.970  10.650  1.00  0.00           H
+TER
+ENDMDL
+REMARK    GENERATED BY TRJCONV
+TITLE     water t=   0.06800 step= 340
+REMARK    THIS IS A SIMULATION BOX
+CRYST1   18.621   18.621   18.621  90.00  90.00  90.00 P 1           1
+MODEL       18
+ATOM      1  OW  SOL     1      15.590   9.840   2.530  1.00  0.00           O
+ATOM      2  HW1 SOL     1      14.920   9.730   1.790  1.00  0.00           H
+ATOM      3  HW2 SOL     1      16.410  10.250   2.030  1.00  0.00           H
+ATOM      4  OW  SOL     2       2.320   7.460  10.750  1.00  0.00           O
+ATOM      5  HW1 SOL     2       1.620   8.250  10.860  1.00  0.00           H
+ATOM      6  HW2 SOL     2       2.830   7.490  11.680  1.00  0.00           H
+ATOM      7  OW  SOL     3      12.570   6.420   2.180  1.00  0.00           O
+ATOM      8  HW1 SOL     3      12.010   7.220   2.330  1.00  0.00           H
+ATOM      9  HW2 SOL     3      12.810   6.320   1.200  1.00  0.00           H
+ATOM     10  OW  SOL     4       3.900  18.320   9.570  1.00  0.00           O
+ATOM     11  HW1 SOL     4       3.600  17.950  10.460  1.00  0.00           H
+ATOM     12  HW2 SOL     4       2.990  18.660   9.190  1.00  0.00           H
+ATOM     13  OW  SOL     5       2.860  11.240   9.680  1.00  0.00           O
+ATOM     14  HW1 SOL     5       2.480  12.170   9.680  1.00  0.00           H
+ATOM     15  HW2 SOL     5       2.750  11.010  10.670  1.00  0.00           H
+TER
+ENDMDL
+REMARK    GENERATED BY TRJCONV
+TITLE     water t=   0.07200 step= 360
+REMARK    THIS IS A SIMULATION BOX
+CRYST1   18.621   18.621   18.621  90.00  90.00  90.00 P 1           1
+MODEL       19
+ATOM      1  OW  SOL     1      15.580   9.840   2.530  1.00  0.00           O
+ATOM      2  HW1 SOL     1      14.940   9.700   1.730  1.00  0.00           H
+ATOM      3  HW2 SOL     1      16.330  10.310   2.020  1.00  0.00           H
+ATOM      4  OW  SOL     2       2.320   7.470  10.750  1.00  0.00           O
+ATOM      5  HW1 SOL     2       1.670   8.200  10.850  1.00  0.00           H
+ATOM      6  HW2 SOL     2       2.780   7.600  11.650  1.00  0.00           H
+ATOM      7  OW  SOL     3      12.570   6.410   2.170  1.00  0.00           O
+ATOM      8  HW1 SOL     3      12.000   7.260   2.360  1.00  0.00           H
+ATOM      9  HW2 SOL     3      12.780   6.300   1.220  1.00  0.00           H
+ATOM     10  OW  SOL     4       3.870  18.330   9.550  1.00  0.00           O
+ATOM     11  HW1 SOL     4       3.610  17.960  10.460  1.00  0.00           H
+ATOM     12  HW2 SOL     4       2.960  18.630   9.170  1.00  0.00           H
+ATOM     13  OW  SOL     5       2.830  11.250   9.680  1.00  0.00           O
+ATOM     14  HW1 SOL     5       2.500  12.210   9.690  1.00  0.00           H
+ATOM     15  HW2 SOL     5       2.800  11.000  10.710  1.00  0.00           H
+TER
+ENDMDL
+REMARK    GENERATED BY TRJCONV
+TITLE     water t=   0.07600 step= 380
+REMARK    THIS IS A SIMULATION BOX
+CRYST1   18.621   18.621   18.621  90.00  90.00  90.00 P 1           1
+MODEL       20
+ATOM      1  OW  SOL     1      15.560   9.840   2.520  1.00  0.00           O
+ATOM      2  HW1 SOL     1      14.920   9.650   1.750  1.00  0.00           H
+ATOM      3  HW2 SOL     1      16.300  10.390   2.020  1.00  0.00           H
+ATOM      4  OW  SOL     2       2.320   7.480  10.750  1.00  0.00           O
+ATOM      5  HW1 SOL     2       1.600   8.250  10.780  1.00  0.00           H
+ATOM      6  HW2 SOL     2       2.770   7.680  11.630  1.00  0.00           H
+ATOM      7  OW  SOL     3      12.580   6.410   2.180  1.00  0.00           O
+ATOM      8  HW1 SOL     3      12.010   7.250   2.320  1.00  0.00           H
+ATOM      9  HW2 SOL     3      12.720   6.300   1.170  1.00  0.00           H
+ATOM     10  OW  SOL     4       3.850  18.330   9.540  1.00  0.00           O
+ATOM     11  HW1 SOL     4       3.640  18.000  10.470  1.00  0.00           H
+ATOM     12  HW2 SOL     4       2.970  18.640   9.130  1.00  0.00           H
+ATOM     13  OW  SOL     5       2.800  11.260   9.680  1.00  0.00           O
+ATOM     14  HW1 SOL     5       2.560  12.230   9.660  1.00  0.00           H
+ATOM     15  HW2 SOL     5       2.860  10.990  10.630  1.00  0.00           H
+TER
+ENDMDL
+REMARK    GENERATED BY TRJCONV
+TITLE     water t=   0.08000 step= 400
+REMARK    THIS IS A SIMULATION BOX
+CRYST1   18.621   18.621   18.621  90.00  90.00  90.00 P 1           1
+MODEL       21
+ATOM      1  OW  SOL     1      15.540   9.840   2.500  1.00  0.00           O
+ATOM      2  HW1 SOL     1      14.870   9.580   1.790  1.00  0.00           H
+ATOM      3  HW2 SOL     1      16.260  10.420   2.070  1.00  0.00           H
+ATOM      4  OW  SOL     2       2.320   7.510  10.750  1.00  0.00           O
+ATOM      5  HW1 SOL     2       1.600   8.230  10.680  1.00  0.00           H
+ATOM      6  HW2 SOL     2       2.840   7.720  11.670  1.00  0.00           H
+ATOM      7  OW  SOL     3      12.590   6.410   2.190  1.00  0.00           O
+ATOM      8  HW1 SOL     3      12.010   7.210   2.270  1.00  0.00           H
+ATOM      9  HW2 SOL     3      12.650   6.300   1.200  1.00  0.00           H
+ATOM     10  OW  SOL     4       3.820  18.330   9.520  1.00  0.00           O
+ATOM     11  HW1 SOL     4       3.650  18.080  10.480  1.00  0.00           H
+ATOM     12  HW2 SOL     4       2.940  18.700   9.090  1.00  0.00           H
+ATOM     13  OW  SOL     5       2.760  11.270   9.680  1.00  0.00           O
+ATOM     14  HW1 SOL     5       2.620  12.290   9.640  1.00  0.00           H
+ATOM     15  HW2 SOL     5       2.890  10.970  10.680  1.00  0.00           H
+TER
+ENDMDL
+REMARK    GENERATED BY TRJCONV
+TITLE     water t=   0.08400 step= 420
+REMARK    THIS IS A SIMULATION BOX
+CRYST1   18.621   18.621   18.621  90.00  90.00  90.00 P 1           1
+MODEL       22
+ATOM      1  OW  SOL     1      15.530   9.830   2.480  1.00  0.00           O
+ATOM      2  HW1 SOL     1      14.810   9.520   1.790  1.00  0.00           H
+ATOM      3  HW2 SOL     1      16.240  10.420   2.050  1.00  0.00           H
+ATOM      4  OW  SOL     2       2.320   7.540  10.760  1.00  0.00           O
+ATOM      5  HW1 SOL     2       1.610   8.210  10.610  1.00  0.00           H
+ATOM      6  HW2 SOL     2       2.820   7.730  11.600  1.00  0.00           H
+ATOM      7  OW  SOL     3      12.600   6.400   2.200  1.00  0.00           O
+ATOM      8  HW1 SOL     3      11.960   7.220   2.280  1.00  0.00           H
+ATOM      9  HW2 SOL     3      12.620   6.250   1.210  1.00  0.00           H
+ATOM     10  OW  SOL     4       3.800  18.330   9.500  1.00  0.00           O
+ATOM     11  HW1 SOL     4       3.610  18.180  10.500  1.00  0.00           H
+ATOM     12  HW2 SOL     4       2.960  18.740   9.120  1.00  0.00           H
+ATOM     13  OW  SOL     5       2.740  11.280   9.680  1.00  0.00           O
+ATOM     14  HW1 SOL     5       2.700  12.290   9.660  1.00  0.00           H
+ATOM     15  HW2 SOL     5       2.850  11.020  10.670  1.00  0.00           H
+TER
+ENDMDL
+REMARK    GENERATED BY TRJCONV
+TITLE     water t=   0.08800 step= 440
+REMARK    THIS IS A SIMULATION BOX
+CRYST1   18.621   18.621   18.621  90.00  90.00  90.00 P 1           1
+MODEL       23
+ATOM      1  OW  SOL     1      15.500   9.820   2.460  1.00  0.00           O
+ATOM      2  HW1 SOL     1      14.830   9.510   1.780  1.00  0.00           H
+ATOM      3  HW2 SOL     1      16.220  10.370   1.940  1.00  0.00           H
+ATOM      4  OW  SOL     2       2.330   7.570  10.750  1.00  0.00           O
+ATOM      5  HW1 SOL     2       1.580   8.300  10.620  1.00  0.00           H
+ATOM      6  HW2 SOL     2       2.810   7.800  11.640  1.00  0.00           H
+ATOM      7  OW  SOL     3      12.600   6.410   2.210  1.00  0.00           O
+ATOM      8  HW1 SOL     3      11.960   7.170   2.320  1.00  0.00           H
+ATOM      9  HW2 SOL     3      12.650   6.160   1.200  1.00  0.00           H
+ATOM     10  OW  SOL     4       3.790  18.310   9.490  1.00  0.00           O
+ATOM     11  HW1 SOL     4       3.580  18.290  10.480  1.00  0.00           H
+ATOM     12  HW2 SOL     4       2.930  18.780   9.140  1.00  0.00           H
+ATOM     13  OW  SOL     5       2.710  11.290   9.690  1.00  0.00           O
+ATOM     14  HW1 SOL     5       2.780  12.290   9.680  1.00  0.00           H
+ATOM     15  HW2 SOL     5       2.750  11.070  10.660  1.00  0.00           H
+TER
+ENDMDL
+REMARK    GENERATED BY TRJCONV
+TITLE     water t=   0.09200 step= 460
+REMARK    THIS IS A SIMULATION BOX
+CRYST1   18.621   18.621   18.621  90.00  90.00  90.00 P 1           1
+MODEL       24
+ATOM      1  OW  SOL     1      15.480   9.810   2.440  1.00  0.00           O
+ATOM      2  HW1 SOL     1      14.810   9.510   1.730  1.00  0.00           H
+ATOM      3  HW2 SOL     1      16.170  10.250   1.830  1.00  0.00           H
+ATOM      4  OW  SOL     2       2.330   7.600  10.740  1.00  0.00           O
+ATOM      5  HW1 SOL     2       1.640   8.300  10.710  1.00  0.00           H
+ATOM      6  HW2 SOL     2       2.780   7.830  11.670  1.00  0.00           H
+ATOM      7  OW  SOL     3      12.610   6.410   2.220  1.00  0.00           O
+ATOM      8  HW1 SOL     3      11.930   7.160   2.350  1.00  0.00           H
+ATOM      9  HW2 SOL     3      12.680   6.100   1.280  1.00  0.00           H
+ATOM     10  OW  SOL     4       3.770  18.300   9.480  1.00  0.00           O
+ATOM     11  HW1 SOL     4       3.590  18.350  10.480  1.00  0.00           H
+ATOM     12  HW2 SOL     4       2.930  18.780   9.110  1.00  0.00           H
+ATOM     13  OW  SOL     5       2.690  11.290   9.690  1.00  0.00           O
+ATOM     14  HW1 SOL     5       2.860  12.310   9.660  1.00  0.00           H
+ATOM     15  HW2 SOL     5       2.630  11.070  10.730  1.00  0.00           H
+TER
+ENDMDL
+REMARK    GENERATED BY TRJCONV
+TITLE     water t=   0.09600 step= 480
+REMARK    THIS IS A SIMULATION BOX
+CRYST1   18.621   18.621   18.621  90.00  90.00  90.00 P 1           1
+MODEL       25
+ATOM      1  OW  SOL     1      15.460   9.800   2.420  1.00  0.00           O
+ATOM      2  HW1 SOL     1      14.750   9.510   1.730  1.00  0.00           H
+ATOM      3  HW2 SOL     1      16.180  10.150   1.750  1.00  0.00           H
+ATOM      4  OW  SOL     2       2.340   7.630  10.740  1.00  0.00           O
+ATOM      5  HW1 SOL     2       1.610   8.340  10.790  1.00  0.00           H
+ATOM      6  HW2 SOL     2       2.740   7.760  11.620  1.00  0.00           H
+ATOM      7  OW  SOL     3      12.610   6.400   2.240  1.00  0.00           O
+ATOM      8  HW1 SOL     3      11.920   7.170   2.290  1.00  0.00           H
+ATOM      9  HW2 SOL     3      12.710   6.090   1.270  1.00  0.00           H
+ATOM     10  OW  SOL     4       3.750  18.300   9.470  1.00  0.00           O
+ATOM     11  HW1 SOL     4       3.630  18.360  10.490  1.00  0.00           H
+ATOM     12  HW2 SOL     4       2.950  18.730   9.050  1.00  0.00           H
+ATOM     13  OW  SOL     5       2.670  11.300   9.700  1.00  0.00           O
+ATOM     14  HW1 SOL     5       2.920  12.270   9.610  1.00  0.00           H
+ATOM     15  HW2 SOL     5       2.510  11.070  10.660  1.00  0.00           H
+TER
+ENDMDL
+REMARK    GENERATED BY TRJCONV
+TITLE     water t=   0.10000 step= 500
+REMARK    THIS IS A SIMULATION BOX
+CRYST1   18.621   18.621   18.621  90.00  90.00  90.00 P 1           1
+MODEL       26
+ATOM      1  OW  SOL     1      15.450   9.780   2.380  1.00  0.00           O
+ATOM      2  HW1 SOL     1      14.660   9.520   1.790  1.00  0.00           H
+ATOM      3  HW2 SOL     1      16.200  10.060   1.740  1.00  0.00           H
+ATOM      4  OW  SOL     2       2.350   7.660  10.720  1.00  0.00           O
+ATOM      5  HW1 SOL     2       1.560   8.330  10.840  1.00  0.00           H
+ATOM      6  HW2 SOL     2       2.820   7.620  11.700  1.00  0.00           H
+ATOM      7  OW  SOL     3      12.610   6.400   2.270  1.00  0.00           O
+ATOM      8  HW1 SOL     3      11.960   7.160   2.170  1.00  0.00           H
+ATOM      9  HW2 SOL     3      12.740   6.140   1.290  1.00  0.00           H
+ATOM     10  OW  SOL     4       3.740  18.290   9.470  1.00  0.00           O
+ATOM     11  HW1 SOL     4       3.670  18.340  10.480  1.00  0.00           H
+ATOM     12  HW2 SOL     4       2.900  18.700   8.990  1.00  0.00           H
+ATOM     13  OW  SOL     5       2.650  11.310   9.710  1.00  0.00           O
+ATOM     14  HW1 SOL     5       2.960  12.260   9.600  1.00  0.00           H
+ATOM     15  HW2 SOL     5       2.400  11.090  10.670  1.00  0.00           H
+TER
+ENDMDL
diff --git a/src/testutils/simulationdatabase/spc5.top b/src/testutils/simulationdatabase/spc5.top
new file mode 100644 (file)
index 0000000..3cd42e1
--- /dev/null
@@ -0,0 +1,9 @@
+#include "oplsaa.ff/forcefield.itp"
+#include "oplsaa.ff/spc.itp"
+
+[ system ]
+water
+
+[ molecules ]
+sol 5
+
diff --git a/src/testutils/simulationdatabase/spc5_3.ndx b/src/testutils/simulationdatabase/spc5_3.ndx
new file mode 100644 (file)
index 0000000..1b06f91
--- /dev/null
@@ -0,0 +1,3 @@
+[ mol ]
+1 2 3 4 5 6 10 11 12
+
diff --git a/src/testutils/simulationdatabase/sw-dimer.g96 b/src/testutils/simulationdatabase/sw-dimer.g96
new file mode 100644 (file)
index 0000000..c83ad6e
--- /dev/null
@@ -0,0 +1,18 @@
+TITLE
+sw dimer
+END
+POSITION
+    1 SM2   OW1        1    0.105589126    1.683747627    2.473256543
+    1 SM2   HW2        2    0.169054476    1.625271429    2.430233329
+    1 SM2   HW3        3    0.158294176    1.733694494    2.535445150
+    1 SM2   DW         4    0.119211950    1.682747427    2.475503990
+    1 SM2   SW         5    0.117933880    1.683816442    2.476262471
+    2 SM2   OW1        6    0.281166272    1.495951726    2.328371342
+    2 SM2   HW2        7    0.273838350    1.511998272    2.233969836
+    2 SM2   HW3        8    0.248561139    1.406400039    2.340213452
+    2 SM2   DW         9    0.276483487    1.487332081    2.318689942
+    2 SM2   SW        10    0.275562577    1.489119972    2.320247878
+END
+BOX
+   14.500100000   14.500100000   14.500100000
+END
diff --git a/src/testutils/simulationdatabase/sw-dimer.ndx b/src/testutils/simulationdatabase/sw-dimer.ndx
new file mode 100644 (file)
index 0000000..0020d24
--- /dev/null
@@ -0,0 +1,2 @@
+[ System ]
+   1    2    3    4    5    6    7    8    9   10
diff --git a/src/testutils/simulationdatabase/sw-dimer.top b/src/testutils/simulationdatabase/sw-dimer.top
new file mode 100644 (file)
index 0000000..fd6d63b
--- /dev/null
@@ -0,0 +1,156 @@
+; 
+; Topology file for SW
+;
+; Paul van Maaren and David van der Spoel
+; Molecular Dynamics Simulations of Water with Novel Shell Model Potentials
+; J. Phys. Chem. B. 105 (2618-2626), 2001
+;
+; Force constants for the shell are given by:
+;
+; k = qs^2/(4 pi eps0 alpha)
+; However, in the current version of the itp file and software (3.2+)
+; force constants are computed in mdrun, and the input is the
+; polarizability in nm^3.
+;
+; Some data: mu (water) = 1.8546 D ( 0.0386116 e nm)
+;            1/(4 pi eps0 alpha) = 94513.94
+;
+; Alpha-X = 1.415   kx = 608069
+; Alpha-Y = 1.528   ky = 563101
+; Alpha-Z = 1.468   kz = 586116
+;
+; Alpha   = 1.470   k  = 585318
+;
+; Bonding parameters from (but without cubic term):
+; D. M. Ferguson: 
+; Parametrization and Evaluation of a Flexible Water Model 
+; J. Comp. Chem. 16(4), 501-511 (1995)
+;
+; Possible defines that you can put in your topol.top:
+; -DANISOTROPIC Select anisotropic polarizibility (isotropic is default).
+; -DRIGID       Rigid model (flexible is default)
+; -DPOSRES      Position restrain oxygen atoms
+;
+
+[ defaults ]
+LJ     Geometric
+
+[ atomtypes ]
+;name        mass      charge   ptype   c6     c12
+   WO    15.99940       0.0     A      0.0     0.0
+   WH     1.00800       0.0     A      0.0     0.0
+   WS     0.0           0.0     S      0.0     0.0
+   WD    0.0           0.0     V       0.0     0.0
+
+[ nonbond_params ]
+#ifdef RIGID
+#ifdef ANISOTROPIC
+WH      WH      1       4.0e-5          4.0e-8
+WS      WO      1       1.0e-6          1.0e-12
+WS      WH      1       4.0e-5          2.766e-08
+WO      WO      1       2.0e-3          1.174e-06
+#else
+WH      WH      1       4.0e-5          4.0e-8
+WS      WO      1       1.0e-6          1.0e-12
+WS      WH      1       4.0e-5          2.769e-08
+WO      WO      1       2.0e-3          1.176e-06
+#endif
+#else
+#ifdef ANISOTROPIC
+WH      WH      1       4.0e-5          4.0e-8
+WS      WO      1       1.0e-6          1.0e-12
+WS      WH      1       4.0e-5          2.910e-08
+WO      WO      1       2.0e-3          1.189e-06
+#else
+WH      WH      1       4.0e-5          4.0e-8
+WS      WO      1       1.0e-6          1.0e-12
+WS      WH      1       4.0e-5          2.937e-08
+WO      WO      1       2.0e-3          1.187e-06
+#endif
+#endif
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; This is a the 'classical YAW' model, in which we do have the dummy.
+;; The shell is attached to the dummy, in this case the gas-phase
+;; quadrupole is correct. Water_pol routine can be used for this
+;; model. This has four interaction sites.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+[ moleculetype ]
+; molname      nrexcl
+SW             2
+
+[ atoms ]
+; id   at type res nr  residu name     at name         cg nr   charge
+1      WO      1       SM2             OW1             1       1.24588
+2      WH      1       SM2             HW2             1       0.62134
+3      WH      1       SM2             HW3             1       0.62134
+4      WD      1       SM2             DW              1       0.0
+5      WS      1       SM2             SW              1       -2.48856
+
+#ifdef ANISOTROPIC
+[ water_polarization ]
+; See notes above. Alphas in nm^3 (See ref. above)
+; O H H D S funct  al_x         al_y     al_z          rOH     rHH     rOD
+  1 2 3 4 5 1  0.001415 0.001528 0.001468      0.09572 0.15139 0.0137408
+
+#else
+
+[ polarization ]
+; See notes above.     alpha (nm^3)
+4      5       1       0.00147
+#endif
+
+#ifdef RIGID
+[ settles ]
+; i    funct   dOH     dHH
+1      1       0.09572 0.15139
+
+#else
+
+[ bonds ]
+1      2       1   0.09572     458148.
+1      3       1   0.09572     458148.
+
+[ angles ]
+; i    j       k
+2      1       3    1   104.52     417.6
+#endif
+
+[ dummies3 ]
+; The position of the dummies is computed as follows:
+;
+;              O
+;            
+;              D
+;        
+;      H               H
+;
+; 2 * b = distance (OD) / [ cos (angle(DOH))   * distance (OH) ]
+;        0.0137408 nm  / [ cos (104.52 / 2 deg) * 0.09572 nm   ]
+;         0.01557 nm 
+; Dummy pos x4 = x1 + a*(x2-x1) + b*(x3-X1)
+;
+; Dummy from                   funct   a               b
+4      1       2       3       1       0.117265878     0.117265878
+
+[ exclusions ]
+; iatom excluded from interaction with i
+1      2       3       4       5
+2      1       3       4       5
+3      1       2       4       5
+4      1       2       3       5
+5      1       2       3       4
+
+#ifdef POSRES
+; Restrain the oxygen...
+[ position_restraints ]
+; iatom type   fx      fy      fz
+1      1       100     100     100
+#endif
+
+[ system ]
+sw dimer
+
+[ molecules ]
+SW 2
+
similarity index 99%
rename from src/programs/mdrun/tests/spc5.top
rename to src/testutils/simulationdatabase/tip3p5.top
index 21a444c04db04a07589a1cf29745e669f907bce5..20a3eb3611b84fa724fea2e7b8e976eb5474b597 100644 (file)
@@ -1,5 +1,4 @@
 #include "oplsaa.ff/forcefield.itp"
-
 ; Include water topology
 #include "oplsaa.ff/tip3p.itp"
 
diff --git a/src/testutils/simulationdatabase/villin.g96 b/src/testutils/simulationdatabase/villin.g96
new file mode 100644 (file)
index 0000000..ca44cf9
--- /dev/null
@@ -0,0 +1,264 @@
+TITLE
+AMYLOID BETA A4 PROTEIN
+END
+POSITION
+    1 ASP   N          1   -0.095738231    0.572774319   -1.057562981
+    1 ASP   H1         2   -0.038734704    0.612581759   -1.133626338
+    1 ASP   H2         3   -0.065228911    0.472622499   -1.038021303
+    1 ASP   H3         4   -0.193927807    0.553503822   -1.089130213
+    1 ASP   CA         5   -0.092733895    0.649483647   -0.931159729
+    1 ASP   HA         6    0.009289907    0.645130106   -0.894797586
+    1 ASP   CB         7   -0.132302761    0.796102401   -0.961795051
+    1 ASP   HB1        8   -0.071222743    0.837940769   -1.044563088
+    1 ASP   HB2        9   -0.239644960    0.807616509   -0.986318894
+    1 ASP   CG        10   -0.100151896    0.875758042   -0.837883250
+    1 ASP   OD1       11    0.018576586    0.910706759   -0.819015285
+    1 ASP   OD2       12   -0.190455399    0.891929899   -0.752573424
+    1 ASP   C         13   -0.179122751    0.582613712   -0.824302376
+    1 ASP   O         14   -0.127854170    0.510843746   -0.739216732
+    2 ALA   N         15   -0.312707650    0.603028428   -0.827177828
+    2 ALA   HN        16   -0.353267958    0.662063591   -0.895982874
+    2 ALA   CA        17   -0.406270503    0.555106865   -0.727409760
+    2 ALA   HA        18   -0.377140695    0.597598894   -0.632389432
+    2 ALA   CB        19   -0.547588852    0.604802381   -0.763602152
+    2 ALA   HB1       20   -0.620860543    0.574927334   -0.685558877
+    2 ALA   HB2       21   -0.548046648    0.715663179   -0.771014666
+    2 ALA   HB3       22   -0.580327033    0.562732245   -0.861111429
+    2 ALA   C         23   -0.408208180    0.403957202   -0.708159996
+    2 ALA   O         24   -0.419548270    0.355100489   -0.596071361
+    3 GLU   N         25   -0.394102539    0.326512982   -0.817111585
+    3 GLU   HN        26   -0.380006497    0.366875495   -0.908211950
+    3 GLU   CA        27   -0.382217046    0.182017694   -0.813863708
+    3 GLU   HA        28   -0.468089297    0.144194034   -0.760284666
+    3 GLU   CB        29   -0.389109207    0.126228620   -0.959128231
+    3 GLU   HB1       30   -0.403188424    0.015892499   -0.954064390
+    3 GLU   HB2       31   -0.480633776    0.168697422   -1.006245798
+    3 GLU   CG        32   -0.269523482    0.154493856   -1.054910974
+    3 GLU   HG1       33   -0.184491588    0.088616103   -1.026518827
+    3 GLU   HG2       34   -0.298638599    0.129179950   -1.158925967
+    3 GLU   CD        35   -0.218822581    0.297339961   -1.053790211
+    3 GLU   OE1       36   -0.099456303    0.317673629   -1.018756015
+    3 GLU   OE2       37   -0.295818569    0.393897437   -1.080046933
+    3 GLU   C         38   -0.259959103    0.132565074   -0.736197301
+    3 GLU   O         39   -0.272549916    0.048973297   -0.646963409
+    4 PHE   N         40   -0.140591735    0.191239724   -0.760043037
+    4 PHE   HN        41   -0.129671915    0.251705649   -0.839613367
+    4 PHE   CA        42   -0.020441914    0.167023198   -0.682431710
+    4 PHE   HA        43   -0.008479130    0.059674466   -0.678112812
+    4 PHE   CB        44    0.104141072    0.228003018   -0.752663941
+    4 PHE   HB1       45    0.108289148    0.191469880   -0.857548209
+    4 PHE   HB2       46    0.097274213    0.338762224   -0.753926916
+    4 PHE   CG        47    0.232475096    0.185371312   -0.685077390
+    4 PHE   CD1       48    0.262163368    0.049082431   -0.667001406
+    4 PHE   HD1       49    0.195683907   -0.027763200   -0.704164737
+    4 PHE   CE1       50    0.376292282    0.009475295   -0.596384732
+    4 PHE   HE1       51    0.394835660   -0.096128426   -0.580959614
+    4 PHE   CZ        52    0.463464115    0.105934765   -0.544607219
+    4 PHE   HZ        53    0.551080815    0.074795657   -0.489611460
+    4 PHE   CD2       54    0.321016568    0.281344741   -0.633001866
+    4 PHE   HD2       55    0.298719391    0.386211355   -0.644741540
+    4 PHE   CE2       56    0.436071386    0.242058365   -0.563188898
+    4 PHE   HE2       57    0.502944347    0.316329006   -0.522333518
+    4 PHE   C         58   -0.032096898    0.214710487   -0.537688600
+    4 PHE   O         59    0.021384151    0.153469629   -0.446077176
+    5 ARG   N         60   -0.104812943    0.324852974   -0.510156677
+    5 ARG   HN        61   -0.143427848    0.378123853   -0.585443429
+    5 ARG   CA        62   -0.132621213    0.366710226   -0.373281701
+    5 ARG   HA        63   -0.037499525    0.375855198   -0.322532204
+    5 ARG   CB        64   -0.204112659    0.503982940   -0.366306351
+    5 ARG   HB1       65   -0.299168939    0.497836177   -0.423649827
+    5 ARG   HB2       66   -0.229791994    0.526233506   -0.260207185
+    5 ARG   CG        67   -0.117210917    0.618787885   -0.420815969
+    5 ARG   HG1       68   -0.022745441    0.623155928   -0.362458013
+    5 ARG   HG2       69   -0.088917595    0.594553701   -0.525386310
+    5 ARG   CD        70   -0.186407524    0.755597878   -0.419216899
+    5 ARG   HD1       71   -0.287529397    0.746979891   -0.465209085
+    5 ARG   HD2       72   -0.197701408    0.795997413   -0.316235319
+    5 ARG   NE        73   -0.106046146    0.848910608   -0.504370465
+    5 ARG   HE        74   -0.138257062    0.868595610   -0.600035221
+    5 ARG   CZ        75    0.013988163    0.900066116   -0.474789584
+    5 ARG   NH1       76    0.067937792    0.887613027   -0.353896867
+    5 ARG   HH11      77    0.016651485    0.835971796   -0.286943145
+    5 ARG   HH12      78    0.157648951    0.925343623   -0.336820949
+    5 ARG   NH2       79    0.081990319    0.963700184   -0.569636967
+    5 ARG   HH21      80    0.047796598    0.952091642   -0.665985404
+    5 ARG   HH22      81    0.175646061    0.990433013   -0.556118833
+    5 ARG   C         82   -0.211689441    0.263784727   -0.293094946
+    5 ARG   O         83   -0.183834600    0.242750833   -0.175482275
+    6 HIS   N         84   -0.310108428    0.195111948   -0.354637165
+    6 HIS   HN        85   -0.336285534    0.217971282   -0.448386570
+    6 HIS   CA        86   -0.375597220    0.080377213   -0.292711542
+    6 HIS   HA        87   -0.410209177    0.110315386   -0.194639473
+    6 HIS   CB        88   -0.497303476    0.032494408   -0.374955423
+    6 HIS   HB1       89   -0.464882194    0.002716760   -0.476840358
+    6 HIS   HB2       90   -0.543867583   -0.055547418   -0.325708936
+    6 HIS   ND1       91   -0.667001817    0.183465672   -0.274071396
+    6 HIS   CG        92   -0.604075935    0.136495007   -0.387727095
+    6 HIS   CE1       93   -0.755666581    0.270458990   -0.317176109
+    6 HIS   HE1       94   -0.823283484    0.326707716   -0.252603108
+    6 HIS   NE2       95   -0.753685967    0.281944428   -0.452176967
+    6 HIS   HE2       96   -0.811629925    0.340848619   -0.508098084
+    6 HIS   CD2       97   -0.656363366    0.195806759   -0.498156059
+    6 HIS   HD2       98   -0.630913956    0.181878997   -0.602152251
+    6 HIS   C         99   -0.283216968   -0.039316896   -0.271590910
+    6 HIS   O        100   -0.283392379   -0.100047338   -0.164852800
+    7 ASP   N        101   -0.200574135   -0.073485014   -0.372724819
+    7 ASP   HN       102   -0.204678100   -0.024621155   -0.459783979
+    7 ASP   CA       103   -0.103973665   -0.182437945   -0.370405262
+    7 ASP   HA       104   -0.155904115   -0.275222498   -0.349936719
+    7 ASP   CB       105   -0.043442926   -0.184385056   -0.513184581
+    7 ASP   HB1      106   -0.125617407   -0.185984189   -0.587785343
+    7 ASP   HB2      107    0.018543208   -0.094361758   -0.530500631
+    7 ASP   CG       108    0.042147355   -0.306357958   -0.540943707
+    7 ASP   OD1      109    0.161294047   -0.286053234   -0.575495741
+    7 ASP   OD2      110   -0.012462374   -0.418945694   -0.531818690
+    7 ASP   C        111    0.004089364   -0.164299107   -0.262618251
+    7 ASP   O        112    0.024351454   -0.247461335   -0.174413788
+    8 SER   N        113    0.067458829   -0.045345296   -0.259463539
+    8 SER   HN       114    0.049849361    0.018756054   -0.334842711
+    8 SER   CA       115    0.161779822   -0.001771952   -0.157007031
+    8 SER   HA       116    0.238508734   -0.077497841   -0.148891495
+    8 SER   CB       117    0.226695673    0.133533356   -0.197501237
+    8 SER   HB1      118    0.272934148    0.121519391   -0.298200321
+    8 SER   HB2      119    0.147248088    0.210938198   -0.206607385
+    8 SER   OG       120    0.325862745    0.179015190   -0.105098606
+    8 SER   HG1      121    0.391013420    0.108425579   -0.096294340
+    8 SER   C        122    0.095733136    0.009307216   -0.020492277
+    8 SER   O        123    0.154193004   -0.020784641    0.083501813
+    9 GLY   N        124   -0.033371891    0.048005952   -0.018856544
+    9 GLY   HN       125   -0.077294880    0.074169752   -0.104883771
+    9 GLY   CA       126   -0.117823005    0.053262708    0.099379448
+    9 GLY   HA1      127   -0.070668913    0.118702574    0.171023759
+    9 GLY   HA2      128   -0.214764792    0.088417422    0.067475000
+    9 GLY   C        129   -0.139800107   -0.079349011    0.167330129
+    9 GLY   O        130   -0.170468830   -0.083363685    0.286042789
+   10 TYR   N        131   -0.122794301   -0.192673403    0.096373691
+   10 TYR   HN       132   -0.101316945   -0.188138600   -0.001461977
+   10 TYR   CA       133   -0.126432672   -0.325429326    0.155272743
+   10 TYR   HA       134   -0.219514180   -0.332262619    0.209200799
+   10 TYR   CB       135   -0.122619710   -0.432233216    0.042287009
+   10 TYR   HB1      136   -0.194892570   -0.402851329   -0.036937820
+   10 TYR   HB2      137   -0.021509578   -0.434063535   -0.004153911
+   10 TYR   CG       138   -0.160063938   -0.572537627    0.084316358
+   10 TYR   CD1      139   -0.096540903   -0.681042627    0.021372100
+   10 TYR   HD1      140   -0.020852114   -0.661920796   -0.053519681
+   10 TYR   CE1      141   -0.131192916   -0.813074208    0.053398039
+   10 TYR   HE1      142   -0.081576686   -0.895608797    0.004473049
+   10 TYR   CZ       143   -0.230318463   -0.837962404    0.148732956
+   10 TYR   OH       144   -0.263675649   -0.970470537    0.182514697
+   10 TYR   HH       145   -0.334849485   -0.966697179    0.246526105
+   10 TYR   CD2      146   -0.260798424   -0.599314397    0.179098596
+   10 TYR   HD2      147   -0.313474332   -0.518795253    0.227736117
+   10 TYR   CE2      148   -0.295423566   -0.731310569    0.211502012
+   10 TYR   HE2      149   -0.371949808   -0.749430147    0.285390063
+   10 TYR   C        150   -0.014923095   -0.346115534    0.258001926
+   10 TYR   O        151   -0.039387969   -0.393341714    0.368749466
+   11 GLU   N        152    0.108525474   -0.301319181    0.227172946
+   11 GLU   HN       153    0.127220340   -0.263938463    0.136640999
+   11 GLU   CA       154    0.218907567   -0.295132719    0.322080415
+   11 GLU   HA       155    0.229277573   -0.392569367    0.367359203
+   11 GLU   CB       156    0.352004058   -0.260602396    0.251081143
+   11 GLU   HB1      157    0.331493536   -0.187666447    0.169847307
+   11 GLU   HB2      158    0.423504271   -0.212719751    0.321884141
+   11 GLU   CG       159    0.421290198   -0.386158339    0.192456142
+   11 GLU   HG1      160    0.346848921   -0.454921336    0.147834427
+   11 GLU   HG2      161    0.493518518   -0.356109547    0.113682480
+   11 GLU   CD       162    0.500257208   -0.463073299    0.298213717
+   11 GLU   OE1      163    0.445179194   -0.490997466    0.408031863
+   11 GLU   OE2      164    0.619685336   -0.491883803    0.272080169
+   11 GLU   C        165    0.193544263   -0.200277670    0.438037710
+   11 GLU   O        166    0.222268815   -0.231308829    0.553241523
+   12 VAL   N        167    0.131519573   -0.083270029    0.412700792
+   12 VAL   HN       168    0.113111129   -0.057944089    0.317972380
+   12 VAL   CA       169    0.088260850    0.008928412    0.517615172
+   12 VAL   HA       170    0.175262217    0.032086012    0.577686472
+   12 VAL   CB       171    0.033383770    0.139482372    0.460108750
+   12 VAL   HB       172   -0.058418337    0.118386857    0.400697310
+   12 VAL   CG1      173   -0.001701682    0.238833670    0.572879134
+   12 VAL   HG11     174   -0.032174765    0.336386732    0.529552209
+   12 VAL   HG12     175   -0.085404127    0.201255161    0.635335892
+   12 VAL   HG13     176    0.086667740    0.255372949    0.638204439
+   12 VAL   CG2      177    0.139505766    0.202210081    0.367437441
+   12 VAL   HG21     178    0.104108216    0.300267311    0.329356875
+   12 VAL   HG22     179    0.234368438    0.218270733    0.422998225
+   12 VAL   HG23     180    0.161027447    0.137594547    0.279855178
+   12 VAL   C        181   -0.013353270   -0.055173300    0.612547549
+   12 VAL   O        182   -0.010069676   -0.035259606    0.734213698
+   13 HIS   N        183   -0.105698930   -0.138881468    0.560675239
+   13 HIS   HN       184   -0.114853102   -0.146640312    0.461045649
+   13 HIS   CA       185   -0.188887082   -0.225410169    0.643185512
+   13 HIS   HA       186   -0.237942741   -0.163019676    0.716661491
+   13 HIS   CB       187   -0.299213632   -0.297498079    0.562332385
+   13 HIS   HB1      188   -0.254143045   -0.355687533    0.479467737
+   13 HIS   HB2      189   -0.354885997   -0.367618189    0.628026515
+   13 HIS   ND1      190   -0.476972345   -0.126680496    0.591617607
+   13 HIS   CG       191   -0.400577926   -0.203287350    0.505507760
+   13 HIS   CE1      192   -0.554938629   -0.054919315    0.513486598
+   13 HIS   HE1      193   -0.627727115    0.018157402    0.549009064
+   13 HIS   NE2      194   -0.533661006   -0.081611957    0.382385280
+   13 HIS   HE2      195   -0.577146630   -0.037778437    0.303852317
+   13 HIS   CD2      196   -0.434761397   -0.177361434    0.376656269
+   13 HIS   HD2      197   -0.395716929   -0.218881458    0.284949251
+   13 HIS   C        198   -0.109741477   -0.329771329    0.721702470
+   13 HIS   O        199   -0.131478075   -0.344971710    0.841922093
+   14 HIS   N        200   -0.012228577   -0.400276585    0.660435569
+   14 HIS   HN       201    0.002741453   -0.391995377    0.561408671
+   14 HIS   CA       202    0.069978456   -0.498416989    0.731112514
+   14 HIS   HA       203    0.003579518   -0.569913899    0.777840355
+   14 HIS   CB       204    0.164770063   -0.575092686    0.635285704
+   14 HIS   HB1      205    0.237628202   -0.505616390    0.588137587
+   14 HIS   HB2      206    0.221808462   -0.651907043    0.691523749
+   14 HIS   ND1      207   -0.015286004   -0.725593019    0.549415213
+   14 HIS   CG       208    0.096114702   -0.647272757    0.524221071
+   14 HIS   CE1      209   -0.046750690   -0.777466414    0.432500937
+   14 HIS   HE1      210   -0.130935266   -0.844308664    0.414342507
+   14 HIS   NE2      211    0.038029258   -0.737825186    0.334709887
+   14 HIS   HE2      212    0.030954986   -0.758454879    0.237091675
+   14 HIS   CD2      213    0.130575322   -0.654579733    0.393159202
+   14 HIS   HD2      214    0.213545409   -0.608781463    0.341076263
+   14 HIS   C        215    0.158939030   -0.441110533    0.841064028
+   14 HIS   O        216    0.150574961   -0.481103183    0.956918075
+   15 GLN   N        217    0.241869809   -0.339871744    0.810028550
+   15 GLN   HN       218    0.243353251   -0.301762929    0.716528302
+   15 GLN   CA       219    0.344931506   -0.290105926    0.899588239
+   15 GLN   HA       220    0.335027133   -0.337073820    0.996556312
+   15 GLN   CB       221    0.486931130   -0.324269575    0.847548932
+   15 GLN   HB1      222    0.563105779   -0.279091819    0.915029442
+   15 GLN   HB2      223    0.498975050   -0.434908375    0.853401883
+   15 GLN   CG       224    0.515765400   -0.281731490    0.701635549
+   15 GLN   HG1      225    0.443764464   -0.329504903    0.631887704
+   15 GLN   HG2      226    0.507054040   -0.171657819    0.690949866
+   15 GLN   CD       227    0.657908355   -0.321609302    0.661381452
+   15 GLN   OE1      228    0.756161050   -0.275358179    0.719982194
+   15 GLN   NE2      229    0.670624496   -0.409601901    0.559815220
+   15 GLN   HE21     230    0.589972288   -0.440646236    0.506585459
+   15 GLN   HE22     231    0.761080307   -0.431277456    0.525310782
+   15 GLN   C        232    0.327912004   -0.141014876    0.923210680
+   15 GLN   O        233    0.297978600   -0.063922660    0.832459636
+   16 LYS   N        234    0.335351596   -0.098615647    1.050607474
+   16 LYS   HN       235    0.359717859   -0.155695561    1.129646885
+   16 LYS   CA       236    0.328396798    0.038956637    1.094040110
+   16 LYS   HA       237    0.404501253    0.095243193    1.041832138
+   16 LYS   CB       238    0.188602114    0.104657736    1.076463107
+   16 LYS   HB1      239    0.200604378    0.214139949    1.093129026
+   16 LYS   HB2      240    0.156710467    0.091323559    0.971054280
+   16 LYS   CG       241    0.080667092    0.053761842    1.174230296
+   16 LYS   HG1      242    0.112660139   -0.042018897    1.221074405
+   16 LYS   HG2      243    0.075735519    0.127867140    1.257518972
+   16 LYS   CD       244   -0.058230301    0.037399968    1.110567162
+   16 LYS   HD1      245   -0.134947405    0.064968367    1.186524481
+   16 LYS   HD2      246   -0.068604489    0.108454503    1.025573279
+   16 LYS   CE       247   -0.087986108   -0.105872934    1.065107328
+   16 LYS   HE1      248   -0.090864931   -0.174036247    1.153041964
+   16 LYS   HE2      249   -0.185305842   -0.111315867    1.011590386
+   16 LYS   NZ       250    0.017492927   -0.153355934    0.974747531
+   16 LYS   HZ1      251    0.000340658   -0.253023756    0.948018656
+   16 LYS   HZ2      252    0.017164210   -0.096950814    0.885809439
+   16 LYS   HZ3      253    0.111142994   -0.142123190    1.018805179
+   16 LYS   C        254    0.365040544    0.038211234    1.244283965
+   16 LYS   OT1      255    0.381584418    0.148358923    1.302706521
+   16 LYS   OT2      256    0.373620063   -0.074276792    1.301521379
+END
+BOX
+   12.100000000   12.100000000   12.100000000
+END
diff --git a/src/testutils/simulationdatabase/villin.ndx b/src/testutils/simulationdatabase/villin.ndx
new file mode 100644 (file)
index 0000000..a8b989e
--- /dev/null
@@ -0,0 +1,19 @@
+[ System ]
+   1    2    3    4    5    6    7    8    9   10   11   12   13   14   15
+  16   17   18   19   20   21   22   23   24   25   26   27   28   29   30
+  31   32   33   34   35   36   37   38   39   40   41   42   43   44   45
+  46   47   48   49   50   51   52   53   54   55   56   57   58   59   60
+  61   62   63   64   65   66   67   68   69   70   71   72   73   74   75
+  76   77   78   79   80   81   82   83   84   85   86   87   88   89   90
+  91   92   93   94   95   96   97   98   99  100  101  102  103  104  105
+ 106  107  108  109  110  111  112  113  114  115  116  117  118  119  120
+ 121  122  123  124  125  126  127  128  129  130  131  132  133  134  135
+ 136  137  138  139  140  141  142  143  144  145  146  147  148  149  150
+ 151  152  153  154  155  156  157  158  159  160  161  162  163  164  165
+ 166  167  168  169  170  171  172  173  174  175  176  177  178  179  180
+ 181  182  183  184  185  186  187  188  189  190  191  192  193  194  195
+ 196  197  198  199  200  201  202  203  204  205  206  207  208  209  210
+ 211  212  213  214  215  216  217  218  219  220  221  222  223  224  225
+ 226  227  228  229  230  231  232  233  234  235  236  237  238  239  240
+ 241  242  243  244  245  246  247  248  249  250  251  252  253  254  255
+ 256
diff --git a/src/testutils/simulationdatabase/villin.top b/src/testutils/simulationdatabase/villin.top
new file mode 100644 (file)
index 0000000..f62c624
--- /dev/null
@@ -0,0 +1,2452 @@
+;
+;      File 'topol.top' was generated
+;      By user: spoel (501)
+;      On host: bright.lan
+;      At date: Wed Dec 30 20:58:54 2015
+
+;
+;      This is a standalone topology file
+;
+;      Created by:
+;       :-) GROMACS - gmx pdb2gmx, 2016-dev-20151226-ae98b19 (double precision) (-:
+;      
+;      Executable:   /Users/spoel/software-master/bin/gmx
+;      Data prefix:  /Users/spoel/software-master
+;      Command line:
+;        gmx pdb2gmx -f 2BP4.pdb -ignh
+;      Force field was read from the standard GROMACS share directory.
+;
+
+; Include forcefield parameters
+#include "charmm27.ff/forcefield.itp"
+
+[ moleculetype ]
+; Name            nrexcl
+Protein_chain_A     3
+
+[ atoms ]
+;   nr       type  resnr residue  atom   cgnr     charge       mass  typeB    chargeB      massB
+; residue   1 ASP rtp ASP  q  0.0
+     1        NH3      1    ASP      N      1       -0.3     14.007   ; qtot -0.3
+     2         HC      1    ASP     H1      2       0.33      1.008   ; qtot 0.03
+     3         HC      1    ASP     H2      3       0.33      1.008   ; qtot 0.36
+     4         HC      1    ASP     H3      4       0.33      1.008   ; qtot 0.69
+     5        CT1      1    ASP     CA      5       0.21     12.011   ; qtot 0.9
+     6         HB      1    ASP     HA      6        0.1      1.008   ; qtot 1
+     7        CT2      1    ASP     CB      7      -0.28     12.011   ; qtot 0.72
+     8         HA      1    ASP    HB1      8       0.09      1.008   ; qtot 0.81
+     9         HA      1    ASP    HB2      9       0.09      1.008   ; qtot 0.9
+    10         CC      1    ASP     CG     10       0.62     12.011   ; qtot 1.52
+    11         OC      1    ASP    OD1     11      -0.76     15.999   ; qtot 0.76
+    12         OC      1    ASP    OD2     12      -0.76     15.999   ; qtot 0
+    13          C      1    ASP      C     13       0.51     12.011   ; qtot 0.51
+    14          O      1    ASP      O     14      -0.51     15.999   ; qtot 0
+; residue   2 ALA rtp ALA  q  0.0
+    15        NH1      2    ALA      N     15      -0.47     14.007   ; qtot -0.47
+    16          H      2    ALA     HN     16       0.31      1.008   ; qtot -0.16
+    17        CT1      2    ALA     CA     17       0.07     12.011   ; qtot -0.09
+    18         HB      2    ALA     HA     18       0.09      1.008   ; qtot 0
+    19        CT3      2    ALA     CB     19      -0.27     12.011   ; qtot -0.27
+    20         HA      2    ALA    HB1     20       0.09      1.008   ; qtot -0.18
+    21         HA      2    ALA    HB2     21       0.09      1.008   ; qtot -0.09
+    22         HA      2    ALA    HB3     22       0.09      1.008   ; qtot 0
+    23          C      2    ALA      C     23       0.51     12.011   ; qtot 0.51
+    24          O      2    ALA      O     24      -0.51     15.999   ; qtot 0
+; residue   3 GLU rtp GLU  q -1.0
+    25        NH1      3    GLU      N     25      -0.47     14.007   ; qtot -0.47
+    26          H      3    GLU     HN     26       0.31      1.008   ; qtot -0.16
+    27        CT1      3    GLU     CA     27       0.07     12.011   ; qtot -0.09
+    28         HB      3    GLU     HA     28       0.09      1.008   ; qtot 0
+    29        CT2      3    GLU     CB     29      -0.18     12.011   ; qtot -0.18
+    30         HA      3    GLU    HB1     30       0.09      1.008   ; qtot -0.09
+    31         HA      3    GLU    HB2     31       0.09      1.008   ; qtot 0
+    32        CT2      3    GLU     CG     32      -0.28     12.011   ; qtot -0.28
+    33         HA      3    GLU    HG1     33       0.09      1.008   ; qtot -0.19
+    34         HA      3    GLU    HG2     34       0.09      1.008   ; qtot -0.1
+    35         CC      3    GLU     CD     35       0.62     12.011   ; qtot 0.52
+    36         OC      3    GLU    OE1     36      -0.76     15.999   ; qtot -0.24
+    37         OC      3    GLU    OE2     37      -0.76     15.999   ; qtot -1
+    38          C      3    GLU      C     38       0.51     12.011   ; qtot -0.49
+    39          O      3    GLU      O     39      -0.51     15.999   ; qtot -1
+; residue   4 PHE rtp PHE  q  0.0
+    40        NH1      4    PHE      N     40      -0.47     14.007   ; qtot -1.47
+    41          H      4    PHE     HN     41       0.31      1.008   ; qtot -1.16
+    42        CT1      4    PHE     CA     42       0.07     12.011   ; qtot -1.09
+    43         HB      4    PHE     HA     43       0.09      1.008   ; qtot -1
+    44        CT2      4    PHE     CB     44      -0.18     12.011   ; qtot -1.18
+    45         HA      4    PHE    HB1     45       0.09      1.008   ; qtot -1.09
+    46         HA      4    PHE    HB2     46       0.09      1.008   ; qtot -1
+    47         CA      4    PHE     CG     47          0     12.011   ; qtot -1
+    48         CA      4    PHE    CD1     48     -0.115     12.011   ; qtot -1.115
+    49         HP      4    PHE    HD1     49      0.115      1.008   ; qtot -1
+    50         CA      4    PHE    CE1     50     -0.115     12.011   ; qtot -1.115
+    51         HP      4    PHE    HE1     51      0.115      1.008   ; qtot -1
+    52         CA      4    PHE     CZ     52     -0.115     12.011   ; qtot -1.115
+    53         HP      4    PHE     HZ     53      0.115      1.008   ; qtot -1
+    54         CA      4    PHE    CD2     54     -0.115     12.011   ; qtot -1.115
+    55         HP      4    PHE    HD2     55      0.115      1.008   ; qtot -1
+    56         CA      4    PHE    CE2     56     -0.115     12.011   ; qtot -1.115
+    57         HP      4    PHE    HE2     57      0.115      1.008   ; qtot -1
+    58          C      4    PHE      C     58       0.51     12.011   ; qtot -0.49
+    59          O      4    PHE      O     59      -0.51     15.999   ; qtot -1
+; residue   5 ARG rtp ARG  q +1.0
+    60        NH1      5    ARG      N     60      -0.47     14.007   ; qtot -1.47
+    61          H      5    ARG     HN     61       0.31      1.008   ; qtot -1.16
+    62        CT1      5    ARG     CA     62       0.07     12.011   ; qtot -1.09
+    63         HB      5    ARG     HA     63       0.09      1.008   ; qtot -1
+    64        CT2      5    ARG     CB     64      -0.18     12.011   ; qtot -1.18
+    65         HA      5    ARG    HB1     65       0.09      1.008   ; qtot -1.09
+    66         HA      5    ARG    HB2     66       0.09      1.008   ; qtot -1
+    67        CT2      5    ARG     CG     67      -0.18     12.011   ; qtot -1.18
+    68         HA      5    ARG    HG1     68       0.09      1.008   ; qtot -1.09
+    69         HA      5    ARG    HG2     69       0.09      1.008   ; qtot -1
+    70        CT2      5    ARG     CD     70        0.2     12.011   ; qtot -0.8
+    71         HA      5    ARG    HD1     71       0.09      1.008   ; qtot -0.71
+    72         HA      5    ARG    HD2     72       0.09      1.008   ; qtot -0.62
+    73        NC2      5    ARG     NE     73       -0.7     14.007   ; qtot -1.32
+    74         HC      5    ARG     HE     74       0.44      1.008   ; qtot -0.88
+    75          C      5    ARG     CZ     75       0.64     12.011   ; qtot -0.24
+    76        NC2      5    ARG    NH1     76       -0.8     14.007   ; qtot -1.04
+    77         HC      5    ARG   HH11     77       0.46      1.008   ; qtot -0.58
+    78         HC      5    ARG   HH12     78       0.46      1.008   ; qtot -0.12
+    79        NC2      5    ARG    NH2     79       -0.8     14.007   ; qtot -0.92
+    80         HC      5    ARG   HH21     80       0.46      1.008   ; qtot -0.46
+    81         HC      5    ARG   HH22     81       0.46      1.008   ; qtot 0
+    82          C      5    ARG      C     82       0.51     12.011   ; qtot 0.51
+    83          O      5    ARG      O     83      -0.51     15.999   ; qtot 0
+; residue   6 HIS rtp HSE  q  0.0
+    84        NH1      6    HIS      N     84      -0.47     14.007   ; qtot -0.47
+    85          H      6    HIS     HN     85       0.31      1.008   ; qtot -0.16
+    86        CT1      6    HIS     CA     86       0.07     12.011   ; qtot -0.09
+    87         HB      6    HIS     HA     87       0.09      1.008   ; qtot 0
+    88        CT2      6    HIS     CB     88      -0.08     12.011   ; qtot -0.08
+    89         HA      6    HIS    HB1     89       0.09      1.008   ; qtot 0.01
+    90         HA      6    HIS    HB2     90       0.09      1.008   ; qtot 0.1
+    91        NR2      6    HIS    ND1     91       -0.7     14.007   ; qtot -0.6
+    92       CPH1      6    HIS     CG     92       0.22     12.011   ; qtot -0.38
+    93       CPH2      6    HIS    CE1     93       0.25     12.011   ; qtot -0.13
+    94        HR1      6    HIS    HE1     94       0.13      1.008   ; qtot 0
+    95        NR1      6    HIS    NE2     95      -0.36     14.007   ; qtot -0.36
+    96          H      6    HIS    HE2     96       0.32      1.008   ; qtot -0.04
+    97       CPH1      6    HIS    CD2     97      -0.05     12.011   ; qtot -0.09
+    98        HR3      6    HIS    HD2     98       0.09      1.008   ; qtot 0
+    99          C      6    HIS      C     99       0.51     12.011   ; qtot 0.51
+   100          O      6    HIS      O    100      -0.51     15.999   ; qtot 0
+; residue   7 ASP rtp ASP  q -1.0
+   101        NH1      7    ASP      N    101      -0.47     14.007   ; qtot -0.47
+   102          H      7    ASP     HN    102       0.31      1.008   ; qtot -0.16
+   103        CT1      7    ASP     CA    103       0.07     12.011   ; qtot -0.09
+   104         HB      7    ASP     HA    104       0.09      1.008   ; qtot 0
+   105        CT2      7    ASP     CB    105      -0.28     12.011   ; qtot -0.28
+   106         HA      7    ASP    HB1    106       0.09      1.008   ; qtot -0.19
+   107         HA      7    ASP    HB2    107       0.09      1.008   ; qtot -0.1
+   108         CC      7    ASP     CG    108       0.62     12.011   ; qtot 0.52
+   109         OC      7    ASP    OD1    109      -0.76     15.999   ; qtot -0.24
+   110         OC      7    ASP    OD2    110      -0.76     15.999   ; qtot -1
+   111          C      7    ASP      C    111       0.51     12.011   ; qtot -0.49
+   112          O      7    ASP      O    112      -0.51     15.999   ; qtot -1
+; residue   8 SER rtp SER  q  0.0
+   113        NH1      8    SER      N    113      -0.47     14.007   ; qtot -1.47
+   114          H      8    SER     HN    114       0.31      1.008   ; qtot -1.16
+   115        CT1      8    SER     CA    115       0.07     12.011   ; qtot -1.09
+   116         HB      8    SER     HA    116       0.09      1.008   ; qtot -1
+   117        CT2      8    SER     CB    117       0.05     12.011   ; qtot -0.95
+   118         HA      8    SER    HB1    118       0.09      1.008   ; qtot -0.86
+   119         HA      8    SER    HB2    119       0.09      1.008   ; qtot -0.77
+   120        OH1      8    SER     OG    120      -0.66     15.999   ; qtot -1.43
+   121          H      8    SER    HG1    121       0.43      1.008   ; qtot -1
+   122          C      8    SER      C    122       0.51     12.011   ; qtot -0.49
+   123          O      8    SER      O    123      -0.51     15.999   ; qtot -1
+; residue   9 GLY rtp GLY  q  0.0
+   124        NH1      9    GLY      N    124      -0.47     14.007   ; qtot -1.47
+   125          H      9    GLY     HN    125       0.31      1.008   ; qtot -1.16
+   126        CT2      9    GLY     CA    126      -0.02     12.011   ; qtot -1.18
+   127         HB      9    GLY    HA1    127       0.09      1.008   ; qtot -1.09
+   128         HB      9    GLY    HA2    128       0.09      1.008   ; qtot -1
+   129          C      9    GLY      C    129       0.51     12.011   ; qtot -0.49
+   130          O      9    GLY      O    130      -0.51     15.999   ; qtot -1
+; residue  10 TYR rtp TYR  q  0.0
+   131        NH1     10    TYR      N    131      -0.47     14.007   ; qtot -1.47
+   132          H     10    TYR     HN    132       0.31      1.008   ; qtot -1.16
+   133        CT1     10    TYR     CA    133       0.07     12.011   ; qtot -1.09
+   134         HB     10    TYR     HA    134       0.09      1.008   ; qtot -1
+   135        CT2     10    TYR     CB    135      -0.18     12.011   ; qtot -1.18
+   136         HA     10    TYR    HB1    136       0.09      1.008   ; qtot -1.09
+   137         HA     10    TYR    HB2    137       0.09      1.008   ; qtot -1
+   138         CA     10    TYR     CG    138          0     12.011   ; qtot -1
+   139         CA     10    TYR    CD1    139     -0.115     12.011   ; qtot -1.115
+   140         HP     10    TYR    HD1    140      0.115      1.008   ; qtot -1
+   141         CA     10    TYR    CE1    141     -0.115     12.011   ; qtot -1.115
+   142         HP     10    TYR    HE1    142      0.115      1.008   ; qtot -1
+   143         CA     10    TYR     CZ    143       0.11     12.011   ; qtot -0.89
+   144        OH1     10    TYR     OH    144      -0.54     15.999   ; qtot -1.43
+   145          H     10    TYR     HH    145       0.43      1.008   ; qtot -1
+   146         CA     10    TYR    CD2    146     -0.115     12.011   ; qtot -1.115
+   147         HP     10    TYR    HD2    147      0.115      1.008   ; qtot -1
+   148         CA     10    TYR    CE2    148     -0.115     12.011   ; qtot -1.115
+   149         HP     10    TYR    HE2    149      0.115      1.008   ; qtot -1
+   150          C     10    TYR      C    150       0.51     12.011   ; qtot -0.49
+   151          O     10    TYR      O    151      -0.51     15.999   ; qtot -1
+; residue  11 GLU rtp GLU  q -1.0
+   152        NH1     11    GLU      N    152      -0.47     14.007   ; qtot -1.47
+   153          H     11    GLU     HN    153       0.31      1.008   ; qtot -1.16
+   154        CT1     11    GLU     CA    154       0.07     12.011   ; qtot -1.09
+   155         HB     11    GLU     HA    155       0.09      1.008   ; qtot -1
+   156        CT2     11    GLU     CB    156      -0.18     12.011   ; qtot -1.18
+   157         HA     11    GLU    HB1    157       0.09      1.008   ; qtot -1.09
+   158         HA     11    GLU    HB2    158       0.09      1.008   ; qtot -1
+   159        CT2     11    GLU     CG    159      -0.28     12.011   ; qtot -1.28
+   160         HA     11    GLU    HG1    160       0.09      1.008   ; qtot -1.19
+   161         HA     11    GLU    HG2    161       0.09      1.008   ; qtot -1.1
+   162         CC     11    GLU     CD    162       0.62     12.011   ; qtot -0.48
+   163         OC     11    GLU    OE1    163      -0.76     15.999   ; qtot -1.24
+   164         OC     11    GLU    OE2    164      -0.76     15.999   ; qtot -2
+   165          C     11    GLU      C    165       0.51     12.011   ; qtot -1.49
+   166          O     11    GLU      O    166      -0.51     15.999   ; qtot -2
+; residue  12 VAL rtp VAL  q  0.0
+   167        NH1     12    VAL      N    167      -0.47     14.007   ; qtot -2.47
+   168          H     12    VAL     HN    168       0.31      1.008   ; qtot -2.16
+   169        CT1     12    VAL     CA    169       0.07     12.011   ; qtot -2.09
+   170         HB     12    VAL     HA    170       0.09      1.008   ; qtot -2
+   171        CT1     12    VAL     CB    171      -0.09     12.011   ; qtot -2.09
+   172         HA     12    VAL     HB    172       0.09      1.008   ; qtot -2
+   173        CT3     12    VAL    CG1    173      -0.27     12.011   ; qtot -2.27
+   174         HA     12    VAL   HG11    174       0.09      1.008   ; qtot -2.18
+   175         HA     12    VAL   HG12    175       0.09      1.008   ; qtot -2.09
+   176         HA     12    VAL   HG13    176       0.09      1.008   ; qtot -2
+   177        CT3     12    VAL    CG2    177      -0.27     12.011   ; qtot -2.27
+   178         HA     12    VAL   HG21    178       0.09      1.008   ; qtot -2.18
+   179         HA     12    VAL   HG22    179       0.09      1.008   ; qtot -2.09
+   180         HA     12    VAL   HG23    180       0.09      1.008   ; qtot -2
+   181          C     12    VAL      C    181       0.51     12.011   ; qtot -1.49
+   182          O     12    VAL      O    182      -0.51     15.999   ; qtot -2
+; residue  13 HIS rtp HSE  q  0.0
+   183        NH1     13    HIS      N    183      -0.47     14.007   ; qtot -2.47
+   184          H     13    HIS     HN    184       0.31      1.008   ; qtot -2.16
+   185        CT1     13    HIS     CA    185       0.07     12.011   ; qtot -2.09
+   186         HB     13    HIS     HA    186       0.09      1.008   ; qtot -2
+   187        CT2     13    HIS     CB    187      -0.08     12.011   ; qtot -2.08
+   188         HA     13    HIS    HB1    188       0.09      1.008   ; qtot -1.99
+   189         HA     13    HIS    HB2    189       0.09      1.008   ; qtot -1.9
+   190        NR2     13    HIS    ND1    190       -0.7     14.007   ; qtot -2.6
+   191       CPH1     13    HIS     CG    191       0.22     12.011   ; qtot -2.38
+   192       CPH2     13    HIS    CE1    192       0.25     12.011   ; qtot -2.13
+   193        HR1     13    HIS    HE1    193       0.13      1.008   ; qtot -2
+   194        NR1     13    HIS    NE2    194      -0.36     14.007   ; qtot -2.36
+   195          H     13    HIS    HE2    195       0.32      1.008   ; qtot -2.04
+   196       CPH1     13    HIS    CD2    196      -0.05     12.011   ; qtot -2.09
+   197        HR3     13    HIS    HD2    197       0.09      1.008   ; qtot -2
+   198          C     13    HIS      C    198       0.51     12.011   ; qtot -1.49
+   199          O     13    HIS      O    199      -0.51     15.999   ; qtot -2
+; residue  14 HIS rtp HSE  q  0.0
+   200        NH1     14    HIS      N    200      -0.47     14.007   ; qtot -2.47
+   201          H     14    HIS     HN    201       0.31      1.008   ; qtot -2.16
+   202        CT1     14    HIS     CA    202       0.07     12.011   ; qtot -2.09
+   203         HB     14    HIS     HA    203       0.09      1.008   ; qtot -2
+   204        CT2     14    HIS     CB    204      -0.08     12.011   ; qtot -2.08
+   205         HA     14    HIS    HB1    205       0.09      1.008   ; qtot -1.99
+   206         HA     14    HIS    HB2    206       0.09      1.008   ; qtot -1.9
+   207        NR2     14    HIS    ND1    207       -0.7     14.007   ; qtot -2.6
+   208       CPH1     14    HIS     CG    208       0.22     12.011   ; qtot -2.38
+   209       CPH2     14    HIS    CE1    209       0.25     12.011   ; qtot -2.13
+   210        HR1     14    HIS    HE1    210       0.13      1.008   ; qtot -2
+   211        NR1     14    HIS    NE2    211      -0.36     14.007   ; qtot -2.36
+   212          H     14    HIS    HE2    212       0.32      1.008   ; qtot -2.04
+   213       CPH1     14    HIS    CD2    213      -0.05     12.011   ; qtot -2.09
+   214        HR3     14    HIS    HD2    214       0.09      1.008   ; qtot -2
+   215          C     14    HIS      C    215       0.51     12.011   ; qtot -1.49
+   216          O     14    HIS      O    216      -0.51     15.999   ; qtot -2
+; residue  15 GLN rtp GLN  q  0.0
+   217        NH1     15    GLN      N    217      -0.47     14.007   ; qtot -2.47
+   218          H     15    GLN     HN    218       0.31      1.008   ; qtot -2.16
+   219        CT1     15    GLN     CA    219       0.07     12.011   ; qtot -2.09
+   220         HB     15    GLN     HA    220       0.09      1.008   ; qtot -2
+   221        CT2     15    GLN     CB    221      -0.18     12.011   ; qtot -2.18
+   222         HA     15    GLN    HB1    222       0.09      1.008   ; qtot -2.09
+   223         HA     15    GLN    HB2    223       0.09      1.008   ; qtot -2
+   224        CT2     15    GLN     CG    224      -0.18     12.011   ; qtot -2.18
+   225         HA     15    GLN    HG1    225       0.09      1.008   ; qtot -2.09
+   226         HA     15    GLN    HG2    226       0.09      1.008   ; qtot -2
+   227         CC     15    GLN     CD    227       0.55     12.011   ; qtot -1.45
+   228          O     15    GLN    OE1    228      -0.55     15.999   ; qtot -2
+   229        NH2     15    GLN    NE2    229      -0.62     14.007   ; qtot -2.62
+   230          H     15    GLN   HE21    230       0.32      1.008   ; qtot -2.3
+   231          H     15    GLN   HE22    231        0.3      1.008   ; qtot -2
+   232          C     15    GLN      C    232       0.51     12.011   ; qtot -1.49
+   233          O     15    GLN      O    233      -0.51     15.999   ; qtot -2
+; residue  16 LYS rtp LYS  q  0.0
+   234        NH1     16    LYS      N    234      -0.47     14.007   ; qtot -2.47
+   235          H     16    LYS     HN    235       0.31      1.008   ; qtot -2.16
+   236        CT1     16    LYS     CA    236       0.07     12.011   ; qtot -2.09
+   237         HB     16    LYS     HA    237       0.09      1.008   ; qtot -2
+   238        CT2     16    LYS     CB    238      -0.18     12.011   ; qtot -2.18
+   239         HA     16    LYS    HB1    239       0.09      1.008   ; qtot -2.09
+   240         HA     16    LYS    HB2    240       0.09      1.008   ; qtot -2
+   241        CT2     16    LYS     CG    241      -0.18     12.011   ; qtot -2.18
+   242         HA     16    LYS    HG1    242       0.09      1.008   ; qtot -2.09
+   243         HA     16    LYS    HG2    243       0.09      1.008   ; qtot -2
+   244        CT2     16    LYS     CD    244      -0.18     12.011   ; qtot -2.18
+   245         HA     16    LYS    HD1    245       0.09      1.008   ; qtot -2.09
+   246         HA     16    LYS    HD2    246       0.09      1.008   ; qtot -2
+   247        CT2     16    LYS     CE    247       0.21     12.011   ; qtot -1.79
+   248         HA     16    LYS    HE1    248       0.05      1.008   ; qtot -1.74
+   249         HA     16    LYS    HE2    249       0.05      1.008   ; qtot -1.69
+   250        NH3     16    LYS     NZ    250       -0.3     14.007   ; qtot -1.99
+   251         HC     16    LYS    HZ1    251       0.33      1.008   ; qtot -1.66
+   252         HC     16    LYS    HZ2    252       0.33      1.008   ; qtot -1.33
+   253         HC     16    LYS    HZ3    253       0.33      1.008   ; qtot -1
+   254         CC     16    LYS      C    254       0.34     12.011   ; qtot -0.66
+   255         OC     16    LYS    OT1    255      -0.67    15.9994   ; qtot -1.33
+   256         OC     16    LYS    OT2    256      -0.67    15.9994   ; qtot -2
+
+[ bonds ]
+;  ai    aj funct            c0            c1            c2            c3
+    1     2     1 
+    1     3     1 
+    1     4     1 
+    1     5     1 
+    5     6     1 
+    5     7     1 
+    5    13     1 
+    7     8     1 
+    7     9     1 
+    7    10     1 
+   10    11     1 
+   10    12     1 
+   13    14     1 
+   13    15     1 
+   15    16     1 
+   15    17     1 
+   17    18     1 
+   17    19     1 
+   17    23     1 
+   19    20     1 
+   19    21     1 
+   19    22     1 
+   23    24     1 
+   23    25     1 
+   25    26     1 
+   25    27     1 
+   27    28     1 
+   27    29     1 
+   27    38     1 
+   29    30     1 
+   29    31     1 
+   29    32     1 
+   32    33     1 
+   32    34     1 
+   32    35     1 
+   35    36     1 
+   35    37     1 
+   38    39     1 
+   38    40     1 
+   40    41     1 
+   40    42     1 
+   42    43     1 
+   42    44     1 
+   42    58     1 
+   44    45     1 
+   44    46     1 
+   44    47     1 
+   47    48     1 
+   47    54     1 
+   48    49     1 
+   48    50     1 
+   50    51     1 
+   50    52     1 
+   52    53     1 
+   52    56     1 
+   54    55     1 
+   54    56     1 
+   56    57     1 
+   58    59     1 
+   58    60     1 
+   60    61     1 
+   60    62     1 
+   62    63     1 
+   62    64     1 
+   62    82     1 
+   64    65     1 
+   64    66     1 
+   64    67     1 
+   67    68     1 
+   67    69     1 
+   67    70     1 
+   70    71     1 
+   70    72     1 
+   70    73     1 
+   73    74     1 
+   73    75     1 
+   75    76     1 
+   75    79     1 
+   76    77     1 
+   76    78     1 
+   79    80     1 
+   79    81     1 
+   82    83     1 
+   82    84     1 
+   84    85     1 
+   84    86     1 
+   86    87     1 
+   86    88     1 
+   86    99     1 
+   88    89     1 
+   88    90     1 
+   88    92     1 
+   91    92     1 
+   91    93     1 
+   92    97     1 
+   93    94     1 
+   93    95     1 
+   95    96     1 
+   95    97     1 
+   97    98     1 
+   99   100     1 
+   99   101     1 
+  101   102     1 
+  101   103     1 
+  103   104     1 
+  103   105     1 
+  103   111     1 
+  105   106     1 
+  105   107     1 
+  105   108     1 
+  108   109     1 
+  108   110     1 
+  111   112     1 
+  111   113     1 
+  113   114     1 
+  113   115     1 
+  115   116     1 
+  115   117     1 
+  115   122     1 
+  117   118     1 
+  117   119     1 
+  117   120     1 
+  120   121     1 
+  122   123     1 
+  122   124     1 
+  124   125     1 
+  124   126     1 
+  126   127     1 
+  126   128     1 
+  126   129     1 
+  129   130     1 
+  129   131     1 
+  131   132     1 
+  131   133     1 
+  133   134     1 
+  133   135     1 
+  133   150     1 
+  135   136     1 
+  135   137     1 
+  135   138     1 
+  138   139     1 
+  138   146     1 
+  139   140     1 
+  139   141     1 
+  141   142     1 
+  141   143     1 
+  143   144     1 
+  143   148     1 
+  144   145     1 
+  146   147     1 
+  146   148     1 
+  148   149     1 
+  150   151     1 
+  150   152     1 
+  152   153     1 
+  152   154     1 
+  154   155     1 
+  154   156     1 
+  154   165     1 
+  156   157     1 
+  156   158     1 
+  156   159     1 
+  159   160     1 
+  159   161     1 
+  159   162     1 
+  162   163     1 
+  162   164     1 
+  165   166     1 
+  165   167     1 
+  167   168     1 
+  167   169     1 
+  169   170     1 
+  169   171     1 
+  169   181     1 
+  171   172     1 
+  171   173     1 
+  171   177     1 
+  173   174     1 
+  173   175     1 
+  173   176     1 
+  177   178     1 
+  177   179     1 
+  177   180     1 
+  181   182     1 
+  181   183     1 
+  183   184     1 
+  183   185     1 
+  185   186     1 
+  185   187     1 
+  185   198     1 
+  187   188     1 
+  187   189     1 
+  187   191     1 
+  190   191     1 
+  190   192     1 
+  191   196     1 
+  192   193     1 
+  192   194     1 
+  194   195     1 
+  194   196     1 
+  196   197     1 
+  198   199     1 
+  198   200     1 
+  200   201     1 
+  200   202     1 
+  202   203     1 
+  202   204     1 
+  202   215     1 
+  204   205     1 
+  204   206     1 
+  204   208     1 
+  207   208     1 
+  207   209     1 
+  208   213     1 
+  209   210     1 
+  209   211     1 
+  211   212     1 
+  211   213     1 
+  213   214     1 
+  215   216     1 
+  215   217     1 
+  217   218     1 
+  217   219     1 
+  219   220     1 
+  219   221     1 
+  219   232     1 
+  221   222     1 
+  221   223     1 
+  221   224     1 
+  224   225     1 
+  224   226     1 
+  224   227     1 
+  227   228     1 
+  227   229     1 
+  229   230     1 
+  229   231     1 
+  232   233     1 
+  232   234     1 
+  234   235     1 
+  234   236     1 
+  236   237     1 
+  236   238     1 
+  236   254     1 
+  238   239     1 
+  238   240     1 
+  238   241     1 
+  241   242     1 
+  241   243     1 
+  241   244     1 
+  244   245     1 
+  244   246     1 
+  244   247     1 
+  247   248     1 
+  247   249     1 
+  247   250     1 
+  250   251     1 
+  250   252     1 
+  250   253     1 
+  254   255     1 
+  254   256     1 
+
+[ pairs ]
+;  ai    aj funct            c0            c1            c2            c3
+    1     8     1 
+    1     9     1 
+    1    10     1 
+    1    14     1 
+    1    15     1 
+    2     6     1 
+    2     7     1 
+    2    13     1 
+    3     6     1 
+    3     7     1 
+    3    13     1 
+    4     6     1 
+    4     7     1 
+    4    13     1 
+    5    11     1 
+    5    12     1 
+    5    16     1 
+    5    17     1 
+    6     8     1 
+    6     9     1 
+    6    10     1 
+    6    14     1 
+    6    15     1 
+    7    14     1 
+    7    15     1 
+    8    11     1 
+    8    12     1 
+    8    13     1 
+    9    11     1 
+    9    12     1 
+    9    13     1 
+   10    13     1 
+   13    18     1 
+   13    19     1 
+   13    23     1 
+   14    16     1 
+   14    17     1 
+   15    20     1 
+   15    21     1 
+   15    22     1 
+   15    24     1 
+   15    25     1 
+   16    18     1 
+   16    19     1 
+   16    23     1 
+   17    26     1 
+   17    27     1 
+   18    20     1 
+   18    21     1 
+   18    22     1 
+   18    24     1 
+   18    25     1 
+   19    24     1 
+   19    25     1 
+   20    23     1 
+   21    23     1 
+   22    23     1 
+   23    28     1 
+   23    29     1 
+   23    38     1 
+   24    26     1 
+   24    27     1 
+   25    30     1 
+   25    31     1 
+   25    32     1 
+   25    39     1 
+   25    40     1 
+   26    28     1 
+   26    29     1 
+   26    38     1 
+   27    33     1 
+   27    34     1 
+   27    35     1 
+   27    41     1 
+   27    42     1 
+   28    30     1 
+   28    31     1 
+   28    32     1 
+   28    39     1 
+   28    40     1 
+   29    36     1 
+   29    37     1 
+   29    39     1 
+   29    40     1 
+   30    33     1 
+   30    34     1 
+   30    35     1 
+   30    38     1 
+   31    33     1 
+   31    34     1 
+   31    35     1 
+   31    38     1 
+   32    38     1 
+   33    36     1 
+   33    37     1 
+   34    36     1 
+   34    37     1 
+   38    43     1 
+   38    44     1 
+   38    58     1 
+   39    41     1 
+   39    42     1 
+   40    45     1 
+   40    46     1 
+   40    47     1 
+   40    59     1 
+   40    60     1 
+   41    43     1 
+   41    44     1 
+   41    58     1 
+   42    48     1 
+   42    54     1 
+   42    61     1 
+   42    62     1 
+   43    45     1 
+   43    46     1 
+   43    47     1 
+   43    59     1 
+   43    60     1 
+   44    49     1 
+   44    50     1 
+   44    55     1 
+   44    56     1 
+   44    59     1 
+   44    60     1 
+   45    48     1 
+   45    54     1 
+   45    58     1 
+   46    48     1 
+   46    54     1 
+   46    58     1 
+   47    51     1 
+   47    52     1 
+   47    57     1 
+   47    58     1 
+   48    53     1 
+   48    55     1 
+   48    56     1 
+   49    51     1 
+   49    52     1 
+   49    54     1 
+   50    54     1 
+   50    57     1 
+   51    53     1 
+   51    56     1 
+   52    55     1 
+   53    54     1 
+   53    57     1 
+   55    57     1 
+   58    63     1 
+   58    64     1 
+   58    82     1 
+   59    61     1 
+   59    62     1 
+   60    65     1 
+   60    66     1 
+   60    67     1 
+   60    83     1 
+   60    84     1 
+   61    63     1 
+   61    64     1 
+   61    82     1 
+   62    68     1 
+   62    69     1 
+   62    70     1 
+   62    85     1 
+   62    86     1 
+   63    65     1 
+   63    66     1 
+   63    67     1 
+   63    83     1 
+   63    84     1 
+   64    71     1 
+   64    72     1 
+   64    73     1 
+   64    83     1 
+   64    84     1 
+   65    68     1 
+   65    69     1 
+   65    70     1 
+   65    82     1 
+   66    68     1 
+   66    69     1 
+   66    70     1 
+   66    82     1 
+   67    74     1 
+   67    75     1 
+   67    82     1 
+   68    71     1 
+   68    72     1 
+   68    73     1 
+   69    71     1 
+   69    72     1 
+   69    73     1 
+   70    76     1 
+   70    79     1 
+   71    74     1 
+   71    75     1 
+   72    74     1 
+   72    75     1 
+   73    77     1 
+   73    78     1 
+   73    80     1 
+   73    81     1 
+   74    76     1 
+   74    79     1 
+   76    80     1 
+   76    81     1 
+   77    79     1 
+   78    79     1 
+   82    87     1 
+   82    88     1 
+   82    99     1 
+   83    85     1 
+   83    86     1 
+   84    89     1 
+   84    90     1 
+   84    92     1 
+   84   100     1 
+   84   101     1 
+   85    87     1 
+   85    88     1 
+   85    99     1 
+   86    91     1 
+   86    97     1 
+   86   102     1 
+   86   103     1 
+   87    89     1 
+   87    90     1 
+   87    92     1 
+   87   100     1 
+   87   101     1 
+   88    93     1 
+   88    95     1 
+   88    98     1 
+   88   100     1 
+   88   101     1 
+   89    91     1 
+   89    97     1 
+   89    99     1 
+   90    91     1 
+   90    97     1 
+   90    99     1 
+   91    96     1 
+   91    98     1 
+   92    94     1 
+   92    96     1 
+   92    99     1 
+   93    98     1 
+   94    96     1 
+   94    97     1 
+   96    98     1 
+   99   104     1 
+   99   105     1 
+   99   111     1 
+  100   102     1 
+  100   103     1 
+  101   106     1 
+  101   107     1 
+  101   108     1 
+  101   112     1 
+  101   113     1 
+  102   104     1 
+  102   105     1 
+  102   111     1 
+  103   109     1 
+  103   110     1 
+  103   114     1 
+  103   115     1 
+  104   106     1 
+  104   107     1 
+  104   108     1 
+  104   112     1 
+  104   113     1 
+  105   112     1 
+  105   113     1 
+  106   109     1 
+  106   110     1 
+  106   111     1 
+  107   109     1 
+  107   110     1 
+  107   111     1 
+  108   111     1 
+  111   116     1 
+  111   117     1 
+  111   122     1 
+  112   114     1 
+  112   115     1 
+  113   118     1 
+  113   119     1 
+  113   120     1 
+  113   123     1 
+  113   124     1 
+  114   116     1 
+  114   117     1 
+  114   122     1 
+  115   121     1 
+  115   125     1 
+  115   126     1 
+  116   118     1 
+  116   119     1 
+  116   120     1 
+  116   123     1 
+  116   124     1 
+  117   123     1 
+  117   124     1 
+  118   121     1 
+  118   122     1 
+  119   121     1 
+  119   122     1 
+  120   122     1 
+  122   127     1 
+  122   128     1 
+  122   129     1 
+  123   125     1 
+  123   126     1 
+  124   130     1 
+  124   131     1 
+  125   127     1 
+  125   128     1 
+  125   129     1 
+  126   132     1 
+  126   133     1 
+  127   130     1 
+  127   131     1 
+  128   130     1 
+  128   131     1 
+  129   134     1 
+  129   135     1 
+  129   150     1 
+  130   132     1 
+  130   133     1 
+  131   136     1 
+  131   137     1 
+  131   138     1 
+  131   151     1 
+  131   152     1 
+  132   134     1 
+  132   135     1 
+  132   150     1 
+  133   139     1 
+  133   146     1 
+  133   153     1 
+  133   154     1 
+  134   136     1 
+  134   137     1 
+  134   138     1 
+  134   151     1 
+  134   152     1 
+  135   140     1 
+  135   141     1 
+  135   147     1 
+  135   148     1 
+  135   151     1 
+  135   152     1 
+  136   139     1 
+  136   146     1 
+  136   150     1 
+  137   139     1 
+  137   146     1 
+  137   150     1 
+  138   142     1 
+  138   143     1 
+  138   149     1 
+  138   150     1 
+  139   144     1 
+  139   147     1 
+  139   148     1 
+  140   142     1 
+  140   143     1 
+  140   146     1 
+  141   145     1 
+  141   146     1 
+  141   149     1 
+  142   144     1 
+  142   148     1 
+  143   147     1 
+  144   146     1 
+  144   149     1 
+  145   148     1 
+  147   149     1 
+  150   155     1 
+  150   156     1 
+  150   165     1 
+  151   153     1 
+  151   154     1 
+  152   157     1 
+  152   158     1 
+  152   159     1 
+  152   166     1 
+  152   167     1 
+  153   155     1 
+  153   156     1 
+  153   165     1 
+  154   160     1 
+  154   161     1 
+  154   162     1 
+  154   168     1 
+  154   169     1 
+  155   157     1 
+  155   158     1 
+  155   159     1 
+  155   166     1 
+  155   167     1 
+  156   163     1 
+  156   164     1 
+  156   166     1 
+  156   167     1 
+  157   160     1 
+  157   161     1 
+  157   162     1 
+  157   165     1 
+  158   160     1 
+  158   161     1 
+  158   162     1 
+  158   165     1 
+  159   165     1 
+  160   163     1 
+  160   164     1 
+  161   163     1 
+  161   164     1 
+  165   170     1 
+  165   171     1 
+  165   181     1 
+  166   168     1 
+  166   169     1 
+  167   172     1 
+  167   173     1 
+  167   177     1 
+  167   182     1 
+  167   183     1 
+  168   170     1 
+  168   171     1 
+  168   181     1 
+  169   174     1 
+  169   175     1 
+  169   176     1 
+  169   178     1 
+  169   179     1 
+  169   180     1 
+  169   184     1 
+  169   185     1 
+  170   172     1 
+  170   173     1 
+  170   177     1 
+  170   182     1 
+  170   183     1 
+  171   182     1 
+  171   183     1 
+  172   174     1 
+  172   175     1 
+  172   176     1 
+  172   178     1 
+  172   179     1 
+  172   180     1 
+  172   181     1 
+  173   178     1 
+  173   179     1 
+  173   180     1 
+  173   181     1 
+  174   177     1 
+  175   177     1 
+  176   177     1 
+  177   181     1 
+  181   186     1 
+  181   187     1 
+  181   198     1 
+  182   184     1 
+  182   185     1 
+  183   188     1 
+  183   189     1 
+  183   191     1 
+  183   199     1 
+  183   200     1 
+  184   186     1 
+  184   187     1 
+  184   198     1 
+  185   190     1 
+  185   196     1 
+  185   201     1 
+  185   202     1 
+  186   188     1 
+  186   189     1 
+  186   191     1 
+  186   199     1 
+  186   200     1 
+  187   192     1 
+  187   194     1 
+  187   197     1 
+  187   199     1 
+  187   200     1 
+  188   190     1 
+  188   196     1 
+  188   198     1 
+  189   190     1 
+  189   196     1 
+  189   198     1 
+  190   195     1 
+  190   197     1 
+  191   193     1 
+  191   195     1 
+  191   198     1 
+  192   197     1 
+  193   195     1 
+  193   196     1 
+  195   197     1 
+  198   203     1 
+  198   204     1 
+  198   215     1 
+  199   201     1 
+  199   202     1 
+  200   205     1 
+  200   206     1 
+  200   208     1 
+  200   216     1 
+  200   217     1 
+  201   203     1 
+  201   204     1 
+  201   215     1 
+  202   207     1 
+  202   213     1 
+  202   218     1 
+  202   219     1 
+  203   205     1 
+  203   206     1 
+  203   208     1 
+  203   216     1 
+  203   217     1 
+  204   209     1 
+  204   211     1 
+  204   214     1 
+  204   216     1 
+  204   217     1 
+  205   207     1 
+  205   213     1 
+  205   215     1 
+  206   207     1 
+  206   213     1 
+  206   215     1 
+  207   212     1 
+  207   214     1 
+  208   210     1 
+  208   212     1 
+  208   215     1 
+  209   214     1 
+  210   212     1 
+  210   213     1 
+  212   214     1 
+  215   220     1 
+  215   221     1 
+  215   232     1 
+  216   218     1 
+  216   219     1 
+  217   222     1 
+  217   223     1 
+  217   224     1 
+  217   233     1 
+  217   234     1 
+  218   220     1 
+  218   221     1 
+  218   232     1 
+  219   225     1 
+  219   226     1 
+  219   227     1 
+  219   235     1 
+  219   236     1 
+  220   222     1 
+  220   223     1 
+  220   224     1 
+  220   233     1 
+  220   234     1 
+  221   228     1 
+  221   229     1 
+  221   233     1 
+  221   234     1 
+  222   225     1 
+  222   226     1 
+  222   227     1 
+  222   232     1 
+  223   225     1 
+  223   226     1 
+  223   227     1 
+  223   232     1 
+  224   230     1 
+  224   231     1 
+  224   232     1 
+  225   228     1 
+  225   229     1 
+  226   228     1 
+  226   229     1 
+  228   230     1 
+  228   231     1 
+  232   237     1 
+  232   238     1 
+  232   254     1 
+  233   235     1 
+  233   236     1 
+  234   239     1 
+  234   240     1 
+  234   241     1 
+  234   255     1 
+  234   256     1 
+  235   237     1 
+  235   238     1 
+  235   254     1 
+  236   242     1 
+  236   243     1 
+  236   244     1 
+  237   239     1 
+  237   240     1 
+  237   241     1 
+  237   255     1 
+  237   256     1 
+  238   245     1 
+  238   246     1 
+  238   247     1 
+  238   255     1 
+  238   256     1 
+  239   242     1 
+  239   243     1 
+  239   244     1 
+  239   254     1 
+  240   242     1 
+  240   243     1 
+  240   244     1 
+  240   254     1 
+  241   248     1 
+  241   249     1 
+  241   250     1 
+  241   254     1 
+  242   245     1 
+  242   246     1 
+  242   247     1 
+  243   245     1 
+  243   246     1 
+  243   247     1 
+  244   251     1 
+  244   252     1 
+  244   253     1 
+  245   248     1 
+  245   249     1 
+  245   250     1 
+  246   248     1 
+  246   249     1 
+  246   250     1 
+  248   251     1 
+  248   252     1 
+  248   253     1 
+  249   251     1 
+  249   252     1 
+  249   253     1 
+
+[ angles ]
+;  ai    aj    ak funct            c0            c1            c2            c3
+    2     1     3     5 
+    2     1     4     5 
+    2     1     5     5 
+    3     1     4     5 
+    3     1     5     5 
+    4     1     5     5 
+    1     5     6     5 
+    1     5     7     5 
+    1     5    13     5 
+    6     5     7     5 
+    6     5    13     5 
+    7     5    13     5 
+    5     7     8     5 
+    5     7     9     5 
+    5     7    10     5 
+    8     7     9     5 
+    8     7    10     5 
+    9     7    10     5 
+    7    10    11     5 
+    7    10    12     5 
+   11    10    12     5 
+    5    13    14     5 
+    5    13    15     5 
+   14    13    15     5 
+   13    15    16     5 
+   13    15    17     5 
+   16    15    17     5 
+   15    17    18     5 
+   15    17    19     5 
+   15    17    23     5 
+   18    17    19     5 
+   18    17    23     5 
+   19    17    23     5 
+   17    19    20     5 
+   17    19    21     5 
+   17    19    22     5 
+   20    19    21     5 
+   20    19    22     5 
+   21    19    22     5 
+   17    23    24     5 
+   17    23    25     5 
+   24    23    25     5 
+   23    25    26     5 
+   23    25    27     5 
+   26    25    27     5 
+   25    27    28     5 
+   25    27    29     5 
+   25    27    38     5 
+   28    27    29     5 
+   28    27    38     5 
+   29    27    38     5 
+   27    29    30     5 
+   27    29    31     5 
+   27    29    32     5 
+   30    29    31     5 
+   30    29    32     5 
+   31    29    32     5 
+   29    32    33     5 
+   29    32    34     5 
+   29    32    35     5 
+   33    32    34     5 
+   33    32    35     5 
+   34    32    35     5 
+   32    35    36     5 
+   32    35    37     5 
+   36    35    37     5 
+   27    38    39     5 
+   27    38    40     5 
+   39    38    40     5 
+   38    40    41     5 
+   38    40    42     5 
+   41    40    42     5 
+   40    42    43     5 
+   40    42    44     5 
+   40    42    58     5 
+   43    42    44     5 
+   43    42    58     5 
+   44    42    58     5 
+   42    44    45     5 
+   42    44    46     5 
+   42    44    47     5 
+   45    44    46     5 
+   45    44    47     5 
+   46    44    47     5 
+   44    47    48     5 
+   44    47    54     5 
+   48    47    54     5 
+   47    48    49     5 
+   47    48    50     5 
+   49    48    50     5 
+   48    50    51     5 
+   48    50    52     5 
+   51    50    52     5 
+   50    52    53     5 
+   50    52    56     5 
+   53    52    56     5 
+   47    54    55     5 
+   47    54    56     5 
+   55    54    56     5 
+   52    56    54     5 
+   52    56    57     5 
+   54    56    57     5 
+   42    58    59     5 
+   42    58    60     5 
+   59    58    60     5 
+   58    60    61     5 
+   58    60    62     5 
+   61    60    62     5 
+   60    62    63     5 
+   60    62    64     5 
+   60    62    82     5 
+   63    62    64     5 
+   63    62    82     5 
+   64    62    82     5 
+   62    64    65     5 
+   62    64    66     5 
+   62    64    67     5 
+   65    64    66     5 
+   65    64    67     5 
+   66    64    67     5 
+   64    67    68     5 
+   64    67    69     5 
+   64    67    70     5 
+   68    67    69     5 
+   68    67    70     5 
+   69    67    70     5 
+   67    70    71     5 
+   67    70    72     5 
+   67    70    73     5 
+   71    70    72     5 
+   71    70    73     5 
+   72    70    73     5 
+   70    73    74     5 
+   70    73    75     5 
+   74    73    75     5 
+   73    75    76     5 
+   73    75    79     5 
+   76    75    79     5 
+   75    76    77     5 
+   75    76    78     5 
+   77    76    78     5 
+   75    79    80     5 
+   75    79    81     5 
+   80    79    81     5 
+   62    82    83     5 
+   62    82    84     5 
+   83    82    84     5 
+   82    84    85     5 
+   82    84    86     5 
+   85    84    86     5 
+   84    86    87     5 
+   84    86    88     5 
+   84    86    99     5 
+   87    86    88     5 
+   87    86    99     5 
+   88    86    99     5 
+   86    88    89     5 
+   86    88    90     5 
+   86    88    92     5 
+   89    88    90     5 
+   89    88    92     5 
+   90    88    92     5 
+   92    91    93     5 
+   88    92    91     5 
+   88    92    97     5 
+   91    92    97     5 
+   91    93    94     5 
+   91    93    95     5 
+   94    93    95     5 
+   93    95    96     5 
+   93    95    97     5 
+   96    95    97     5 
+   92    97    95     5 
+   92    97    98     5 
+   95    97    98     5 
+   86    99   100     5 
+   86    99   101     5 
+  100    99   101     5 
+   99   101   102     5 
+   99   101   103     5 
+  102   101   103     5 
+  101   103   104     5 
+  101   103   105     5 
+  101   103   111     5 
+  104   103   105     5 
+  104   103   111     5 
+  105   103   111     5 
+  103   105   106     5 
+  103   105   107     5 
+  103   105   108     5 
+  106   105   107     5 
+  106   105   108     5 
+  107   105   108     5 
+  105   108   109     5 
+  105   108   110     5 
+  109   108   110     5 
+  103   111   112     5 
+  103   111   113     5 
+  112   111   113     5 
+  111   113   114     5 
+  111   113   115     5 
+  114   113   115     5 
+  113   115   116     5 
+  113   115   117     5 
+  113   115   122     5 
+  116   115   117     5 
+  116   115   122     5 
+  117   115   122     5 
+  115   117   118     5 
+  115   117   119     5 
+  115   117   120     5 
+  118   117   119     5 
+  118   117   120     5 
+  119   117   120     5 
+  117   120   121     5 
+  115   122   123     5 
+  115   122   124     5 
+  123   122   124     5 
+  122   124   125     5 
+  122   124   126     5 
+  125   124   126     5 
+  124   126   127     5 
+  124   126   128     5 
+  124   126   129     5 
+  127   126   128     5 
+  127   126   129     5 
+  128   126   129     5 
+  126   129   130     5 
+  126   129   131     5 
+  130   129   131     5 
+  129   131   132     5 
+  129   131   133     5 
+  132   131   133     5 
+  131   133   134     5 
+  131   133   135     5 
+  131   133   150     5 
+  134   133   135     5 
+  134   133   150     5 
+  135   133   150     5 
+  133   135   136     5 
+  133   135   137     5 
+  133   135   138     5 
+  136   135   137     5 
+  136   135   138     5 
+  137   135   138     5 
+  135   138   139     5 
+  135   138   146     5 
+  139   138   146     5 
+  138   139   140     5 
+  138   139   141     5 
+  140   139   141     5 
+  139   141   142     5 
+  139   141   143     5 
+  142   141   143     5 
+  141   143   144     5 
+  141   143   148     5 
+  144   143   148     5 
+  143   144   145     5 
+  138   146   147     5 
+  138   146   148     5 
+  147   146   148     5 
+  143   148   146     5 
+  143   148   149     5 
+  146   148   149     5 
+  133   150   151     5 
+  133   150   152     5 
+  151   150   152     5 
+  150   152   153     5 
+  150   152   154     5 
+  153   152   154     5 
+  152   154   155     5 
+  152   154   156     5 
+  152   154   165     5 
+  155   154   156     5 
+  155   154   165     5 
+  156   154   165     5 
+  154   156   157     5 
+  154   156   158     5 
+  154   156   159     5 
+  157   156   158     5 
+  157   156   159     5 
+  158   156   159     5 
+  156   159   160     5 
+  156   159   161     5 
+  156   159   162     5 
+  160   159   161     5 
+  160   159   162     5 
+  161   159   162     5 
+  159   162   163     5 
+  159   162   164     5 
+  163   162   164     5 
+  154   165   166     5 
+  154   165   167     5 
+  166   165   167     5 
+  165   167   168     5 
+  165   167   169     5 
+  168   167   169     5 
+  167   169   170     5 
+  167   169   171     5 
+  167   169   181     5 
+  170   169   171     5 
+  170   169   181     5 
+  171   169   181     5 
+  169   171   172     5 
+  169   171   173     5 
+  169   171   177     5 
+  172   171   173     5 
+  172   171   177     5 
+  173   171   177     5 
+  171   173   174     5 
+  171   173   175     5 
+  171   173   176     5 
+  174   173   175     5 
+  174   173   176     5 
+  175   173   176     5 
+  171   177   178     5 
+  171   177   179     5 
+  171   177   180     5 
+  178   177   179     5 
+  178   177   180     5 
+  179   177   180     5 
+  169   181   182     5 
+  169   181   183     5 
+  182   181   183     5 
+  181   183   184     5 
+  181   183   185     5 
+  184   183   185     5 
+  183   185   186     5 
+  183   185   187     5 
+  183   185   198     5 
+  186   185   187     5 
+  186   185   198     5 
+  187   185   198     5 
+  185   187   188     5 
+  185   187   189     5 
+  185   187   191     5 
+  188   187   189     5 
+  188   187   191     5 
+  189   187   191     5 
+  191   190   192     5 
+  187   191   190     5 
+  187   191   196     5 
+  190   191   196     5 
+  190   192   193     5 
+  190   192   194     5 
+  193   192   194     5 
+  192   194   195     5 
+  192   194   196     5 
+  195   194   196     5 
+  191   196   194     5 
+  191   196   197     5 
+  194   196   197     5 
+  185   198   199     5 
+  185   198   200     5 
+  199   198   200     5 
+  198   200   201     5 
+  198   200   202     5 
+  201   200   202     5 
+  200   202   203     5 
+  200   202   204     5 
+  200   202   215     5 
+  203   202   204     5 
+  203   202   215     5 
+  204   202   215     5 
+  202   204   205     5 
+  202   204   206     5 
+  202   204   208     5 
+  205   204   206     5 
+  205   204   208     5 
+  206   204   208     5 
+  208   207   209     5 
+  204   208   207     5 
+  204   208   213     5 
+  207   208   213     5 
+  207   209   210     5 
+  207   209   211     5 
+  210   209   211     5 
+  209   211   212     5 
+  209   211   213     5 
+  212   211   213     5 
+  208   213   211     5 
+  208   213   214     5 
+  211   213   214     5 
+  202   215   216     5 
+  202   215   217     5 
+  216   215   217     5 
+  215   217   218     5 
+  215   217   219     5 
+  218   217   219     5 
+  217   219   220     5 
+  217   219   221     5 
+  217   219   232     5 
+  220   219   221     5 
+  220   219   232     5 
+  221   219   232     5 
+  219   221   222     5 
+  219   221   223     5 
+  219   221   224     5 
+  222   221   223     5 
+  222   221   224     5 
+  223   221   224     5 
+  221   224   225     5 
+  221   224   226     5 
+  221   224   227     5 
+  225   224   226     5 
+  225   224   227     5 
+  226   224   227     5 
+  224   227   228     5 
+  224   227   229     5 
+  228   227   229     5 
+  227   229   230     5 
+  227   229   231     5 
+  230   229   231     5 
+  219   232   233     5 
+  219   232   234     5 
+  233   232   234     5 
+  232   234   235     5 
+  232   234   236     5 
+  235   234   236     5 
+  234   236   237     5 
+  234   236   238     5 
+  234   236   254     5 
+  237   236   238     5 
+  237   236   254     5 
+  238   236   254     5 
+  236   238   239     5 
+  236   238   240     5 
+  236   238   241     5 
+  239   238   240     5 
+  239   238   241     5 
+  240   238   241     5 
+  238   241   242     5 
+  238   241   243     5 
+  238   241   244     5 
+  242   241   243     5 
+  242   241   244     5 
+  243   241   244     5 
+  241   244   245     5 
+  241   244   246     5 
+  241   244   247     5 
+  245   244   246     5 
+  245   244   247     5 
+  246   244   247     5 
+  244   247   248     5 
+  244   247   249     5 
+  244   247   250     5 
+  248   247   249     5 
+  248   247   250     5 
+  249   247   250     5 
+  247   250   251     5 
+  247   250   252     5 
+  247   250   253     5 
+  251   250   252     5 
+  251   250   253     5 
+  252   250   253     5 
+  236   254   255     5 
+  236   254   256     5 
+  255   254   256     5 
+
+[ dihedrals ]
+;  ai    aj    ak    al funct            c0            c1            c2            c3            c4            c5
+    2     1     5     6     9 
+    2     1     5     7     9 
+    2     1     5    13     9 
+    3     1     5     6     9 
+    3     1     5     7     9 
+    3     1     5    13     9 
+    4     1     5     6     9 
+    4     1     5     7     9 
+    4     1     5    13     9 
+    1     5     7     8     9 
+    1     5     7     9     9 
+    1     5     7    10     9 
+    6     5     7     8     9 
+    6     5     7     9     9 
+    6     5     7    10     9 
+   13     5     7     8     9 
+   13     5     7     9     9 
+   13     5     7    10     9 
+    1     5    13    14     9 
+    1     5    13    15     9 
+    6     5    13    14     9 
+    6     5    13    15     9 
+    7     5    13    14     9 
+    7     5    13    15     9 
+    5     7    10    11     9 
+    5     7    10    12     9 
+    8     7    10    11     9 
+    8     7    10    12     9 
+    9     7    10    11     9 
+    9     7    10    12     9 
+    5    13    15    16     9 
+    5    13    15    17     9 
+   14    13    15    16     9 
+   14    13    15    17     9 
+   13    15    17    18     9 
+   13    15    17    19     9 
+   13    15    17    23     9 
+   16    15    17    18     9 
+   16    15    17    19     9 
+   16    15    17    23     9 
+   15    17    19    20     9 
+   15    17    19    21     9 
+   15    17    19    22     9 
+   18    17    19    20     9 
+   18    17    19    21     9 
+   18    17    19    22     9 
+   23    17    19    20     9 
+   23    17    19    21     9 
+   23    17    19    22     9 
+   15    17    23    24     9 
+   15    17    23    25     9 
+   18    17    23    24     9 
+   18    17    23    25     9 
+   19    17    23    24     9 
+   19    17    23    25     9 
+   17    23    25    26     9 
+   17    23    25    27     9 
+   24    23    25    26     9 
+   24    23    25    27     9 
+   23    25    27    28     9 
+   23    25    27    29     9 
+   23    25    27    38     9 
+   26    25    27    28     9 
+   26    25    27    29     9 
+   26    25    27    38     9 
+   25    27    29    30     9 
+   25    27    29    31     9 
+   25    27    29    32     9 
+   28    27    29    30     9 
+   28    27    29    31     9 
+   28    27    29    32     9 
+   38    27    29    30     9 
+   38    27    29    31     9 
+   38    27    29    32     9 
+   25    27    38    39     9 
+   25    27    38    40     9 
+   28    27    38    39     9 
+   28    27    38    40     9 
+   29    27    38    39     9 
+   29    27    38    40     9 
+   27    29    32    33     9 
+   27    29    32    34     9 
+   27    29    32    35     9 
+   30    29    32    33     9 
+   30    29    32    34     9 
+   30    29    32    35     9 
+   31    29    32    33     9 
+   31    29    32    34     9 
+   31    29    32    35     9 
+   29    32    35    36     9 
+   29    32    35    37     9 
+   33    32    35    36     9 
+   33    32    35    37     9 
+   34    32    35    36     9 
+   34    32    35    37     9 
+   27    38    40    41     9 
+   27    38    40    42     9 
+   39    38    40    41     9 
+   39    38    40    42     9 
+   38    40    42    43     9 
+   38    40    42    44     9 
+   38    40    42    58     9 
+   41    40    42    43     9 
+   41    40    42    44     9 
+   41    40    42    58     9 
+   40    42    44    45     9 
+   40    42    44    46     9 
+   40    42    44    47     9 
+   43    42    44    45     9 
+   43    42    44    46     9 
+   43    42    44    47     9 
+   58    42    44    45     9 
+   58    42    44    46     9 
+   58    42    44    47     9 
+   40    42    58    59     9 
+   40    42    58    60     9 
+   43    42    58    59     9 
+   43    42    58    60     9 
+   44    42    58    59     9 
+   44    42    58    60     9 
+   42    44    47    48     9 
+   42    44    47    54     9 
+   45    44    47    48     9 
+   45    44    47    54     9 
+   46    44    47    48     9 
+   46    44    47    54     9 
+   44    47    48    49     9 
+   44    47    48    50     9 
+   54    47    48    49     9 
+   54    47    48    50     9 
+   44    47    54    55     9 
+   44    47    54    56     9 
+   48    47    54    55     9 
+   48    47    54    56     9 
+   47    48    50    51     9 
+   47    48    50    52     9 
+   49    48    50    51     9 
+   49    48    50    52     9 
+   48    50    52    53     9 
+   48    50    52    56     9 
+   51    50    52    53     9 
+   51    50    52    56     9 
+   50    52    56    54     9 
+   50    52    56    57     9 
+   53    52    56    54     9 
+   53    52    56    57     9 
+   47    54    56    52     9 
+   47    54    56    57     9 
+   55    54    56    52     9 
+   55    54    56    57     9 
+   42    58    60    61     9 
+   42    58    60    62     9 
+   59    58    60    61     9 
+   59    58    60    62     9 
+   58    60    62    63     9 
+   58    60    62    64     9 
+   58    60    62    82     9 
+   61    60    62    63     9 
+   61    60    62    64     9 
+   61    60    62    82     9 
+   60    62    64    65     9 
+   60    62    64    66     9 
+   60    62    64    67     9 
+   63    62    64    65     9 
+   63    62    64    66     9 
+   63    62    64    67     9 
+   82    62    64    65     9 
+   82    62    64    66     9 
+   82    62    64    67     9 
+   60    62    82    83     9 
+   60    62    82    84     9 
+   63    62    82    83     9 
+   63    62    82    84     9 
+   64    62    82    83     9 
+   64    62    82    84     9 
+   62    64    67    68     9 
+   62    64    67    69     9 
+   62    64    67    70     9 
+   65    64    67    68     9 
+   65    64    67    69     9 
+   65    64    67    70     9 
+   66    64    67    68     9 
+   66    64    67    69     9 
+   66    64    67    70     9 
+   64    67    70    71     9 
+   64    67    70    72     9 
+   64    67    70    73     9 
+   68    67    70    71     9 
+   68    67    70    72     9 
+   68    67    70    73     9 
+   69    67    70    71     9 
+   69    67    70    72     9 
+   69    67    70    73     9 
+   67    70    73    74     9 
+   67    70    73    75     9 
+   71    70    73    74     9 
+   71    70    73    75     9 
+   72    70    73    74     9 
+   72    70    73    75     9 
+   70    73    75    76     9 
+   70    73    75    79     9 
+   74    73    75    76     9 
+   74    73    75    79     9 
+   73    75    76    77     9 
+   73    75    76    78     9 
+   79    75    76    77     9 
+   79    75    76    78     9 
+   73    75    79    80     9 
+   73    75    79    81     9 
+   76    75    79    80     9 
+   76    75    79    81     9 
+   62    82    84    85     9 
+   62    82    84    86     9 
+   83    82    84    85     9 
+   83    82    84    86     9 
+   82    84    86    87     9 
+   82    84    86    88     9 
+   82    84    86    99     9 
+   85    84    86    87     9 
+   85    84    86    88     9 
+   85    84    86    99     9 
+   84    86    88    89     9 
+   84    86    88    90     9 
+   84    86    88    92     9 
+   87    86    88    89     9 
+   87    86    88    90     9 
+   87    86    88    92     9 
+   99    86    88    89     9 
+   99    86    88    90     9 
+   99    86    88    92     9 
+   84    86    99   100     9 
+   84    86    99   101     9 
+   87    86    99   100     9 
+   87    86    99   101     9 
+   88    86    99   100     9 
+   88    86    99   101     9 
+   86    88    92    91     9 
+   86    88    92    97     9 
+   89    88    92    91     9 
+   89    88    92    97     9 
+   90    88    92    91     9 
+   90    88    92    97     9 
+   93    91    92    88     9 
+   93    91    92    97     9 
+   92    91    93    94     9 
+   92    91    93    95     9 
+   88    92    97    95     9 
+   88    92    97    98     9 
+   91    92    97    95     9 
+   91    92    97    98     9 
+   91    93    95    96     9 
+   91    93    95    97     9 
+   94    93    95    96     9 
+   94    93    95    97     9 
+   93    95    97    92     9 
+   93    95    97    98     9 
+   96    95    97    92     9 
+   96    95    97    98     9 
+   86    99   101   102     9 
+   86    99   101   103     9 
+  100    99   101   102     9 
+  100    99   101   103     9 
+   99   101   103   104     9 
+   99   101   103   105     9 
+   99   101   103   111     9 
+  102   101   103   104     9 
+  102   101   103   105     9 
+  102   101   103   111     9 
+  101   103   105   106     9 
+  101   103   105   107     9 
+  101   103   105   108     9 
+  104   103   105   106     9 
+  104   103   105   107     9 
+  104   103   105   108     9 
+  111   103   105   106     9 
+  111   103   105   107     9 
+  111   103   105   108     9 
+  101   103   111   112     9 
+  101   103   111   113     9 
+  104   103   111   112     9 
+  104   103   111   113     9 
+  105   103   111   112     9 
+  105   103   111   113     9 
+  103   105   108   109     9 
+  103   105   108   110     9 
+  106   105   108   109     9 
+  106   105   108   110     9 
+  107   105   108   109     9 
+  107   105   108   110     9 
+  103   111   113   114     9 
+  103   111   113   115     9 
+  112   111   113   114     9 
+  112   111   113   115     9 
+  111   113   115   116     9 
+  111   113   115   117     9 
+  111   113   115   122     9 
+  114   113   115   116     9 
+  114   113   115   117     9 
+  114   113   115   122     9 
+  113   115   117   118     9 
+  113   115   117   119     9 
+  113   115   117   120     9 
+  116   115   117   118     9 
+  116   115   117   119     9 
+  116   115   117   120     9 
+  122   115   117   118     9 
+  122   115   117   119     9 
+  122   115   117   120     9 
+  113   115   122   123     9 
+  113   115   122   124     9 
+  116   115   122   123     9 
+  116   115   122   124     9 
+  117   115   122   123     9 
+  117   115   122   124     9 
+  115   117   120   121     9 
+  118   117   120   121     9 
+  119   117   120   121     9 
+  115   122   124   125     9 
+  115   122   124   126     9 
+  123   122   124   125     9 
+  123   122   124   126     9 
+  122   124   126   127     9 
+  122   124   126   128     9 
+  122   124   126   129     9 
+  125   124   126   127     9 
+  125   124   126   128     9 
+  125   124   126   129     9 
+  124   126   129   130     9 
+  124   126   129   131     9 
+  127   126   129   130     9 
+  127   126   129   131     9 
+  128   126   129   130     9 
+  128   126   129   131     9 
+  126   129   131   132     9 
+  126   129   131   133     9 
+  130   129   131   132     9 
+  130   129   131   133     9 
+  129   131   133   134     9 
+  129   131   133   135     9 
+  129   131   133   150     9 
+  132   131   133   134     9 
+  132   131   133   135     9 
+  132   131   133   150     9 
+  131   133   135   136     9 
+  131   133   135   137     9 
+  131   133   135   138     9 
+  134   133   135   136     9 
+  134   133   135   137     9 
+  134   133   135   138     9 
+  150   133   135   136     9 
+  150   133   135   137     9 
+  150   133   135   138     9 
+  131   133   150   151     9 
+  131   133   150   152     9 
+  134   133   150   151     9 
+  134   133   150   152     9 
+  135   133   150   151     9 
+  135   133   150   152     9 
+  133   135   138   139     9 
+  133   135   138   146     9 
+  136   135   138   139     9 
+  136   135   138   146     9 
+  137   135   138   139     9 
+  137   135   138   146     9 
+  135   138   139   140     9 
+  135   138   139   141     9 
+  146   138   139   140     9 
+  146   138   139   141     9 
+  135   138   146   147     9 
+  135   138   146   148     9 
+  139   138   146   147     9 
+  139   138   146   148     9 
+  138   139   141   142     9 
+  138   139   141   143     9 
+  140   139   141   142     9 
+  140   139   141   143     9 
+  139   141   143   144     9 
+  139   141   143   148     9 
+  142   141   143   144     9 
+  142   141   143   148     9 
+  141   143   144   145     9 
+  148   143   144   145     9 
+  141   143   148   146     9 
+  141   143   148   149     9 
+  144   143   148   146     9 
+  144   143   148   149     9 
+  138   146   148   143     9 
+  138   146   148   149     9 
+  147   146   148   143     9 
+  147   146   148   149     9 
+  133   150   152   153     9 
+  133   150   152   154     9 
+  151   150   152   153     9 
+  151   150   152   154     9 
+  150   152   154   155     9 
+  150   152   154   156     9 
+  150   152   154   165     9 
+  153   152   154   155     9 
+  153   152   154   156     9 
+  153   152   154   165     9 
+  152   154   156   157     9 
+  152   154   156   158     9 
+  152   154   156   159     9 
+  155   154   156   157     9 
+  155   154   156   158     9 
+  155   154   156   159     9 
+  165   154   156   157     9 
+  165   154   156   158     9 
+  165   154   156   159     9 
+  152   154   165   166     9 
+  152   154   165   167     9 
+  155   154   165   166     9 
+  155   154   165   167     9 
+  156   154   165   166     9 
+  156   154   165   167     9 
+  154   156   159   160     9 
+  154   156   159   161     9 
+  154   156   159   162     9 
+  157   156   159   160     9 
+  157   156   159   161     9 
+  157   156   159   162     9 
+  158   156   159   160     9 
+  158   156   159   161     9 
+  158   156   159   162     9 
+  156   159   162   163     9 
+  156   159   162   164     9 
+  160   159   162   163     9 
+  160   159   162   164     9 
+  161   159   162   163     9 
+  161   159   162   164     9 
+  154   165   167   168     9 
+  154   165   167   169     9 
+  166   165   167   168     9 
+  166   165   167   169     9 
+  165   167   169   170     9 
+  165   167   169   171     9 
+  165   167   169   181     9 
+  168   167   169   170     9 
+  168   167   169   171     9 
+  168   167   169   181     9 
+  167   169   171   172     9 
+  167   169   171   173     9 
+  167   169   171   177     9 
+  170   169   171   172     9 
+  170   169   171   173     9 
+  170   169   171   177     9 
+  181   169   171   172     9 
+  181   169   171   173     9 
+  181   169   171   177     9 
+  167   169   181   182     9 
+  167   169   181   183     9 
+  170   169   181   182     9 
+  170   169   181   183     9 
+  171   169   181   182     9 
+  171   169   181   183     9 
+  169   171   173   174     9 
+  169   171   173   175     9 
+  169   171   173   176     9 
+  172   171   173   174     9 
+  172   171   173   175     9 
+  172   171   173   176     9 
+  177   171   173   174     9 
+  177   171   173   175     9 
+  177   171   173   176     9 
+  169   171   177   178     9 
+  169   171   177   179     9 
+  169   171   177   180     9 
+  172   171   177   178     9 
+  172   171   177   179     9 
+  172   171   177   180     9 
+  173   171   177   178     9 
+  173   171   177   179     9 
+  173   171   177   180     9 
+  169   181   183   184     9 
+  169   181   183   185     9 
+  182   181   183   184     9 
+  182   181   183   185     9 
+  181   183   185   186     9 
+  181   183   185   187     9 
+  181   183   185   198     9 
+  184   183   185   186     9 
+  184   183   185   187     9 
+  184   183   185   198     9 
+  183   185   187   188     9 
+  183   185   187   189     9 
+  183   185   187   191     9 
+  186   185   187   188     9 
+  186   185   187   189     9 
+  186   185   187   191     9 
+  198   185   187   188     9 
+  198   185   187   189     9 
+  198   185   187   191     9 
+  183   185   198   199     9 
+  183   185   198   200     9 
+  186   185   198   199     9 
+  186   185   198   200     9 
+  187   185   198   199     9 
+  187   185   198   200     9 
+  185   187   191   190     9 
+  185   187   191   196     9 
+  188   187   191   190     9 
+  188   187   191   196     9 
+  189   187   191   190     9 
+  189   187   191   196     9 
+  192   190   191   187     9 
+  192   190   191   196     9 
+  191   190   192   193     9 
+  191   190   192   194     9 
+  187   191   196   194     9 
+  187   191   196   197     9 
+  190   191   196   194     9 
+  190   191   196   197     9 
+  190   192   194   195     9 
+  190   192   194   196     9 
+  193   192   194   195     9 
+  193   192   194   196     9 
+  192   194   196   191     9 
+  192   194   196   197     9 
+  195   194   196   191     9 
+  195   194   196   197     9 
+  185   198   200   201     9 
+  185   198   200   202     9 
+  199   198   200   201     9 
+  199   198   200   202     9 
+  198   200   202   203     9 
+  198   200   202   204     9 
+  198   200   202   215     9 
+  201   200   202   203     9 
+  201   200   202   204     9 
+  201   200   202   215     9 
+  200   202   204   205     9 
+  200   202   204   206     9 
+  200   202   204   208     9 
+  203   202   204   205     9 
+  203   202   204   206     9 
+  203   202   204   208     9 
+  215   202   204   205     9 
+  215   202   204   206     9 
+  215   202   204   208     9 
+  200   202   215   216     9 
+  200   202   215   217     9 
+  203   202   215   216     9 
+  203   202   215   217     9 
+  204   202   215   216     9 
+  204   202   215   217     9 
+  202   204   208   207     9 
+  202   204   208   213     9 
+  205   204   208   207     9 
+  205   204   208   213     9 
+  206   204   208   207     9 
+  206   204   208   213     9 
+  209   207   208   204     9 
+  209   207   208   213     9 
+  208   207   209   210     9 
+  208   207   209   211     9 
+  204   208   213   211     9 
+  204   208   213   214     9 
+  207   208   213   211     9 
+  207   208   213   214     9 
+  207   209   211   212     9 
+  207   209   211   213     9 
+  210   209   211   212     9 
+  210   209   211   213     9 
+  209   211   213   208     9 
+  209   211   213   214     9 
+  212   211   213   208     9 
+  212   211   213   214     9 
+  202   215   217   218     9 
+  202   215   217   219     9 
+  216   215   217   218     9 
+  216   215   217   219     9 
+  215   217   219   220     9 
+  215   217   219   221     9 
+  215   217   219   232     9 
+  218   217   219   220     9 
+  218   217   219   221     9 
+  218   217   219   232     9 
+  217   219   221   222     9 
+  217   219   221   223     9 
+  217   219   221   224     9 
+  220   219   221   222     9 
+  220   219   221   223     9 
+  220   219   221   224     9 
+  232   219   221   222     9 
+  232   219   221   223     9 
+  232   219   221   224     9 
+  217   219   232   233     9 
+  217   219   232   234     9 
+  220   219   232   233     9 
+  220   219   232   234     9 
+  221   219   232   233     9 
+  221   219   232   234     9 
+  219   221   224   225     9 
+  219   221   224   226     9 
+  219   221   224   227     9 
+  222   221   224   225     9 
+  222   221   224   226     9 
+  222   221   224   227     9 
+  223   221   224   225     9 
+  223   221   224   226     9 
+  223   221   224   227     9 
+  221   224   227   228     9 
+  221   224   227   229     9 
+  225   224   227   228     9 
+  225   224   227   229     9 
+  226   224   227   228     9 
+  226   224   227   229     9 
+  224   227   229   230     9 
+  224   227   229   231     9 
+  228   227   229   230     9 
+  228   227   229   231     9 
+  219   232   234   235     9 
+  219   232   234   236     9 
+  233   232   234   235     9 
+  233   232   234   236     9 
+  232   234   236   237     9 
+  232   234   236   238     9 
+  232   234   236   254     9 
+  235   234   236   237     9 
+  235   234   236   238     9 
+  235   234   236   254     9 
+  234   236   238   239     9 
+  234   236   238   240     9 
+  234   236   238   241     9 
+  237   236   238   239     9 
+  237   236   238   240     9 
+  237   236   238   241     9 
+  254   236   238   239     9 
+  254   236   238   240     9 
+  254   236   238   241     9 
+  234   236   254   255     9 
+  234   236   254   256     9 
+  237   236   254   255     9 
+  237   236   254   256     9 
+  238   236   254   255     9 
+  238   236   254   256     9 
+  236   238   241   242     9 
+  236   238   241   243     9 
+  236   238   241   244     9 
+  239   238   241   242     9 
+  239   238   241   243     9 
+  239   238   241   244     9 
+  240   238   241   242     9 
+  240   238   241   243     9 
+  240   238   241   244     9 
+  238   241   244   245     9 
+  238   241   244   246     9 
+  238   241   244   247     9 
+  242   241   244   245     9 
+  242   241   244   246     9 
+  242   241   244   247     9 
+  243   241   244   245     9 
+  243   241   244   246     9 
+  243   241   244   247     9 
+  241   244   247   248     9 
+  241   244   247   249     9 
+  241   244   247   250     9 
+  245   244   247   248     9 
+  245   244   247   249     9 
+  245   244   247   250     9 
+  246   244   247   248     9 
+  246   244   247   249     9 
+  246   244   247   250     9 
+  244   247   250   251     9 
+  244   247   250   252     9 
+  244   247   250   253     9 
+  248   247   250   251     9 
+  248   247   250   252     9 
+  248   247   250   253     9 
+  249   247   250   251     9 
+  249   247   250   252     9 
+  249   247   250   253     9 
+
+[ dihedrals ]
+;  ai    aj    ak    al funct            c0            c1            c2            c3
+   10     7    12    11     2 
+   13     5    15    14     2 
+   15    13    17    16     2 
+   23    17    25    24     2 
+   25    23    27    26     2 
+   35    32    37    36     2 
+   38    27    40    39     2 
+   40    38    42    41     2 
+   58    42    60    59     2 
+   60    58    62    61     2 
+   73    79    76    75     2 
+   82    62    84    83     2 
+   84    82    86    85     2 
+   93    91    95    94     2 
+   93    95    91    94     2 
+   95    93    97    96     2 
+   95    97    93    96     2 
+   97    92    95    98     2 
+   97    95    92    98     2 
+   99    86   101   100     2 
+  101    99   103   102     2 
+  108   105   110   109     2 
+  111   103   113   112     2 
+  113   111   115   114     2 
+  122   115   124   123     2 
+  124   122   126   125     2 
+  129   126   131   130     2 
+  131   129   133   132     2 
+  150   133   152   151     2 
+  152   150   154   153     2 
+  162   159   164   163     2 
+  165   154   167   166     2 
+  167   165   169   168     2 
+  181   169   183   182     2 
+  183   181   185   184     2 
+  192   190   194   193     2 
+  192   194   190   193     2 
+  194   192   196   195     2 
+  194   196   192   195     2 
+  196   191   194   197     2 
+  196   194   191   197     2 
+  198   185   200   199     2 
+  200   198   202   201     2 
+  209   207   211   210     2 
+  209   211   207   210     2 
+  211   209   213   212     2 
+  211   213   209   212     2 
+  213   208   211   214     2 
+  213   211   208   214     2 
+  215   202   217   216     2 
+  217   215   219   218     2 
+  227   224   229   228     2 
+  227   229   224   228     2 
+  229   227   231   230     2 
+  229   227   230   231     2 
+  232   219   234   233     2 
+  234   232   236   235     2 
+  254   236   256   255     2 
+
+[ cmap ]
+;  ai    aj    ak    al    am funct
+   13    15    17    23    25     1 
+   23    25    27    38    40     1 
+   38    40    42    58    60     1 
+   58    60    62    82    84     1 
+   82    84    86    99   101     1 
+   99   101   103   111   113     1 
+  111   113   115   122   124     1 
+  122   124   126   129   131     1 
+  129   131   133   150   152     1 
+  150   152   154   165   167     1 
+  165   167   169   181   183     1 
+  181   183   185   198   200     1 
+  198   200   202   215   217     1 
+  215   217   219   232   234     1 
+
+; Include water topology
+#include "charmm27.ff/tip3p.itp"
+
+#ifdef POSRES_WATER
+; Position restraint for each water oxygen
+[ position_restraints ]
+;  i funct       fcx        fcy        fcz
+   1    1       1000       1000       1000
+#endif
+
+; Include topology for ions
+#include "charmm27.ff/ions.itp"
+
+[ system ]
+; Name
+AMYLOID BETA A4 PROTEIN; 4  PROTEIN, CEREBRAL VASCULAR AMYLOID PEPTIDE, CVAP,; 5  PROTEASE NEXIN-II, PN-II, APPI, PREA4; 8  SECRETASES CLEAVAGE SITES OF ALZHEIMER'S DISEASE AMYLOID; 9  A4 PROTEIN, RESIDUES  672-687
+
+[ molecules ]
+; Compound        #mols
+Protein_chain_A     1
index f81272a73aaf876b06ffe42fe6367c6162ee8bad..c7f4e3758ec0781c0ca16f30065ab6d47666a479 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2011,2012,2013,2014,2015,2016,2017, by the GROMACS development team, led by
+ * Copyright (c) 2011,2012,2013,2014,2015,2016,2017,2019, 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.
@@ -49,9 +49,9 @@
 #include <gtest/gtest.h>
 #include <gtest/gtest-spi.h>
 
+#include "gromacs/utility/any.h"
 #include "gromacs/utility/keyvaluetree.h"
 #include "gromacs/utility/keyvaluetreebuilder.h"
-#include "gromacs/utility/variant.h"
 
 #include "testutils/testasserts.h"
 #include "testutils/testexceptions.h"
@@ -344,24 +344,24 @@ TEST(ReferenceDataTest, HandlesUncheckedDataInCompound)
 }
 
 
-TEST(ReferenceDataTest, HandlesVariants)
+TEST(ReferenceDataTest, HandlesAnys)
 {
-    using gmx::Variant;
+    using gmx::Any;
     {
         TestReferenceData    data(gmx::test::erefdataUpdateAll);
         TestReferenceChecker checker(data.rootChecker());
-        checker.checkVariant(Variant::create<bool>(true), "bool");
-        checker.checkVariant(Variant::create<int>(1), "int");
-        checker.checkVariant(Variant::create<double>(3.5), "real");
-        checker.checkVariant(Variant::create<std::string>("foo"), "str");
+        checker.checkAny(Any::create<bool>(true), "bool");
+        checker.checkAny(Any::create<int>(1), "int");
+        checker.checkAny(Any::create<double>(3.5), "real");
+        checker.checkAny(Any::create<std::string>("foo"), "str");
     }
     {
         TestReferenceData    data(gmx::test::erefdataCompare);
         TestReferenceChecker checker(data.rootChecker());
-        checker.checkVariant(Variant::create<bool>(true), "bool");
-        checker.checkVariant(Variant::create<int>(1), "int");
-        checker.checkVariant(Variant::create<double>(3.5), "real");
-        checker.checkVariant(Variant::create<std::string>("foo"), "str");
+        checker.checkAny(Any::create<bool>(true), "bool");
+        checker.checkAny(Any::create<int>(1), "int");
+        checker.checkAny(Any::create<double>(3.5), "real");
+        checker.checkAny(Any::create<std::string>("foo"), "str");
     }
 }
 
@@ -430,44 +430,44 @@ TEST(ReferenceDataTest, HandlesKeyValueTreeMissingKey)
 }
 
 
-TEST(ReferenceDataTest, HandlesVariantsWithIncorrectValue)
+TEST(ReferenceDataTest, HandlesAnysWithIncorrectValue)
 {
-    using gmx::Variant;
+    using gmx::Any;
     {
         TestReferenceData    data(gmx::test::erefdataUpdateAll);
         TestReferenceChecker checker(data.rootChecker());
-        checker.checkVariant(Variant::create<bool>(true), "bool");
-        checker.checkVariant(Variant::create<int>(1), "int");
-        checker.checkVariant(Variant::create<double>(3.5), "real");
-        checker.checkVariant(Variant::create<std::string>("foo"), "str");
+        checker.checkAny(Any::create<bool>(true), "bool");
+        checker.checkAny(Any::create<int>(1), "int");
+        checker.checkAny(Any::create<double>(3.5), "real");
+        checker.checkAny(Any::create<std::string>("foo"), "str");
     }
     {
         TestReferenceData    data(gmx::test::erefdataCompare);
         TestReferenceChecker checker(data.rootChecker());
-        EXPECT_NONFATAL_FAILURE(checker.checkVariant(Variant::create<bool>(false), "bool"), "");
-        EXPECT_NONFATAL_FAILURE(checker.checkVariant(Variant::create<int>(2), "int"), "");
-        EXPECT_NONFATAL_FAILURE(checker.checkVariant(Variant::create<double>(2.5), "real"), "");
-        EXPECT_NONFATAL_FAILURE(checker.checkVariant(Variant::create<std::string>("bar"), "str"), "");
+        EXPECT_NONFATAL_FAILURE(checker.checkAny(Any::create<bool>(false), "bool"), "");
+        EXPECT_NONFATAL_FAILURE(checker.checkAny(Any::create<int>(2), "int"), "");
+        EXPECT_NONFATAL_FAILURE(checker.checkAny(Any::create<double>(2.5), "real"), "");
+        EXPECT_NONFATAL_FAILURE(checker.checkAny(Any::create<std::string>("bar"), "str"), "");
     }
 }
 
 
-TEST(ReferenceDataTest, HandlesVariantsWithIncorrectType)
+TEST(ReferenceDataTest, HandlesAnysWithIncorrectType)
 {
-    using gmx::Variant;
+    using gmx::Any;
     {
         TestReferenceData    data(gmx::test::erefdataUpdateAll);
         TestReferenceChecker checker(data.rootChecker());
-        checker.checkVariant(Variant::create<bool>(true), "bool");
-        checker.checkVariant(Variant::create<int>(1), "int");
-        checker.checkVariant(Variant::create<double>(3.5), "real");
+        checker.checkAny(Any::create<bool>(true), "bool");
+        checker.checkAny(Any::create<int>(1), "int");
+        checker.checkAny(Any::create<double>(3.5), "real");
     }
     {
         TestReferenceData    data(gmx::test::erefdataCompare);
         TestReferenceChecker checker(data.rootChecker());
-        EXPECT_NONFATAL_FAILURE(checker.checkVariant(Variant::create<int>(1), "bool"), "");
-        EXPECT_NONFATAL_FAILURE(checker.checkVariant(Variant::create<bool>(true), "int"), "");
-        EXPECT_NONFATAL_FAILURE(checker.checkVariant(Variant::create<int>(2), "real"), "");
+        EXPECT_NONFATAL_FAILURE(checker.checkAny(Any::create<int>(1), "bool"), "");
+        EXPECT_NONFATAL_FAILURE(checker.checkAny(Any::create<bool>(true), "int"), "");
+        EXPECT_NONFATAL_FAILURE(checker.checkAny(Any::create<int>(2), "real"), "");
     }
 }
 
index 5039ebfb09920e1daff522124fef95c9740cb874..b454177314c848806659f794055c649e52bc5345 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2012,2013,2014,2015,2016,2017,2018, by the GROMACS development team, led by
+# Copyright (c) 2012,2013,2014,2015,2016,2017,2018,2019, 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.
@@ -167,7 +167,7 @@ if(REGRESSIONTEST_PATH)
     endif()
 
     #currently not testing tools because they don't contain any useful tests
-    foreach(subtest simple complex kernel freeenergy rotation essentialdynamics)
+    foreach(subtest complex freeenergy rotation essentialdynamics)
         add_test(NAME regressiontests/${subtest}
             #windows requires the command to be perl and not the script
             COMMAND perl "${REGRESSIONTEST_PATH}/gmxtest.pl" ${subtest} ${ARGS})