hillclimber 0.1.6__cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- hillclimber/__init__.py +41 -0
- hillclimber/actions.py +53 -0
- hillclimber/analysis.py +590 -0
- hillclimber/biases.py +293 -0
- hillclimber/calc.py +22 -0
- hillclimber/cvs.py +1070 -0
- hillclimber/interfaces.py +133 -0
- hillclimber/metadynamics.py +416 -0
- hillclimber/nodes.py +6 -0
- hillclimber/opes.py +359 -0
- hillclimber/pycv.py +362 -0
- hillclimber/selectors.py +230 -0
- hillclimber/virtual_atoms.py +341 -0
- hillclimber-0.1.6.dist-info/METADATA +325 -0
- hillclimber-0.1.6.dist-info/RECORD +475 -0
- hillclimber-0.1.6.dist-info/WHEEL +6 -0
- hillclimber-0.1.6.dist-info/entry_points.txt +8 -0
- hillclimber-0.1.6.dist-info/licenses/LICENSE +165 -0
- hillclimber-0.1.6.dist-info/sboms/auditwheel.cdx.json +1 -0
- hillclimber.libs/libgomp-a49a47f9.so.1.0.0 +0 -0
- plumed/__init__.py +104 -0
- plumed/_lib/bin/plumed +0 -0
- plumed/_lib/bin/plumed-config +9 -0
- plumed/_lib/bin/plumed-patch +9 -0
- plumed/_lib/include/plumed/adjmat/AdjacencyMatrixBase.h +659 -0
- plumed/_lib/include/plumed/adjmat/ContactMatrix.h +59 -0
- plumed/_lib/include/plumed/asmjit/arch.h +228 -0
- plumed/_lib/include/plumed/asmjit/arm.h +43 -0
- plumed/_lib/include/plumed/asmjit/asmjit.h +69 -0
- plumed/_lib/include/plumed/asmjit/asmjit_apibegin.h +143 -0
- plumed/_lib/include/plumed/asmjit/asmjit_apiend.h +93 -0
- plumed/_lib/include/plumed/asmjit/asmjit_build.h +971 -0
- plumed/_lib/include/plumed/asmjit/assembler.h +183 -0
- plumed/_lib/include/plumed/asmjit/base.h +56 -0
- plumed/_lib/include/plumed/asmjit/codebuilder.h +944 -0
- plumed/_lib/include/plumed/asmjit/codecompiler.h +767 -0
- plumed/_lib/include/plumed/asmjit/codeemitter.h +528 -0
- plumed/_lib/include/plumed/asmjit/codeholder.h +777 -0
- plumed/_lib/include/plumed/asmjit/constpool.h +286 -0
- plumed/_lib/include/plumed/asmjit/cpuinfo.h +402 -0
- plumed/_lib/include/plumed/asmjit/func.h +1327 -0
- plumed/_lib/include/plumed/asmjit/globals.h +370 -0
- plumed/_lib/include/plumed/asmjit/inst.h +137 -0
- plumed/_lib/include/plumed/asmjit/logging.h +317 -0
- plumed/_lib/include/plumed/asmjit/misc_p.h +103 -0
- plumed/_lib/include/plumed/asmjit/moved_string.h +318 -0
- plumed/_lib/include/plumed/asmjit/operand.h +1599 -0
- plumed/_lib/include/plumed/asmjit/osutils.h +207 -0
- plumed/_lib/include/plumed/asmjit/regalloc_p.h +597 -0
- plumed/_lib/include/plumed/asmjit/runtime.h +227 -0
- plumed/_lib/include/plumed/asmjit/simdtypes.h +1104 -0
- plumed/_lib/include/plumed/asmjit/utils.h +1387 -0
- plumed/_lib/include/plumed/asmjit/vmem.h +183 -0
- plumed/_lib/include/plumed/asmjit/x86.h +45 -0
- plumed/_lib/include/plumed/asmjit/x86assembler.h +125 -0
- plumed/_lib/include/plumed/asmjit/x86builder.h +117 -0
- plumed/_lib/include/plumed/asmjit/x86compiler.h +322 -0
- plumed/_lib/include/plumed/asmjit/x86emitter.h +5149 -0
- plumed/_lib/include/plumed/asmjit/x86globals.h +535 -0
- plumed/_lib/include/plumed/asmjit/x86inst.h +2547 -0
- plumed/_lib/include/plumed/asmjit/x86instimpl_p.h +74 -0
- plumed/_lib/include/plumed/asmjit/x86internal_p.h +108 -0
- plumed/_lib/include/plumed/asmjit/x86logging_p.h +92 -0
- plumed/_lib/include/plumed/asmjit/x86misc.h +417 -0
- plumed/_lib/include/plumed/asmjit/x86operand.h +1133 -0
- plumed/_lib/include/plumed/asmjit/x86regalloc_p.h +734 -0
- plumed/_lib/include/plumed/asmjit/zone.h +1157 -0
- plumed/_lib/include/plumed/bias/Bias.h +82 -0
- plumed/_lib/include/plumed/bias/ReweightBase.h +58 -0
- plumed/_lib/include/plumed/blas/blas.h +253 -0
- plumed/_lib/include/plumed/blas/def_external.h +61 -0
- plumed/_lib/include/plumed/blas/def_internal.h +97 -0
- plumed/_lib/include/plumed/blas/real.h +49 -0
- plumed/_lib/include/plumed/cltools/CLTool.h +32 -0
- plumed/_lib/include/plumed/clusters/ClusteringBase.h +70 -0
- plumed/_lib/include/plumed/colvar/Colvar.h +32 -0
- plumed/_lib/include/plumed/colvar/ColvarInput.h +68 -0
- plumed/_lib/include/plumed/colvar/ColvarShortcut.h +81 -0
- plumed/_lib/include/plumed/colvar/CoordinationBase.h +52 -0
- plumed/_lib/include/plumed/colvar/MultiColvarTemplate.h +333 -0
- plumed/_lib/include/plumed/colvar/PathMSDBase.h +101 -0
- plumed/_lib/include/plumed/colvar/RMSDVector.h +78 -0
- plumed/_lib/include/plumed/config/Config.h +118 -0
- plumed/_lib/include/plumed/config/version.h +9 -0
- plumed/_lib/include/plumed/contour/ContourFindingObject.h +87 -0
- plumed/_lib/include/plumed/contour/DistanceFromContourBase.h +82 -0
- plumed/_lib/include/plumed/contour/FindContour.h +67 -0
- plumed/_lib/include/plumed/core/Action.h +540 -0
- plumed/_lib/include/plumed/core/ActionAnyorder.h +48 -0
- plumed/_lib/include/plumed/core/ActionAtomistic.h +343 -0
- plumed/_lib/include/plumed/core/ActionForInterface.h +99 -0
- plumed/_lib/include/plumed/core/ActionPilot.h +57 -0
- plumed/_lib/include/plumed/core/ActionRegister.h +124 -0
- plumed/_lib/include/plumed/core/ActionSet.h +163 -0
- plumed/_lib/include/plumed/core/ActionSetup.h +48 -0
- plumed/_lib/include/plumed/core/ActionShortcut.h +73 -0
- plumed/_lib/include/plumed/core/ActionToGetData.h +59 -0
- plumed/_lib/include/plumed/core/ActionToPutData.h +101 -0
- plumed/_lib/include/plumed/core/ActionWithArguments.h +140 -0
- plumed/_lib/include/plumed/core/ActionWithMatrix.h +87 -0
- plumed/_lib/include/plumed/core/ActionWithValue.h +258 -0
- plumed/_lib/include/plumed/core/ActionWithVector.h +94 -0
- plumed/_lib/include/plumed/core/ActionWithVirtualAtom.h +123 -0
- plumed/_lib/include/plumed/core/CLTool.h +177 -0
- plumed/_lib/include/plumed/core/CLToolMain.h +102 -0
- plumed/_lib/include/plumed/core/CLToolRegister.h +108 -0
- plumed/_lib/include/plumed/core/Colvar.h +115 -0
- plumed/_lib/include/plumed/core/DataPassingObject.h +94 -0
- plumed/_lib/include/plumed/core/DataPassingTools.h +54 -0
- plumed/_lib/include/plumed/core/DomainDecomposition.h +120 -0
- plumed/_lib/include/plumed/core/ExchangePatterns.h +47 -0
- plumed/_lib/include/plumed/core/FlexibleBin.h +63 -0
- plumed/_lib/include/plumed/core/GREX.h +61 -0
- plumed/_lib/include/plumed/core/GenericMolInfo.h +89 -0
- plumed/_lib/include/plumed/core/Group.h +41 -0
- plumed/_lib/include/plumed/core/ModuleMap.h +30 -0
- plumed/_lib/include/plumed/core/ParallelTaskManager.h +1023 -0
- plumed/_lib/include/plumed/core/PbcAction.h +61 -0
- plumed/_lib/include/plumed/core/PlumedMain.h +632 -0
- plumed/_lib/include/plumed/core/PlumedMainInitializer.h +118 -0
- plumed/_lib/include/plumed/core/RegisterBase.h +340 -0
- plumed/_lib/include/plumed/core/TargetDist.h +48 -0
- plumed/_lib/include/plumed/core/Value.h +547 -0
- plumed/_lib/include/plumed/core/WithCmd.h +93 -0
- plumed/_lib/include/plumed/dimred/SMACOF.h +55 -0
- plumed/_lib/include/plumed/drr/DRR.h +383 -0
- plumed/_lib/include/plumed/drr/colvar_UIestimator.h +777 -0
- plumed/_lib/include/plumed/fisst/legendre_rule_fast.h +44 -0
- plumed/_lib/include/plumed/function/Custom.h +54 -0
- plumed/_lib/include/plumed/function/Function.h +85 -0
- plumed/_lib/include/plumed/function/FunctionOfMatrix.h +368 -0
- plumed/_lib/include/plumed/function/FunctionOfScalar.h +135 -0
- plumed/_lib/include/plumed/function/FunctionOfVector.h +296 -0
- plumed/_lib/include/plumed/function/FunctionSetup.h +180 -0
- plumed/_lib/include/plumed/function/FunctionShortcut.h +130 -0
- plumed/_lib/include/plumed/function/FunctionWithSingleArgument.h +165 -0
- plumed/_lib/include/plumed/gridtools/ActionWithGrid.h +43 -0
- plumed/_lib/include/plumed/gridtools/EvaluateGridFunction.h +99 -0
- plumed/_lib/include/plumed/gridtools/FunctionOfGrid.h +295 -0
- plumed/_lib/include/plumed/gridtools/GridCoordinatesObject.h +179 -0
- plumed/_lib/include/plumed/gridtools/GridSearch.h +135 -0
- plumed/_lib/include/plumed/gridtools/Interpolator.h +45 -0
- plumed/_lib/include/plumed/gridtools/KDE.h +455 -0
- plumed/_lib/include/plumed/gridtools/RDF.h +40 -0
- plumed/_lib/include/plumed/gridtools/SumOfKernels.h +219 -0
- plumed/_lib/include/plumed/isdb/MetainferenceBase.h +398 -0
- plumed/_lib/include/plumed/lapack/def_external.h +207 -0
- plumed/_lib/include/plumed/lapack/def_internal.h +388 -0
- plumed/_lib/include/plumed/lapack/lapack.h +899 -0
- plumed/_lib/include/plumed/lapack/lapack_limits.h +79 -0
- plumed/_lib/include/plumed/lapack/real.h +50 -0
- plumed/_lib/include/plumed/lepton/CompiledExpression.h +164 -0
- plumed/_lib/include/plumed/lepton/CustomFunction.h +143 -0
- plumed/_lib/include/plumed/lepton/Exception.h +93 -0
- plumed/_lib/include/plumed/lepton/ExpressionProgram.h +137 -0
- plumed/_lib/include/plumed/lepton/ExpressionTreeNode.h +145 -0
- plumed/_lib/include/plumed/lepton/Lepton.h +85 -0
- plumed/_lib/include/plumed/lepton/MSVC_erfc.h +123 -0
- plumed/_lib/include/plumed/lepton/Operation.h +1302 -0
- plumed/_lib/include/plumed/lepton/ParsedExpression.h +165 -0
- plumed/_lib/include/plumed/lepton/Parser.h +111 -0
- plumed/_lib/include/plumed/lepton/windowsIncludes.h +73 -0
- plumed/_lib/include/plumed/mapping/Path.h +44 -0
- plumed/_lib/include/plumed/mapping/PathProjectionCalculator.h +57 -0
- plumed/_lib/include/plumed/matrixtools/MatrixOperationBase.h +54 -0
- plumed/_lib/include/plumed/matrixtools/MatrixTimesMatrix.h +309 -0
- plumed/_lib/include/plumed/matrixtools/MatrixTimesVectorBase.h +365 -0
- plumed/_lib/include/plumed/matrixtools/OuterProduct.h +238 -0
- plumed/_lib/include/plumed/maze/Core.h +65 -0
- plumed/_lib/include/plumed/maze/Loss.h +86 -0
- plumed/_lib/include/plumed/maze/Member.h +66 -0
- plumed/_lib/include/plumed/maze/Memetic.h +799 -0
- plumed/_lib/include/plumed/maze/Optimizer.h +357 -0
- plumed/_lib/include/plumed/maze/Random_MT.h +156 -0
- plumed/_lib/include/plumed/maze/Tools.h +183 -0
- plumed/_lib/include/plumed/metatomic/vesin.h +188 -0
- plumed/_lib/include/plumed/molfile/Gromacs.h +2013 -0
- plumed/_lib/include/plumed/molfile/endianswap.h +217 -0
- plumed/_lib/include/plumed/molfile/fastio.h +683 -0
- plumed/_lib/include/plumed/molfile/largefiles.h +78 -0
- plumed/_lib/include/plumed/molfile/libmolfile_plugin.h +77 -0
- plumed/_lib/include/plumed/molfile/molfile_plugin.h +1034 -0
- plumed/_lib/include/plumed/molfile/periodic_table.h +248 -0
- plumed/_lib/include/plumed/molfile/readpdb.h +447 -0
- plumed/_lib/include/plumed/molfile/vmdplugin.h +236 -0
- plumed/_lib/include/plumed/multicolvar/MultiColvarShortcuts.h +45 -0
- plumed/_lib/include/plumed/opes/ExpansionCVs.h +79 -0
- plumed/_lib/include/plumed/sasa/Sasa.h +32 -0
- plumed/_lib/include/plumed/secondarystructure/SecondaryStructureBase.h +372 -0
- plumed/_lib/include/plumed/setup/ActionSetup.h +25 -0
- plumed/_lib/include/plumed/small_vector/small_vector.h +6114 -0
- plumed/_lib/include/plumed/symfunc/CoordinationNumbers.h +41 -0
- plumed/_lib/include/plumed/tools/Angle.h +52 -0
- plumed/_lib/include/plumed/tools/AtomDistribution.h +138 -0
- plumed/_lib/include/plumed/tools/AtomNumber.h +152 -0
- plumed/_lib/include/plumed/tools/BiasRepresentation.h +106 -0
- plumed/_lib/include/plumed/tools/BitmaskEnum.h +167 -0
- plumed/_lib/include/plumed/tools/Brent1DRootSearch.h +159 -0
- plumed/_lib/include/plumed/tools/CheckInRange.h +44 -0
- plumed/_lib/include/plumed/tools/Citations.h +74 -0
- plumed/_lib/include/plumed/tools/ColvarOutput.h +118 -0
- plumed/_lib/include/plumed/tools/Communicator.h +316 -0
- plumed/_lib/include/plumed/tools/ConjugateGradient.h +80 -0
- plumed/_lib/include/plumed/tools/DLLoader.h +79 -0
- plumed/_lib/include/plumed/tools/ERMSD.h +73 -0
- plumed/_lib/include/plumed/tools/Exception.h +406 -0
- plumed/_lib/include/plumed/tools/File.h +28 -0
- plumed/_lib/include/plumed/tools/FileBase.h +153 -0
- plumed/_lib/include/plumed/tools/FileTools.h +37 -0
- plumed/_lib/include/plumed/tools/ForwardDecl.h +54 -0
- plumed/_lib/include/plumed/tools/Grid.h +638 -0
- plumed/_lib/include/plumed/tools/HistogramBead.h +136 -0
- plumed/_lib/include/plumed/tools/IFile.h +117 -0
- plumed/_lib/include/plumed/tools/KernelFunctions.h +113 -0
- plumed/_lib/include/plumed/tools/Keywords.h +380 -0
- plumed/_lib/include/plumed/tools/LatticeReduction.h +66 -0
- plumed/_lib/include/plumed/tools/LeptonCall.h +64 -0
- plumed/_lib/include/plumed/tools/LinkCells.h +126 -0
- plumed/_lib/include/plumed/tools/Log.h +41 -0
- plumed/_lib/include/plumed/tools/LoopUnroller.h +163 -0
- plumed/_lib/include/plumed/tools/Matrix.h +721 -0
- plumed/_lib/include/plumed/tools/MatrixSquareBracketsAccess.h +138 -0
- plumed/_lib/include/plumed/tools/MergeVectorTools.h +153 -0
- plumed/_lib/include/plumed/tools/Minimise1DBrent.h +244 -0
- plumed/_lib/include/plumed/tools/MinimiseBase.h +120 -0
- plumed/_lib/include/plumed/tools/MolDataClass.h +51 -0
- plumed/_lib/include/plumed/tools/NeighborList.h +112 -0
- plumed/_lib/include/plumed/tools/OFile.h +286 -0
- plumed/_lib/include/plumed/tools/OpenACC.h +180 -0
- plumed/_lib/include/plumed/tools/OpenMP.h +75 -0
- plumed/_lib/include/plumed/tools/PDB.h +154 -0
- plumed/_lib/include/plumed/tools/Pbc.h +139 -0
- plumed/_lib/include/plumed/tools/PlumedHandle.h +105 -0
- plumed/_lib/include/plumed/tools/RMSD.h +493 -0
- plumed/_lib/include/plumed/tools/Random.h +80 -0
- plumed/_lib/include/plumed/tools/RootFindingBase.h +79 -0
- plumed/_lib/include/plumed/tools/Stopwatch.h +475 -0
- plumed/_lib/include/plumed/tools/Subprocess.h +142 -0
- plumed/_lib/include/plumed/tools/SwitchingFunction.h +208 -0
- plumed/_lib/include/plumed/tools/Tensor.h +724 -0
- plumed/_lib/include/plumed/tools/TokenizedLine.h +123 -0
- plumed/_lib/include/plumed/tools/Tools.h +638 -0
- plumed/_lib/include/plumed/tools/Torsion.h +55 -0
- plumed/_lib/include/plumed/tools/TrajectoryParser.h +118 -0
- plumed/_lib/include/plumed/tools/Tree.h +61 -0
- plumed/_lib/include/plumed/tools/TypesafePtr.h +463 -0
- plumed/_lib/include/plumed/tools/Units.h +167 -0
- plumed/_lib/include/plumed/tools/Vector.h +433 -0
- plumed/_lib/include/plumed/tools/View.h +296 -0
- plumed/_lib/include/plumed/tools/View2D.h +100 -0
- plumed/_lib/include/plumed/tools/h36.h +39 -0
- plumed/_lib/include/plumed/vatom/ActionWithVirtualAtom.h +32 -0
- plumed/_lib/include/plumed/ves/BasisFunctions.h +380 -0
- plumed/_lib/include/plumed/ves/CoeffsBase.h +310 -0
- plumed/_lib/include/plumed/ves/CoeffsMatrix.h +220 -0
- plumed/_lib/include/plumed/ves/CoeffsVector.h +251 -0
- plumed/_lib/include/plumed/ves/FermiSwitchingFunction.h +74 -0
- plumed/_lib/include/plumed/ves/GridIntegrationWeights.h +50 -0
- plumed/_lib/include/plumed/ves/GridLinearInterpolation.h +81 -0
- plumed/_lib/include/plumed/ves/GridProjWeights.h +61 -0
- plumed/_lib/include/plumed/ves/LinearBasisSetExpansion.h +303 -0
- plumed/_lib/include/plumed/ves/Optimizer.h +444 -0
- plumed/_lib/include/plumed/ves/TargetDistModifer.h +53 -0
- plumed/_lib/include/plumed/ves/TargetDistribution.h +266 -0
- plumed/_lib/include/plumed/ves/VesBias.h +545 -0
- plumed/_lib/include/plumed/ves/VesTools.h +142 -0
- plumed/_lib/include/plumed/ves/WaveletGrid.h +75 -0
- plumed/_lib/include/plumed/volumes/ActionVolume.h +268 -0
- plumed/_lib/include/plumed/volumes/VolumeShortcut.h +147 -0
- plumed/_lib/include/plumed/wrapper/Plumed.h +5025 -0
- plumed/_lib/include/plumed/xdrfile/xdrfile.h +663 -0
- plumed/_lib/include/plumed/xdrfile/xdrfile_trr.h +89 -0
- plumed/_lib/include/plumed/xdrfile/xdrfile_xtc.h +90 -0
- plumed/_lib/lib/PythonCVInterface.so +0 -0
- plumed/_lib/lib/libplumed.a +0 -0
- plumed/_lib/lib/libplumed.so +0 -0
- plumed/_lib/lib/libplumedKernel.so +0 -0
- plumed/_lib/lib/libplumedWrapper.a +0 -0
- plumed/_lib/lib/pkgconfig/plumed.pc +13 -0
- plumed/_lib/lib/pkgconfig/plumedInternals.pc +13 -0
- plumed/_lib/lib/pkgconfig/plumedWrapper.pc +13 -0
- plumed/_lib/lib/plumed/fortran/plumed.f90 +879 -0
- plumed/_lib/lib/plumed/fortran/plumed_f08.f90 +2625 -0
- plumed/_lib/lib/plumed/modulefile +69 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.config +43 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/CMakeLists.txt +543 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/CMakeLists.txt.preplumed +540 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdlib/expanded.cpp +1628 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdlib/expanded.cpp.preplumed +1590 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdlib/expanded.h +103 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdlib/expanded.h.preplumed +99 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdlib/sim_util.cpp +2527 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdlib/sim_util.cpp.preplumed +2513 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/legacymdrunoptions.cpp +208 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/legacymdrunoptions.cpp.preplumed +175 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/legacymdrunoptions.h +408 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/legacymdrunoptions.h.preplumed +394 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/md.cpp +2348 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/md.cpp.preplumed +2091 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/minimize.cpp +3573 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/minimize.cpp.preplumed +3495 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/replicaexchange.cpp +1506 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/replicaexchange.cpp.preplumed +1402 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/replicaexchange.h +114 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/replicaexchange.h.preplumed +106 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/rerun.cpp +997 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/rerun.cpp.preplumed +906 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/runner.cpp +2780 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/runner.cpp.preplumed +2738 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/modularsimulator/expandedensembleelement.cpp +224 -0
- plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/modularsimulator/expandedensembleelement.cpp.preplumed +222 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.config +43 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/CMakeLists.txt +549 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/CMakeLists.txt.preplumed +546 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdlib/expanded.cpp +1632 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdlib/expanded.cpp.preplumed +1594 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdlib/expanded.h +104 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdlib/expanded.h.preplumed +100 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdlib/sim_util.cpp +2624 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdlib/sim_util.cpp.preplumed +2610 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/legacymdrunoptions.cpp +208 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/legacymdrunoptions.cpp.preplumed +175 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/legacymdrunoptions.h +409 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/legacymdrunoptions.h.preplumed +395 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/md.cpp +2419 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/md.cpp.preplumed +2164 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/minimize.cpp +3546 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/minimize.cpp.preplumed +3468 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/replicaexchange.cpp +1513 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/replicaexchange.cpp.preplumed +1409 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/replicaexchange.h +114 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/replicaexchange.h.preplumed +106 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/rerun.cpp +991 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/rerun.cpp.preplumed +900 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/runner.cpp +2895 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/runner.cpp.preplumed +2849 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/modularsimulator/expandedensembleelement.cpp +224 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/modularsimulator/expandedensembleelement.cpp.preplumed +222 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/taskassignment/decidegpuusage.cpp +886 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/taskassignment/decidegpuusage.cpp.preplumed +880 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/taskassignment/include/gromacs/taskassignment/decidegpuusage.h +347 -0
- plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/taskassignment/include/gromacs/taskassignment/decidegpuusage.h.preplumed +345 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.config +43 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/CMakeLists.txt +575 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/CMakeLists.txt.preplumed +572 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdlib/expanded.cpp +1632 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdlib/expanded.cpp.preplumed +1594 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdlib/expanded.h +104 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdlib/expanded.h.preplumed +100 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdlib/sim_util.cpp +2564 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdlib/sim_util.cpp.preplumed +2550 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/legacymdrunoptions.cpp +208 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/legacymdrunoptions.cpp.preplumed +175 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/legacymdrunoptions.h +410 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/legacymdrunoptions.h.preplumed +396 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/md.cpp +2435 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/md.cpp.preplumed +2187 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/minimize.cpp +3592 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/minimize.cpp.preplumed +3514 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/replicaexchange.cpp +1513 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/replicaexchange.cpp.preplumed +1409 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/replicaexchange.h +114 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/replicaexchange.h.preplumed +106 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/rerun.cpp +958 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/rerun.cpp.preplumed +929 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/runner.cpp +2987 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/runner.cpp.preplumed +2941 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/modularsimulator/expandedensembleelement.cpp +224 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/modularsimulator/expandedensembleelement.cpp.preplumed +222 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/taskassignment/decidegpuusage.cpp +904 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/taskassignment/decidegpuusage.cpp.preplumed +898 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/taskassignment/include/gromacs/taskassignment/decidegpuusage.h +353 -0
- plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/taskassignment/include/gromacs/taskassignment/decidegpuusage.h.preplumed +351 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.config +39 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/cmake/gmxManagePlumed.cmake +82 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/cmake/gmxManagePlumed.cmake.preplumed +82 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedMDModule.cpp +162 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedMDModule.cpp.preplumed +154 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedOptions.cpp +107 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedOptions.cpp.preplumed +99 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedOptions.h +120 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedOptions.h.preplumed +111 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedforceprovider.cpp +215 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedforceprovider.cpp.preplumed +197 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedforceprovider.h +87 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedforceprovider.h.preplumed +86 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/mdrun/runner.cpp +2971 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/mdrun/runner.cpp.preplumed +2970 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/mdrunutility/mdmodulesnotifiers.h +430 -0
- plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/mdrunutility/mdmodulesnotifiers.h.preplumed +429 -0
- plumed/_lib/lib/plumed/patches/namd-2.12.config +30 -0
- plumed/_lib/lib/plumed/patches/namd-2.12.diff +267 -0
- plumed/_lib/lib/plumed/patches/namd-2.13.config +30 -0
- plumed/_lib/lib/plumed/patches/namd-2.13.diff +267 -0
- plumed/_lib/lib/plumed/patches/namd-2.14.config +30 -0
- plumed/_lib/lib/plumed/patches/namd-2.14.diff +268 -0
- plumed/_lib/lib/plumed/patches/patch.sh +500 -0
- plumed/_lib/lib/plumed/patches/qespresso-5.0.2.config +25 -0
- plumed/_lib/lib/plumed/patches/qespresso-5.0.2.diff/PW/src/forces.f90 +368 -0
- plumed/_lib/lib/plumed/patches/qespresso-5.0.2.diff/PW/src/forces.f90.preplumed +366 -0
- plumed/_lib/lib/plumed/patches/qespresso-5.0.2.diff/PW/src/plugin_forces.f90 +71 -0
- plumed/_lib/lib/plumed/patches/qespresso-5.0.2.diff/PW/src/plugin_forces.f90.preplumed +24 -0
- plumed/_lib/lib/plumed/patches/qespresso-5.0.2.diff/PW/src/plugin_initialization.f90 +62 -0
- plumed/_lib/lib/plumed/patches/qespresso-5.0.2.diff/PW/src/plugin_initialization.f90.preplumed +21 -0
- plumed/_lib/lib/plumed/patches/qespresso-5.0.2.diff/PW/src/pwscf.f90 +189 -0
- plumed/_lib/lib/plumed/patches/qespresso-5.0.2.diff/PW/src/pwscf.f90.preplumed +185 -0
- plumed/_lib/lib/plumed/patches/qespresso-6.2.config +26 -0
- plumed/_lib/lib/plumed/patches/qespresso-6.2.diff/PW/src/forces.f90 +422 -0
- plumed/_lib/lib/plumed/patches/qespresso-6.2.diff/PW/src/forces.f90.preplumed +420 -0
- plumed/_lib/lib/plumed/patches/qespresso-6.2.diff/PW/src/plugin_ext_forces.f90 +70 -0
- plumed/_lib/lib/plumed/patches/qespresso-6.2.diff/PW/src/plugin_ext_forces.f90.preplumed +23 -0
- plumed/_lib/lib/plumed/patches/qespresso-6.2.diff/PW/src/plugin_initialization.f90 +62 -0
- plumed/_lib/lib/plumed/patches/qespresso-6.2.diff/PW/src/plugin_initialization.f90.preplumed +21 -0
- plumed/_lib/lib/plumed/patches/qespresso-6.2.diff/PW/src/run_pwscf.f90 +233 -0
- plumed/_lib/lib/plumed/patches/qespresso-6.2.diff/PW/src/run_pwscf.f90.preplumed +230 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.0.config +28 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/Modules/Makefile +175 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/Modules/Makefile.preplumed +171 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/PW/src/forces.f90 +486 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/PW/src/forces.f90.preplumed +484 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/PW/src/plugin_ext_forces.f90 +74 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/PW/src/plugin_ext_forces.f90.preplumed +23 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/PW/src/plugin_initialization.f90 +64 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/PW/src/plugin_initialization.f90.preplumed +21 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/PW/src/run_pwscf.f90 +532 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/PW/src/run_pwscf.f90.preplumed +518 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.2.config +28 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/Modules/Makefile +249 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/Modules/Makefile.preplumed +244 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/PW/src/forces.f90 +532 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/PW/src/forces.f90.preplumed +535 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/PW/src/plugin_ext_forces.f90 +74 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/PW/src/plugin_ext_forces.f90.preplumed +23 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/PW/src/plugin_initialization.f90 +64 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/PW/src/plugin_initialization.f90.preplumed +21 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/PW/src/run_pwscf.f90 +569 -0
- plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/PW/src/run_pwscf.f90.preplumed +560 -0
- plumed/_lib/lib/plumed/plumed-config +9 -0
- plumed/_lib/lib/plumed/plumed-mklib +9 -0
- plumed/_lib/lib/plumed/plumed-newcv +9 -0
- plumed/_lib/lib/plumed/plumed-partial_tempering +9 -0
- plumed/_lib/lib/plumed/plumed-patch +9 -0
- plumed/_lib/lib/plumed/plumed-runtime +0 -0
- plumed/_lib/lib/plumed/plumed-selector +9 -0
- plumed/_lib/lib/plumed/plumed-vim2html +9 -0
- plumed/_lib/lib/plumed/scripts/config.sh +126 -0
- plumed/_lib/lib/plumed/scripts/mklib.sh +175 -0
- plumed/_lib/lib/plumed/scripts/newcv.sh +26 -0
- plumed/_lib/lib/plumed/scripts/partial_tempering.sh +319 -0
- plumed/_lib/lib/plumed/scripts/patch.sh +4 -0
- plumed/_lib/lib/plumed/scripts/selector.sh +234 -0
- plumed/_lib/lib/plumed/scripts/vim2html.sh +190 -0
- plumed/_lib/lib/plumed/src/colvar/Template.cpp +116 -0
- plumed/_lib/lib/plumed/src/config/compile_options.sh +3 -0
- plumed/_lib/lib/plumed/src/config/config.txt +179 -0
- plumed/_lib/lib/plumed/src/lib/Plumed.cmake +8 -0
- plumed/_lib/lib/plumed/src/lib/Plumed.cmake.runtime +5 -0
- plumed/_lib/lib/plumed/src/lib/Plumed.cmake.shared +5 -0
- plumed/_lib/lib/plumed/src/lib/Plumed.cmake.static +5 -0
- plumed/_lib/lib/plumed/src/lib/Plumed.inc +8 -0
- plumed/_lib/lib/plumed/src/lib/Plumed.inc.runtime +5 -0
- plumed/_lib/lib/plumed/src/lib/Plumed.inc.shared +5 -0
- plumed/_lib/lib/plumed/src/lib/Plumed.inc.static +5 -0
- plumed/_lib/lib/plumed/vim/scripts.vim +6 -0
- plumed/_plumed_core.cpython-311-aarch64-linux-gnu.so +0 -0
- plumed/_plumed_core.cpython-312-aarch64-linux-gnu.so +0 -0
- plumed/_plumed_core.cpython-313-aarch64-linux-gnu.so +0 -0
- plumed/_plumed_core.cpython-314-aarch64-linux-gnu.so +0 -0
- plumed/_plumed_core.cpython-314t-aarch64-linux-gnu.so +0 -0
- plumedCommunications.cpython-311-aarch64-linux-gnu.so +0 -0
- plumedCommunications.cpython-312-aarch64-linux-gnu.so +0 -0
- plumedCommunications.cpython-313-aarch64-linux-gnu.so +0 -0
- plumedCommunications.cpython-314-aarch64-linux-gnu.so +0 -0
- plumedCommunications.cpython-314t-aarch64-linux-gnu.so +0 -0
- plumedCommunications.pyi +431 -0
|
@@ -0,0 +1,898 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This file is part of the GROMACS molecular simulation package.
|
|
3
|
+
*
|
|
4
|
+
* Copyright 2015- The GROMACS Authors
|
|
5
|
+
* and the project initiators Erik Lindahl, Berk Hess and David van der Spoel.
|
|
6
|
+
* Consult the AUTHORS/COPYING files and https://www.gromacs.org for details.
|
|
7
|
+
*
|
|
8
|
+
* GROMACS is free software; you can redistribute it and/or
|
|
9
|
+
* modify it under the terms of the GNU Lesser General Public License
|
|
10
|
+
* as published by the Free Software Foundation; either version 2.1
|
|
11
|
+
* of the License, or (at your option) any later version.
|
|
12
|
+
*
|
|
13
|
+
* GROMACS is distributed in the hope that it will be useful,
|
|
14
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
15
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
16
|
+
* Lesser General Public License for more details.
|
|
17
|
+
*
|
|
18
|
+
* You should have received a copy of the GNU Lesser General Public
|
|
19
|
+
* License along with GROMACS; if not, see
|
|
20
|
+
* https://www.gnu.org/licenses, or write to the Free Software Foundation,
|
|
21
|
+
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
22
|
+
*
|
|
23
|
+
* If you want to redistribute modifications to GROMACS, please
|
|
24
|
+
* consider that scientific software is very special. Version
|
|
25
|
+
* control is crucial - bugs must be traceable. We will be happy to
|
|
26
|
+
* consider code for inclusion in the official distribution, but
|
|
27
|
+
* derived work must not be called official GROMACS. Details are found
|
|
28
|
+
* in the README & COPYING files - if they are missing, get the
|
|
29
|
+
* official version at https://www.gromacs.org.
|
|
30
|
+
*
|
|
31
|
+
* To help us fund GROMACS development, we humbly ask that you cite
|
|
32
|
+
* the research papers on the package. Check out https://www.gromacs.org.
|
|
33
|
+
*/
|
|
34
|
+
/*! \internal \file
|
|
35
|
+
* \brief Defines functionality for deciding whether tasks will run on GPUs.
|
|
36
|
+
*
|
|
37
|
+
* \author Mark Abraham <mark.j.abraham@gmail.com>
|
|
38
|
+
* \ingroup module_taskassignment
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
#include "gmxpre.h"
|
|
42
|
+
|
|
43
|
+
#include "gromacs/taskassignment/decidegpuusage.h"
|
|
44
|
+
|
|
45
|
+
#include "config.h"
|
|
46
|
+
|
|
47
|
+
#include <cstdlib>
|
|
48
|
+
#include <cstring>
|
|
49
|
+
|
|
50
|
+
#include <algorithm>
|
|
51
|
+
#include <string>
|
|
52
|
+
|
|
53
|
+
#include "gromacs/ewald/pme.h"
|
|
54
|
+
#include "gromacs/hardware/cpuinfo.h"
|
|
55
|
+
#include "gromacs/hardware/detecthardware.h"
|
|
56
|
+
#include "gromacs/hardware/hardwaretopology.h"
|
|
57
|
+
#include "gromacs/hardware/hw_info.h"
|
|
58
|
+
#include "gromacs/listed_forces/listed_forces_gpu.h"
|
|
59
|
+
#include "gromacs/mdlib/gmx_omp_nthreads.h"
|
|
60
|
+
#include "gromacs/mdlib/update_constrain_gpu.h"
|
|
61
|
+
#include "gromacs/mdtypes/commrec.h"
|
|
62
|
+
#include "gromacs/mdtypes/inputrec.h"
|
|
63
|
+
#include "gromacs/mdtypes/md_enums.h"
|
|
64
|
+
#include "gromacs/mdtypes/mdrunoptions.h"
|
|
65
|
+
#include "gromacs/pulling/pull.h"
|
|
66
|
+
#include "gromacs/taskassignment/taskassignment.h"
|
|
67
|
+
#include "gromacs/topology/mtop_util.h"
|
|
68
|
+
#include "gromacs/topology/topology.h"
|
|
69
|
+
#include "gromacs/utility/baseversion.h"
|
|
70
|
+
#include "gromacs/utility/exceptions.h"
|
|
71
|
+
#include "gromacs/utility/fatalerror.h"
|
|
72
|
+
#include "gromacs/utility/gmxassert.h"
|
|
73
|
+
#include "gromacs/utility/logger.h"
|
|
74
|
+
#include "gromacs/utility/message_string_collector.h"
|
|
75
|
+
#include "gromacs/utility/stringutil.h"
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
namespace gmx
|
|
79
|
+
{
|
|
80
|
+
|
|
81
|
+
namespace
|
|
82
|
+
{
|
|
83
|
+
|
|
84
|
+
//! Helper variable to localise the text of an often repeated message.
|
|
85
|
+
const char* const g_specifyEverythingFormatString =
|
|
86
|
+
"When you use mdrun -gputasks, %s must be set to non-default "
|
|
87
|
+
"values, so that the device IDs can be interpreted correctly."
|
|
88
|
+
#if GMX_GPU
|
|
89
|
+
" If you simply want to restrict which GPUs are used, then it is "
|
|
90
|
+
"better to use mdrun -gpu_id. Otherwise, setting the "
|
|
91
|
+
# if GMX_GPU_CUDA
|
|
92
|
+
"CUDA_VISIBLE_DEVICES"
|
|
93
|
+
# elif GMX_GPU_OPENCL
|
|
94
|
+
// Technically there is no portable way to do this offered by the
|
|
95
|
+
// OpenCL standard, but the only current relevant case for GROMACS
|
|
96
|
+
// is AMD OpenCL, which offers this variable.
|
|
97
|
+
"GPU_DEVICE_ORDINAL"
|
|
98
|
+
# elif GMX_GPU_SYCL && GMX_SYCL_DPCPP
|
|
99
|
+
// https://github.com/intel/llvm/blob/sycl/sycl/doc/EnvironmentVariables.md
|
|
100
|
+
"ONEAPI_DEVICE_SELECTOR"
|
|
101
|
+
# elif GMX_GPU_SYCL && GMX_SYCL_HIPSYCL && GMX_HIPSYCL_HAVE_HIP_TARGET
|
|
102
|
+
// https://rocm.docs.amd.com/en/latest/conceptual/gpu-isolation.html
|
|
103
|
+
"ROCR_VISIBLE_DEVICES"
|
|
104
|
+
# elif GMX_GPU_SYCL && GMX_SYCL_HIPSYCL && GMX_HIPSYCL_HAVE_CUDA_TARGET
|
|
105
|
+
"CUDA_VISIBLE_DEVIES"
|
|
106
|
+
# else
|
|
107
|
+
# error "Unreachable branch"
|
|
108
|
+
# endif
|
|
109
|
+
" environment variable in your bash profile or job "
|
|
110
|
+
"script may be more convenient."
|
|
111
|
+
#endif
|
|
112
|
+
;
|
|
113
|
+
|
|
114
|
+
} // namespace
|
|
115
|
+
|
|
116
|
+
// The conditions below must be in sync with getSkipMessagesIfNecessary check in src/programs/mdrun/tests/pmetest.cpp
|
|
117
|
+
constexpr bool c_gpuBuildSyclWithoutGpuFft =
|
|
118
|
+
// NOLINTNEXTLINE(misc-redundant-expression)
|
|
119
|
+
(GMX_GPU_SYCL != 0) && (GMX_GPU_FFT_MKL == 0) && (GMX_GPU_FFT_ROCFFT == 0)
|
|
120
|
+
&& (GMX_GPU_FFT_VKFFT == 0) && (GMX_GPU_FFT_BBFFT == 0); // NOLINT(misc-redundant-expression)
|
|
121
|
+
|
|
122
|
+
bool decideWhetherToUseGpusForNonbondedWithThreadMpi(const TaskTarget nonbondedTarget,
|
|
123
|
+
const bool haveAvailableDevices,
|
|
124
|
+
const std::vector<int>& userGpuTaskAssignment,
|
|
125
|
+
const EmulateGpuNonbonded emulateGpuNonbonded,
|
|
126
|
+
const bool buildSupportsNonbondedOnGpu,
|
|
127
|
+
const bool nonbondedOnGpuIsUseful,
|
|
128
|
+
const bool binaryReproducibilityRequested,
|
|
129
|
+
const int numRanksPerSimulation)
|
|
130
|
+
{
|
|
131
|
+
// First, exclude all cases where we can't run NB on GPUs.
|
|
132
|
+
if (nonbondedTarget == TaskTarget::Cpu || emulateGpuNonbonded == EmulateGpuNonbonded::Yes
|
|
133
|
+
|| !nonbondedOnGpuIsUseful || binaryReproducibilityRequested || !buildSupportsNonbondedOnGpu)
|
|
134
|
+
{
|
|
135
|
+
// If the user required NB on GPUs, we issue an error later.
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// We now know that NB on GPUs makes sense, if we have any.
|
|
140
|
+
|
|
141
|
+
if (!userGpuTaskAssignment.empty())
|
|
142
|
+
{
|
|
143
|
+
// Specifying -gputasks requires specifying everything.
|
|
144
|
+
if (nonbondedTarget == TaskTarget::Auto || numRanksPerSimulation < 1)
|
|
145
|
+
{
|
|
146
|
+
GMX_THROW(InconsistentInputError(formatString(
|
|
147
|
+
g_specifyEverythingFormatString, GMX_THREAD_MPI ? "-nb and -ntmpi" : "-nb")));
|
|
148
|
+
}
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (nonbondedTarget == TaskTarget::Gpu)
|
|
153
|
+
{
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Because this is thread-MPI, we already know about the GPUs that
|
|
158
|
+
// all potential ranks can use, and can use that in a global
|
|
159
|
+
// decision that will later be consistent.
|
|
160
|
+
// If we get here, then the user permitted or required GPUs.
|
|
161
|
+
return haveAvailableDevices;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
static bool decideWhetherToUseGpusForPmeFft(const TaskTarget pmeFftTarget)
|
|
165
|
+
{
|
|
166
|
+
const bool useCpuFft = (pmeFftTarget == TaskTarget::Cpu)
|
|
167
|
+
|| (pmeFftTarget == TaskTarget::Auto && c_gpuBuildSyclWithoutGpuFft);
|
|
168
|
+
return !useCpuFft;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
static bool canUseGpusForPme(const bool useGpuForNonbonded,
|
|
172
|
+
const TaskTarget pmeTarget,
|
|
173
|
+
const TaskTarget pmeFftTarget,
|
|
174
|
+
const t_inputrec& inputrec,
|
|
175
|
+
std::string* errorMessage)
|
|
176
|
+
{
|
|
177
|
+
if (pmeTarget == TaskTarget::Cpu)
|
|
178
|
+
{
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
std::string tempString;
|
|
183
|
+
gmx::MessageStringCollector errorReasons;
|
|
184
|
+
// Before changing the prefix string, make sure that it is not searched for in regression tests.
|
|
185
|
+
errorReasons.startContext("Cannot compute PME interactions on a GPU, because:");
|
|
186
|
+
errorReasons.appendIf(!useGpuForNonbonded, "Nonbonded interactions must also run on GPUs.");
|
|
187
|
+
errorReasons.appendIf(!pme_gpu_supports_build(&tempString), tempString);
|
|
188
|
+
errorReasons.appendIf(!pme_gpu_supports_input(inputrec, &tempString), tempString);
|
|
189
|
+
if (!decideWhetherToUseGpusForPmeFft(pmeFftTarget))
|
|
190
|
+
{
|
|
191
|
+
// We need to do FFT on CPU, so we check whether we are able to use PME Mixed mode.
|
|
192
|
+
errorReasons.appendIf(!pme_gpu_mixed_mode_supports_input(inputrec, &tempString), tempString);
|
|
193
|
+
}
|
|
194
|
+
errorReasons.finishContext();
|
|
195
|
+
|
|
196
|
+
if (errorReasons.isEmpty())
|
|
197
|
+
{
|
|
198
|
+
return true;
|
|
199
|
+
}
|
|
200
|
+
else
|
|
201
|
+
{
|
|
202
|
+
if (pmeTarget == TaskTarget::Gpu && errorMessage != nullptr)
|
|
203
|
+
{
|
|
204
|
+
*errorMessage = errorReasons.toString();
|
|
205
|
+
}
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
bool decideWhetherToUseGpusForPmeWithThreadMpi(const bool useGpuForNonbonded,
|
|
211
|
+
const TaskTarget pmeTarget,
|
|
212
|
+
const TaskTarget pmeFftTarget,
|
|
213
|
+
const int numDevicesToUse,
|
|
214
|
+
const std::vector<int>& userGpuTaskAssignment,
|
|
215
|
+
const t_inputrec& inputrec,
|
|
216
|
+
const int numRanksPerSimulation,
|
|
217
|
+
const int numPmeRanksPerSimulation)
|
|
218
|
+
{
|
|
219
|
+
// First, exclude all cases where we can't run PME on GPUs.
|
|
220
|
+
if (!canUseGpusForPme(useGpuForNonbonded, pmeTarget, pmeFftTarget, inputrec, nullptr))
|
|
221
|
+
{
|
|
222
|
+
// PME can't run on a GPU. If the user required that, we issue an error later.
|
|
223
|
+
return false;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// We now know that PME on GPUs might make sense, if we have any.
|
|
227
|
+
|
|
228
|
+
if (pmeTarget == TaskTarget::Gpu)
|
|
229
|
+
{
|
|
230
|
+
if ((numRanksPerSimulation > 1) && (numPmeRanksPerSimulation < 0))
|
|
231
|
+
{
|
|
232
|
+
GMX_THROW(NotImplementedError(
|
|
233
|
+
"PME tasks were required to run on GPUs with multiple ranks "
|
|
234
|
+
"but the -npme option was not specified. "
|
|
235
|
+
"A non-negative value must be specified for -npme."));
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
if (!userGpuTaskAssignment.empty())
|
|
240
|
+
{
|
|
241
|
+
// Follow the user's choice of GPU task assignment, if we
|
|
242
|
+
// can. Checking that their IDs are for compatible GPUs comes
|
|
243
|
+
// later.
|
|
244
|
+
|
|
245
|
+
// Specifying -gputasks requires specifying everything.
|
|
246
|
+
if (pmeTarget == TaskTarget::Auto || numRanksPerSimulation < 1)
|
|
247
|
+
{
|
|
248
|
+
GMX_THROW(InconsistentInputError(
|
|
249
|
+
formatString(g_specifyEverythingFormatString, "all of -nb, -pme, and -ntmpi")));
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// PME on GPUs is only supported in a single case
|
|
253
|
+
if (pmeTarget == TaskTarget::Gpu)
|
|
254
|
+
{
|
|
255
|
+
if (((numRanksPerSimulation > 1) && (numPmeRanksPerSimulation == 0))
|
|
256
|
+
|| (numPmeRanksPerSimulation > 1))
|
|
257
|
+
{
|
|
258
|
+
GMX_THROW(InconsistentInputError(
|
|
259
|
+
"When you run mdrun -pme gpu -gputasks, you must supply a PME-enabled .tpr "
|
|
260
|
+
"file and use a single PME rank."));
|
|
261
|
+
}
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// pmeTarget == TaskTarget::Auto
|
|
266
|
+
return numRanksPerSimulation == 1;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// Because this is thread-MPI, we already know about the GPUs that
|
|
270
|
+
// all potential ranks can use, and can use that in a global
|
|
271
|
+
// decision that will later be consistent.
|
|
272
|
+
|
|
273
|
+
if (pmeTarget == TaskTarget::Gpu)
|
|
274
|
+
{
|
|
275
|
+
if (((numRanksPerSimulation > 1) && (numPmeRanksPerSimulation == 0))
|
|
276
|
+
|| (numPmeRanksPerSimulation > 1))
|
|
277
|
+
{
|
|
278
|
+
GMX_THROW(NotImplementedError(
|
|
279
|
+
"PME tasks were required to run on GPUs, but that is not implemented with "
|
|
280
|
+
"more than one PME rank. Use a single rank simulation, or a separate PME rank, "
|
|
281
|
+
"or permit PME tasks to be assigned to the CPU."));
|
|
282
|
+
}
|
|
283
|
+
return true;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
if (numRanksPerSimulation == 1)
|
|
287
|
+
{
|
|
288
|
+
// PME can run well on a GPU shared with NB, and we permit
|
|
289
|
+
// mdrun to default to try that.
|
|
290
|
+
return numDevicesToUse > 0;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
if (numPmeRanksPerSimulation == 1)
|
|
294
|
+
{
|
|
295
|
+
// We have a single separate PME rank, that can use a GPU
|
|
296
|
+
return numDevicesToUse > 0;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
if (numRanksPerSimulation < 1)
|
|
300
|
+
{
|
|
301
|
+
// Full automated mode for thread-MPI (the default). PME can
|
|
302
|
+
// run well on a GPU shared with NB, and we permit mdrun to
|
|
303
|
+
// default to it if there is only one GPU available.
|
|
304
|
+
return (numDevicesToUse == 1);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// Not enough support for PME on GPUs for anything else
|
|
308
|
+
return false;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
bool decideWhetherToUseGpusForNonbonded(const TaskTarget nonbondedTarget,
|
|
312
|
+
const std::vector<int>& userGpuTaskAssignment,
|
|
313
|
+
const EmulateGpuNonbonded emulateGpuNonbonded,
|
|
314
|
+
const bool buildSupportsNonbondedOnGpu,
|
|
315
|
+
const bool nonbondedOnGpuIsUseful,
|
|
316
|
+
const bool binaryReproducibilityRequested,
|
|
317
|
+
const bool gpusWereDetected)
|
|
318
|
+
{
|
|
319
|
+
if (nonbondedTarget == TaskTarget::Cpu)
|
|
320
|
+
{
|
|
321
|
+
if (!userGpuTaskAssignment.empty())
|
|
322
|
+
{
|
|
323
|
+
GMX_THROW(InconsistentInputError(
|
|
324
|
+
"A GPU task assignment was specified, but nonbonded interactions were "
|
|
325
|
+
"assigned to the CPU. Make no more than one of these choices."));
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
return false;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
if (!buildSupportsNonbondedOnGpu && nonbondedTarget == TaskTarget::Gpu)
|
|
332
|
+
{
|
|
333
|
+
GMX_THROW(InconsistentInputError(
|
|
334
|
+
"Nonbonded interactions on the GPU were requested with -nb gpu, "
|
|
335
|
+
"but the GROMACS binary has been built without GPU support. "
|
|
336
|
+
"Either run without selecting GPU options, or recompile GROMACS "
|
|
337
|
+
"with GPU support enabled"));
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// TODO refactor all these TaskTarget::Gpu checks into one place?
|
|
341
|
+
// e.g. use a subfunction that handles only the cases where
|
|
342
|
+
// TaskTargets are not Cpu?
|
|
343
|
+
if (emulateGpuNonbonded == EmulateGpuNonbonded::Yes)
|
|
344
|
+
{
|
|
345
|
+
if (nonbondedTarget == TaskTarget::Gpu)
|
|
346
|
+
{
|
|
347
|
+
GMX_THROW(InconsistentInputError(
|
|
348
|
+
"Nonbonded interactions on the GPU were required, which is inconsistent "
|
|
349
|
+
"with choosing emulation. Make no more than one of these choices."));
|
|
350
|
+
}
|
|
351
|
+
if (!userGpuTaskAssignment.empty())
|
|
352
|
+
{
|
|
353
|
+
GMX_THROW(
|
|
354
|
+
InconsistentInputError("GPU ID usage was specified, as was GPU emulation. Make "
|
|
355
|
+
"no more than one of these choices."));
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
return false;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
if (!nonbondedOnGpuIsUseful)
|
|
362
|
+
{
|
|
363
|
+
if (nonbondedTarget == TaskTarget::Gpu)
|
|
364
|
+
{
|
|
365
|
+
GMX_THROW(InconsistentInputError(
|
|
366
|
+
"Nonbonded interactions on the GPU were required, but not supported for these "
|
|
367
|
+
"simulation settings. Change your settings, or do not require using GPUs."));
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
return false;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
if (binaryReproducibilityRequested)
|
|
374
|
+
{
|
|
375
|
+
if (nonbondedTarget == TaskTarget::Gpu)
|
|
376
|
+
{
|
|
377
|
+
GMX_THROW(InconsistentInputError(
|
|
378
|
+
"Nonbonded interactions on the GPU and binary reprocibility were required. "
|
|
379
|
+
"These requirements are not compatible."));
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
return false;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
if (!userGpuTaskAssignment.empty())
|
|
386
|
+
{
|
|
387
|
+
// Specifying -gputasks requires specifying everything.
|
|
388
|
+
if (nonbondedTarget == TaskTarget::Auto)
|
|
389
|
+
{
|
|
390
|
+
GMX_THROW(InconsistentInputError(formatString(
|
|
391
|
+
g_specifyEverythingFormatString, GMX_THREAD_MPI ? "-nb and -ntmpi" : "-nb")));
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
return true;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
if (nonbondedTarget == TaskTarget::Gpu)
|
|
398
|
+
{
|
|
399
|
+
// We still don't know whether it is an error if no GPUs are found
|
|
400
|
+
// because we don't know the duty of this rank, yet. For example,
|
|
401
|
+
// a node with only PME ranks and -pme cpu is OK if there are not
|
|
402
|
+
// GPUs.
|
|
403
|
+
return true;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
// If we get here, then the user permitted GPUs, which we should
|
|
407
|
+
// use for nonbonded interactions.
|
|
408
|
+
return buildSupportsNonbondedOnGpu && gpusWereDetected;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
bool decideWhetherToUseGpusForPme(const bool useGpuForNonbonded,
|
|
412
|
+
const TaskTarget pmeTarget,
|
|
413
|
+
const TaskTarget pmeFftTarget,
|
|
414
|
+
const std::vector<int>& userGpuTaskAssignment,
|
|
415
|
+
const t_inputrec& inputrec,
|
|
416
|
+
const int numRanksPerSimulation,
|
|
417
|
+
const int numPmeRanksPerSimulation,
|
|
418
|
+
const bool gpusWereDetected)
|
|
419
|
+
{
|
|
420
|
+
std::string message;
|
|
421
|
+
if (!canUseGpusForPme(useGpuForNonbonded, pmeTarget, pmeFftTarget, inputrec, &message))
|
|
422
|
+
{
|
|
423
|
+
if (!message.empty())
|
|
424
|
+
{
|
|
425
|
+
GMX_THROW(InconsistentInputError(message));
|
|
426
|
+
}
|
|
427
|
+
return false;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
if (pmeTarget == TaskTarget::Cpu)
|
|
431
|
+
{
|
|
432
|
+
if (!userGpuTaskAssignment.empty())
|
|
433
|
+
{
|
|
434
|
+
GMX_THROW(InconsistentInputError(
|
|
435
|
+
"A GPU task assignment was specified, but PME interactions were "
|
|
436
|
+
"assigned to the CPU. Make no more than one of these choices."));
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
return false;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
if (pmeTarget == TaskTarget::Gpu)
|
|
443
|
+
{
|
|
444
|
+
if ((numRanksPerSimulation > 1) && (numPmeRanksPerSimulation < 0))
|
|
445
|
+
{
|
|
446
|
+
GMX_THROW(NotImplementedError(
|
|
447
|
+
"PME tasks were required to run on GPUs with multiple ranks "
|
|
448
|
+
"but the -npme option was not specified. "
|
|
449
|
+
"A non-negative value must be specified for -npme."));
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
if (!userGpuTaskAssignment.empty())
|
|
454
|
+
{
|
|
455
|
+
// Specifying -gputasks requires specifying everything.
|
|
456
|
+
if (pmeTarget == TaskTarget::Auto)
|
|
457
|
+
{
|
|
458
|
+
GMX_THROW(InconsistentInputError(
|
|
459
|
+
formatString(g_specifyEverythingFormatString,
|
|
460
|
+
GMX_THREAD_MPI ? "all of -nb, -pme, and -ntmpi" : "-nb and -pme")));
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
return true;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
// We still don't know whether it is an error if no GPUs are found
|
|
467
|
+
// because we don't know the duty of this rank, yet. For example,
|
|
468
|
+
// a node with only PME ranks and -pme cpu is OK if there are not
|
|
469
|
+
// GPUs.
|
|
470
|
+
|
|
471
|
+
if (pmeTarget == TaskTarget::Gpu)
|
|
472
|
+
{
|
|
473
|
+
return true;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
// If we get here, then the user permitted GPUs.
|
|
477
|
+
if (numRanksPerSimulation == 1)
|
|
478
|
+
{
|
|
479
|
+
// PME can run well on a single GPU shared with NB when there
|
|
480
|
+
// is one rank, so we permit mdrun to try that if we have
|
|
481
|
+
// detected GPUs.
|
|
482
|
+
return gpusWereDetected;
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
if (numPmeRanksPerSimulation == 1)
|
|
486
|
+
{
|
|
487
|
+
// We have a single separate PME rank, that can use a GPU
|
|
488
|
+
return gpusWereDetected;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
// Not enough support for PME on GPUs for anything else
|
|
492
|
+
return false;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
|
|
496
|
+
PmeRunMode determinePmeRunMode(const bool useGpuForPme, const TaskTarget& pmeFftTarget, const t_inputrec& inputrec)
|
|
497
|
+
{
|
|
498
|
+
if (!usingPme(inputrec.coulombtype) && !usingLJPme(inputrec.vdwtype))
|
|
499
|
+
{
|
|
500
|
+
return PmeRunMode::None;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
if (useGpuForPme)
|
|
504
|
+
{
|
|
505
|
+
if (c_gpuBuildSyclWithoutGpuFft && pmeFftTarget == TaskTarget::Gpu)
|
|
506
|
+
{
|
|
507
|
+
gmx_fatal(FARGS,
|
|
508
|
+
"GROMACS is built without SYCL GPU FFT library. Please do not use -pmefft "
|
|
509
|
+
"gpu.");
|
|
510
|
+
}
|
|
511
|
+
if (!decideWhetherToUseGpusForPmeFft(pmeFftTarget))
|
|
512
|
+
{
|
|
513
|
+
return PmeRunMode::Mixed;
|
|
514
|
+
}
|
|
515
|
+
else
|
|
516
|
+
{
|
|
517
|
+
return PmeRunMode::GPU;
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
else
|
|
521
|
+
{
|
|
522
|
+
if (pmeFftTarget == TaskTarget::Gpu)
|
|
523
|
+
{
|
|
524
|
+
gmx_fatal(FARGS,
|
|
525
|
+
"Assigning FFTs to GPU requires PME to be assigned to GPU as well. With PME "
|
|
526
|
+
"on CPU you should not be using -pmefft.");
|
|
527
|
+
}
|
|
528
|
+
return PmeRunMode::CPU;
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
bool decideWhetherToUseGpusForBonded(bool useGpuForNonbonded,
|
|
533
|
+
bool useGpuForPme,
|
|
534
|
+
TaskTarget bondedTarget,
|
|
535
|
+
const t_inputrec& inputrec,
|
|
536
|
+
const gmx_mtop_t& mtop,
|
|
537
|
+
int numPmeRanksPerSimulation,
|
|
538
|
+
bool gpusWereDetected)
|
|
539
|
+
{
|
|
540
|
+
if (bondedTarget == TaskTarget::Cpu)
|
|
541
|
+
{
|
|
542
|
+
return false;
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
std::string errorMessage;
|
|
546
|
+
|
|
547
|
+
if (!buildSupportsListedForcesGpu(&errorMessage))
|
|
548
|
+
{
|
|
549
|
+
if (bondedTarget == TaskTarget::Gpu)
|
|
550
|
+
{
|
|
551
|
+
GMX_THROW(InconsistentInputError(errorMessage.c_str()));
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
return false;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
if (!inputSupportsListedForcesGpu(inputrec, mtop, &errorMessage))
|
|
558
|
+
{
|
|
559
|
+
if (bondedTarget == TaskTarget::Gpu)
|
|
560
|
+
{
|
|
561
|
+
GMX_THROW(InconsistentInputError(errorMessage.c_str()));
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
return false;
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
if (!useGpuForNonbonded)
|
|
568
|
+
{
|
|
569
|
+
if (bondedTarget == TaskTarget::Gpu)
|
|
570
|
+
{
|
|
571
|
+
GMX_THROW(InconsistentInputError(
|
|
572
|
+
"Bonded interactions on the GPU were required, but this requires that "
|
|
573
|
+
"short-ranged non-bonded interactions are also run on the GPU. Change "
|
|
574
|
+
"your settings, or do not require using GPUs."));
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
return false;
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
// TODO If the bonded kernels do not get fused, then performance
|
|
581
|
+
// overheads might suggest alternative choices here.
|
|
582
|
+
|
|
583
|
+
if (bondedTarget == TaskTarget::Gpu)
|
|
584
|
+
{
|
|
585
|
+
// We still don't know whether it is an error if no GPUs are
|
|
586
|
+
// found.
|
|
587
|
+
return true;
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
// If we get here, then the user permitted GPUs, which we should
|
|
591
|
+
// use for bonded interactions if any were detected and the CPU
|
|
592
|
+
// is busy, for which we currently only check PME or Ewald.
|
|
593
|
+
// (It would be better to dynamically assign bondeds based on timings)
|
|
594
|
+
// Note that here we assume that the auto setting of PME ranks will not
|
|
595
|
+
// choose separate PME ranks when nonBonded are assigned to the GPU.
|
|
596
|
+
bool usingOurCpuForPmeOrEwald = (usingLJPme(inputrec.vdwtype)
|
|
597
|
+
|| (usingPmeOrEwald(inputrec.coulombtype) && !useGpuForPme
|
|
598
|
+
&& numPmeRanksPerSimulation <= 0));
|
|
599
|
+
|
|
600
|
+
return gpusWereDetected && usingOurCpuForPmeOrEwald;
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
bool decideWhetherToUseGpuForUpdate(const bool isDomainDecomposition,
|
|
604
|
+
const bool useUpdateGroups,
|
|
605
|
+
const PmeRunMode pmeRunMode,
|
|
606
|
+
const bool havePmeOnlyRank,
|
|
607
|
+
const bool useGpuForNonbonded,
|
|
608
|
+
const TaskTarget updateTarget,
|
|
609
|
+
const bool gpusWereDetected,
|
|
610
|
+
const t_inputrec& inputrec,
|
|
611
|
+
const gmx_mtop_t& mtop,
|
|
612
|
+
const bool useEssentialDynamics,
|
|
613
|
+
const bool doOrientationRestraints,
|
|
614
|
+
const bool haveFrozenAtoms,
|
|
615
|
+
const bool useModularSimulator,
|
|
616
|
+
const bool doRerun,
|
|
617
|
+
const gmx::MDLogger& mdlog)
|
|
618
|
+
{
|
|
619
|
+
|
|
620
|
+
// '-update cpu' overrides the environment variable, '-update auto' does not
|
|
621
|
+
const bool forceCpuUpdateDefault = getenv("GMX_FORCE_UPDATE_DEFAULT_CPU") != nullptr;
|
|
622
|
+
|
|
623
|
+
if (forceCpuUpdateDefault)
|
|
624
|
+
{
|
|
625
|
+
GMX_LOG(mdlog.warning)
|
|
626
|
+
.asParagraph()
|
|
627
|
+
.appendTextFormatted(
|
|
628
|
+
"This run will default to '-update cpu' as requested by the "
|
|
629
|
+
"GMX_FORCE_UPDATE_CPU environment variable.");
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
|
|
633
|
+
if (updateTarget == TaskTarget::Cpu || (updateTarget == TaskTarget::Auto && forceCpuUpdateDefault))
|
|
634
|
+
{
|
|
635
|
+
return false;
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
const bool hasAnyConstraints = gmx_mtop_interaction_count(mtop, IF_CONSTRAINT) > 0;
|
|
639
|
+
const bool pmeSpreadGatherUsesCpu = (pmeRunMode == PmeRunMode::CPU);
|
|
640
|
+
|
|
641
|
+
std::string errorMessage;
|
|
642
|
+
// Flag to set if we do not want to log the error with `-update auto` (e.g., for non-GPU build)
|
|
643
|
+
bool silenceWarningMessageWithUpdateAuto = forceCpuUpdateDefault;
|
|
644
|
+
|
|
645
|
+
if (isDomainDecomposition)
|
|
646
|
+
{
|
|
647
|
+
if (hasAnyConstraints && !useUpdateGroups)
|
|
648
|
+
{
|
|
649
|
+
errorMessage +=
|
|
650
|
+
"Domain decomposition is only supported with constraints when update "
|
|
651
|
+
"groups "
|
|
652
|
+
"are used. This means constraining all bonds is not supported, except for "
|
|
653
|
+
"small molecules, and box sizes close to half the pair-list cutoff are not "
|
|
654
|
+
"supported.\n ";
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
if (havePmeOnlyRank)
|
|
659
|
+
{
|
|
660
|
+
if (pmeSpreadGatherUsesCpu)
|
|
661
|
+
{
|
|
662
|
+
errorMessage += "With separate PME rank(s), PME must run on the GPU.\n";
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
if (inputrec.useMts)
|
|
667
|
+
{
|
|
668
|
+
errorMessage += "Multiple time stepping is not supported.\n";
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
if (inputrec.eConstrAlg == ConstraintAlgorithm::Shake && hasAnyConstraints
|
|
672
|
+
&& gmx_mtop_ftype_count(mtop, F_CONSTR) > 0)
|
|
673
|
+
{
|
|
674
|
+
errorMessage += "SHAKE constraints are not supported.\n";
|
|
675
|
+
}
|
|
676
|
+
// Using the GPU-version of update if:
|
|
677
|
+
// 1. PME is on the GPU (there should be a copy of coordinates on GPU for PME spread) or inactive, or
|
|
678
|
+
// 2. Non-bonded interactions are on the GPU.
|
|
679
|
+
if ((pmeRunMode == PmeRunMode::CPU || pmeRunMode == PmeRunMode::None) && !useGpuForNonbonded)
|
|
680
|
+
{
|
|
681
|
+
errorMessage +=
|
|
682
|
+
"Either PME or short-ranged non-bonded interaction tasks must run on the GPU.\n";
|
|
683
|
+
silenceWarningMessageWithUpdateAuto = true;
|
|
684
|
+
}
|
|
685
|
+
if (!gpusWereDetected)
|
|
686
|
+
{
|
|
687
|
+
errorMessage += "Compatible GPUs must have been found.\n";
|
|
688
|
+
silenceWarningMessageWithUpdateAuto = true;
|
|
689
|
+
}
|
|
690
|
+
if (!(GMX_GPU_CUDA || GMX_GPU_SYCL))
|
|
691
|
+
{
|
|
692
|
+
errorMessage += "Only CUDA and SYCL builds are supported.\n";
|
|
693
|
+
// Silence clang-analyzer deadcode.DeadStores warning about ignoring the previous assignments
|
|
694
|
+
GMX_UNUSED_VALUE(silenceWarningMessageWithUpdateAuto);
|
|
695
|
+
silenceWarningMessageWithUpdateAuto = true;
|
|
696
|
+
}
|
|
697
|
+
if (inputrec.eI != IntegrationAlgorithm::MD)
|
|
698
|
+
{
|
|
699
|
+
errorMessage += "Only the md integrator is supported.\n";
|
|
700
|
+
}
|
|
701
|
+
if (inputrec.etc == TemperatureCoupling::NoseHoover)
|
|
702
|
+
{
|
|
703
|
+
errorMessage += "Nose-Hoover temperature coupling is not supported.\n";
|
|
704
|
+
}
|
|
705
|
+
if (!(inputrec.pressureCouplingOptions.epc == PressureCoupling::No
|
|
706
|
+
|| inputrec.pressureCouplingOptions.epc == PressureCoupling::ParrinelloRahman
|
|
707
|
+
|| inputrec.pressureCouplingOptions.epc == PressureCoupling::Berendsen
|
|
708
|
+
|| inputrec.pressureCouplingOptions.epc == PressureCoupling::CRescale))
|
|
709
|
+
{
|
|
710
|
+
errorMessage +=
|
|
711
|
+
"Only Parrinello-Rahman, Berendsen, and C-rescale pressure coupling are "
|
|
712
|
+
"supported.\n";
|
|
713
|
+
}
|
|
714
|
+
if (inputrec.cos_accel != 0 || inputrec.useConstantAcceleration)
|
|
715
|
+
{
|
|
716
|
+
errorMessage += "Acceleration is not supported.\n";
|
|
717
|
+
}
|
|
718
|
+
if (ir_haveBoxDeformation(inputrec))
|
|
719
|
+
{
|
|
720
|
+
errorMessage += "Box deformation is not supported.\n";
|
|
721
|
+
}
|
|
722
|
+
if (usingPmeOrEwald(inputrec.coulombtype) && inputrec.epsilon_surface != 0)
|
|
723
|
+
{
|
|
724
|
+
// The graph is needed, but not supported
|
|
725
|
+
errorMessage += "Ewald surface correction is not supported.\n";
|
|
726
|
+
}
|
|
727
|
+
if (gmx_mtop_interaction_count(mtop, IF_VSITE) > 0)
|
|
728
|
+
{
|
|
729
|
+
errorMessage += "Virtual sites are not supported.\n";
|
|
730
|
+
}
|
|
731
|
+
if (useEssentialDynamics)
|
|
732
|
+
{
|
|
733
|
+
errorMessage += "Essential dynamics is not supported.\n";
|
|
734
|
+
}
|
|
735
|
+
if (inputrec.bPull && pull_have_constraint(*inputrec.pull))
|
|
736
|
+
{
|
|
737
|
+
errorMessage += "Constraints pulling is not supported.\n";
|
|
738
|
+
}
|
|
739
|
+
if (doOrientationRestraints)
|
|
740
|
+
{
|
|
741
|
+
// The graph is needed, but not supported
|
|
742
|
+
errorMessage += "Orientation restraints are not supported.\n";
|
|
743
|
+
}
|
|
744
|
+
if (inputrec.efep != FreeEnergyPerturbationType::No
|
|
745
|
+
&& (haveFepPerturbedMasses(mtop) || havePerturbedConstraints(mtop)))
|
|
746
|
+
{
|
|
747
|
+
errorMessage += "Free energy perturbation for mass and constraints are not supported.\n";
|
|
748
|
+
}
|
|
749
|
+
const auto particleTypes = gmx_mtop_particletype_count(mtop);
|
|
750
|
+
if (particleTypes[ParticleType::Shell] > 0)
|
|
751
|
+
{
|
|
752
|
+
errorMessage += "Shells are not supported.\n";
|
|
753
|
+
}
|
|
754
|
+
if (inputrec.eSwapCoords != SwapType::No)
|
|
755
|
+
{
|
|
756
|
+
errorMessage += "Swapping the coordinates is not supported.\n";
|
|
757
|
+
}
|
|
758
|
+
if (useModularSimulator)
|
|
759
|
+
{
|
|
760
|
+
errorMessage += "The modular simulator is not supported.\n";
|
|
761
|
+
}
|
|
762
|
+
if (doRerun)
|
|
763
|
+
{
|
|
764
|
+
errorMessage += "Re-run is not supported.\n";
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
// TODO: F_CONSTRNC is only unsupported, because isNumCoupledConstraintsSupported()
|
|
768
|
+
// does not support it, the actual CUDA LINCS code does support it
|
|
769
|
+
if (gmx_mtop_ftype_count(mtop, F_CONSTRNC) > 0)
|
|
770
|
+
{
|
|
771
|
+
errorMessage += "Non-connecting constraints are not supported\n";
|
|
772
|
+
}
|
|
773
|
+
if (!UpdateConstrainGpu::isNumCoupledConstraintsSupported(mtop))
|
|
774
|
+
{
|
|
775
|
+
errorMessage +=
|
|
776
|
+
"The number of coupled constraints is higher than supported in the GPU LINCS "
|
|
777
|
+
"code.\n";
|
|
778
|
+
}
|
|
779
|
+
if (hasAnyConstraints && !UpdateConstrainGpu::areConstraintsSupported())
|
|
780
|
+
{
|
|
781
|
+
errorMessage += "Chosen GPU implementation does not support constraints.\n";
|
|
782
|
+
}
|
|
783
|
+
if (haveFrozenAtoms)
|
|
784
|
+
{
|
|
785
|
+
// There is a known bug with frozen atoms and GPU update, see Issue #3920.
|
|
786
|
+
errorMessage += "Frozen atoms not supported.\n";
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
if (!errorMessage.empty())
|
|
790
|
+
{
|
|
791
|
+
if (updateTarget == TaskTarget::Auto && !silenceWarningMessageWithUpdateAuto)
|
|
792
|
+
{
|
|
793
|
+
GMX_LOG(mdlog.info)
|
|
794
|
+
.asParagraph()
|
|
795
|
+
.appendText(
|
|
796
|
+
"Update task can not run on the GPU, because the following "
|
|
797
|
+
"condition(s) were not satisfied:");
|
|
798
|
+
GMX_LOG(mdlog.info).asParagraph().appendText(errorMessage.c_str());
|
|
799
|
+
}
|
|
800
|
+
else if (updateTarget == TaskTarget::Gpu)
|
|
801
|
+
{
|
|
802
|
+
std::string prefix = gmx::formatString(
|
|
803
|
+
"Update task on the GPU was required,\n"
|
|
804
|
+
"but the following condition(s) were not satisfied:\n");
|
|
805
|
+
GMX_THROW(InconsistentInputError((prefix + errorMessage).c_str()));
|
|
806
|
+
}
|
|
807
|
+
return false;
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
return (updateTarget == TaskTarget::Gpu
|
|
811
|
+
|| (updateTarget == TaskTarget::Auto && !forceCpuUpdateDefault));
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
bool decideWhetherDirectGpuCommunicationCanBeUsed(const DevelopmentFeatureFlags& devFlags,
|
|
815
|
+
bool haveMts,
|
|
816
|
+
bool haveSwapCoords,
|
|
817
|
+
const gmx::MDLogger& mdlog)
|
|
818
|
+
{
|
|
819
|
+
const bool buildSupportsDirectGpuComm = (GMX_GPU_CUDA || GMX_GPU_SYCL) && GMX_MPI;
|
|
820
|
+
if (!buildSupportsDirectGpuComm)
|
|
821
|
+
{
|
|
822
|
+
return false;
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
// Direct GPU communication is presently turned off due to insufficient testing
|
|
826
|
+
const bool enableDirectGpuComm = (getenv("GMX_ENABLE_DIRECT_GPU_COMM") != nullptr)
|
|
827
|
+
|| (getenv("GMX_GPU_DD_COMMS") != nullptr)
|
|
828
|
+
|| (getenv("GMX_GPU_PME_PP_COMMS") != nullptr);
|
|
829
|
+
|
|
830
|
+
if (GMX_THREAD_MPI && GMX_GPU_SYCL && enableDirectGpuComm)
|
|
831
|
+
{
|
|
832
|
+
GMX_LOG(mdlog.warning)
|
|
833
|
+
.asParagraph()
|
|
834
|
+
.appendTextFormatted(
|
|
835
|
+
"GMX_ENABLE_DIRECT_GPU_COMM environment variable detected, "
|
|
836
|
+
"but SYCL does not support direct communications with threadMPI.");
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
// Now check those flags that may cause, from the user perspective, an unexpected
|
|
840
|
+
// fallback to CPU halo, and report accordingly
|
|
841
|
+
gmx::MessageStringCollector errorReasons;
|
|
842
|
+
errorReasons.startContext("GPU direct communication can not be activated because:");
|
|
843
|
+
errorReasons.appendIf(haveMts, "MTS is not supported.");
|
|
844
|
+
errorReasons.appendIf(haveSwapCoords, "Swap-coords is not supported.");
|
|
845
|
+
errorReasons.finishContext();
|
|
846
|
+
|
|
847
|
+
if (!errorReasons.isEmpty())
|
|
848
|
+
{
|
|
849
|
+
GMX_LOG(mdlog.warning).asParagraph().appendText(errorReasons.toString());
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
bool runUsesCompatibleFeatures = errorReasons.isEmpty();
|
|
853
|
+
|
|
854
|
+
bool runAndGpuSupportDirectGpuComm = (runUsesCompatibleFeatures && enableDirectGpuComm);
|
|
855
|
+
|
|
856
|
+
// Thread-MPI case on by default, can be disabled with env var.
|
|
857
|
+
bool canUseDirectGpuCommWithThreadMpi =
|
|
858
|
+
(runAndGpuSupportDirectGpuComm && GMX_THREAD_MPI && !GMX_GPU_SYCL);
|
|
859
|
+
// GPU-aware MPI case off by default, can be enabled with dev flag
|
|
860
|
+
// Note: GMX_DISABLE_DIRECT_GPU_COMM already taken into account in devFlags.enableDirectGpuCommWithMpi
|
|
861
|
+
bool canUseDirectGpuCommWithMpi = (runAndGpuSupportDirectGpuComm && GMX_LIB_MPI
|
|
862
|
+
&& devFlags.canUseGpuAwareMpi && enableDirectGpuComm);
|
|
863
|
+
|
|
864
|
+
return canUseDirectGpuCommWithThreadMpi || canUseDirectGpuCommWithMpi;
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
bool decideWhetherToUseGpuForHalo(bool havePPDomainDecomposition,
|
|
868
|
+
bool useGpuForNonbonded,
|
|
869
|
+
bool canUseDirectGpuComm,
|
|
870
|
+
bool useModularSimulator,
|
|
871
|
+
bool doRerun,
|
|
872
|
+
bool haveEnergyMinimization,
|
|
873
|
+
const gmx::MDLogger& mdlog)
|
|
874
|
+
{
|
|
875
|
+
if (!canUseDirectGpuComm || !havePPDomainDecomposition || !useGpuForNonbonded)
|
|
876
|
+
{
|
|
877
|
+
// return false without warning
|
|
878
|
+
return false;
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
// Now check those flags that may cause, from the user perspective, an unexpected
|
|
882
|
+
// fallback to CPU halo, and report accordingly
|
|
883
|
+
gmx::MessageStringCollector errorReasons;
|
|
884
|
+
errorReasons.startContext("GPU halo exchange will not be activated because:");
|
|
885
|
+
errorReasons.appendIf(useModularSimulator, "Modular simulator runs are not supported.");
|
|
886
|
+
errorReasons.appendIf(doRerun, "Re-runs are not supported.");
|
|
887
|
+
errorReasons.appendIf(haveEnergyMinimization, "Energy minimization is not supported.");
|
|
888
|
+
errorReasons.finishContext();
|
|
889
|
+
|
|
890
|
+
if (!errorReasons.isEmpty())
|
|
891
|
+
{
|
|
892
|
+
GMX_LOG(mdlog.warning).asParagraph().appendText(errorReasons.toString());
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
return errorReasons.isEmpty();
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
} // namespace gmx
|