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