hillclimber 0.1.5__cp313-cp313-musllinux_1_2_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 (472) hide show
  1. hillclimber/__init__.py +39 -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 +325 -0
  9. hillclimber/nodes.py +6 -0
  10. hillclimber/opes.py +359 -0
  11. hillclimber/selectors.py +230 -0
  12. hillclimber/virtual_atoms.py +341 -0
  13. hillclimber-0.1.5.dist-info/METADATA +210 -0
  14. hillclimber-0.1.5.dist-info/RECORD +472 -0
  15. hillclimber-0.1.5.dist-info/WHEEL +5 -0
  16. hillclimber-0.1.5.dist-info/entry_points.txt +8 -0
  17. hillclimber-0.1.5.dist-info/licenses/LICENSE +165 -0
  18. hillclimber-0.1.5.dist-info/sboms/auditwheel.cdx.json +1 -0
  19. hillclimber.libs/libgcc_s-2d945d6c.so.1 +0 -0
  20. hillclimber.libs/libgomp-1ede7ee7.so.1.0.0 +0 -0
  21. hillclimber.libs/libstdc++-85f2cd6d.so.6.0.33 +0 -0
  22. plumed/__init__.py +104 -0
  23. plumed/_lib/bin/plumed +0 -0
  24. plumed/_lib/bin/plumed-config +9 -0
  25. plumed/_lib/bin/plumed-patch +9 -0
  26. plumed/_lib/include/plumed/adjmat/AdjacencyMatrixBase.h +659 -0
  27. plumed/_lib/include/plumed/adjmat/ContactMatrix.h +59 -0
  28. plumed/_lib/include/plumed/asmjit/arch.h +228 -0
  29. plumed/_lib/include/plumed/asmjit/arm.h +43 -0
  30. plumed/_lib/include/plumed/asmjit/asmjit.h +69 -0
  31. plumed/_lib/include/plumed/asmjit/asmjit_apibegin.h +143 -0
  32. plumed/_lib/include/plumed/asmjit/asmjit_apiend.h +93 -0
  33. plumed/_lib/include/plumed/asmjit/asmjit_build.h +971 -0
  34. plumed/_lib/include/plumed/asmjit/assembler.h +183 -0
  35. plumed/_lib/include/plumed/asmjit/base.h +56 -0
  36. plumed/_lib/include/plumed/asmjit/codebuilder.h +944 -0
  37. plumed/_lib/include/plumed/asmjit/codecompiler.h +767 -0
  38. plumed/_lib/include/plumed/asmjit/codeemitter.h +528 -0
  39. plumed/_lib/include/plumed/asmjit/codeholder.h +777 -0
  40. plumed/_lib/include/plumed/asmjit/constpool.h +286 -0
  41. plumed/_lib/include/plumed/asmjit/cpuinfo.h +402 -0
  42. plumed/_lib/include/plumed/asmjit/func.h +1327 -0
  43. plumed/_lib/include/plumed/asmjit/globals.h +370 -0
  44. plumed/_lib/include/plumed/asmjit/inst.h +137 -0
  45. plumed/_lib/include/plumed/asmjit/logging.h +317 -0
  46. plumed/_lib/include/plumed/asmjit/misc_p.h +103 -0
  47. plumed/_lib/include/plumed/asmjit/moved_string.h +318 -0
  48. plumed/_lib/include/plumed/asmjit/operand.h +1599 -0
  49. plumed/_lib/include/plumed/asmjit/osutils.h +207 -0
  50. plumed/_lib/include/plumed/asmjit/regalloc_p.h +597 -0
  51. plumed/_lib/include/plumed/asmjit/runtime.h +227 -0
  52. plumed/_lib/include/plumed/asmjit/simdtypes.h +1104 -0
  53. plumed/_lib/include/plumed/asmjit/utils.h +1387 -0
  54. plumed/_lib/include/plumed/asmjit/vmem.h +183 -0
  55. plumed/_lib/include/plumed/asmjit/x86.h +45 -0
  56. plumed/_lib/include/plumed/asmjit/x86assembler.h +125 -0
  57. plumed/_lib/include/plumed/asmjit/x86builder.h +117 -0
  58. plumed/_lib/include/plumed/asmjit/x86compiler.h +322 -0
  59. plumed/_lib/include/plumed/asmjit/x86emitter.h +5149 -0
  60. plumed/_lib/include/plumed/asmjit/x86globals.h +535 -0
  61. plumed/_lib/include/plumed/asmjit/x86inst.h +2547 -0
  62. plumed/_lib/include/plumed/asmjit/x86instimpl_p.h +74 -0
  63. plumed/_lib/include/plumed/asmjit/x86internal_p.h +108 -0
  64. plumed/_lib/include/plumed/asmjit/x86logging_p.h +92 -0
  65. plumed/_lib/include/plumed/asmjit/x86misc.h +417 -0
  66. plumed/_lib/include/plumed/asmjit/x86operand.h +1133 -0
  67. plumed/_lib/include/plumed/asmjit/x86regalloc_p.h +734 -0
  68. plumed/_lib/include/plumed/asmjit/zone.h +1157 -0
  69. plumed/_lib/include/plumed/bias/Bias.h +82 -0
  70. plumed/_lib/include/plumed/bias/ReweightBase.h +58 -0
  71. plumed/_lib/include/plumed/blas/blas.h +253 -0
  72. plumed/_lib/include/plumed/blas/def_external.h +61 -0
  73. plumed/_lib/include/plumed/blas/def_internal.h +97 -0
  74. plumed/_lib/include/plumed/blas/real.h +49 -0
  75. plumed/_lib/include/plumed/cltools/CLTool.h +32 -0
  76. plumed/_lib/include/plumed/clusters/ClusteringBase.h +70 -0
  77. plumed/_lib/include/plumed/colvar/Colvar.h +32 -0
  78. plumed/_lib/include/plumed/colvar/ColvarInput.h +68 -0
  79. plumed/_lib/include/plumed/colvar/ColvarShortcut.h +81 -0
  80. plumed/_lib/include/plumed/colvar/CoordinationBase.h +52 -0
  81. plumed/_lib/include/plumed/colvar/MultiColvarTemplate.h +333 -0
  82. plumed/_lib/include/plumed/colvar/PathMSDBase.h +101 -0
  83. plumed/_lib/include/plumed/colvar/RMSDVector.h +78 -0
  84. plumed/_lib/include/plumed/config/Config.h +118 -0
  85. plumed/_lib/include/plumed/config/version.h +9 -0
  86. plumed/_lib/include/plumed/contour/ContourFindingObject.h +87 -0
  87. plumed/_lib/include/plumed/contour/DistanceFromContourBase.h +82 -0
  88. plumed/_lib/include/plumed/contour/FindContour.h +67 -0
  89. plumed/_lib/include/plumed/core/Action.h +540 -0
  90. plumed/_lib/include/plumed/core/ActionAnyorder.h +48 -0
  91. plumed/_lib/include/plumed/core/ActionAtomistic.h +343 -0
  92. plumed/_lib/include/plumed/core/ActionForInterface.h +99 -0
  93. plumed/_lib/include/plumed/core/ActionPilot.h +57 -0
  94. plumed/_lib/include/plumed/core/ActionRegister.h +124 -0
  95. plumed/_lib/include/plumed/core/ActionSet.h +163 -0
  96. plumed/_lib/include/plumed/core/ActionSetup.h +48 -0
  97. plumed/_lib/include/plumed/core/ActionShortcut.h +73 -0
  98. plumed/_lib/include/plumed/core/ActionToGetData.h +59 -0
  99. plumed/_lib/include/plumed/core/ActionToPutData.h +101 -0
  100. plumed/_lib/include/plumed/core/ActionWithArguments.h +140 -0
  101. plumed/_lib/include/plumed/core/ActionWithMatrix.h +87 -0
  102. plumed/_lib/include/plumed/core/ActionWithValue.h +258 -0
  103. plumed/_lib/include/plumed/core/ActionWithVector.h +94 -0
  104. plumed/_lib/include/plumed/core/ActionWithVirtualAtom.h +123 -0
  105. plumed/_lib/include/plumed/core/CLTool.h +177 -0
  106. plumed/_lib/include/plumed/core/CLToolMain.h +102 -0
  107. plumed/_lib/include/plumed/core/CLToolRegister.h +108 -0
  108. plumed/_lib/include/plumed/core/Colvar.h +115 -0
  109. plumed/_lib/include/plumed/core/DataPassingObject.h +94 -0
  110. plumed/_lib/include/plumed/core/DataPassingTools.h +54 -0
  111. plumed/_lib/include/plumed/core/DomainDecomposition.h +120 -0
  112. plumed/_lib/include/plumed/core/ExchangePatterns.h +47 -0
  113. plumed/_lib/include/plumed/core/FlexibleBin.h +63 -0
  114. plumed/_lib/include/plumed/core/GREX.h +61 -0
  115. plumed/_lib/include/plumed/core/GenericMolInfo.h +89 -0
  116. plumed/_lib/include/plumed/core/Group.h +41 -0
  117. plumed/_lib/include/plumed/core/ModuleMap.h +30 -0
  118. plumed/_lib/include/plumed/core/ParallelTaskManager.h +1023 -0
  119. plumed/_lib/include/plumed/core/PbcAction.h +61 -0
  120. plumed/_lib/include/plumed/core/PlumedMain.h +632 -0
  121. plumed/_lib/include/plumed/core/PlumedMainInitializer.h +118 -0
  122. plumed/_lib/include/plumed/core/RegisterBase.h +340 -0
  123. plumed/_lib/include/plumed/core/TargetDist.h +48 -0
  124. plumed/_lib/include/plumed/core/Value.h +547 -0
  125. plumed/_lib/include/plumed/core/WithCmd.h +93 -0
  126. plumed/_lib/include/plumed/dimred/SMACOF.h +55 -0
  127. plumed/_lib/include/plumed/drr/DRR.h +383 -0
  128. plumed/_lib/include/plumed/drr/colvar_UIestimator.h +777 -0
  129. plumed/_lib/include/plumed/fisst/legendre_rule_fast.h +44 -0
  130. plumed/_lib/include/plumed/function/Custom.h +54 -0
  131. plumed/_lib/include/plumed/function/Function.h +85 -0
  132. plumed/_lib/include/plumed/function/FunctionOfMatrix.h +368 -0
  133. plumed/_lib/include/plumed/function/FunctionOfScalar.h +135 -0
  134. plumed/_lib/include/plumed/function/FunctionOfVector.h +296 -0
  135. plumed/_lib/include/plumed/function/FunctionSetup.h +180 -0
  136. plumed/_lib/include/plumed/function/FunctionShortcut.h +130 -0
  137. plumed/_lib/include/plumed/function/FunctionWithSingleArgument.h +165 -0
  138. plumed/_lib/include/plumed/gridtools/ActionWithGrid.h +43 -0
  139. plumed/_lib/include/plumed/gridtools/EvaluateGridFunction.h +99 -0
  140. plumed/_lib/include/plumed/gridtools/FunctionOfGrid.h +295 -0
  141. plumed/_lib/include/plumed/gridtools/GridCoordinatesObject.h +179 -0
  142. plumed/_lib/include/plumed/gridtools/GridSearch.h +135 -0
  143. plumed/_lib/include/plumed/gridtools/Interpolator.h +45 -0
  144. plumed/_lib/include/plumed/gridtools/KDE.h +455 -0
  145. plumed/_lib/include/plumed/gridtools/RDF.h +40 -0
  146. plumed/_lib/include/plumed/gridtools/SumOfKernels.h +219 -0
  147. plumed/_lib/include/plumed/isdb/MetainferenceBase.h +398 -0
  148. plumed/_lib/include/plumed/lapack/def_external.h +207 -0
  149. plumed/_lib/include/plumed/lapack/def_internal.h +388 -0
  150. plumed/_lib/include/plumed/lapack/lapack.h +899 -0
  151. plumed/_lib/include/plumed/lapack/lapack_limits.h +79 -0
  152. plumed/_lib/include/plumed/lapack/real.h +50 -0
  153. plumed/_lib/include/plumed/lepton/CompiledExpression.h +164 -0
  154. plumed/_lib/include/plumed/lepton/CustomFunction.h +143 -0
  155. plumed/_lib/include/plumed/lepton/Exception.h +93 -0
  156. plumed/_lib/include/plumed/lepton/ExpressionProgram.h +137 -0
  157. plumed/_lib/include/plumed/lepton/ExpressionTreeNode.h +145 -0
  158. plumed/_lib/include/plumed/lepton/Lepton.h +85 -0
  159. plumed/_lib/include/plumed/lepton/MSVC_erfc.h +123 -0
  160. plumed/_lib/include/plumed/lepton/Operation.h +1302 -0
  161. plumed/_lib/include/plumed/lepton/ParsedExpression.h +165 -0
  162. plumed/_lib/include/plumed/lepton/Parser.h +111 -0
  163. plumed/_lib/include/plumed/lepton/windowsIncludes.h +73 -0
  164. plumed/_lib/include/plumed/mapping/Path.h +44 -0
  165. plumed/_lib/include/plumed/mapping/PathProjectionCalculator.h +57 -0
  166. plumed/_lib/include/plumed/matrixtools/MatrixOperationBase.h +54 -0
  167. plumed/_lib/include/plumed/matrixtools/MatrixTimesMatrix.h +309 -0
  168. plumed/_lib/include/plumed/matrixtools/MatrixTimesVectorBase.h +365 -0
  169. plumed/_lib/include/plumed/matrixtools/OuterProduct.h +238 -0
  170. plumed/_lib/include/plumed/maze/Core.h +65 -0
  171. plumed/_lib/include/plumed/maze/Loss.h +86 -0
  172. plumed/_lib/include/plumed/maze/Member.h +66 -0
  173. plumed/_lib/include/plumed/maze/Memetic.h +799 -0
  174. plumed/_lib/include/plumed/maze/Optimizer.h +357 -0
  175. plumed/_lib/include/plumed/maze/Random_MT.h +156 -0
  176. plumed/_lib/include/plumed/maze/Tools.h +183 -0
  177. plumed/_lib/include/plumed/metatomic/vesin.h +188 -0
  178. plumed/_lib/include/plumed/molfile/Gromacs.h +2013 -0
  179. plumed/_lib/include/plumed/molfile/endianswap.h +217 -0
  180. plumed/_lib/include/plumed/molfile/fastio.h +683 -0
  181. plumed/_lib/include/plumed/molfile/largefiles.h +78 -0
  182. plumed/_lib/include/plumed/molfile/libmolfile_plugin.h +77 -0
  183. plumed/_lib/include/plumed/molfile/molfile_plugin.h +1034 -0
  184. plumed/_lib/include/plumed/molfile/periodic_table.h +248 -0
  185. plumed/_lib/include/plumed/molfile/readpdb.h +447 -0
  186. plumed/_lib/include/plumed/molfile/vmdplugin.h +236 -0
  187. plumed/_lib/include/plumed/multicolvar/MultiColvarShortcuts.h +45 -0
  188. plumed/_lib/include/plumed/opes/ExpansionCVs.h +79 -0
  189. plumed/_lib/include/plumed/sasa/Sasa.h +32 -0
  190. plumed/_lib/include/plumed/secondarystructure/SecondaryStructureBase.h +372 -0
  191. plumed/_lib/include/plumed/setup/ActionSetup.h +25 -0
  192. plumed/_lib/include/plumed/small_vector/small_vector.h +6114 -0
  193. plumed/_lib/include/plumed/symfunc/CoordinationNumbers.h +41 -0
  194. plumed/_lib/include/plumed/tools/Angle.h +52 -0
  195. plumed/_lib/include/plumed/tools/AtomDistribution.h +138 -0
  196. plumed/_lib/include/plumed/tools/AtomNumber.h +152 -0
  197. plumed/_lib/include/plumed/tools/BiasRepresentation.h +106 -0
  198. plumed/_lib/include/plumed/tools/BitmaskEnum.h +167 -0
  199. plumed/_lib/include/plumed/tools/Brent1DRootSearch.h +159 -0
  200. plumed/_lib/include/plumed/tools/CheckInRange.h +44 -0
  201. plumed/_lib/include/plumed/tools/Citations.h +74 -0
  202. plumed/_lib/include/plumed/tools/ColvarOutput.h +118 -0
  203. plumed/_lib/include/plumed/tools/Communicator.h +316 -0
  204. plumed/_lib/include/plumed/tools/ConjugateGradient.h +80 -0
  205. plumed/_lib/include/plumed/tools/DLLoader.h +79 -0
  206. plumed/_lib/include/plumed/tools/ERMSD.h +73 -0
  207. plumed/_lib/include/plumed/tools/Exception.h +406 -0
  208. plumed/_lib/include/plumed/tools/File.h +28 -0
  209. plumed/_lib/include/plumed/tools/FileBase.h +153 -0
  210. plumed/_lib/include/plumed/tools/FileTools.h +37 -0
  211. plumed/_lib/include/plumed/tools/ForwardDecl.h +54 -0
  212. plumed/_lib/include/plumed/tools/Grid.h +638 -0
  213. plumed/_lib/include/plumed/tools/HistogramBead.h +136 -0
  214. plumed/_lib/include/plumed/tools/IFile.h +117 -0
  215. plumed/_lib/include/plumed/tools/KernelFunctions.h +113 -0
  216. plumed/_lib/include/plumed/tools/Keywords.h +380 -0
  217. plumed/_lib/include/plumed/tools/LatticeReduction.h +66 -0
  218. plumed/_lib/include/plumed/tools/LeptonCall.h +64 -0
  219. plumed/_lib/include/plumed/tools/LinkCells.h +126 -0
  220. plumed/_lib/include/plumed/tools/Log.h +41 -0
  221. plumed/_lib/include/plumed/tools/LoopUnroller.h +163 -0
  222. plumed/_lib/include/plumed/tools/Matrix.h +721 -0
  223. plumed/_lib/include/plumed/tools/MatrixSquareBracketsAccess.h +138 -0
  224. plumed/_lib/include/plumed/tools/MergeVectorTools.h +153 -0
  225. plumed/_lib/include/plumed/tools/Minimise1DBrent.h +244 -0
  226. plumed/_lib/include/plumed/tools/MinimiseBase.h +120 -0
  227. plumed/_lib/include/plumed/tools/MolDataClass.h +51 -0
  228. plumed/_lib/include/plumed/tools/NeighborList.h +112 -0
  229. plumed/_lib/include/plumed/tools/OFile.h +286 -0
  230. plumed/_lib/include/plumed/tools/OpenACC.h +180 -0
  231. plumed/_lib/include/plumed/tools/OpenMP.h +75 -0
  232. plumed/_lib/include/plumed/tools/PDB.h +154 -0
  233. plumed/_lib/include/plumed/tools/Pbc.h +139 -0
  234. plumed/_lib/include/plumed/tools/PlumedHandle.h +105 -0
  235. plumed/_lib/include/plumed/tools/RMSD.h +493 -0
  236. plumed/_lib/include/plumed/tools/Random.h +80 -0
  237. plumed/_lib/include/plumed/tools/RootFindingBase.h +79 -0
  238. plumed/_lib/include/plumed/tools/Stopwatch.h +475 -0
  239. plumed/_lib/include/plumed/tools/Subprocess.h +142 -0
  240. plumed/_lib/include/plumed/tools/SwitchingFunction.h +208 -0
  241. plumed/_lib/include/plumed/tools/Tensor.h +724 -0
  242. plumed/_lib/include/plumed/tools/TokenizedLine.h +123 -0
  243. plumed/_lib/include/plumed/tools/Tools.h +638 -0
  244. plumed/_lib/include/plumed/tools/Torsion.h +55 -0
  245. plumed/_lib/include/plumed/tools/TrajectoryParser.h +118 -0
  246. plumed/_lib/include/plumed/tools/Tree.h +61 -0
  247. plumed/_lib/include/plumed/tools/TypesafePtr.h +463 -0
  248. plumed/_lib/include/plumed/tools/Units.h +167 -0
  249. plumed/_lib/include/plumed/tools/Vector.h +433 -0
  250. plumed/_lib/include/plumed/tools/View.h +296 -0
  251. plumed/_lib/include/plumed/tools/View2D.h +100 -0
  252. plumed/_lib/include/plumed/tools/h36.h +39 -0
  253. plumed/_lib/include/plumed/vatom/ActionWithVirtualAtom.h +32 -0
  254. plumed/_lib/include/plumed/ves/BasisFunctions.h +380 -0
  255. plumed/_lib/include/plumed/ves/CoeffsBase.h +310 -0
  256. plumed/_lib/include/plumed/ves/CoeffsMatrix.h +220 -0
  257. plumed/_lib/include/plumed/ves/CoeffsVector.h +251 -0
  258. plumed/_lib/include/plumed/ves/FermiSwitchingFunction.h +74 -0
  259. plumed/_lib/include/plumed/ves/GridIntegrationWeights.h +50 -0
  260. plumed/_lib/include/plumed/ves/GridLinearInterpolation.h +81 -0
  261. plumed/_lib/include/plumed/ves/GridProjWeights.h +61 -0
  262. plumed/_lib/include/plumed/ves/LinearBasisSetExpansion.h +303 -0
  263. plumed/_lib/include/plumed/ves/Optimizer.h +444 -0
  264. plumed/_lib/include/plumed/ves/TargetDistModifer.h +53 -0
  265. plumed/_lib/include/plumed/ves/TargetDistribution.h +266 -0
  266. plumed/_lib/include/plumed/ves/VesBias.h +545 -0
  267. plumed/_lib/include/plumed/ves/VesTools.h +142 -0
  268. plumed/_lib/include/plumed/ves/WaveletGrid.h +75 -0
  269. plumed/_lib/include/plumed/volumes/ActionVolume.h +268 -0
  270. plumed/_lib/include/plumed/volumes/VolumeShortcut.h +147 -0
  271. plumed/_lib/include/plumed/wrapper/Plumed.h +5025 -0
  272. plumed/_lib/include/plumed/xdrfile/xdrfile.h +663 -0
  273. plumed/_lib/include/plumed/xdrfile/xdrfile_trr.h +89 -0
  274. plumed/_lib/include/plumed/xdrfile/xdrfile_xtc.h +90 -0
  275. plumed/_lib/lib/PythonCVInterface.so +0 -0
  276. plumed/_lib/lib/libplumed.a +0 -0
  277. plumed/_lib/lib/libplumed.so +0 -0
  278. plumed/_lib/lib/libplumedKernel.so +0 -0
  279. plumed/_lib/lib/libplumedWrapper.a +0 -0
  280. plumed/_lib/lib/pkgconfig/plumed.pc +13 -0
  281. plumed/_lib/lib/pkgconfig/plumedInternals.pc +13 -0
  282. plumed/_lib/lib/pkgconfig/plumedWrapper.pc +13 -0
  283. plumed/_lib/lib/plumed/fortran/plumed.f90 +879 -0
  284. plumed/_lib/lib/plumed/fortran/plumed_f08.f90 +2625 -0
  285. plumed/_lib/lib/plumed/modulefile +69 -0
  286. plumed/_lib/lib/plumed/patches/gromacs-2022.5.config +43 -0
  287. plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/CMakeLists.txt +543 -0
  288. plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/CMakeLists.txt.preplumed +540 -0
  289. plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdlib/expanded.cpp +1628 -0
  290. plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdlib/expanded.cpp.preplumed +1590 -0
  291. plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdlib/expanded.h +103 -0
  292. plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdlib/expanded.h.preplumed +99 -0
  293. plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdlib/sim_util.cpp +2527 -0
  294. plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdlib/sim_util.cpp.preplumed +2513 -0
  295. plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/legacymdrunoptions.cpp +208 -0
  296. plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/legacymdrunoptions.cpp.preplumed +175 -0
  297. plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/legacymdrunoptions.h +408 -0
  298. plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/legacymdrunoptions.h.preplumed +394 -0
  299. plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/md.cpp +2348 -0
  300. plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/md.cpp.preplumed +2091 -0
  301. plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/minimize.cpp +3573 -0
  302. plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/minimize.cpp.preplumed +3495 -0
  303. plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/replicaexchange.cpp +1506 -0
  304. plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/replicaexchange.cpp.preplumed +1402 -0
  305. plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/replicaexchange.h +114 -0
  306. plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/replicaexchange.h.preplumed +106 -0
  307. plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/rerun.cpp +997 -0
  308. plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/rerun.cpp.preplumed +906 -0
  309. plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/runner.cpp +2780 -0
  310. plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/mdrun/runner.cpp.preplumed +2738 -0
  311. plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/modularsimulator/expandedensembleelement.cpp +224 -0
  312. plumed/_lib/lib/plumed/patches/gromacs-2022.5.diff/src/gromacs/modularsimulator/expandedensembleelement.cpp.preplumed +222 -0
  313. plumed/_lib/lib/plumed/patches/gromacs-2023.5.config +43 -0
  314. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/CMakeLists.txt +549 -0
  315. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/CMakeLists.txt.preplumed +546 -0
  316. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdlib/expanded.cpp +1632 -0
  317. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdlib/expanded.cpp.preplumed +1594 -0
  318. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdlib/expanded.h +104 -0
  319. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdlib/expanded.h.preplumed +100 -0
  320. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdlib/sim_util.cpp +2624 -0
  321. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdlib/sim_util.cpp.preplumed +2610 -0
  322. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/legacymdrunoptions.cpp +208 -0
  323. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/legacymdrunoptions.cpp.preplumed +175 -0
  324. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/legacymdrunoptions.h +409 -0
  325. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/legacymdrunoptions.h.preplumed +395 -0
  326. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/md.cpp +2419 -0
  327. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/md.cpp.preplumed +2164 -0
  328. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/minimize.cpp +3546 -0
  329. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/minimize.cpp.preplumed +3468 -0
  330. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/replicaexchange.cpp +1513 -0
  331. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/replicaexchange.cpp.preplumed +1409 -0
  332. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/replicaexchange.h +114 -0
  333. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/replicaexchange.h.preplumed +106 -0
  334. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/rerun.cpp +991 -0
  335. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/rerun.cpp.preplumed +900 -0
  336. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/runner.cpp +2895 -0
  337. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/mdrun/runner.cpp.preplumed +2849 -0
  338. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/modularsimulator/expandedensembleelement.cpp +224 -0
  339. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/modularsimulator/expandedensembleelement.cpp.preplumed +222 -0
  340. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/taskassignment/decidegpuusage.cpp +886 -0
  341. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/taskassignment/decidegpuusage.cpp.preplumed +880 -0
  342. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/taskassignment/include/gromacs/taskassignment/decidegpuusage.h +347 -0
  343. plumed/_lib/lib/plumed/patches/gromacs-2023.5.diff/src/gromacs/taskassignment/include/gromacs/taskassignment/decidegpuusage.h.preplumed +345 -0
  344. plumed/_lib/lib/plumed/patches/gromacs-2024.3.config +43 -0
  345. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/CMakeLists.txt +575 -0
  346. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/CMakeLists.txt.preplumed +572 -0
  347. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdlib/expanded.cpp +1632 -0
  348. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdlib/expanded.cpp.preplumed +1594 -0
  349. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdlib/expanded.h +104 -0
  350. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdlib/expanded.h.preplumed +100 -0
  351. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdlib/sim_util.cpp +2564 -0
  352. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdlib/sim_util.cpp.preplumed +2550 -0
  353. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/legacymdrunoptions.cpp +208 -0
  354. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/legacymdrunoptions.cpp.preplumed +175 -0
  355. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/legacymdrunoptions.h +410 -0
  356. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/legacymdrunoptions.h.preplumed +396 -0
  357. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/md.cpp +2435 -0
  358. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/md.cpp.preplumed +2187 -0
  359. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/minimize.cpp +3592 -0
  360. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/minimize.cpp.preplumed +3514 -0
  361. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/replicaexchange.cpp +1513 -0
  362. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/replicaexchange.cpp.preplumed +1409 -0
  363. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/replicaexchange.h +114 -0
  364. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/replicaexchange.h.preplumed +106 -0
  365. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/rerun.cpp +958 -0
  366. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/rerun.cpp.preplumed +929 -0
  367. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/runner.cpp +2987 -0
  368. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/mdrun/runner.cpp.preplumed +2941 -0
  369. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/modularsimulator/expandedensembleelement.cpp +224 -0
  370. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/modularsimulator/expandedensembleelement.cpp.preplumed +222 -0
  371. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/taskassignment/decidegpuusage.cpp +904 -0
  372. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/taskassignment/decidegpuusage.cpp.preplumed +898 -0
  373. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/taskassignment/include/gromacs/taskassignment/decidegpuusage.h +353 -0
  374. plumed/_lib/lib/plumed/patches/gromacs-2024.3.diff/src/gromacs/taskassignment/include/gromacs/taskassignment/decidegpuusage.h.preplumed +351 -0
  375. plumed/_lib/lib/plumed/patches/gromacs-2025.0.config +39 -0
  376. plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/cmake/gmxManagePlumed.cmake +82 -0
  377. plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/cmake/gmxManagePlumed.cmake.preplumed +82 -0
  378. plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedMDModule.cpp +162 -0
  379. plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedMDModule.cpp.preplumed +154 -0
  380. plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedOptions.cpp +107 -0
  381. plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedOptions.cpp.preplumed +99 -0
  382. plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedOptions.h +120 -0
  383. plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedOptions.h.preplumed +111 -0
  384. plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedforceprovider.cpp +215 -0
  385. plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedforceprovider.cpp.preplumed +197 -0
  386. plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedforceprovider.h +87 -0
  387. plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/applied_forces/plumed/plumedforceprovider.h.preplumed +86 -0
  388. plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/mdrun/runner.cpp +2971 -0
  389. plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/mdrun/runner.cpp.preplumed +2970 -0
  390. plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/mdrunutility/mdmodulesnotifiers.h +430 -0
  391. plumed/_lib/lib/plumed/patches/gromacs-2025.0.diff/src/gromacs/mdrunutility/mdmodulesnotifiers.h.preplumed +429 -0
  392. plumed/_lib/lib/plumed/patches/namd-2.12.config +30 -0
  393. plumed/_lib/lib/plumed/patches/namd-2.12.diff +267 -0
  394. plumed/_lib/lib/plumed/patches/namd-2.13.config +30 -0
  395. plumed/_lib/lib/plumed/patches/namd-2.13.diff +267 -0
  396. plumed/_lib/lib/plumed/patches/namd-2.14.config +30 -0
  397. plumed/_lib/lib/plumed/patches/namd-2.14.diff +268 -0
  398. plumed/_lib/lib/plumed/patches/patch.sh +500 -0
  399. plumed/_lib/lib/plumed/patches/qespresso-5.0.2.config +25 -0
  400. plumed/_lib/lib/plumed/patches/qespresso-5.0.2.diff/PW/src/forces.f90 +368 -0
  401. plumed/_lib/lib/plumed/patches/qespresso-5.0.2.diff/PW/src/forces.f90.preplumed +366 -0
  402. plumed/_lib/lib/plumed/patches/qespresso-5.0.2.diff/PW/src/plugin_forces.f90 +71 -0
  403. plumed/_lib/lib/plumed/patches/qespresso-5.0.2.diff/PW/src/plugin_forces.f90.preplumed +24 -0
  404. plumed/_lib/lib/plumed/patches/qespresso-5.0.2.diff/PW/src/plugin_initialization.f90 +62 -0
  405. plumed/_lib/lib/plumed/patches/qespresso-5.0.2.diff/PW/src/plugin_initialization.f90.preplumed +21 -0
  406. plumed/_lib/lib/plumed/patches/qespresso-5.0.2.diff/PW/src/pwscf.f90 +189 -0
  407. plumed/_lib/lib/plumed/patches/qespresso-5.0.2.diff/PW/src/pwscf.f90.preplumed +185 -0
  408. plumed/_lib/lib/plumed/patches/qespresso-6.2.config +26 -0
  409. plumed/_lib/lib/plumed/patches/qespresso-6.2.diff/PW/src/forces.f90 +422 -0
  410. plumed/_lib/lib/plumed/patches/qespresso-6.2.diff/PW/src/forces.f90.preplumed +420 -0
  411. plumed/_lib/lib/plumed/patches/qespresso-6.2.diff/PW/src/plugin_ext_forces.f90 +70 -0
  412. plumed/_lib/lib/plumed/patches/qespresso-6.2.diff/PW/src/plugin_ext_forces.f90.preplumed +23 -0
  413. plumed/_lib/lib/plumed/patches/qespresso-6.2.diff/PW/src/plugin_initialization.f90 +62 -0
  414. plumed/_lib/lib/plumed/patches/qespresso-6.2.diff/PW/src/plugin_initialization.f90.preplumed +21 -0
  415. plumed/_lib/lib/plumed/patches/qespresso-6.2.diff/PW/src/run_pwscf.f90 +233 -0
  416. plumed/_lib/lib/plumed/patches/qespresso-6.2.diff/PW/src/run_pwscf.f90.preplumed +230 -0
  417. plumed/_lib/lib/plumed/patches/qespresso-7.0.config +28 -0
  418. plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/Modules/Makefile +175 -0
  419. plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/Modules/Makefile.preplumed +171 -0
  420. plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/PW/src/forces.f90 +486 -0
  421. plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/PW/src/forces.f90.preplumed +484 -0
  422. plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/PW/src/plugin_ext_forces.f90 +74 -0
  423. plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/PW/src/plugin_ext_forces.f90.preplumed +23 -0
  424. plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/PW/src/plugin_initialization.f90 +64 -0
  425. plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/PW/src/plugin_initialization.f90.preplumed +21 -0
  426. plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/PW/src/run_pwscf.f90 +532 -0
  427. plumed/_lib/lib/plumed/patches/qespresso-7.0.diff/PW/src/run_pwscf.f90.preplumed +518 -0
  428. plumed/_lib/lib/plumed/patches/qespresso-7.2.config +28 -0
  429. plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/Modules/Makefile +249 -0
  430. plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/Modules/Makefile.preplumed +244 -0
  431. plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/PW/src/forces.f90 +532 -0
  432. plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/PW/src/forces.f90.preplumed +535 -0
  433. plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/PW/src/plugin_ext_forces.f90 +74 -0
  434. plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/PW/src/plugin_ext_forces.f90.preplumed +23 -0
  435. plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/PW/src/plugin_initialization.f90 +64 -0
  436. plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/PW/src/plugin_initialization.f90.preplumed +21 -0
  437. plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/PW/src/run_pwscf.f90 +569 -0
  438. plumed/_lib/lib/plumed/patches/qespresso-7.2.diff/PW/src/run_pwscf.f90.preplumed +560 -0
  439. plumed/_lib/lib/plumed/plumed-config +9 -0
  440. plumed/_lib/lib/plumed/plumed-mklib +9 -0
  441. plumed/_lib/lib/plumed/plumed-newcv +9 -0
  442. plumed/_lib/lib/plumed/plumed-partial_tempering +9 -0
  443. plumed/_lib/lib/plumed/plumed-patch +9 -0
  444. plumed/_lib/lib/plumed/plumed-runtime +0 -0
  445. plumed/_lib/lib/plumed/plumed-selector +9 -0
  446. plumed/_lib/lib/plumed/plumed-vim2html +9 -0
  447. plumed/_lib/lib/plumed/scripts/config.sh +126 -0
  448. plumed/_lib/lib/plumed/scripts/mklib.sh +175 -0
  449. plumed/_lib/lib/plumed/scripts/newcv.sh +26 -0
  450. plumed/_lib/lib/plumed/scripts/partial_tempering.sh +319 -0
  451. plumed/_lib/lib/plumed/scripts/patch.sh +4 -0
  452. plumed/_lib/lib/plumed/scripts/selector.sh +234 -0
  453. plumed/_lib/lib/plumed/scripts/vim2html.sh +190 -0
  454. plumed/_lib/lib/plumed/src/colvar/Template.cpp +116 -0
  455. plumed/_lib/lib/plumed/src/config/compile_options.sh +3 -0
  456. plumed/_lib/lib/plumed/src/config/config.txt +179 -0
  457. plumed/_lib/lib/plumed/src/lib/Plumed.cmake +8 -0
  458. plumed/_lib/lib/plumed/src/lib/Plumed.cmake.runtime +5 -0
  459. plumed/_lib/lib/plumed/src/lib/Plumed.cmake.shared +5 -0
  460. plumed/_lib/lib/plumed/src/lib/Plumed.cmake.static +5 -0
  461. plumed/_lib/lib/plumed/src/lib/Plumed.inc +8 -0
  462. plumed/_lib/lib/plumed/src/lib/Plumed.inc.runtime +5 -0
  463. plumed/_lib/lib/plumed/src/lib/Plumed.inc.shared +5 -0
  464. plumed/_lib/lib/plumed/src/lib/Plumed.inc.static +5 -0
  465. plumed/_lib/lib/plumed/vim/scripts.vim +6 -0
  466. plumed/_plumed_core.cpython-311-aarch64-linux-musl.so +0 -0
  467. plumed/_plumed_core.cpython-312-aarch64-linux-musl.so +0 -0
  468. plumed/_plumed_core.cpython-313-aarch64-linux-musl.so +0 -0
  469. plumedCommunications.cpython-311-aarch64-linux-musl.so +0 -0
  470. plumedCommunications.cpython-312-aarch64-linux-musl.so +0 -0
  471. plumedCommunications.cpython-313-aarch64-linux-musl.so +0 -0
  472. plumedCommunications.pyi +431 -0
