DEME 2.0.3__tar.gz → 2.0.5__tar.gz

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 (443) hide show
  1. {deme-2.0.3/deme.egg-info → deme-2.0.5}/PKG-INFO +1 -1
  2. {deme-2.0.3 → deme-2.0.5}/README.md +2 -0
  3. {deme-2.0.3 → deme-2.0.5/deme.egg-info}/PKG-INFO +1 -1
  4. {deme-2.0.3 → deme-2.0.5}/setup.py +1 -1
  5. {deme-2.0.3 → deme-2.0.5}/src/DEM/API.h +81 -10
  6. {deme-2.0.3 → deme-2.0.5}/src/DEM/APIPrivate.cpp +5 -3
  7. {deme-2.0.3 → deme-2.0.5}/src/DEM/APIPublic.cpp +64 -2
  8. {deme-2.0.3 → deme-2.0.5}/src/DEM/AuxClasses.cpp +18 -6
  9. {deme-2.0.3 → deme-2.0.5}/src/DEM/AuxClasses.h +13 -3
  10. {deme-2.0.3 → deme-2.0.5}/src/DEM/Defines.h +7 -7
  11. {deme-2.0.3 → deme-2.0.5}/src/DEM/PyDEME.cpp +101 -14
  12. {deme-2.0.3 → deme-2.0.5}/src/DEM/Structs.h +177 -7
  13. {deme-2.0.3 → deme-2.0.5}/src/DEM/dT.cpp +132 -58
  14. {deme-2.0.3 → deme-2.0.5}/src/DEM/dT.h +5 -1
  15. {deme-2.0.3 → deme-2.0.5}/src/DEM/kT.cpp +11 -11
  16. {deme-2.0.3 → deme-2.0.5}/src/DEM/kT.h +2 -1
  17. {deme-2.0.3 → deme-2.0.5}/src/demo/DEMdemo_ContactChain.cpp +1 -1
  18. {deme-2.0.3 → deme-2.0.5}/src/demo/DEMdemo_Indentation.cpp +18 -5
  19. {deme-2.0.3 → deme-2.0.5}/src/demo/DEMdemo_SingleSphereCollide.cpp +11 -2
  20. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMCalcForceKernels.cu +11 -9
  21. {deme-2.0.3 → deme-2.0.5}/CMakeLists.txt +0 -0
  22. {deme-2.0.3 → deme-2.0.5}/LICENSE.md +0 -0
  23. {deme-2.0.3 → deme-2.0.5}/MANIFEST.in +0 -0
  24. {deme-2.0.3 → deme-2.0.5}/cmake/CudaSupportedArchitectures.cmake +0 -0
  25. {deme-2.0.3 → deme-2.0.5}/cmake/CxxStdAutodetect.cmake +0 -0
  26. {deme-2.0.3 → deme-2.0.5}/cmake/DEMEConfig.cmake.in +0 -0
  27. {deme-2.0.3 → deme-2.0.5}/cmake/FixNinjaColors.cmake +0 -0
  28. {deme-2.0.3 → deme-2.0.5}/data/clumps/3_clump.csv +0 -0
  29. {deme-2.0.3 → deme-2.0.5}/data/clumps/6_clump.csv +0 -0
  30. {deme-2.0.3 → deme-2.0.5}/data/clumps/ContactChain_initial.csv +0 -0
  31. {deme-2.0.3 → deme-2.0.5}/data/clumps/TeddyBear.csv +0 -0
  32. {deme-2.0.3 → deme-2.0.5}/data/clumps/ViperWheelSimple.csv +0 -0
  33. {deme-2.0.3 → deme-2.0.5}/data/clumps/ellipsoid_2_1_1.csv +0 -0
  34. {deme-2.0.3 → deme-2.0.5}/data/clumps/molecule.csv +0 -0
  35. {deme-2.0.3 → deme-2.0.5}/data/clumps/spiky_sphere.csv +0 -0
  36. {deme-2.0.3 → deme-2.0.5}/data/clumps/triangular_flat.csv +0 -0
  37. {deme-2.0.3 → deme-2.0.5}/data/clumps/triangular_flat_6comp.csv +0 -0
  38. {deme-2.0.3 → deme-2.0.5}/data/mesh/GPBR_Vessel_Fine.obj +0 -0
  39. {deme-2.0.3 → deme-2.0.5}/data/mesh/cone.obj +0 -0
  40. {deme-2.0.3 → deme-2.0.5}/data/mesh/cube.obj +0 -0
  41. {deme-2.0.3 → deme-2.0.5}/data/mesh/cyl_r1_h2.obj +0 -0
  42. {deme-2.0.3 → deme-2.0.5}/data/mesh/excavator.obj +0 -0
  43. {deme-2.0.3 → deme-2.0.5}/data/mesh/funnel.obj +0 -0
  44. {deme-2.0.3 → deme-2.0.5}/data/mesh/funnel_left.obj +0 -0
  45. {deme-2.0.3 → deme-2.0.5}/data/mesh/hourglass.obj +0 -0
  46. {deme-2.0.3 → deme-2.0.5}/data/mesh/hourglass_cap.obj +0 -0
  47. {deme-2.0.3 → deme-2.0.5}/data/mesh/internal_mixer.obj +0 -0
  48. {deme-2.0.3 → deme-2.0.5}/data/mesh/plane_20by20.obj +0 -0
  49. {deme-2.0.3 → deme-2.0.5}/data/mesh/rover_wheels/curiosity_wheel.obj +0 -0
  50. {deme-2.0.3 → deme-2.0.5}/data/mesh/rover_wheels/curiosity_wheel_surface.obj +0 -0
  51. {deme-2.0.3 → deme-2.0.5}/data/mesh/rover_wheels/viper_wheel_right.obj +0 -0
  52. {deme-2.0.3 → deme-2.0.5}/data/mesh/silo.obj +0 -0
  53. {deme-2.0.3 → deme-2.0.5}/data/mesh/sphere.obj +0 -0
  54. {deme-2.0.3 → deme-2.0.5}/data/mesh/thin_plate.obj +0 -0
  55. {deme-2.0.3 → deme-2.0.5}/data/sim_data/example_cnt_pairs.csv +0 -0
  56. {deme-2.0.3 → deme-2.0.5}/deme.egg-info/SOURCES.txt +0 -0
  57. {deme-2.0.3 → deme-2.0.5}/deme.egg-info/dependency_links.txt +0 -0
  58. {deme-2.0.3 → deme-2.0.5}/deme.egg-info/not-zip-safe +0 -0
  59. {deme-2.0.3 → deme-2.0.5}/deme.egg-info/requires.txt +0 -0
  60. {deme-2.0.3 → deme-2.0.5}/deme.egg-info/top_level.txt +0 -0
  61. {deme-2.0.3 → deme-2.0.5}/packaging_instructions.txt +0 -0
  62. {deme-2.0.3 → deme-2.0.5}/pyproject.toml +0 -0
  63. {deme-2.0.3 → deme-2.0.5}/setup.cfg +0 -0
  64. {deme-2.0.3 → deme-2.0.5}/src/.format_all +0 -0
  65. {deme-2.0.3 → deme-2.0.5}/src/DEM/BdrsAndObjs.h +0 -0
  66. {deme-2.0.3 → deme-2.0.5}/src/DEM/CMakeLists.txt +0 -0
  67. {deme-2.0.3 → deme-2.0.5}/src/DEM/HostSideHelpers.hpp +0 -0
  68. {deme-2.0.3 → deme-2.0.5}/src/DEM/MeshUtils.cpp +0 -0
  69. {deme-2.0.3 → deme-2.0.5}/src/DEM/Models.h +0 -0
  70. {deme-2.0.3 → deme-2.0.5}/src/DEM/VariableTypes.h +0 -0
  71. {deme-2.0.3 → deme-2.0.5}/src/DEM/utils/Samplers.hpp +0 -0
  72. {deme-2.0.3 → deme-2.0.5}/src/algorithms/CMakeLists.txt +0 -0
  73. {deme-2.0.3 → deme-2.0.5}/src/algorithms/DEMCubContactDetection.cu +0 -0
  74. {deme-2.0.3 → deme-2.0.5}/src/algorithms/DEMCubForceCollection.cu +0 -0
  75. {deme-2.0.3 → deme-2.0.5}/src/algorithms/DEMCubInstantiations.cu +0 -0
  76. {deme-2.0.3 → deme-2.0.5}/src/algorithms/DEMCubWrappers.cu +0 -0
  77. {deme-2.0.3 → deme-2.0.5}/src/algorithms/DEMDynamicMisc.cu +0 -0
  78. {deme-2.0.3 → deme-2.0.5}/src/algorithms/DEMStaticDeviceSubroutines.h +0 -0
  79. {deme-2.0.3 → deme-2.0.5}/src/algorithms/DEMStaticDeviceUtilities.cuh +0 -0
  80. {deme-2.0.3 → deme-2.0.5}/src/core/ApiVersion.h.in +0 -0
  81. {deme-2.0.3 → deme-2.0.5}/src/core/CMakeLists.txt +0 -0
  82. {deme-2.0.3 → deme-2.0.5}/src/core/DebugInfo.cpp +0 -0
  83. {deme-2.0.3 → deme-2.0.5}/src/core/utils/CudaAllocator.hpp +0 -0
  84. {deme-2.0.3 → deme-2.0.5}/src/core/utils/DEMEPaths.cpp +0 -0
  85. {deme-2.0.3 → deme-2.0.5}/src/core/utils/DEMEPaths.h +0 -0
  86. {deme-2.0.3 → deme-2.0.5}/src/core/utils/DataMigrationHelper.hpp +0 -0
  87. {deme-2.0.3 → deme-2.0.5}/src/core/utils/GpuError.h +0 -0
  88. {deme-2.0.3 → deme-2.0.5}/src/core/utils/GpuManager.cpp +0 -0
  89. {deme-2.0.3 → deme-2.0.5}/src/core/utils/GpuManager.h +0 -0
  90. {deme-2.0.3 → deme-2.0.5}/src/core/utils/HeaderGenerator.h +0 -0
  91. {deme-2.0.3 → deme-2.0.5}/src/core/utils/JitHelper.cpp +0 -0
  92. {deme-2.0.3 → deme-2.0.5}/src/core/utils/JitHelper.h +0 -0
  93. {deme-2.0.3 → deme-2.0.5}/src/core/utils/ManagedMemory.hpp +0 -0
  94. {deme-2.0.3 → deme-2.0.5}/src/core/utils/RuntimeData.cpp.in +0 -0
  95. {deme-2.0.3 → deme-2.0.5}/src/core/utils/RuntimeData.h +0 -0
  96. {deme-2.0.3 → deme-2.0.5}/src/core/utils/ThreadManager.h +0 -0
  97. {deme-2.0.3 → deme-2.0.5}/src/core/utils/Timer.hpp +0 -0
  98. {deme-2.0.3 → deme-2.0.5}/src/core/utils/WavefrontMeshLoader.hpp +0 -0
  99. {deme-2.0.3 → deme-2.0.5}/src/core/utils/csv.hpp +0 -0
  100. {deme-2.0.3 → deme-2.0.5}/src/demo/CMakeLists.txt +0 -0
  101. {deme-2.0.3 → deme-2.0.5}/src/demo/DEMdemo_BallDrop.cpp +0 -0
  102. {deme-2.0.3 → deme-2.0.5}/src/demo/DEMdemo_BallDrop2D.cpp +0 -0
  103. {deme-2.0.3 → deme-2.0.5}/src/demo/DEMdemo_Centrifuge.cpp +0 -0
  104. {deme-2.0.3 → deme-2.0.5}/src/demo/DEMdemo_ConePenetration.cpp +0 -0
  105. {deme-2.0.3 → deme-2.0.5}/src/demo/DEMdemo_Electrostatic.cpp +0 -0
  106. {deme-2.0.3 → deme-2.0.5}/src/demo/DEMdemo_FlexibleMesh.cpp +0 -0
  107. {deme-2.0.3 → deme-2.0.5}/src/demo/DEMdemo_Fracture_Box.cpp +0 -0
  108. {deme-2.0.3 → deme-2.0.5}/src/demo/DEMdemo_GRCPrep_Part1.cpp +0 -0
  109. {deme-2.0.3 → deme-2.0.5}/src/demo/DEMdemo_GRCPrep_Part2.cpp +0 -0
  110. {deme-2.0.3 → deme-2.0.5}/src/demo/DEMdemo_GRCPrep_Part3.cpp +0 -0
  111. {deme-2.0.3 → deme-2.0.5}/src/demo/DEMdemo_GameOfLife.cpp +0 -0
  112. {deme-2.0.3 → deme-2.0.5}/src/demo/DEMdemo_Hopper_Sphere_Cylinder.cpp +0 -0
  113. {deme-2.0.3 → deme-2.0.5}/src/demo/DEMdemo_Mixer.cpp +0 -0
  114. {deme-2.0.3 → deme-2.0.5}/src/demo/DEMdemo_Plow.cpp +0 -0
  115. {deme-2.0.3 → deme-2.0.5}/src/demo/DEMdemo_Repose.cpp +0 -0
  116. {deme-2.0.3 → deme-2.0.5}/src/demo/DEMdemo_Repose2D.cpp +0 -0
  117. {deme-2.0.3 → deme-2.0.5}/src/demo/DEMdemo_RotatingDrum.cpp +0 -0
  118. {deme-2.0.3 → deme-2.0.5}/src/demo/DEMdemo_Shake.cpp +0 -0
  119. {deme-2.0.3 → deme-2.0.5}/src/demo/DEMdemo_Sieve.cpp +0 -0
  120. {deme-2.0.3 → deme-2.0.5}/src/demo/DEMdemo_SolarSystem.cpp +0 -0
  121. {deme-2.0.3 → deme-2.0.5}/src/demo/DEMdemo_TestPack.cpp +0 -0
  122. {deme-2.0.3 → deme-2.0.5}/src/demo/DEMdemo_WheelDP.cpp +0 -0
  123. {deme-2.0.3 → deme-2.0.5}/src/demo/DEMdemo_WheelDPSimplified.cpp +0 -0
  124. {deme-2.0.3 → deme-2.0.5}/src/demo/DEMdemo_WheelSlopeSlip.cpp +0 -0
  125. {deme-2.0.3 → deme-2.0.5}/src/demo/pyDEME_BallDrop.py +0 -0
  126. {deme-2.0.3 → deme-2.0.5}/src/demo/pyDEME_BallDrop2D.py +0 -0
  127. {deme-2.0.3 → deme-2.0.5}/src/demo/pyDEME_Centrifuge.py +0 -0
  128. {deme-2.0.3 → deme-2.0.5}/src/demo/pyDEME_ConePenetration.py +0 -0
  129. {deme-2.0.3 → deme-2.0.5}/src/demo/pyDEME_Electrostatic.py +0 -0
  130. {deme-2.0.3 → deme-2.0.5}/src/demo/pyDEME_FlexibleMesh.py +0 -0
  131. {deme-2.0.3 → deme-2.0.5}/src/demo/pyDEME_GRCPrep_Part1.py +0 -0
  132. {deme-2.0.3 → deme-2.0.5}/src/demo/pyDEME_GameOfLife.py +0 -0
  133. {deme-2.0.3 → deme-2.0.5}/src/demo/pyDEME_Mixer.py +0 -0
  134. {deme-2.0.3 → deme-2.0.5}/src/demo/pyDEME_WheelDPSimplified.py +0 -0
  135. {deme-2.0.3 → deme-2.0.5}/src/kernel/CUDAMathHelpers.cuh +0 -0
  136. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMBinSphereKernels.cu +0 -0
  137. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMBinTriangleKernels.cu +0 -0
  138. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMCollectForceKernels.cu +0 -0
  139. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMCollectForceKernels_Compact.cu +0 -0
  140. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMCollisionKernels.cu +0 -0
  141. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMContactKernels_SphereSphere.cu +0 -0
  142. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMContactKernels_SphereTriangle.cu +0 -0
  143. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMCustomizablePolicies/AnalyticalCompDefJitify.cu +0 -0
  144. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMCustomizablePolicies/ClumpCompAcqStratAllFlatten.cu +0 -0
  145. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMCustomizablePolicies/ClumpCompAcqStratAllJitify.cu +0 -0
  146. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMCustomizablePolicies/ClumpCompAcqStratPartialJitify.cu +0 -0
  147. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMCustomizablePolicies/ClumpCompDefJitify.cu +0 -0
  148. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMCustomizablePolicies/ContactInfoWriteBack.cu +0 -0
  149. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMCustomizablePolicies/ForceInKernelReductionStrat.cu +0 -0
  150. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMCustomizablePolicies/FrictionlessHertzianForceModel.cu +0 -0
  151. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMCustomizablePolicies/FullHertzianForceModel.cu +0 -0
  152. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMCustomizablePolicies/IntegrationVelPassOnCenteredDiff.cu +0 -0
  153. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMCustomizablePolicies/IntegrationVelPassOnExtendedTaylor.cu +0 -0
  154. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMCustomizablePolicies/IntegrationVelPassOnForwardEuler.cu +0 -0
  155. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMCustomizablePolicies/MOIAcqStratFlatten.cu +0 -0
  156. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMCustomizablePolicies/MOIAcqStratJitify.cu +0 -0
  157. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMCustomizablePolicies/MOIDefJitify.cu +0 -0
  158. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMCustomizablePolicies/MassAcqStratFlatten.cu +0 -0
  159. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMCustomizablePolicies/MassAcqStratJitify.cu +0 -0
  160. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMCustomizablePolicies/MassDefJitify.cu +0 -0
  161. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMHelperKernels.cuh +0 -0
  162. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMHistoryMappingKernels.cu +0 -0
  163. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMIntegrationKernels.cu +0 -0
  164. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMMiscKernels.cu +0 -0
  165. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMModeratorKernels.cu +0 -0
  166. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMOwnerQueryKernels.cu +0 -0
  167. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMPrepForceKernels.cu +0 -0
  168. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMSphereQueryKernels.cu +0 -0
  169. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMTriangleBoxIntersect.cu +0 -0
  170. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMUserScripts/ForceModel2D.cu +0 -0
  171. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMUserScripts/ForceModelMooring.cu +0 -0
  172. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMUserScripts/ForceModelMooringPosition.cu +0 -0
  173. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMUserScripts/ForceModelWithCohesion.cu +0 -0
  174. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMUserScripts/ForceModelWithElectrostatic.cu +0 -0
  175. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMUserScripts/ForceModelWithFractureModel.cu +0 -0
  176. {deme-2.0.3 → deme-2.0.5}/src/kernel/DEMUserScripts/ForceModelWithGravity.cu +0 -0
  177. {deme-2.0.3 → deme-2.0.5}/src/kernel/hello.cu +0 -0
  178. {deme-2.0.3 → deme-2.0.5}/thirdparty/jitify/.clang-format +0 -0
  179. {deme-2.0.3 → deme-2.0.5}/thirdparty/jitify/.git +0 -0
  180. {deme-2.0.3 → deme-2.0.5}/thirdparty/jitify/.gitignore +0 -0
  181. {deme-2.0.3 → deme-2.0.5}/thirdparty/jitify/Doxyfile +0 -0
  182. {deme-2.0.3 → deme-2.0.5}/thirdparty/jitify/LICENSE +0 -0
  183. {deme-2.0.3 → deme-2.0.5}/thirdparty/jitify/Makefile +0 -0
  184. {deme-2.0.3 → deme-2.0.5}/thirdparty/jitify/README.md +0 -0
  185. {deme-2.0.3 → deme-2.0.5}/thirdparty/jitify/example_headers/class_arg_kernel.cuh +0 -0
  186. {deme-2.0.3 → deme-2.0.5}/thirdparty/jitify/example_headers/constant_header.cuh +0 -0
  187. {deme-2.0.3 → deme-2.0.5}/thirdparty/jitify/example_headers/my_header1.cuh +0 -0
  188. {deme-2.0.3 → deme-2.0.5}/thirdparty/jitify/example_headers/my_header2.cuh +0 -0
  189. {deme-2.0.3 → deme-2.0.5}/thirdparty/jitify/example_headers/my_header3.cuh +0 -0
  190. {deme-2.0.3 → deme-2.0.5}/thirdparty/jitify/jitify.hpp +0 -0
  191. {deme-2.0.3 → deme-2.0.5}/thirdparty/jitify/jitify_example.cpp +0 -0
  192. {deme-2.0.3 → deme-2.0.5}/thirdparty/jitify/jitify_test.cu +0 -0
  193. {deme-2.0.3 → deme-2.0.5}/thirdparty/jitify/nvrtc_cli.cpp +0 -0
  194. {deme-2.0.3 → deme-2.0.5}/thirdparty/jitify/nvrtc_cli_test.sh +0 -0
  195. {deme-2.0.3 → deme-2.0.5}/thirdparty/jitify/stringify.cpp +0 -0
  196. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/.appveyor.yml +0 -0
  197. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/.clang-format +0 -0
  198. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/.clang-tidy +0 -0
  199. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/.cmake-format.yaml +0 -0
  200. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/.codespell-ignore-lines +0 -0
  201. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/.git +0 -0
  202. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/.gitattributes +0 -0
  203. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/.github/CODEOWNERS +0 -0
  204. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/.github/CONTRIBUTING.md +0 -0
  205. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  206. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/.github/ISSUE_TEMPLATE/config.yml +0 -0
  207. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/.github/dependabot.yml +0 -0
  208. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/.github/labeler.yml +0 -0
  209. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/.github/labeler_merged.yml +0 -0
  210. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/.github/matchers/pylint.json +0 -0
  211. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/.github/pull_request_template.md +0 -0
  212. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/.github/workflows/ci.yml +0 -0
  213. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/.github/workflows/configure.yml +0 -0
  214. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/.github/workflows/format.yml +0 -0
  215. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/.github/workflows/labeler.yml +0 -0
  216. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/.github/workflows/pip.yml +0 -0
  217. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/.github/workflows/upstream.yml +0 -0
  218. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/.gitignore +0 -0
  219. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/.pre-commit-config.yaml +0 -0
  220. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/.readthedocs.yml +0 -0
  221. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/CMakeLists.txt +0 -0
  222. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/LICENSE +0 -0
  223. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/MANIFEST.in +0 -0
  224. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/README.rst +0 -0
  225. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/Doxyfile +0 -0
  226. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/Makefile +0 -0
  227. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/_static/css/custom.css +0 -0
  228. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/advanced/cast/chrono.rst +0 -0
  229. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/advanced/cast/custom.rst +0 -0
  230. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/advanced/cast/eigen.rst +0 -0
  231. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/advanced/cast/functional.rst +0 -0
  232. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/advanced/cast/index.rst +0 -0
  233. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/advanced/cast/overview.rst +0 -0
  234. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/advanced/cast/stl.rst +0 -0
  235. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/advanced/cast/strings.rst +0 -0
  236. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/advanced/classes.rst +0 -0
  237. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/advanced/embedding.rst +0 -0
  238. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/advanced/exceptions.rst +0 -0
  239. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/advanced/functions.rst +0 -0
  240. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/advanced/misc.rst +0 -0
  241. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/advanced/pycpp/index.rst +0 -0
  242. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/advanced/pycpp/numpy.rst +0 -0
  243. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/advanced/pycpp/object.rst +0 -0
  244. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/advanced/pycpp/utilities.rst +0 -0
  245. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/advanced/smart_ptrs.rst +0 -0
  246. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/basics.rst +0 -0
  247. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/benchmark.py +0 -0
  248. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/benchmark.rst +0 -0
  249. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/changelog.rst +0 -0
  250. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/classes.rst +0 -0
  251. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/cmake/index.rst +0 -0
  252. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/compiling.rst +0 -0
  253. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/conf.py +0 -0
  254. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/faq.rst +0 -0
  255. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/index.rst +0 -0
  256. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/installing.rst +0 -0
  257. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/limitations.rst +0 -0
  258. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/pybind11-logo.png +0 -0
  259. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/pybind11_vs_boost_python1.png +0 -0
  260. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/pybind11_vs_boost_python1.svg +0 -0
  261. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/pybind11_vs_boost_python2.png +0 -0
  262. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/pybind11_vs_boost_python2.svg +0 -0
  263. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/reference.rst +0 -0
  264. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/release.rst +0 -0
  265. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/requirements.txt +0 -0
  266. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/docs/upgrade.rst +0 -0
  267. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/include/pybind11/attr.h +0 -0
  268. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/include/pybind11/buffer_info.h +0 -0
  269. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/include/pybind11/cast.h +0 -0
  270. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/include/pybind11/chrono.h +0 -0
  271. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/include/pybind11/common.h +0 -0
  272. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/include/pybind11/complex.h +0 -0
  273. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/include/pybind11/detail/class.h +0 -0
  274. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/include/pybind11/detail/common.h +0 -0
  275. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/include/pybind11/detail/descr.h +0 -0
  276. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/include/pybind11/detail/init.h +0 -0
  277. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/include/pybind11/detail/internals.h +0 -0
  278. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/include/pybind11/detail/type_caster_base.h +0 -0
  279. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/include/pybind11/detail/typeid.h +0 -0
  280. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/include/pybind11/eigen/matrix.h +0 -0
  281. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/include/pybind11/eigen/tensor.h +0 -0
  282. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/include/pybind11/eigen.h +0 -0
  283. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/include/pybind11/embed.h +0 -0
  284. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/include/pybind11/eval.h +0 -0
  285. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/include/pybind11/functional.h +0 -0
  286. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/include/pybind11/gil.h +0 -0
  287. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/include/pybind11/iostream.h +0 -0
  288. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/include/pybind11/numpy.h +0 -0
  289. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/include/pybind11/operators.h +0 -0
  290. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/include/pybind11/options.h +0 -0
  291. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/include/pybind11/pybind11.h +0 -0
  292. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/include/pybind11/pytypes.h +0 -0
  293. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/include/pybind11/stl/filesystem.h +0 -0
  294. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/include/pybind11/stl.h +0 -0
  295. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/include/pybind11/stl_bind.h +0 -0
  296. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/noxfile.py +0 -0
  297. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/pybind11/__init__.py +0 -0
  298. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/pybind11/__main__.py +0 -0
  299. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/pybind11/_version.py +0 -0
  300. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/pybind11/commands.py +0 -0
  301. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/pybind11/py.typed +0 -0
  302. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/pybind11/setup_helpers.py +0 -0
  303. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/pyproject.toml +0 -0
  304. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/setup.cfg +0 -0
  305. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/setup.py +0 -0
  306. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/CMakeLists.txt +0 -0
  307. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/conftest.py +0 -0
  308. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/constructor_stats.h +0 -0
  309. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/cross_module_gil_utils.cpp +0 -0
  310. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/cross_module_interleaved_error_already_set.cpp +0 -0
  311. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/eigen_tensor_avoid_stl_array.cpp +0 -0
  312. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/env.py +0 -0
  313. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/extra_python_package/pytest.ini +0 -0
  314. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/extra_python_package/test_files.py +0 -0
  315. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/extra_setuptools/pytest.ini +0 -0
  316. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/extra_setuptools/test_setuphelper.py +0 -0
  317. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/local_bindings.h +0 -0
  318. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/object.h +0 -0
  319. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/pybind11_cross_module_tests.cpp +0 -0
  320. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/pybind11_tests.cpp +0 -0
  321. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/pybind11_tests.h +0 -0
  322. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/pytest.ini +0 -0
  323. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/requirements.txt +0 -0
  324. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_async.cpp +0 -0
  325. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_async.py +0 -0
  326. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_buffers.cpp +0 -0
  327. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_buffers.py +0 -0
  328. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_builtin_casters.cpp +0 -0
  329. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_builtin_casters.py +0 -0
  330. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_call_policies.cpp +0 -0
  331. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_call_policies.py +0 -0
  332. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_callbacks.cpp +0 -0
  333. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_callbacks.py +0 -0
  334. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_chrono.cpp +0 -0
  335. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_chrono.py +0 -0
  336. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_class.cpp +0 -0
  337. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_class.py +0 -0
  338. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_cmake_build/CMakeLists.txt +0 -0
  339. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_cmake_build/embed.cpp +0 -0
  340. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_cmake_build/installed_embed/CMakeLists.txt +0 -0
  341. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_cmake_build/installed_function/CMakeLists.txt +0 -0
  342. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_cmake_build/installed_target/CMakeLists.txt +0 -0
  343. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_cmake_build/main.cpp +0 -0
  344. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_cmake_build/subdirectory_embed/CMakeLists.txt +0 -0
  345. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_cmake_build/subdirectory_function/CMakeLists.txt +0 -0
  346. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_cmake_build/subdirectory_target/CMakeLists.txt +0 -0
  347. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_cmake_build/test.py +0 -0
  348. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_const_name.cpp +0 -0
  349. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_const_name.py +0 -0
  350. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_constants_and_functions.cpp +0 -0
  351. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_constants_and_functions.py +0 -0
  352. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_copy_move.cpp +0 -0
  353. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_copy_move.py +0 -0
  354. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_custom_type_casters.cpp +0 -0
  355. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_custom_type_casters.py +0 -0
  356. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_custom_type_setup.cpp +0 -0
  357. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_custom_type_setup.py +0 -0
  358. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_docstring_options.cpp +0 -0
  359. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_docstring_options.py +0 -0
  360. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_eigen_matrix.cpp +0 -0
  361. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_eigen_matrix.py +0 -0
  362. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_eigen_tensor.cpp +0 -0
  363. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_eigen_tensor.inl +0 -0
  364. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_eigen_tensor.py +0 -0
  365. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_embed/CMakeLists.txt +0 -0
  366. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_embed/catch.cpp +0 -0
  367. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_embed/external_module.cpp +0 -0
  368. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_embed/test_interpreter.cpp +0 -0
  369. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_embed/test_interpreter.py +0 -0
  370. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_embed/test_trampoline.py +0 -0
  371. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_enum.cpp +0 -0
  372. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_enum.py +0 -0
  373. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_eval.cpp +0 -0
  374. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_eval.py +0 -0
  375. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_eval_call.py +0 -0
  376. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_exceptions.cpp +0 -0
  377. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_exceptions.h +0 -0
  378. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_exceptions.py +0 -0
  379. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_factory_constructors.cpp +0 -0
  380. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_factory_constructors.py +0 -0
  381. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_gil_scoped.cpp +0 -0
  382. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_gil_scoped.py +0 -0
  383. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_iostream.cpp +0 -0
  384. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_iostream.py +0 -0
  385. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_kwargs_and_defaults.cpp +0 -0
  386. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_kwargs_and_defaults.py +0 -0
  387. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_local_bindings.cpp +0 -0
  388. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_local_bindings.py +0 -0
  389. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_methods_and_attributes.cpp +0 -0
  390. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_methods_and_attributes.py +0 -0
  391. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_modules.cpp +0 -0
  392. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_modules.py +0 -0
  393. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_multiple_inheritance.cpp +0 -0
  394. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_multiple_inheritance.py +0 -0
  395. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_numpy_array.cpp +0 -0
  396. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_numpy_array.py +0 -0
  397. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_numpy_dtypes.cpp +0 -0
  398. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_numpy_dtypes.py +0 -0
  399. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_numpy_vectorize.cpp +0 -0
  400. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_numpy_vectorize.py +0 -0
  401. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_opaque_types.cpp +0 -0
  402. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_opaque_types.py +0 -0
  403. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_operator_overloading.cpp +0 -0
  404. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_operator_overloading.py +0 -0
  405. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_pickling.cpp +0 -0
  406. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_pickling.py +0 -0
  407. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_pytypes.cpp +0 -0
  408. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_pytypes.py +0 -0
  409. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_sequences_and_iterators.cpp +0 -0
  410. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_sequences_and_iterators.py +0 -0
  411. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_smart_ptr.cpp +0 -0
  412. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_smart_ptr.py +0 -0
  413. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_stl.cpp +0 -0
  414. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_stl.py +0 -0
  415. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_stl_binders.cpp +0 -0
  416. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_stl_binders.py +0 -0
  417. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_tagbased_polymorphic.cpp +0 -0
  418. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_tagbased_polymorphic.py +0 -0
  419. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_thread.cpp +0 -0
  420. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_thread.py +0 -0
  421. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_union.cpp +0 -0
  422. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_union.py +0 -0
  423. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_virtual_functions.cpp +0 -0
  424. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/test_virtual_functions.py +0 -0
  425. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/valgrind-numpy-scipy.supp +0 -0
  426. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tests/valgrind-python.supp +0 -0
  427. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tools/FindCatch.cmake +0 -0
  428. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tools/FindEigen3.cmake +0 -0
  429. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tools/FindPythonLibsNew.cmake +0 -0
  430. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tools/JoinPaths.cmake +0 -0
  431. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tools/check-style.sh +0 -0
  432. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tools/cmake_uninstall.cmake.in +0 -0
  433. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tools/codespell_ignore_lines_from_errors.py +0 -0
  434. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tools/libsize.py +0 -0
  435. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tools/make_changelog.py +0 -0
  436. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tools/pybind11.pc.in +0 -0
  437. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tools/pybind11Common.cmake +0 -0
  438. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tools/pybind11Config.cmake.in +0 -0
  439. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tools/pybind11NewTools.cmake +0 -0
  440. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tools/pybind11Tools.cmake +0 -0
  441. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tools/pyproject.toml +0 -0
  442. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tools/setup_global.py.in +0 -0
  443. {deme-2.0.3 → deme-2.0.5}/thirdparty/pybind11/tools/setup_main.py.in +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: deme
3
- Version: 2.0.3
3
+ Version: 2.0.5
4
4
  Summary: PyBind Wrapper Library for DEM-Engine
5
5
  Home-page: UNKNOWN
6
6
  Author: Ruochun Zhang
@@ -85,6 +85,8 @@ pip3 install DEME
85
85
 
86
86
  Then [Python scripts](https://github.com/projectchrono/DEM-Engine/tree/pyDEME_demo/src/demo) can be executed in this environment. To understand the content of each Python demo, refer to the explanations of the C++ demos with the same names in <a href="#examples">Numerical examples</a> section.
87
87
 
88
+ If you use _pyDEME_ in conjunction with PyChrono, you should `import pyDEME` first, then PyChrono.
89
+
88
90
  <h2 id="compilation">Compilation</h2>
89
91
 
90
92
  You can also build C++ _DEME_ from source. It allows for potentially more performance and more tailoring.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: deme
3
- Version: 2.0.3
3
+ Version: 2.0.5
4
4
  Summary: PyBind Wrapper Library for DEM-Engine
5
5
  Home-page: UNKNOWN
6
6
  Author: Ruochun Zhang
@@ -152,7 +152,7 @@ class CMakeBuild(build_ext):
152
152
  # logic and declaration, and simpler if you include description/version in a file.
153
153
  setup(
154
154
  name="deme",
155
- version="2.0.3",
155
+ version="2.0.5",
156
156
  author="Ruochun Zhang",
157
157
  author_email="ruochunz@gmail.com",
158
158
  description="PyBind Wrapper Library for DEM-Engine",
@@ -88,8 +88,11 @@ class DEMSolver {
88
88
  /// Set the initial time step size. If using constant step size, then this will be used throughout; otherwise, the
89
89
  /// actual step size depends on the variable step strategy.
90
90
  void SetInitTimeStep(double ts_size) { m_ts_size = ts_size; }
91
- /// Return the number of clumps that are currently in the simulation.
91
+ /// Return the number of clumps that are currently in the simulation. Must be used after initialization.
92
92
  size_t GetNumClumps() const { return nOwnerClumps; }
93
+ /// Return the total number of owners (clumps + meshes + analytical objects) that are currently in the simulation.
94
+ /// Must be used after initialization.
95
+ size_t GetNumOwners() const { return nOwnerBodies; }
93
96
  /// @brief Get the number of kT-reported potential contact pairs.
94
97
  /// @return Number of potential contact pairs.
95
98
  size_t GetNumContacts() const { return dT->getNumContacts(); }
@@ -125,6 +128,10 @@ class DEMSolver {
125
128
  /// Get the jitification string substitution laundary list. It is needed by some of this simulation system's friend
126
129
  /// classes.
127
130
  std::unordered_map<std::string, std::string> GetJitStringSubs() const { return m_subs; }
131
+ /// Get current jitification options. It is needed by some of this simulation system's friend classes.
132
+ std::vector<std::string> GetJitifyOptions() const { return m_jitify_options; }
133
+ /// Set the jitification options. It is only needed by advanced users.
134
+ void SetJitifyOptions(const std::vector<std::string>& options) { m_jitify_options = options; }
128
135
 
129
136
  /// Explicitly instruct the bin size (for contact detection) that the solver should use.
130
137
  void SetInitBinSize(double bin_size) {
@@ -413,7 +420,7 @@ class DEMSolver {
413
420
 
414
421
  /// @brief Get the clumps that are in contact with this owner as a vector.
415
422
  /// @details No multi-owner bulk version. This is due to efficiency concerns. If getting multiple owners' contacting
416
- /// clumps is needed, use family-based GetClumpContacts method, then the owner ID list-based c method if you further
423
+ /// clumps is needed, use family-based GetContacts method, then the owner ID list-based c method if you further
417
424
  /// need the contact forces information.
418
425
  /// @param ownerID The ID of the owner that is being queried.
419
426
  /// @return Clump owner IDs in contact with this owner.
@@ -487,18 +494,25 @@ class DEMSolver {
487
494
  /// @return A vector of float3 representing the global coordinates of the mesh nodes.
488
495
  std::vector<float3> GetMeshNodesGlobal(bodyID_t ownerID);
489
496
 
490
- /// @brief Get all clump--clump contacts in the simulation system.
497
+ /// @brief Get all clump--clump contact ID pairs in the simulation system. Note all GetContact-like methods reports
498
+ /// potential contacts (not necessarily confirmed contacts), meaning they are similar to what
499
+ /// WriteContactFileIncludingPotentialPairs does, not what WriteContactFile does.
500
+ /// @details Do not call this method with high frequency, as it is not efficient.
491
501
  /// @return A sorted (based on contact body A's owner ID) vector of contact pairs. First is the owner ID of contact
492
502
  /// body A, and Second is that of contact body B.
493
503
  std::vector<std::pair<bodyID_t, bodyID_t>> GetClumpContacts() const;
494
-
495
- /// @brief Get all clump--clump contacts in the simulation system.
504
+ /// @brief Get all clump--clump contact ID pairs in the simulation system. Note all GetContact-like methods reports
505
+ /// potential contacts (not necessarily confirmed contacts), meaning they are similar to what
506
+ /// WriteContactFileIncludingPotentialPairs does, not what WriteContactFile does.
507
+ /// @details Do not call this method with high frequency, as it is not efficient.
496
508
  /// @param family_to_include Contacts that involve a body in a family not listed in this argument are ignored.
497
509
  /// @return A sorted (based on contact body A's owner ID) vector of contact pairs. First is the owner ID of contact
498
510
  /// body A, and Second is that of contact body B.
499
511
  std::vector<std::pair<bodyID_t, bodyID_t>> GetClumpContacts(const std::set<family_t>& family_to_include) const;
500
-
501
- /// @brief Get all clump--clump contacts in the simulation system.
512
+ /// @brief Get all clump--clump contact ID pairs in the simulation system. Note all GetContact-like methods reports
513
+ /// potential contacts (not necessarily confirmed contacts), meaning they are similar to what
514
+ /// WriteContactFileIncludingPotentialPairs does, not what WriteContactFile does.
515
+ /// @details Do not call this method with high frequency, as it is not efficient.
502
516
  /// @param family_pair Functions returns a vector of contact body family number pairs. First is the family number of
503
517
  /// contact body A, and Second is that of contact body B.
504
518
  /// @return A sorted (based on contact body A's owner ID) vector of contact pairs. First is the owner ID of contact
@@ -506,6 +520,51 @@ class DEMSolver {
506
520
  std::vector<std::pair<bodyID_t, bodyID_t>> GetClumpContacts(
507
521
  std::vector<std::pair<family_t, family_t>>& family_pair) const;
508
522
 
523
+ /// @brief Get all contact ID pairs in the simulation system. Note all GetContact-like methods reports potential
524
+ /// contacts (not necessarily confirmed contacts), meaning they are similar to what
525
+ /// WriteContactFileIncludingPotentialPairs does, not what WriteContactFile does.
526
+ /// @details Do not call this method with high frequency, as it is not efficient.
527
+ /// @return A sorted (based on contact body A's owner ID) vector of contact pairs. First is the owner ID of contact
528
+ /// body A, and Second is that of contact body B.
529
+ std::vector<std::pair<bodyID_t, bodyID_t>> GetContacts() const;
530
+ /// @brief Get all contact ID pairs in the simulation system. Note all GetContact-like methods reports potential
531
+ /// contacts (not necessarily confirmed contacts), meaning they are similar to what
532
+ /// WriteContactFileIncludingPotentialPairs does, not what WriteContactFile does.
533
+ /// @details Do not call this method with high frequency, as it is not efficient.
534
+ /// @param family_to_include Contacts that involve a body in a family not listed in this argument are ignored.
535
+ /// @return A sorted (based on contact body A's owner ID) vector of contact pairs. First is the owner ID of contact
536
+ /// body A, and Second is that of contact body B.
537
+ std::vector<std::pair<bodyID_t, bodyID_t>> GetContacts(const std::set<family_t>& family_to_include) const;
538
+ /// @brief Get all contact ID pairs in the simulation system. Note all GetContact-like methods reports potential
539
+ /// contacts (not necessarily confirmed contacts), meaning they are similar to what
540
+ /// WriteContactFileIncludingPotentialPairs does, not what WriteContactFile does.
541
+ /// @details Do not call this method with high frequency, as it is not efficient.
542
+ /// @param family_pair Functions returns a vector of contact body family number pairs. First is the family number of
543
+ /// contact body A, and Second is that of contact body B.
544
+ /// @return A sorted (based on contact body A's owner ID) vector of contact pairs. First is the owner ID of contact
545
+ /// body A, and Second is that of contact body B.
546
+ std::vector<std::pair<bodyID_t, bodyID_t>> GetContacts(
547
+ std::vector<std::pair<family_t, family_t>>& family_pair) const;
548
+
549
+ /// @brief Get all contact pairs' detailed information (actual content based on the setting with
550
+ /// SetContactOutputContent; default are owner IDs, contact point location, contact force, and associated wildcard
551
+ /// values) in the simulation system. Note all GetContact-like methods reports potential contacts (not necessarily
552
+ /// confirmed contacts), meaning they are similar to what WriteContactFileIncludingPotentialPairs does, not what
553
+ /// WriteContactFile does.
554
+ /// @details Do not call this method with high frequency, as it is not efficient.
555
+ /// @param force_thres Only contacts with force larger than this value are returned. Setting it to a small positive
556
+ /// number to, instead of getting all potential contacts, only get the ones that are currently confirmed to generate
557
+ /// force.
558
+ /// @return A map that may have the following keys: "ContactType", "Point", "AOwner", "BOwner", "AOwnerFamily",
559
+ /// "BOwnerFamily", "Force", "Torque", "Normal" and wildcard names, each corresponding to a vector of values. The
560
+ /// "ContactType" is a vector of strings, each indicating the type of contact (e.g., "sphere-sphere",
561
+ /// "sphere-triangle", etc.). The "Point" is a vector of float3s, each indicating the contact point location in
562
+ /// global coordinates. The "AOwner" and "BOwner" are vectors of body IDs for the two bodies in contact. The "Force"
563
+ /// is a vector of float3s, each indicating the contact force at the contact point. The "Torque" is a vector of
564
+ /// float3s, each indicating the torque at the contact point. The "Normal" is a vector of float3s, each indicating
565
+ /// the normal direction at the contact point.
566
+ std::shared_ptr<ContactInfoContainer> GetContactDetailedInfo(float force_thres = -1.0) const;
567
+
509
568
  /// @brief Get the host memory usage (in bytes) on dT.
510
569
  /// @return Number of bytes.
511
570
  size_t GetHostMemUsageDynamic() const { return dT->estimateHostMemUsage(); }
@@ -1046,7 +1105,17 @@ class DEMSolver {
1046
1105
  /// @param force_thres Forces with magnitude smaller than this amount will not be outputted.
1047
1106
  void WriteContactFile(const std::string& outfilename, float force_thres = DEME_TINY_FLOAT) const;
1048
1107
  void WriteContactFile(const std::filesystem::path& outfilename) const { WriteContactFile(outfilename.string()); }
1049
- /// Write the current status of all meshes to a file
1108
+ /// @brief Write all contact pairs kT-supplied to a file, thus including the potential ones (those are not yet in
1109
+ /// contact, or recently used to be in contact).
1110
+ /// @details The outputted torque using this method is in global, rather than each object's local coordinate system.
1111
+ /// @param outfilename Output filename.
1112
+ void WriteContactFileIncludingPotentialPairs(const std::string& outfilename) const {
1113
+ WriteContactFile(outfilename, -1.0);
1114
+ }
1115
+ void WriteContactFileIncludingPotentialPairs(const std::filesystem::path& outfilename) const {
1116
+ WriteContactFileIncludingPotentialPairs(outfilename.string());
1117
+ }
1118
+ /// Write the current status of all meshes to a file.
1050
1119
  void WriteMeshFile(const std::string& outfilename) const;
1051
1120
  void WriteMeshFile(const std::filesystem::path& outfilename) const { WriteMeshFile(outfilename.string()); }
1052
1121
 
@@ -1345,8 +1414,8 @@ class DEMSolver {
1345
1414
  // The output file format for contact pairs
1346
1415
  OUTPUT_FORMAT m_cnt_out_format = OUTPUT_FORMAT::CSV;
1347
1416
  // The output file content for contact pairs
1348
- unsigned int m_cnt_out_content = CNT_OUTPUT_CONTENT::GEO_ID | CNT_OUTPUT_CONTENT::FORCE |
1349
- CNT_OUTPUT_CONTENT::DEME_POINT | CNT_OUTPUT_CONTENT::CNT_WILDCARD;
1417
+ unsigned int m_cnt_out_content = CNT_OUTPUT_CONTENT::OWNER | CNT_OUTPUT_CONTENT::FORCE |
1418
+ CNT_OUTPUT_CONTENT::CNT_POINT | CNT_OUTPUT_CONTENT::CNT_WILDCARD;
1350
1419
  // The output file format for meshes
1351
1420
  MESH_FORMAT m_mesh_out_format = MESH_FORMAT::VTK;
1352
1421
  // If the solver should output wildcards to file
@@ -1577,6 +1646,8 @@ class DEMSolver {
1577
1646
 
1578
1647
  // A big fat tab for all string replacement that the JIT compiler needs to consider
1579
1648
  std::unordered_map<std::string, std::string> m_subs;
1649
+ // jitify's compilation options
1650
+ std::vector<std::string> m_jitify_options = DEME_JITIFY_DEFAULT_OPTIONS;
1580
1651
 
1581
1652
  // A map that records the numbering for user-defined owner wildcards
1582
1653
  std::unordered_map<std::string, unsigned int> m_owner_wc_num;
@@ -306,12 +306,12 @@ void DEMSolver::jitifyKernels() {
306
306
  // Jitify may require a defined device to derive the arch
307
307
  std::thread kT_build([&]() {
308
308
  DEME_GPU_CALL(cudaSetDevice(kT->streamInfo.device));
309
- kT->jitifyKernels(m_subs);
309
+ kT->jitifyKernels(m_subs, m_jitify_options);
310
310
  });
311
311
 
312
312
  std::thread dT_build([&]() {
313
313
  DEME_GPU_CALL(cudaSetDevice(dT->streamInfo.device));
314
- dT->jitifyKernels(m_subs);
314
+ dT->jitifyKernels(m_subs, m_jitify_options);
315
315
 
316
316
  // Now, inspectors need to be jitified too... but the current design jitify inspector kernels at the first time
317
317
  // they are used. for (auto& insp : m_inspectors) {
@@ -321,7 +321,7 @@ void DEMSolver::jitifyKernels() {
321
321
  // Solver system's own max vel inspector should be init-ed. Don't bother init-ing it while using, because it is
322
322
  // called at high frequency, let's save an if check. Forced initialization (since doing it before system
323
323
  // completes init).
324
- m_approx_max_vel_func->Initialize(m_subs, true);
324
+ m_approx_max_vel_func->Initialize(m_subs, m_jitify_options, true);
325
325
  dT->approxMaxVelFunc = m_approx_max_vel_func;
326
326
  });
327
327
  kT_build.join();
@@ -1379,6 +1379,7 @@ inline void DEMSolver::equipForceModel(std::unordered_map<std::string, std::stri
1379
1379
  std::set<std::string> added_owner_wildcards, added_geo_wildcards;
1380
1380
  // Analyze this model... what does it require?
1381
1381
  std::string model = m_force_model[DEFAULT_FORCE_MODEL_NAME]->m_force_model;
1382
+ std::string model_prerequisites = m_force_model[DEFAULT_FORCE_MODEL_NAME]->m_model_prerequisites;
1382
1383
  const std::set<std::string> contact_wildcard_names = m_force_model[DEFAULT_FORCE_MODEL_NAME]->m_contact_wildcards;
1383
1384
  const std::set<std::string> owner_wildcard_names = m_force_model[DEFAULT_FORCE_MODEL_NAME]->m_owner_wildcards;
1384
1385
  const std::set<std::string> geo_wildcard_names = m_force_model[DEFAULT_FORCE_MODEL_NAME]->m_geo_wildcards;
@@ -1539,6 +1540,7 @@ inline void DEMSolver::equipForceModel(std::unordered_map<std::string, std::stri
1539
1540
  contact_info_write_strat = compact_code(contact_info_write_strat);
1540
1541
  }
1541
1542
  strMap["_DEMForceModel_"] = model;
1543
+ strMap["_forceModelPrerequisites_;"] = model_prerequisites;
1542
1544
  strMap["_forceModelIngredientDefinition_"] = ingredient_definition;
1543
1545
  strMap["_forceModelIngredientAcqForA_"] = ingredient_acquisition_A;
1544
1546
  strMap["_forceModelIngredientAcqForB_"] = ingredient_acquisition_B;
@@ -213,7 +213,7 @@ void DEMSolver::SetContactOutputContent(const std::vector<std::string>& content)
213
213
  m_cnt_out_content = m_cnt_out_content | CNT_OUTPUT_CONTENT::FORCE;
214
214
  break;
215
215
  case ("POINT"_):
216
- m_cnt_out_content = m_cnt_out_content | CNT_OUTPUT_CONTENT::DEME_POINT;
216
+ m_cnt_out_content = m_cnt_out_content | CNT_OUTPUT_CONTENT::CNT_POINT;
217
217
  break;
218
218
  case ("COMPONENT"_):
219
219
  m_cnt_out_content = m_cnt_out_content | CNT_OUTPUT_CONTENT::COMPONENT;
@@ -399,6 +399,68 @@ std::vector<std::pair<bodyID_t, bodyID_t>> DEMSolver::GetClumpContacts(
399
399
  return out_pair;
400
400
  }
401
401
 
402
+ std::vector<std::pair<bodyID_t, bodyID_t>> DEMSolver::GetContacts() const {
403
+ std::vector<bodyID_t> idA_tmp, idB_tmp;
404
+ std::vector<family_t> famA_tmp, famB_tmp;
405
+ std::vector<contact_t> cnt_type_tmp;
406
+ // Getting sphere contacts is enough
407
+ getContacts_impl(idA_tmp, idB_tmp, cnt_type_tmp, famA_tmp, famB_tmp, [](contact_t type) { return true; });
408
+ auto idx = hostSortIndices(idA_tmp);
409
+ std::vector<std::pair<bodyID_t, bodyID_t>> out_pair(idx.size());
410
+ for (size_t i = 0; i < idx.size(); i++) {
411
+ out_pair[i] = std::pair<bodyID_t, bodyID_t>(idA_tmp[idx[i]], idB_tmp[idx[i]]);
412
+ }
413
+ return out_pair;
414
+ }
415
+
416
+ std::vector<std::pair<bodyID_t, bodyID_t>> DEMSolver::GetContacts(const std::set<family_t>& family_to_include) const {
417
+ std::vector<bodyID_t> idA_tmp, idB_tmp;
418
+ std::vector<family_t> famA_tmp, famB_tmp;
419
+ std::vector<contact_t> cnt_type_tmp;
420
+ // Getting sphere contacts is enough
421
+ getContacts_impl(idA_tmp, idB_tmp, cnt_type_tmp, famA_tmp, famB_tmp, [](contact_t type) { return true; });
422
+ // Exclude the families that are not in the set
423
+ std::vector<bool> elem_to_remove(idA_tmp.size(), false);
424
+ for (size_t i = 0; i < idA_tmp.size(); i++) {
425
+ if (!check_exist(family_to_include, famA_tmp.at(i)) || !check_exist(family_to_include, famB_tmp.at(i))) {
426
+ elem_to_remove[i] = true;
427
+ }
428
+ }
429
+ idA_tmp = hostRemoveElem(idA_tmp, elem_to_remove);
430
+ idB_tmp = hostRemoveElem(idB_tmp, elem_to_remove);
431
+ famA_tmp = hostRemoveElem(famA_tmp, elem_to_remove);
432
+ famB_tmp = hostRemoveElem(famB_tmp, elem_to_remove);
433
+ cnt_type_tmp = hostRemoveElem(cnt_type_tmp, elem_to_remove);
434
+
435
+ auto idx = hostSortIndices(idA_tmp);
436
+ std::vector<std::pair<bodyID_t, bodyID_t>> out_pair(idx.size());
437
+ for (size_t i = 0; i < idx.size(); i++) {
438
+ out_pair[i] = std::pair<bodyID_t, bodyID_t>(idA_tmp[idx[i]], idB_tmp[idx[i]]);
439
+ }
440
+ return out_pair;
441
+ }
442
+
443
+ std::vector<std::pair<bodyID_t, bodyID_t>> DEMSolver::GetContacts(
444
+ std::vector<std::pair<family_t, family_t>>& family_pair) const {
445
+ std::vector<bodyID_t> idA_tmp, idB_tmp;
446
+ std::vector<family_t> famA_tmp, famB_tmp;
447
+ std::vector<contact_t> cnt_type_tmp;
448
+ // Getting sphere contacts is enough
449
+ getContacts_impl(idA_tmp, idB_tmp, cnt_type_tmp, famA_tmp, famB_tmp, [](contact_t type) { return true; });
450
+ auto idx = hostSortIndices(idA_tmp);
451
+ std::vector<std::pair<bodyID_t, bodyID_t>> out_pair(idx.size());
452
+ family_pair.resize(idx.size());
453
+ for (size_t i = 0; i < idx.size(); i++) {
454
+ out_pair[i] = std::pair<bodyID_t, bodyID_t>(idA_tmp[idx[i]], idB_tmp[idx[i]]);
455
+ family_pair[i] = std::pair<family_t, family_t>(famA_tmp[idx[i]], famB_tmp[idx[i]]);
456
+ }
457
+ return out_pair;
458
+ }
459
+
460
+ std::shared_ptr<ContactInfoContainer> DEMSolver::GetContactDetailedInfo(float force_thres) const {
461
+ return dT->generateContactInfo(force_thres);
462
+ }
463
+
402
464
  std::vector<float3> DEMSolver::GetOwnerPosition(bodyID_t ownerID, bodyID_t n) const {
403
465
  return dT->getOwnerPos(ownerID, n);
404
466
  }
@@ -2195,7 +2257,7 @@ void DEMSolver::UpdateSimParams() {
2195
2257
  std::thread dT_build([&]() {
2196
2258
  DEME_GPU_CALL(cudaSetDevice(dT->streamInfo.device));
2197
2259
  // Jitify max vel finder, in case the policy there changed
2198
- m_approx_max_vel_func->Initialize(m_subs, true);
2260
+ m_approx_max_vel_func->Initialize(m_subs, m_jitify_options, true);
2199
2261
  dT->approxMaxVelFunc = m_approx_max_vel_func;
2200
2262
  // Updating sim environment is critical
2201
2263
  dT->announceCritical();
@@ -186,11 +186,13 @@ float* DEMInspector::dT_GetValue() {
186
186
 
187
187
  void DEMInspector::assertInit() {
188
188
  if (!initialized) {
189
- Initialize(sys->GetJitStringSubs());
189
+ Initialize(sys->GetJitStringSubs(), sys->GetJitifyOptions());
190
190
  }
191
191
  }
192
192
 
193
- void DEMInspector::Initialize(const std::unordered_map<std::string, std::string>& Subs, bool force) {
193
+ void DEMInspector::Initialize(const std::unordered_map<std::string, std::string>& Subs,
194
+ const std::vector<std::string>& options,
195
+ bool force) {
194
196
  if (!(sys->GetInitStatus()) && !force) {
195
197
  std::stringstream ss;
196
198
  ss << "Inspector should only be initialized or used after the simulation system is initialized (because it "
@@ -221,12 +223,11 @@ void DEMInspector::Initialize(const std::unordered_map<std::string, std::string>
221
223
  my_subs["_inRegionPolicy_"] = in_region_specifier;
222
224
  my_subs["_quantityQueryProcess_"] = inspection_code;
223
225
  if (thing_to_insp == INSPECT_ENTITY_TYPE::SPHERE) {
224
- inspection_kernel = std::make_shared<jitify::Program>(std::move(
225
- JitHelper::buildProgram("DEMSphereQueryKernels", JitHelper::KERNEL_DIR / "DEMSphereQueryKernels.cu",
226
- my_subs, DEME_JITIFY_OPTIONS)));
226
+ inspection_kernel = std::make_shared<jitify::Program>(std::move(JitHelper::buildProgram(
227
+ "DEMSphereQueryKernels", JitHelper::KERNEL_DIR / "DEMSphereQueryKernels.cu", my_subs, options)));
227
228
  } else if (thing_to_insp == INSPECT_ENTITY_TYPE::CLUMP || thing_to_insp == INSPECT_ENTITY_TYPE::EVERYTHING) {
228
229
  inspection_kernel = std::make_shared<jitify::Program>(std::move(JitHelper::buildProgram(
229
- "DEMOwnerQueryKernels", JitHelper::KERNEL_DIR / "DEMOwnerQueryKernels.cu", my_subs, DEME_JITIFY_OPTIONS)));
230
+ "DEMOwnerQueryKernels", JitHelper::KERNEL_DIR / "DEMOwnerQueryKernels.cu", my_subs, options)));
230
231
  } else {
231
232
  std::stringstream ss;
232
233
  ss << "Sorry, an inspector object you are using is not implemented yet.\nConsider letting the developers know "
@@ -926,6 +927,17 @@ int DEMForceModel::ReadCustomModelFile(const std::filesystem::path& sourcefile)
926
927
  return 0;
927
928
  }
928
929
 
930
+ void DEMForceModel::DefineCustomModelPrerequisites(const std::string& util) {
931
+ m_model_prerequisites = util;
932
+ }
933
+ int DEMForceModel::ReadCustomModelPrerequisitesFile(const std::filesystem::path& sourcefile) {
934
+ if (!std::filesystem::exists(sourcefile)) {
935
+ return 1;
936
+ }
937
+ m_model_prerequisites = read_file_to_string(sourcefile);
938
+ return 0;
939
+ }
940
+
929
941
  void DEMForceModel::SetPerContactWildcards(const std::set<std::string>& wildcards) {
930
942
  for (const auto& a_str : wildcards) {
931
943
  if (match_pattern(a_str, " ")) {
@@ -70,7 +70,9 @@ class DEMInspector {
70
70
  void SetInspectionCode(const std::string& code) { inspection_code = code; }
71
71
 
72
72
  // Initialize with the DEM simulation system (user should not call this)
73
- void Initialize(const std::unordered_map<std::string, std::string>& Subs, bool force = false);
73
+ void Initialize(const std::unordered_map<std::string, std::string>& Subs,
74
+ const std::vector<std::string>& options,
75
+ bool force = false);
74
76
 
75
77
  /// Get the reduce value of the quantity that you wish to inspect.
76
78
  float GetValue();
@@ -434,6 +436,8 @@ class DEMForceModel {
434
436
  FORCE_MODEL type = FORCE_MODEL::CUSTOM;
435
437
  // The model
436
438
  std::string m_force_model = " ";
439
+ // Mainly for device util functions this model might need.
440
+ std::string m_model_prerequisites = " ";
437
441
  // Quatity names that we want to associate each contact pair with. An array will be allocated for storing this, and
438
442
  // it lives and die with contact pairs.
439
443
  std::set<std::string> m_contact_wildcards;
@@ -451,14 +455,20 @@ class DEMForceModel {
451
455
  DEMForceModel() {}
452
456
  ~DEMForceModel() {}
453
457
 
454
- /// Set the contact force model type
458
+ /// Set the contact force model type.
455
459
  void SetForceModelType(FORCE_MODEL model_type);
456
- /// Define user-custom force model with a string which is your force calculation code
460
+ /// Define user-custom force model with a string which is your force calculation code.
457
461
  void DefineCustomModel(const std::string& model);
458
462
  /// Read user-custom force model from a file (which by default should reside in kernel/DEMUserScripts), which
459
463
  /// contains your force calculation code. Returns 0 if read successfully, otherwise 1.
460
464
  int ReadCustomModelFile(const std::filesystem::path& sourcefile);
461
465
 
466
+ /// Define user-custom force model's utility __device__ functions with a string.
467
+ void DefineCustomModelPrerequisites(const std::string& util);
468
+ /// Read user-custom force model's utility __device__ functions from a file (which by default should reside in
469
+ /// kernel/DEMUserScripts). Returns 0 if read successfully, otherwise 1.
470
+ int ReadCustomModelPrerequisitesFile(const std::filesystem::path& sourcefile);
471
+
462
472
  /// @brief Specifiy the material properties that this force model will use.
463
473
  /// @param props Material property names.
464
474
  void SetMustHaveMatProp(const std::set<std::string>& props) { m_must_have_mat_props = props; }
@@ -26,7 +26,7 @@ namespace deme {
26
26
  // It is better to keep DEME_NUM_SPHERES_PER_CD_BATCH == DEME_KT_CD_NTHREADS_PER_BLOCK for better performance
27
27
  #define DEME_NUM_SPHERES_PER_CD_BATCH 512 ///< Can't be larger than DEME_KT_CD_NTHREADS_PER_BLOCK
28
28
  #define DEME_NUM_TRIANGLES_PER_CD_BATCH 256 ///< Can't be larger than DEME_KT_CD_NTHREADS_PER_BLOCK
29
- #define DEME_TINY_FLOAT 1e-12
29
+ #define DEME_TINY_FLOAT 1e-15
30
30
  #define DEME_HUGE_FLOAT 1e15
31
31
  #define DEME_BITS_PER_BYTE 8
32
32
  #define DEME_CUDA_WARP_SIZE 32
@@ -170,12 +170,12 @@ enum OUTPUT_CONTENT {
170
170
  enum class SPATIAL_DIR { X, Y, Z, NONE };
171
171
  // The info that should be present in the contact pair output files
172
172
  enum CNT_OUTPUT_CONTENT {
173
- CNT_TYPE = 0, // Owner numbers and contact type
174
- FORCE = 1, // Force (that owner 1 feels) xyz components in global
175
- DEME_POINT = 2, // Contact point in global frame
176
- COMPONENT = 4, // The component numbers (such as triangle number for a mesh) that involved in this contact
177
- NORMAL = 8, // Contact normal direction in global frame
178
- TORQUE = 16, // This is a standalone force and produces torque only (typical example: rolling resistance force)
173
+ CNT_TYPE = 0, // Owner numbers and contact type
174
+ FORCE = 1, // Force (that owner 1 feels) xyz components in global
175
+ CNT_POINT = 2, // Contact point in global frame
176
+ COMPONENT = 4, // The component numbers (such as triangle number for a mesh) that involved in this contact
177
+ NORMAL = 8, // Contact normal direction in global frame
178
+ TORQUE = 16, // This is a standalone force and produces torque only (typical example: rolling resistance force)
179
179
  CNT_WILDCARD = 32,
180
180
  OWNER = 64,
181
181
  GEO_ID = 128,
@@ -205,6 +205,31 @@ PYBIND11_MODULE(DEME, obj) {
205
205
 
206
206
  .def("GetSeparation", &deme::HCPSampler::GetSeparation);
207
207
 
208
+ // Have to forward declare this templated method so pybind can see it
209
+ std::vector<float>& (deme::DataContainer::*get_float_dc)(const std::string&) = &deme::DataContainer::Get<float>;
210
+ py::class_<deme::DataContainer, std::shared_ptr<deme::DataContainer>>(obj, "DataContainer")
211
+ .def(py::init<>())
212
+ .def("Get", get_float_dc, py::return_value_policy::reference_internal,
213
+ "Get a float value from the container by name. Should be used for getting wildcard by name.");
214
+
215
+ py::class_<deme::ContactInfoContainer, deme::DataContainer, std::shared_ptr<deme::ContactInfoContainer>>(
216
+ obj, "ContactInfoContainer")
217
+ .def(py::init<unsigned int&, const std::vector<std::pair<std::string, std::string>>&>())
218
+ .def("GetContactType", &deme::ContactInfoContainer::GetContactType,
219
+ "Get contact type as strings from the container.")
220
+ .def("GetPoint", &deme::ContactInfoContainer::GetPoint, "Get contact points as vectors from the container.")
221
+ .def("GetAOwner", &deme::ContactInfoContainer::GetAOwner, "Get AOwner number from the container.")
222
+ .def("GetBOwner", &deme::ContactInfoContainer::GetBOwner, "Get BOwner number from the container.")
223
+ .def("GetAGeo", &deme::ContactInfoContainer::GetAGeo, "Get AGeo number from the container.")
224
+ .def("GetBGeo", &deme::ContactInfoContainer::GetBGeo, "Get BGeo number from the container.")
225
+ .def("GetAOwnerFamily", &deme::ContactInfoContainer::GetAOwnerFamily,
226
+ "Get AOwnerFamily number from the container.")
227
+ .def("GetBOwnerFamily", &deme::ContactInfoContainer::GetBOwnerFamily,
228
+ "Get BOwnerFamily number from the container.")
229
+ .def("GetForce", &deme::ContactInfoContainer::GetForce, "Get force as vectors from the container.")
230
+ .def("GetTorque", &deme::ContactInfoContainer::GetTorque, "Get torque as vectors from the container.")
231
+ .def("GetNormal", &deme::ContactInfoContainer::GetNormal, "Get contact normal as vectors from the container.");
232
+
208
233
  py::class_<deme::DEMInspector, std::shared_ptr<deme::DEMInspector>>(obj, "DEMInspector")
209
234
  .def(py::init<deme::DEMSolver*, deme::DEMDynamicThread*, const std::string&>())
210
235
  .def("GetValue", &deme::DEMInspector::GetValue);
@@ -417,11 +442,18 @@ PYBIND11_MODULE(DEME, obj) {
417
442
  py::class_<deme::DEMForceModel, std::shared_ptr<deme::DEMForceModel>>(obj, "DEMForceModel")
418
443
  .def(py::init<deme::FORCE_MODEL>())
419
444
  .def("SetForceModelType", &deme::DEMForceModel::SetForceModelType, "Set the contact force model type")
445
+
420
446
  .def("DefineCustomModel", &deme::DEMForceModel::DefineCustomModel,
421
- "Define user-custom force model with a string which is your force calculation code")
447
+ "Define user-custom force model with a string which is your force calculation code.")
422
448
  .def("ReadCustomModelFile", &deme::DEMForceModel::ReadCustomModelFile,
423
449
  "Read user-custom force model from a file (which by default should reside in kernel/DEMUserScripts), "
424
450
  "which contains your force calculation code. Returns 0 if read successfully, otherwise 1.")
451
+ .def("DefineCustomModelPrerequisites", &deme::DEMForceModel::DefineCustomModelPrerequisites,
452
+ "Define user-custom force model's utility __device__ functions with a string.")
453
+ .def("ReadCustomModelPrerequisitesFile", &deme::DEMForceModel::ReadCustomModelPrerequisitesFile,
454
+ "Read user-custom force model's utility __device__ functions from a file (which by default should reside "
455
+ "in kernel/DEMUserScripts). Returns 0 if read successfully, otherwise 1.")
456
+
425
457
  .def("SetMustHaveMatProp", &deme::DEMForceModel::SetMustHaveMatProp,
426
458
  "Specifiy the material properties that this force model will use")
427
459
  .def("SetMustPairwiseMatProp", &deme::DEMForceModel::SetMustPairwiseMatProp,
@@ -491,6 +523,10 @@ PYBIND11_MODULE(DEME, obj) {
491
523
  .def("GetJitStringSubs", &deme::DEMSolver::GetJitStringSubs,
492
524
  "Get the jitification string substitution laundary list. It is needed by some of this simulation system's "
493
525
  "friend classes.")
526
+ .def("GetJitifyOptions", &deme::DEMSolver::GetJitifyOptions,
527
+ "Get current jitification options. It is needed by some of this simulation system's friend classes.")
528
+ .def("SetJitifyOptions", &deme::DEMSolver::SetJitifyOptions,
529
+ "Set the jitification options. It is only needed by advanced users.")
494
530
 
495
531
  .def("SetInitBinSizeAsMultipleOfSmallestSphere", &deme::DEMSolver::SetInitBinSizeAsMultipleOfSmallestSphere,
496
532
  "Explicitly instruct the bin size (for contact detection) that the solver should use, as a multiple of "
@@ -748,17 +784,50 @@ PYBIND11_MODULE(DEME, obj) {
748
784
  .def("GetClumpContacts",
749
785
  static_cast<std::vector<std::pair<deme::bodyID_t, deme::bodyID_t>> (deme::DEMSolver::*)() const>(
750
786
  &deme::DEMSolver::GetClumpContacts),
751
- "Get all clump--clump contacts in the simulation system.")
752
-
787
+ "Get all clump--clump contact ID pairs in the simulation system. Note all GetContact-like methods reports "
788
+ "potential contacts (not necessarily confirmed contacts), meaning they are similar to what "
789
+ "WriteContactFileIncludingPotentialPairs does, not what WriteContactFile does.")
753
790
  .def("GetClumpContacts",
754
791
  static_cast<std::vector<std::pair<deme::bodyID_t, deme::bodyID_t>> (deme::DEMSolver::*)(
755
792
  const std::set<deme::family_t>&) const>(&deme::DEMSolver::GetClumpContacts),
756
- "Get all clump--clump contacts in the simulation system.")
757
-
793
+ "Get all clump--clump contact ID pairs in the simulation system. Note all GetContact-like methods reports "
794
+ "potential contacts (not necessarily confirmed contacts), meaning they are similar to what "
795
+ "WriteContactFileIncludingPotentialPairs does, not what WriteContactFile does. Use the argument to "
796
+ "include only these families in the output.")
758
797
  .def("GetClumpContacts",
759
798
  static_cast<std::vector<std::pair<deme::bodyID_t, deme::bodyID_t>> (deme::DEMSolver::*)(
760
799
  std::vector<std::pair<deme::family_t, deme::family_t>>&) const>(&deme::DEMSolver::GetClumpContacts),
761
- "Get all clump--clump contacts in the simulation system.")
800
+ "Get all clump--clump contact ID pairs in the simulation system. Note all GetContact-like methods reports "
801
+ "potential contacts (not necessarily confirmed contacts), meaning they are similar to what "
802
+ "WriteContactFileIncludingPotentialPairs does, not what WriteContactFile does.")
803
+
804
+ .def("GetContacts",
805
+ static_cast<std::vector<std::pair<deme::bodyID_t, deme::bodyID_t>> (deme::DEMSolver::*)() const>(
806
+ &deme::DEMSolver::GetContacts),
807
+ "Get all contact ID pairs in the simulation system. Note all GetContact-like methods reports potential "
808
+ "contacts (not necessarily confirmed contacts), meaning they are similar to what "
809
+ "WriteContactFileIncludingPotentialPairs does, not what WriteContactFile does.")
810
+ .def("GetContacts",
811
+ static_cast<std::vector<std::pair<deme::bodyID_t, deme::bodyID_t>> (deme::DEMSolver::*)(
812
+ const std::set<deme::family_t>&) const>(&deme::DEMSolver::GetContacts),
813
+ "Get all contact ID pairs in the simulation system. Note all GetContact-like methods reports potential "
814
+ "contacts (not necessarily confirmed contacts), meaning they are similar to what "
815
+ "WriteContactFileIncludingPotentialPairs does, not what WriteContactFile does. Use the argument to "
816
+ "include only these families in the output.")
817
+ .def("GetContacts",
818
+ static_cast<std::vector<std::pair<deme::bodyID_t, deme::bodyID_t>> (deme::DEMSolver::*)(
819
+ std::vector<std::pair<deme::family_t, deme::family_t>>&) const>(&deme::DEMSolver::GetContacts),
820
+ "Get all contact ID pairs in the simulation system. Note all GetContact-like methods reports potential "
821
+ "contacts (not necessarily confirmed contacts), meaning they are similar to what "
822
+ "WriteContactFileIncludingPotentialPairs does, not what WriteContactFile does.")
823
+
824
+ .def("GetContactDetailedInfo", &deme::DEMSolver::GetContactDetailedInfo,
825
+ "Get all contact pairs' detailed information (actual content based on the setting with "
826
+ "SetContactOutputContent; default are owner IDs, contact point location, contact force, and associated "
827
+ "wildcard values) in the simulation system. Note all GetContact-like methods reports potential contacts "
828
+ "(not necessarily confirmed contacts), meaning they are similar to what "
829
+ "WriteContactFileIncludingPotentialPairs does, not what WriteContactFile does.",
830
+ py::arg("force_thres") = -1.0)
762
831
 
763
832
  .def("GetHostMemUsageDynamic", &deme::DEMSolver::GetHostMemUsageDynamic,
764
833
  "Get the host memory usage (in bytes) on dT.")
@@ -948,6 +1017,18 @@ PYBIND11_MODULE(DEME, obj) {
948
1017
  .def("SetAnalWildcardValue", &deme::DEMSolver::SetAnalWildcardValue,
949
1018
  "Set the wildcard values of some analytical components.")
950
1019
 
1020
+ .def("SetOwnerWildcardValue",
1021
+ static_cast<void (deme::DEMSolver::*)(deme::bodyID_t ownerID, const std::string& name,
1022
+ const std::vector<float>& vals)>(
1023
+ &deme::DEMSolver::SetOwnerWildcardValue),
1024
+ "Set the wildcard values of some owners using a list.", py::arg("ownerIDs"), py::arg("name"),
1025
+ py::arg("vals"))
1026
+ .def("SetOwnerWildcardValue",
1027
+ static_cast<void (deme::DEMSolver::*)(deme::bodyID_t ownerID, const std::string& name, float val,
1028
+ size_t n)>(&deme::DEMSolver::SetOwnerWildcardValue),
1029
+ "Set the wildcard values of some owners using a list.", py::arg("ownerIDs"), py::arg("name"),
1030
+ py::arg("val"), py::arg("n") = 1)
1031
+
951
1032
  .def("GetOwnerWildcardValue",
952
1033
  static_cast<std::vector<float> (deme::DEMSolver::*)(deme::bodyID_t ownerID, const std::string& name,
953
1034
  deme::bodyID_t n)>(
@@ -987,11 +1068,6 @@ PYBIND11_MODULE(DEME, obj) {
987
1068
  "Add an extra contact margin to entities in a family so they are registered as potential contact pairs "
988
1069
  "earlier.")
989
1070
 
990
- .def("GetAllOwnerWildcardValue", &deme::DEMSolver::GetAllOwnerWildcardValue,
991
- "Get the owner wildcard's values of all entities.")
992
- .def("GetFamilyOwnerWildcardValue", &deme::DEMSolver::GetFamilyOwnerWildcardValue,
993
- "Get the owner wildcard's values of all entities in family N.")
994
-
995
1071
  .def("ClearCache", &deme::DEMSolver::ClearCache,
996
1072
  "Remove host-side cached vectors (so you can re-define them, and then re-initialize system).")
997
1073
 
@@ -1000,7 +1076,11 @@ PYBIND11_MODULE(DEME, obj) {
1000
1076
  &deme::DEMSolver::CreateInspector),
1001
1077
  "Create a inspector object that can help query some statistical info of the clumps in the simulation.",
1002
1078
  py::arg("quantity") = "clump_max_z")
1003
- .def("GetNumClumps", &deme::DEMSolver::GetNumClumps)
1079
+ .def("GetNumClumps", &deme::DEMSolver::GetNumClumps,
1080
+ "Return the number of clumps that are currently in the simulation. Must be used after initialization.")
1081
+ .def("GetNumOwners", &deme::DEMSolver::GetNumOwners,
1082
+ "Return the total number of owners (clumps + meshes + analytical objects) that are currently in the "
1083
+ "simulation. Must be used after initialization.")
1004
1084
  .def("CreateInspector",
1005
1085
  static_cast<std::shared_ptr<deme::DEMInspector> (deme::DEMSolver::*)(
1006
1086
  const std::string&, const std::string&)>(&deme::DEMSolver::CreateInspector),
@@ -1036,7 +1116,14 @@ PYBIND11_MODULE(DEME, obj) {
1036
1116
  "WriteContactFile",
1037
1117
  static_cast<void (deme::DEMSolver::*)(const std::string&, float) const>(&deme::DEMSolver::WriteContactFile),
1038
1118
  "Write all contact pairs to a file. Forces smaller than threshold will not be outputted.",
1039
- py::arg("outfilename"), py::arg("force_thres") = 1e-15)
1119
+ py::arg("outfilename"), py::arg("force_thres") = 1e-30)
1120
+ .def("WriteContactFileIncludingPotentialPairs",
1121
+ static_cast<void (deme::DEMSolver::*)(const std::string&) const>(
1122
+ &deme::DEMSolver::WriteContactFileIncludingPotentialPairs),
1123
+ "Write all contact pairs kT-supplied to a file, thus including the potential ones (those are not yet in "
1124
+ "contact, or recently used to be in contact).",
1125
+ py::arg("outfilename"))
1126
+
1040
1127
  // Maybe add checkpoint-reading methods here...
1041
1128
  .def("DoDynamics", &deme::DEMSolver::DoDynamics,
1042
1129
  "Advance simulation by this amount of time (but does not attempt to sync kT and dT). This can work with "
@@ -1336,7 +1423,7 @@ PYBIND11_MODULE(DEME, obj) {
1336
1423
  py::enum_<deme::CNT_OUTPUT_CONTENT>(obj, "CNT_OUTPUT_CONTENT")
1337
1424
  .value("CNT_TYPE", deme::CNT_OUTPUT_CONTENT::CNT_TYPE)
1338
1425
  .value("FORCE", deme::CNT_OUTPUT_CONTENT::FORCE)
1339
- .value("POINT", deme::CNT_OUTPUT_CONTENT::DEME_POINT)
1426
+ .value("POINT", deme::CNT_OUTPUT_CONTENT::CNT_POINT)
1340
1427
  .value("COMPONENT", deme::CNT_OUTPUT_CONTENT::COMPONENT)
1341
1428
  .value("NORMAL", deme::CNT_OUTPUT_CONTENT::NORMAL)
1342
1429
  .value("TORQUE", deme::CNT_OUTPUT_CONTENT::TORQUE)