@@ -0,0 +1,721 @@
1
+ /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2
+ Copyright (c) 2011-2023 The plumed team
3
+ (see the PEOPLE file at the root of the distribution for a list of names)
4
+
5
+ See http://www.plumed.org for more information.
6
+
7
+ This file is part of plumed, version 2.
8
+
9
+ plumed is free software: you can redistribute it and/or modify
10
+ it under the terms of the GNU Lesser General Public License as published by
11
+ the Free Software Foundation, either version 3 of the License, or
12
+ (at your option) any later version.
13
+
14
+ plumed is distributed in the hope that it will be useful,
15
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
+ GNU Lesser General Public License for more details.
18
+
19
+ You should have received a copy of the GNU Lesser General Public License
20
+ along with plumed. If not, see <http://www.gnu.org/licenses/>.
21
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
22
+ #ifndef __PLUMED_tools_Matrix_h
23
+ #define __PLUMED_tools_Matrix_h
24
+ #include <vector>
25
+ #include <string>
26
+ #include <set>
27
+ #include <cmath>
28
+ #include "Exception.h"
29
+ #include "MatrixSquareBracketsAccess.h"
30
+ #include "Tools.h"
31
+ #include "Log.h"
32
+ #include "../lapack/lapack.h"
33
+
34
+ namespace PLMD {
35
+
36
+ /// Calculate the dot product between two vectors
37
+ template <typename T> T dotProduct( const std::vector<T>& A, const std::vector<T>& B ) {
38
+ plumed_assert( A.size()==B.size() );
39
+ T val;
40
+ for(unsigned i=0; i<A.size(); ++i) {
41
+ val+=A[i]*B[i];
42
+ }
43
+ return val;
44
+ }
45
+
46
+ /// Calculate the dot product between a vector and itself
47
+ template <typename T> T norm( const std::vector<T>& A ) {
48
+ T val;
49
+ for(unsigned i=0; i<A.size(); ++i) {
50
+ val+=A[i]*A[i];
51
+ }
52
+ return val;
53
+ }
54
+
55
+ /// This class stores a full matrix and allows one to do some simple matrix operations
56
+ template <typename T>
57
+ class Matrix:
58
+ public MatrixSquareBracketsAccess<Matrix<T>,T> {
59
+ /// Multiply matrix by scalar
60
+ template <typename U> friend Matrix<U> operator*(U&, const Matrix<U>& );
61
+ /// Matrix matrix multiply
62
+ template <typename U> friend void mult( const Matrix<U>&, const Matrix<U>&, Matrix<U>& );
63
+ /// Matrix times a std::vector
64
+ template <typename U> friend void mult( const Matrix<U>&, const std::vector<U>&, std::vector<U>& );
65
+ /// std::vector times a Matrix
66
+ template <typename U> friend void mult( const std::vector<U>&, const Matrix<U>&, std::vector<U>& );
67
+ /// Matrix transpose
68
+ template <typename U> friend void transpose( const Matrix<U>&, Matrix<U>& );
69
+ /// Output the entire matrix on a single line
70
+ template <typename U> friend Log& operator<<(Log&, const Matrix<U>& );
71
+ /// Output the Matrix in matrix form
72
+ template <typename U> friend void matrixOut( Log&, const Matrix<U>& );
73
+ /// Diagonalize a symmetric matrix - returns zero if diagonalization worked
74
+ template <typename U> friend int diagMat( const Matrix<U>&, std::vector<U>&, Matrix<U>& );
75
+ /// Calculate the Moore-Penrose Pseudoinverse of a matrix
76
+ template <typename U> friend int pseudoInvert( const Matrix<U>&, Matrix<U>& );
77
+ /// Calculate the logarithm of the determinant of a symmetric matrix - returns zero if succesfull
78
+ template <typename U> friend int logdet( const Matrix<U>&, U& );
79
+ /// Invert a matrix (works for both symmetric and asymmetric matrices) - returns zero if sucesfull
80
+ template <typename U> friend int Invert( const Matrix<U>&, Matrix<U>& );
81
+ /// Do a cholesky decomposition of a matrix
82
+ template <typename U> friend void cholesky( const Matrix<U>&, Matrix<U>& );
83
+ /// Solve a system of equations using the cholesky decomposition
84
+ template <typename U> friend void chol_elsolve( const Matrix<U>&, const std::vector<U>&, std::vector<U>& );
85
+ private:
86
+ /// Number of elements in matrix (nrows*ncols)
87
+ unsigned sz;
88
+ /// Number of rows in matrix
89
+ unsigned rw;
90
+ /// Number of columns in matrix
91
+ unsigned cl;
92
+ /// The data in the matrix
93
+ std::vector<T> data;
94
+ template <typename Y>
95
+ struct openAccVectorHelper {
96
+ using pointer = Y*;
97
+ size_t sz=0;
98
+ pointer data=nullptr;
99
+ void toACCDevice() const {
100
+ #pragma acc enter data copyin(this[0:1],sz,data[0:sz])
101
+ }
102
+ void removeFromACCDevice() const {
103
+ #pragma acc exit data delete(data[0:sz],sz,this[0:1])
104
+ }
105
+ void update(std::vector<Y>&x) {
106
+ data = x.data();
107
+ sz = x.size();
108
+ }
109
+ };
110
+ openAccVectorHelper<T> helper{};
111
+
112
+ public:
113
+ explicit Matrix(const unsigned nr=0, const unsigned nc=0 ) : sz(nr*nc), rw(nr), cl(nc), data(nr*nc) {
114
+ helper.update(data);
115
+ }
116
+ void toACCDevice() const {
117
+ #pragma acc enter data copyin(this[0:1])
118
+ helper.toACCDevice();
119
+ }
120
+ void removeFromACCDevice() const {
121
+ helper.removeFromACCDevice();
122
+ // and delete
123
+ #pragma acc exit data delete( this[0:1])
124
+ }
125
+ Matrix(const Matrix<T>& t) : sz(t.sz), rw(t.rw), cl(t.cl), data(t.data) {
126
+ helper.update(data);
127
+ }
128
+ /// Resize the matrix
129
+ void resize( const unsigned nr, const unsigned nc ) {
130
+ rw=nr;
131
+ cl=nc;
132
+ sz=nr*nc;
133
+ data.resize(sz);
134
+ helper.update(data);
135
+ }
136
+ /// Return the number of rows
137
+ inline unsigned nrows() const {
138
+ return rw;
139
+ }
140
+ /// Return the number of columns
141
+ inline unsigned ncols() const {
142
+ return cl;
143
+ }
144
+ /// Return the contents of the matrix as a vector of length rw*cl
145
+ inline std::vector<T>& getVector() {
146
+ return data;
147
+ }
148
+ /// Set the matrix from a vector input
149
+ inline void setFromVector( const std::vector<T>& vecin ) {
150
+ plumed_assert( vecin.size()==sz );
151
+ for(unsigned i=0; i<sz; ++i) {
152
+ data[i]=vecin[i];
153
+ }
154
+ }
155
+ /// Return element i,j of the matrix
156
+ inline const T& operator () (const unsigned& i, const unsigned& j) const {
157
+ return helper.data[j+i*cl];
158
+ // return data[j+i*cl];
159
+ }
160
+ /// Return a referenre to element i,j of the matrix
161
+ inline T& operator () (const unsigned& i, const unsigned& j) {
162
+ return helper.data[j+i*cl];
163
+ // return data[j+i*cl];
164
+ }
165
+ /// Set all elements of the matrix equal to the value of v
166
+ Matrix<T>& operator=(const T& v) {
167
+ for(unsigned i=0; i<sz; ++i) {
168
+ data[i]=v;
169
+ }
170
+ return *this;
171
+ }
172
+ /// Set the Matrix equal to another Matrix
173
+ Matrix<T>& operator=(const Matrix<T>& m) {
174
+ sz=m.sz;
175
+ rw=m.rw;
176
+ cl=m.cl;
177
+ data=m.data;
178
+ helper.update(data);
179
+ return *this;
180
+ }
181
+ /// Set the Matrix equal to the value of a standard vector - used for readin
182
+ Matrix<T>& operator=(const std::vector<T>& v) {
183
+ plumed_dbg_assert( v.size()==sz );
184
+ for(unsigned i=0; i<sz; ++i) {
185
+ data[i]=v[i];
186
+ }
187
+ return *this;
188
+ }
189
+ /// Add v to all elements of the Matrix
190
+ Matrix<T> operator+=(const T& v) {
191
+ for(unsigned i=0; i<sz; ++i) {
192
+ data[i]+=v;
193
+ }
194
+ return *this;
195
+ }
196
+ /// Multiply all elements by v
197
+ Matrix<T> operator*=(const T& v) {
198
+ for(unsigned i=0; i<sz; ++i) {
199
+ data[i]*=v;
200
+ }
201
+ return *this;
202
+ }
203
+ /// Matrix addition
204
+ Matrix<T>& operator+=(const Matrix<T>& m) {
205
+ plumed_dbg_assert( m.rw==rw && m.cl==cl );
206
+ data+=m.data;
207
+ return *this;
208
+ }
209
+ /// Subtract v from all elements of the Matrix
210
+ Matrix<T> operator-=(const T& v) {
211
+ for(unsigned i=0; i<sz; ++i) {
212
+ data-=v;
213
+ }
214
+ return *this;
215
+ }
216
+ /// Matrix subtraction
217
+ Matrix<T>& operator-=(const Matrix<T>& m) {
218
+ plumed_dbg_assert( m.rw==rw && m.cl==cl );
219
+ data-=m.data;
220
+ return *this;
221
+ }
222
+ /// Test if the matrix is symmetric or not
223
+ unsigned isSymmetric() const {
224
+ if (rw!=cl) {
225
+ return 0;
226
+ }
227
+ unsigned sym=1;
228
+ for(unsigned i=1; i<rw; ++i)
229
+ for(unsigned j=0; j<i; ++j)
230
+ if( std::fabs(data[i+j*cl]-data[j+i*cl])>1.e-10 ) {
231
+ sym=0;
232
+ break;
233
+ }
234
+ return sym;
235
+ }
236
+ };
237
+
238
+ /// Multiply matrix by scalar
239
+ template <typename T> Matrix<T> operator*(T& v, const Matrix<T>& m ) {
240
+ Matrix<T> new_m(m);
241
+ new_m*=v;
242
+ return new_m;
243
+ }
244
+
245
+ template <typename T> void mult( const Matrix<T>& A, const Matrix<T>& B, Matrix<T>& C ) {
246
+ plumed_assert(A.cl==B.rw);
247
+ if( A.rw !=C.rw || B.cl !=C.cl ) {
248
+ C.resize( A.rw, B.cl );
249
+ }
250
+ C=static_cast<T>( 0 );
251
+ for(unsigned i=0; i<A.rw; ++i)
252
+ for(unsigned j=0; j<B.cl; ++j)
253
+ for (unsigned k=0; k<A.cl; ++k) {
254
+ C(i,j)+=A(i,k)*B(k,j);
255
+ }
256
+ }
257
+
258
+ template <typename T> void mult( const Matrix<T>& A, const std::vector<T>& B, std::vector<T>& C) {
259
+ plumed_assert( A.cl==B.size() );
260
+ if( C.size()!=A.rw ) {
261
+ C.resize(A.rw);
262
+ }
263
+ for(unsigned i=0; i<A.rw; ++i) {
264
+ C[i]= static_cast<T>( 0 );
265
+ }
266
+ for(unsigned i=0; i<A.rw; ++i)
267
+ for(unsigned k=0; k<A.cl; ++k) {
268
+ C[i]+=A(i,k)*B[k] ;
269
+ }
270
+ }
271
+
272
+ template <typename T> void mult( const std::vector<T>& A, const Matrix<T>& B, std::vector<T>& C) {
273
+ plumed_assert( B.rw==A.size() );
274
+ if( C.size()!=B.cl ) {
275
+ C.resize( B.cl );
276
+ }
277
+ for(unsigned i=0; i<B.cl; ++i) {
278
+ C[i]=static_cast<T>( 0 );
279
+ }
280
+ for(unsigned i=0; i<B.cl; ++i)
281
+ for(unsigned k=0; k<B.rw; ++k) {
282
+ C[i]+=A[k]*B(k,i);
283
+ }
284
+ }
285
+
286
+ template <typename T> void transpose( const Matrix<T>& A, Matrix<T>& AT ) {
287
+ if( A.rw!=AT.cl || A.cl!=AT.rw ) {
288
+ AT.resize( A.cl, A.rw );
289
+ }
290
+ for(unsigned i=0; i<A.cl; ++i)
291
+ for(unsigned j=0; j<A.rw; ++j) {
292
+ AT(i,j)=A(j,i);
293
+ }
294
+ }
295
+
296
+ template <typename T> Log& operator<<(Log& ostr, const Matrix<T>& mat) {
297
+ for(unsigned i=0; i<mat.sz; ++i) {
298
+ ostr<<mat.data[i]<<" ";
299
+ }
300
+ return ostr;
301
+ }
302
+
303
+ template <typename T> void matrixOut( Log& ostr, const Matrix<T>& mat) {
304
+ for(unsigned i=0; i<mat.rw; ++i) {
305
+ for(unsigned j=0; j<mat.cl; ++j) {
306
+ ostr<<mat(i,j)<<" ";
307
+ }
308
+ ostr<<"\n";
309
+ }
310
+ return;
311
+ }
312
+
313
+ template <typename T> int diagMat( const Matrix<T>& A, std::vector<T>& eigenvals, Matrix<T>& eigenvecs ) {
314
+
315
+ // Check matrix is square and symmetric
316
+ plumed_assert( A.rw==A.cl );
317
+ plumed_assert( A.isSymmetric()==1 );
318
+ std::vector<T> da(A.sz);
319
+ unsigned k=0;
320
+ std::vector<T> evals(A.cl);
321
+ // Transfer the matrix to the local array
322
+ for (unsigned i=0; i<A.cl; ++i)
323
+ for (unsigned j=0; j<A.rw; ++j) {
324
+ da[k++]=static_cast<T>( A(j,i) );
325
+ }
326
+
327
+ int n=A.cl;
328
+ int lwork=-1;
329
+ int liwork=-1;
330
+ int m;
331
+ int info=0;
332
+ int one=1;
333
+ std::vector<T> work(A.cl);
334
+ std::vector<int> iwork(A.cl);
335
+ T vl, vu, abstol=0.0;
336
+ std::vector<int> isup(2*A.cl);
337
+ std::vector<T> evecs(A.sz);
338
+ if constexpr (std::is_same_v<T,double>) {
339
+ plumed_lapack_dsyevr("V", "I", "U", &n, da.data(), &n, &vl, &vu, &one, &n,
340
+ &abstol, &m, evals.data(), evecs.data(), &n,
341
+ isup.data(), work.data(), &lwork, iwork.data(), &liwork, &info);
342
+ } else if constexpr (std::is_same_v<T,float>) {
343
+ plumed_lapack_ssyevr("V", "I", "U", &n, da.data(), &n, &vl, &vu, &one, &n,
344
+ &abstol, &m, evals.data(), evecs.data(), &n,
345
+ isup.data(), work.data(), &lwork, iwork.data(), &liwork, &info);
346
+ } else {
347
+ static_assert(std::is_same_v<T,double> || std::is_same_v<T,float>, "diagMat is only compatible with float and double");
348
+ }
349
+ if (info!=0) {
350
+ return info;
351
+ }
352
+
353
+ // Retrieve correct sizes for work and iwork then reallocate
354
+ liwork=iwork[0];
355
+ iwork.resize(liwork);
356
+ lwork=static_cast<int>( work[0] );
357
+ work.resize(lwork);
358
+
359
+ if constexpr (std::is_same_v<T,double>) {
360
+ plumed_lapack_dsyevr("V", "I", "U", &n, da.data(), &n, &vl, &vu, &one, &n,
361
+ &abstol, &m, evals.data(), evecs.data(), &n,
362
+ isup.data(), work.data(), &lwork, iwork.data(), &liwork, &info);
363
+ } else if constexpr (std::is_same_v<T,float>) {
364
+ plumed_lapack_ssyevr("V", "I", "U", &n, da.data(), &n, &vl, &vu, &one, &n,
365
+ &abstol, &m, evals.data(), evecs.data(), &n,
366
+ isup.data(), work.data(), &lwork, iwork.data(), &liwork, &info);
367
+ } else {
368
+ static_assert(std::is_same_v<T,double> || std::is_same_v<T,float>, "diagMat is only compatible with float and double");
369
+ }
370
+ if (info!=0) {
371
+ return info;
372
+ }
373
+
374
+ if( eigenvals.size()!=A.cl ) {
375
+ eigenvals.resize( A.cl );
376
+ }
377
+ if( eigenvecs.rw!=A.rw || eigenvecs.cl!=A.cl ) {
378
+ eigenvecs.resize( A.rw, A.cl );
379
+ }
380
+ k=0;
381
+ for(unsigned i=0; i<A.cl; ++i) {
382
+ eigenvals[i]=evals[i];
383
+ // N.B. For ease of producing projectors we store the eigenvectors
384
+ // ROW-WISE in the eigenvectors matrix. The first index is the
385
+ // eigenvector number and the second the component
386
+ for(unsigned j=0; j<A.rw; ++j) {
387
+ eigenvecs(i,j)=evecs[k++];
388
+ }
389
+ }
390
+
391
+ // This changes eigenvectors so that the first non-null element
392
+ // of each of them is positive
393
+ // We can do it because the phase is arbitrary, and helps making
394
+ // the result reproducible
395
+ for(int i=0; i<n; ++i) {
396
+ int j;
397
+ for(j=0; j<n; j++)
398
+ if(eigenvecs(i,j)*eigenvecs(i,j)>1e-14) {
399
+ break;
400
+ }
401
+ if(j<n)
402
+ if(eigenvecs(i,j)<0.0)
403
+ for(j=0; j<n; j++) {
404
+ eigenvecs(i,j)*=-1;
405
+ }
406
+ }
407
+ return 0;
408
+ }
409
+
410
+ template <typename T> int pseudoInvert( const Matrix<T>& A, Matrix<T>& pseudoinverse ) {
411
+ std::vector<T> da(A.sz);
412
+ unsigned k=0;
413
+ // Transfer the matrix to the local array
414
+ for (unsigned i=0; i<A.cl; ++i)
415
+ for (unsigned j=0; j<A.rw; ++j) {
416
+ da[k++]=static_cast<T>( A(j,i) );
417
+ }
418
+
419
+ int nsv;
420
+ int info=0;
421
+ int nrows=A.rw, ncols=A.cl;
422
+ if(A.rw>A.cl) {
423
+ nsv=A.cl;
424
+ } else {
425
+ nsv=A.rw;
426
+ }
427
+
428
+ // Create some containers for stuff from single value decomposition
429
+ std::vector<T> S(nsv);
430
+ std::vector<T> U(nrows*nrows);
431
+ std::vector<T> VT(ncols*ncols);
432
+ std::vector<int> iwork(8*nsv);
433
+
434
+ // This optimizes the size of the work array used in lapack singular value decomposition
435
+ int lwork=-1;
436
+ std::vector<T> work(1);
437
+ if constexpr (std::is_same_v<T,double> ) {
438
+ plumed_lapack_dgesdd( "A", &nrows, &ncols, da.data(), &nrows, S.data(),
439
+ U.data(), &nrows, VT.data(), &ncols, work.data(),
440
+ &lwork, iwork.data(), &info );
441
+ } else if constexpr (std::is_same_v<T,float>) {
442
+ plumed_lapack_sgesdd( "A", &nrows, &ncols, da.data(), &nrows, S.data(),
443
+ U.data(), &nrows, VT.data(), &ncols, work.data(),
444
+ &lwork, iwork.data(), &info );
445
+ } else {
446
+ static_assert(std::is_same_v<T,double> || std::is_same_v<T,float>, "pseudoInvert works only for float and double");
447
+ }
448
+ if(info!=0) {
449
+ return info;
450
+ }
451
+
452
+ // Retrieve correct sizes for work and rellocate
453
+ lwork=(int) work[0];
454
+ work.resize(lwork);
455
+
456
+ // This does the singular value decomposition
457
+ if constexpr (std::is_same_v<T,double> ) {
458
+ plumed_lapack_dgesdd( "A", &nrows, &ncols, da.data(), &nrows, S.data(),
459
+ U.data(), &nrows, VT.data(), &ncols, work.data(),
460
+ &lwork, iwork.data(), &info );
461
+ } else if constexpr (std::is_same_v<T,float>) {
462
+ plumed_lapack_sgesdd( "A", &nrows, &ncols, da.data(), &nrows, S.data(),
463
+ U.data(), &nrows, VT.data(), &ncols, work.data(),
464
+ &lwork, iwork.data(), &info );
465
+ } else {
466
+ static_assert(std::is_same_v<T,double> || std::is_same_v<T,float>, "pseudoInvert works only for float and double");
467
+ }
468
+ if(info!=0) {
469
+ return info;
470
+ }
471
+
472
+ // Compute the tolerance on the singular values ( machine epsilon * number of singular values * maximum singular value )
473
+ T tol;
474
+ tol=S[0];
475
+ for(int i=1; i<nsv; ++i) {
476
+ if( S[i]>tol ) {
477
+ tol=S[i];
478
+ }
479
+ }
480
+ tol*=nsv*epsilon;
481
+
482
+ // Get the inverses of the singlular values
483
+ Matrix<T> Si( ncols, nrows );
484
+ Si=0.0;
485
+ for(int i=0; i<nsv; ++i) {
486
+ if( S[i]>tol ) {
487
+ Si(i,i)=1./S[i];
488
+ } else {
489
+ Si(i,i)=0.0;
490
+ }
491
+ }
492
+
493
+ // Now extract matrices for pseudoinverse
494
+ Matrix<T> V( ncols, ncols ), UT( nrows, nrows ), tmp( ncols, nrows );
495
+ k=0;
496
+ for(int i=0; i<nrows; ++i) {
497
+ for(int j=0; j<nrows; ++j) {
498
+ UT(i,j)=U[k++];
499
+ }
500
+ }
501
+ k=0;
502
+ for(int i=0; i<ncols; ++i) {
503
+ for(int j=0; j<ncols; ++j) {
504
+ V(i,j)=VT[k++];
505
+ }
506
+ }
507
+
508
+ // And do matrix algebra to construct the pseudoinverse
509
+ if( pseudoinverse.rw!=static_cast<unsigned>(ncols)
510
+ || pseudoinverse.cl!=static_cast<unsigned>(nrows) ) {
511
+ pseudoinverse.resize( ncols, nrows );
512
+ }
513
+ mult( V, Si, tmp );
514
+ mult( tmp, UT, pseudoinverse );
515
+
516
+ return 0;
517
+ }
518
+
519
+ template <typename T> int Invert( const Matrix<T>& A, Matrix<T>& inverse ) {
520
+
521
+ if( A.isSymmetric()==1 ) {
522
+ // GAT -- I only ever use symmetric matrices so I can invert them like this.
523
+ // I choose to do this as I have had problems with the more general way of doing this that
524
+ // is implemented below.
525
+ std::vector<T> eval(A.rw);
526
+ Matrix<T> evec(A.rw,A.cl), tevec(A.rw,A.cl);
527
+ int err;
528
+ err=diagMat( A, eval, evec );
529
+ if(err!=0) {
530
+ return err;
531
+ }
532
+ for (unsigned i=0; i<A.rw; ++i)
533
+ for (unsigned j=0; j<A.cl; ++j) {
534
+ tevec(i,j)=evec(j,i)/eval[j];
535
+ }
536
+ mult(tevec,evec,inverse);
537
+ } else {
538
+ std::vector<T> da(A.sz);
539
+ std::vector<int> ipiv(A.cl);
540
+ unsigned k=0;
541
+ int n=A.rw;
542
+ int info=0;
543
+ for(unsigned i=0; i<A.cl; ++i)
544
+ for(unsigned j=0; j<A.rw; ++j) {
545
+ da[k++]=static_cast<T>( A(j,i) );
546
+ }
547
+ if constexpr (std::is_same_v<T,double> ) {
548
+ plumed_lapack_dgetrf(&n,&n,da.data(),&n,ipiv.data(),&info);
549
+ } else if constexpr (std::is_same_v<T,float>) {
550
+ plumed_lapack_sgetrf(&n,&n,da.data(),&n,ipiv.data(),&info);
551
+ } else {
552
+ static_assert(std::is_same_v<T,double> || std::is_same_v<T,float>, "Invert works only for float and double");
553
+ }
554
+ if(info!=0) {
555
+ return info;
556
+ }
557
+
558
+ int lwork=-1;
559
+ std::vector<T> work(A.cl);
560
+ if constexpr (std::is_same_v<T,double> ) {
561
+ plumed_lapack_dgetri(&n,da.data(),&n,ipiv.data(),work.data(),&lwork,&info);
562
+ } else if constexpr (std::is_same_v<T,float>) {
563
+ plumed_lapack_sgetri(&n,da.data(),&n,ipiv.data(),work.data(),&lwork,&info);
564
+ } else {
565
+ static_assert(std::is_same_v<T,double> || std::is_same_v<T,float>, "Invert works only for float and double");
566
+ }
567
+ if(info!=0) {
568
+ return info;
569
+ }
570
+
571
+ lwork=static_cast<int>( work[0] );
572
+ work.resize(lwork);
573
+ if constexpr (std::is_same_v<T,double> ) {
574
+ plumed_lapack_dgetri(&n,da.data(),&n,ipiv.data(),work.data(),&lwork,&info);
575
+ } else if constexpr (std::is_same_v<T,float>) {
576
+ plumed_lapack_sgetri(&n,da.data(),&n,ipiv.data(),work.data(),&lwork,&info);
577
+ } else {
578
+ static_assert(std::is_same_v<T,double> || std::is_same_v<T,float>, "Invert works only for float and double");
579
+ }
580
+ if(info!=0) {
581
+ return info;
582
+ }
583
+
584
+ if( inverse.cl!=A.cl || inverse.rw!=A.rw ) {
585
+ inverse.resize(A.rw,A.cl);
586
+ }
587
+ k=0;
588
+ for(unsigned i=0; i<A.rw; ++i)
589
+ for(unsigned j=0; j<A.cl; ++j) {
590
+ inverse(j,i)=da[k++];
591
+ }
592
+ }
593
+
594
+ return 0;
595
+ }
596
+
597
+ template <typename T> void cholesky( const Matrix<T>& A, Matrix<T>& B ) {
598
+
599
+ plumed_assert( A.rw==A.cl && A.isSymmetric() );
600
+ Matrix<T> L(A.rw,A.cl);
601
+ L=0.;
602
+ std::vector<T> D(A.rw,0.);
603
+ for(unsigned i=0; i<A.rw; ++i) {
604
+ L(i,i)=static_cast<T>( 1 );
605
+ for (unsigned j=0; j<i; ++j) {
606
+ L(i,j)=A(i,j);
607
+ for (unsigned k=0; k<j; ++k) {
608
+ L(i,j)-=L(i,k)*L(j,k)*D[k];
609
+ }
610
+ if (D[j]!=0.) {
611
+ L(i,j)/=D[j];
612
+ } else {
613
+ L(i,j)=static_cast<T>( 0 );
614
+ }
615
+ }
616
+ D[i]=A(i,i);
617
+ for (unsigned k=0; k<i; ++k) {
618
+ D[i]-=L(i,k)*L(i,k)*D[k];
619
+ }
620
+ }
621
+
622
+ for(unsigned i=0; i<A.rw; ++i) {
623
+ D[i]=(D[i]>0.?std::sqrt(D[i]):0.);
624
+ }
625
+ if( B.rw!=A.rw || B.cl!=A.cl ) {
626
+ B.resize( A.rw, A.cl);
627
+ }
628
+ B=0.;
629
+ for(unsigned i=0; i<A.rw; ++i)
630
+ for(unsigned j=0; j<=i; ++j) {
631
+ B(i,j)+=L(i,j)*D[j];
632
+ }
633
+ }
634
+
635
+ template <typename T> void chol_elsolve( const Matrix<T>& M, const std::vector<T>& b, std::vector<T>& y ) {
636
+
637
+ plumed_assert( M.rw==M.cl && M(0,1)==0.0 && b.size()==M.rw );
638
+ if( y.size()!=M.rw ) {
639
+ y.resize( M.rw );
640
+ }
641
+ for(unsigned i=0; i<M.rw; ++i) {
642
+ y[i]=b[i];
643
+ for(unsigned j=0; j<i; ++j) {
644
+ y[i]-=M(i,j)*y[j];
645
+ }
646
+ y[i]*=1.0/M(i,i);
647
+ }
648
+ }
649
+
650
+ template <typename T> int logdet( const Matrix<T>& M, T& ldet ) {
651
+ // Check matrix is square and symmetric
652
+ plumed_assert( M.rw==M.cl || M.isSymmetric() );
653
+
654
+ std::vector<T> da(M.sz);
655
+ unsigned k=0;
656
+ std::vector<T> evals(M.cl);
657
+ // Transfer the matrix to the local array
658
+ for (unsigned i=0; i<M.rw; ++i)
659
+ for (unsigned j=0; j<M.cl; ++j) {
660
+ da[k++]=static_cast<T>( M(j,i) );
661
+ }
662
+
663
+ int n=M.cl;
664
+ int lwork=-1;
665
+ int liwork=-1;
666
+ int info=0;
667
+ int m;
668
+ int one=1;
669
+ std::vector<T> work(M.rw);
670
+ std::vector<int> iwork(M.rw);
671
+ T vl, vu, abstol=0.0;
672
+ std::vector<int> isup(2*M.rw);
673
+ std::vector<T> evecs(M.sz);
674
+ if constexpr (std::is_same_v<T,double> ) {
675
+ plumed_lapack_dsyevr("N", "I", "U", &n, da.data(), &n, &vl, &vu, &one, &n,
676
+ &abstol, &m, evals.data(), evecs.data(), &n,
677
+ isup.data(), work.data(), &lwork, iwork.data(), &liwork, &info);
678
+ } else if constexpr (std::is_same_v<T,float>) {
679
+ plumed_lapack_ssyevr("N", "I", "U", &n, da.data(), &n, &vl, &vu, &one, &n,
680
+ &abstol, &m, evals.data(), evecs.data(), &n,
681
+ isup.data(), work.data(), &lwork, iwork.data(), &liwork, &info);
682
+ } else {
683
+ static_assert(std::is_same_v<T,double> || std::is_same_v<T,float>, "logdet works only for float and double");
684
+ }
685
+ if (info!=0) {
686
+ return info;
687
+ }
688
+
689
+ // Retrieve correct sizes for work and iwork then reallocate
690
+ lwork=static_cast<int>( work[0] );
691
+ work.resize(lwork);
692
+ liwork=iwork[0];
693
+ iwork.resize(liwork);
694
+ if constexpr (std::is_same_v<T,double> ) {
695
+ plumed_lapack_dsyevr("N", "I", "U", &n, da.data(), &n, &vl, &vu, &one, &n,
696
+ &abstol, &m, evals.data(), evecs.data(), &n,
697
+ isup.data(), work.data(), &lwork, iwork.data(), &liwork, &info);
698
+ } else if constexpr (std::is_same_v<T,float>) {
699
+ plumed_lapack_ssyevr("N", "I", "U", &n, da.data(), &n, &vl, &vu, &one, &n,
700
+ &abstol, &m, evals.data(), evecs.data(), &n,
701
+ isup.data(), work.data(), &lwork, iwork.data(), &liwork, &info);
702
+ } else {
703
+ static_assert(std::is_same_v<T,double> || std::is_same_v<T,float>, "logdet works only for float and double");
704
+ }
705
+ if (info!=0) {
706
+ return info;
707
+ }
708
+
709
+ // Transfer the eigenvalues and eigenvectors to the output
710
+ ldet=0;
711
+ for(unsigned i=0; i<M.cl; i++) {
712
+ ldet+=log(evals[i]);
713
+ }
714
+
715
+ return 0;
716
+ }
717
+
718
+
719
+
720
+ }
721
+ #endif