htpolynet 2.12.0__tar.gz → 2.13.0__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 (383) hide show
  1. {htpolynet-2.12.0 → htpolynet-2.13.0}/CHANGELOG.md +172 -0
  2. {htpolynet-2.12.0 → htpolynet-2.13.0}/PKG-INFO +1 -1
  3. {htpolynet-2.12.0 → htpolynet-2.13.0}/ROADMAP.md +262 -3
  4. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/user-guide/usage.rst +14 -1
  5. {htpolynet-2.12.0 → htpolynet-2.13.0}/pyproject.toml +1 -1
  6. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/analysis/postsim.py +181 -4
  7. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/analysis/utils.py +19 -0
  8. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/cure/ringcontroller.py +7 -4
  9. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/external/gromacs.py +40 -1
  10. htpolynet-2.13.0/tests/unit/fixtures/README-postsim-traces.md +18 -0
  11. htpolynet-2.13.0/tests/unit/fixtures/deform-x-FDE-FCPDA.csv +1002 -0
  12. htpolynet-2.13.0/tests/unit/fixtures/ladder-FDE-DFDA.csv +62 -0
  13. htpolynet-2.13.0/tests/unit/test_grompp_warnings.py +67 -0
  14. htpolynet-2.13.0/tests/unit/test_postsim_moduli.py +177 -0
  15. htpolynet-2.13.0/tests/unit/test_postsim_real_traces.py +124 -0
  16. htpolynet-2.13.0/tests/unit/test_postsim_shear.py +202 -0
  17. {htpolynet-2.12.0 → htpolynet-2.13.0}/.claude/settings.json +0 -0
  18. {htpolynet-2.12.0 → htpolynet-2.13.0}/.claude/skills/htpolynet/SKILL.md +0 -0
  19. {htpolynet-2.12.0 → htpolynet-2.13.0}/.envrc +0 -0
  20. {htpolynet-2.12.0 → htpolynet-2.13.0}/.github/workflows/conda-forge-sync.yml +0 -0
  21. {htpolynet-2.12.0 → htpolynet-2.13.0}/.github/workflows/docker.yml +0 -0
  22. {htpolynet-2.12.0 → htpolynet-2.13.0}/.github/workflows/docs.yml +0 -0
  23. {htpolynet-2.12.0 → htpolynet-2.13.0}/.github/workflows/release.yaml +0 -0
  24. {htpolynet-2.12.0 → htpolynet-2.13.0}/.github/workflows/test.yml +0 -0
  25. {htpolynet-2.12.0 → htpolynet-2.13.0}/.gitignore +0 -0
  26. {htpolynet-2.12.0 → htpolynet-2.13.0}/.readthedocs.yaml +0 -0
  27. {htpolynet-2.12.0 → htpolynet-2.13.0}/CITATION.cff +0 -0
  28. {htpolynet-2.12.0 → htpolynet-2.13.0}/CLAUDE.md +0 -0
  29. {htpolynet-2.12.0 → htpolynet-2.13.0}/LICENSE +0 -0
  30. {htpolynet-2.12.0 → htpolynet-2.13.0}/MANIFEST.in +0 -0
  31. {htpolynet-2.12.0 → htpolynet-2.13.0}/README.md +0 -0
  32. {htpolynet-2.12.0 → htpolynet-2.13.0}/docker/Dockerfile +0 -0
  33. {htpolynet-2.12.0 → htpolynet-2.13.0}/docker/compose.yml +0 -0
  34. {htpolynet-2.12.0 → htpolynet-2.13.0}/docker/docker-entrypoint.sh +0 -0
  35. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/Makefile +0 -0
  36. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/README.rst +0 -0
  37. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/make.bat +0 -0
  38. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/requirements.txt +0 -0
  39. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/_static/.gitkeep +0 -0
  40. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/_static/htpolynet-favicon.ico +0 -0
  41. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/_static/htpolynet-landing.jpg +0 -0
  42. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/_static/htpolynet-logo-dark.png +0 -0
  43. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/_static/htpolynet-logo-light.png +0 -0
  44. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/changelog.rst +0 -0
  45. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/conf.py +0 -0
  46. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/0-liquid-styrene/configuration.rst +0 -0
  47. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/0-liquid-styrene/index.rst +0 -0
  48. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/0-liquid-styrene/introduction.rst +0 -0
  49. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/0-liquid-styrene/monomer.rst +0 -0
  50. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/0-liquid-styrene/postsim.rst +0 -0
  51. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/0-liquid-styrene/results.rst +0 -0
  52. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/0-liquid-styrene/run.rst +0 -0
  53. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/1-polystyrene/configuration.rst +0 -0
  54. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/1-polystyrene/index.rst +0 -0
  55. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/1-polystyrene/introduction.rst +0 -0
  56. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/1-polystyrene/monomer.rst +0 -0
  57. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/1-polystyrene/pics/STY.png +0 -0
  58. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/1-polystyrene/pics/STYCC.png +0 -0
  59. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/1-polystyrene/pics/buildtraces.png +0 -0
  60. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/1-polystyrene/pics/cure_info.png +0 -0
  61. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/1-polystyrene/pics/densification-density.png +0 -0
  62. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/1-polystyrene/pics/final-box.png +0 -0
  63. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/1-polystyrene/pics/reaction_network.png +0 -0
  64. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/1-polystyrene/pics/sty-coloring.tcl +0 -0
  65. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/1-polystyrene/pics/sty-cured.png +0 -0
  66. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/1-polystyrene/pics/sty-detail.png +0 -0
  67. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/1-polystyrene/pics/sty-liq.png +0 -0
  68. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/1-polystyrene/pics/styrene-polymerization.png +0 -0
  69. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/1-polystyrene/postsim.rst +0 -0
  70. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/1-polystyrene/reactions.rst +0 -0
  71. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/1-polystyrene/results.rst +0 -0
  72. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/1-polystyrene/run.rst +0 -0
  73. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/configuration.rst +0 -0
  74. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/index.rst +0 -0
  75. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/introduction.rst +0 -0
  76. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/BPA.png +0 -0
  77. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/GMA.png +0 -0
  78. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/HIE.png +0 -0
  79. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/buildtraces.png +0 -0
  80. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/cure_info.png +0 -0
  81. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/densification-density.png +0 -0
  82. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/four_dimers.eps +0 -0
  83. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/four_dimers.fig +0 -0
  84. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/four_dimers.png +0 -0
  85. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-coloring.tcl +0 -0
  86. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-cured.png +0 -0
  87. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-detail.png +0 -0
  88. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-liq.png +0 -0
  89. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/p1-traces.png +0 -0
  90. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/reaction_network.png +0 -0
  91. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/vesys.eps +0 -0
  92. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/vesys.fig +0 -0
  93. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/vesys.png +0 -0
  94. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/postsim.rst +0 -0
  95. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/reactions.rst +0 -0
  96. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/results.rst +0 -0
  97. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/run.rst +0 -0
  98. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/configuration.rst +0 -0
  99. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/index.rst +0 -0
  100. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/introduction.rst +0 -0
  101. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/monomers.rst +0 -0
  102. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/DGE-epoxy.png +0 -0
  103. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/DGE-labelled.png +0 -0
  104. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/PAC-2d.png +0 -0
  105. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/PAC-labelled.png +0 -0
  106. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/buildtraces.png +0 -0
  107. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/cure_info.png +0 -0
  108. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/densification-density.png +0 -0
  109. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-coloring.tcl +0 -0
  110. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-cured.png +0 -0
  111. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-detail.png +0 -0
  112. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-liq.png +0 -0
  113. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dgesys.eps +0 -0
  114. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dgesys.fig +0 -0
  115. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dgesys.png +0 -0
  116. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/equil-rho_v_ns.png +0 -0
  117. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/postsim-typical.png +0 -0
  118. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/prod-e.png +0 -0
  119. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/prod-equil-rho_v_ns.png +0 -0
  120. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/prod-rho_v_ns.png +0 -0
  121. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/prod-tg.png +0 -0
  122. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/r1.png +0 -0
  123. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/r2.png +0 -0
  124. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/r3.png +0 -0
  125. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/reaction_network.png +0 -0
  126. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/rho_v_ns.png +0 -0
  127. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/short-e.png +0 -0
  128. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/short-tg.png +0 -0
  129. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/postsim.rst +0 -0
  130. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/reactions.rst +0 -0
  131. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/results.rst +0 -0
  132. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/run.rst +0 -0
  133. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/configuration.rst +0 -0
  134. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/index.rst +0 -0
  135. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/introduction.rst +0 -0
  136. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/monomers.rst +0 -0
  137. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/buildtraces.png +0 -0
  138. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/cure_info.png +0 -0
  139. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/densification-density.png +0 -0
  140. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-coloring.tcl +0 -0
  141. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-cured.png +0 -0
  142. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-detail.png +0 -0
  143. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-liq.png +0 -0
  144. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/reaction_network.png +0 -0
  145. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/postsim.rst +0 -0
  146. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/reactions.rst +0 -0
  147. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/results.rst +0 -0
  148. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/run.rst +0 -0
  149. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/5-htpb-ipdi/configuration.rst +0 -0
  150. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/5-htpb-ipdi/index.rst +0 -0
  151. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/5-htpb-ipdi/introduction.rst +0 -0
  152. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/5-htpb-ipdi/monomers.rst +0 -0
  153. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/buildtraces.png +0 -0
  154. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/cure_info.png +0 -0
  155. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/densification-density.png +0 -0
  156. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-coloring.tcl +0 -0
  157. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-ipdi-cured.png +0 -0
  158. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-ipdi-detail.png +0 -0
  159. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-ipdi-liq.png +0 -0
  160. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/reaction_network.png +0 -0
  161. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/5-htpb-ipdi/postsim.rst +0 -0
  162. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/5-htpb-ipdi/reactions.rst +0 -0
  163. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/5-htpb-ipdi/results.rst +0 -0
  164. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/5-htpb-ipdi/run.rst +0 -0
  165. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/6-cyanate-ester/configuration.rst +0 -0
  166. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/6-cyanate-ester/index.rst +0 -0
  167. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/6-cyanate-ester/introduction.rst +0 -0
  168. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/6-cyanate-ester/monomers.rst +0 -0
  169. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-coloring.tcl +0 -0
  170. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-cured.png +0 -0
  171. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-detail.png +0 -0
  172. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-liq.png +0 -0
  173. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/6-cyanate-ester/pics/buildtraces.png +0 -0
  174. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/6-cyanate-ester/pics/cure_info.png +0 -0
  175. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/6-cyanate-ester/pics/densification-density.png +0 -0
  176. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/6-cyanate-ester/pics/reaction_network.png +0 -0
  177. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/6-cyanate-ester/postsim.rst +0 -0
  178. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/6-cyanate-ester/reactions.rst +0 -0
  179. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/6-cyanate-ester/results.rst +0 -0
  180. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/6-cyanate-ester/run.rst +0 -0
  181. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/example-tutorials/index.rst +0 -0
  182. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/htpolynetpackage.rst +0 -0
  183. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/index.rst +0 -0
  184. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/install.rst +0 -0
  185. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/references/index.rst +0 -0
  186. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/references/mol2-reference.pdf +0 -0
  187. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/references.bib +0 -0
  188. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/user-guide/CURE.odg +0 -0
  189. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/user-guide/bond_filter.odg +0 -0
  190. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/user-guide/building-a-system.rst +0 -0
  191. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/user-guide/configs/configs-for-analyze.rst +0 -0
  192. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/user-guide/configs/configs-for-postsim.rst +0 -0
  193. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/user-guide/configs/configs-for-run.rst +0 -0
  194. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/user-guide/configuration-files.rst +0 -0
  195. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/user-guide/container-usage.rst +0 -0
  196. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/user-guide/flow1.odg +0 -0
  197. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/user-guide/flow1yaml.odg +0 -0
  198. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/user-guide/hydrogenated.eps +0 -0
  199. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/user-guide/hydrogenated.fig +0 -0
  200. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/user-guide/index.rst +0 -0
  201. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/user-guide/molecular-structure-inputs.rst +0 -0
  202. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/user-guide/periodic-networks.rst +0 -0
  203. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/user-guide/pics/STY.png +0 -0
  204. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/user-guide/pics/STYCC.png +0 -0
  205. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/user-guide/pics/TypicalUsageFlow.png +0 -0
  206. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/user-guide/pics/bond_filter.png +0 -0
  207. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/user-guide/pics/chemdoodle-2dsketcher-emb.png +0 -0
  208. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/user-guide/pics/chemdoodle-2dsketcher-styrene.png +0 -0
  209. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/user-guide/pics/hydrogenated.png +0 -0
  210. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/user-guide/pics/ring_pierce/ring_pierce_cases.png +0 -0
  211. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/user-guide/pics/ring_pierce/ring_pierce_linkcell.png +0 -0
  212. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/user-guide/postcure-repair.rst +0 -0
  213. {htpolynet-2.12.0 → htpolynet-2.13.0}/docs/source/user-guide/program-flow.rst +0 -0
  214. {htpolynet-2.12.0 → htpolynet-2.13.0}/scripts/check-conda-sync.py +0 -0
  215. {htpolynet-2.12.0 → htpolynet-2.13.0}/scripts/release.sh +0 -0
  216. {htpolynet-2.12.0 → htpolynet-2.13.0}/scripts/render-detail.sh +0 -0
  217. {htpolynet-2.12.0 → htpolynet-2.13.0}/scripts/render-detail.tcl +0 -0
  218. {htpolynet-2.12.0 → htpolynet-2.13.0}/scripts/render-snapshot.sh +0 -0
  219. {htpolynet-2.12.0 → htpolynet-2.13.0}/scripts/run_all_examples.sh +0 -0
  220. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/__init__.py +0 -0
  221. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/analysis/__init__.py +0 -0
  222. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/analysis/analyze.py +0 -0
  223. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/analysis/piercings.py +0 -0
  224. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/analysis/plot.py +0 -0
  225. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/cli.py +0 -0
  226. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/core/__init__.py +0 -0
  227. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/core/bondtemplate.py +0 -0
  228. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/core/configuration.py +0 -0
  229. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/core/coordinates.py +0 -0
  230. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/core/molecule.py +0 -0
  231. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/core/paramcache.py +0 -0
  232. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/core/productsplice.py +0 -0
  233. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/core/projectfilesystem.py +0 -0
  234. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/core/runtime.py +0 -0
  235. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/core/topocoord.py +0 -0
  236. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/core/topology.py +0 -0
  237. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/cure/__init__.py +0 -0
  238. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/cure/chain.py +0 -0
  239. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/cure/curecontroller.py +0 -0
  240. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/cure/expandreactions.py +0 -0
  241. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/cure/reaction.py +0 -0
  242. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/cure/triplesearch.py +0 -0
  243. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/external/__init__.py +0 -0
  244. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/external/ambertools.py +0 -0
  245. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/external/command.py +0 -0
  246. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/external/slurm.py +0 -0
  247. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/external/smiles_input.py +0 -0
  248. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/external/software.py +0 -0
  249. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/geometry/__init__.py +0 -0
  250. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/geometry/bondlist.py +0 -0
  251. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/geometry/lattice.py +0 -0
  252. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/geometry/linkcell.py +0 -0
  253. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/geometry/matrix4.py +0 -0
  254. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/geometry/piercing.py +0 -0
  255. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/geometry/placement.py +0 -0
  256. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/geometry/ring.py +0 -0
  257. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/geometry/templategeom.py +0 -0
  258. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/io/__init__.py +0 -0
  259. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/io/gro.py +0 -0
  260. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/io/mol2.py +0 -0
  261. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/io/pdb.py +0 -0
  262. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/repair/__init__.py +0 -0
  263. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/repair/cyanate_cap.py +0 -0
  264. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/repair/topology_surgery.py +0 -0
  265. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/README.md +0 -0
  266. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/__init__.py +0 -0
  267. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/claude/SKILL.md +0 -0
  268. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/example_depot/0-liquid-styrene.yaml +0 -0
  269. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/example_depot/1-polystyrene.yaml +0 -0
  270. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/example_depot/2-bisgma-styrene-thermoset.yaml +0 -0
  271. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/example_depot/3-pacm-dgeba-epoxy-thermoset.yaml +0 -0
  272. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/example_depot/4-dfda-fde-epoxy-thermoset.yaml +0 -0
  273. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/example_depot/5-htpb-ipdi.yaml +0 -0
  274. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/example_depot/6-cyanate-ester.yaml +0 -0
  275. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/mdp/README.md +0 -0
  276. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/mdp/drag-min.mdp +0 -0
  277. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/mdp/drag-npt.mdp +0 -0
  278. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/mdp/drag-nvt.mdp +0 -0
  279. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/mdp/min.mdp +0 -0
  280. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/mdp/npt.mdp +0 -0
  281. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/mdp/nvt.mdp +0 -0
  282. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/mdp/relax-min.mdp +0 -0
  283. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/mdp/relax-npt.mdp +0 -0
  284. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/mdp/relax-nvt.mdp +0 -0
  285. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/mdp/single-molecule-min.mdp +0 -0
  286. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/mdp/single-molecule-nvt.mdp +0 -0
  287. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/molecules/inputs/DFA.pdb +0 -0
  288. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/molecules/inputs/DGE.mol2 +0 -0
  289. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/molecules/inputs/EMB.mol2 +0 -0
  290. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/molecules/inputs/FDE.pdb +0 -0
  291. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/molecules/inputs/GMA.mol2 +0 -0
  292. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/molecules/inputs/PAC.mol2 +0 -0
  293. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/molecules/inputs/STY.mol2 +0 -0
  294. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/molecules/make-monomers.sh +0 -0
  295. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/molecules/pics/DFA.png +0 -0
  296. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/molecules/pics/DGE.png +0 -0
  297. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/molecules/pics/EMB.png +0 -0
  298. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/molecules/pics/FDE.png +0 -0
  299. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/molecules/pics/GMA.png +0 -0
  300. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/molecules/pics/PAC.png +0 -0
  301. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/molecules/pics/STY.png +0 -0
  302. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/molecules/sample-inputs/DFA.pdb +0 -0
  303. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/molecules/sample-inputs/DGE.mol2 +0 -0
  304. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/molecules/sample-inputs/EMB.mol2 +0 -0
  305. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/molecules/sample-inputs/FDE.pdb +0 -0
  306. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/molecules/sample-inputs/GMA.mol2 +0 -0
  307. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/molecules/sample-inputs/PAC.mol2 +0 -0
  308. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/molecules/sample-inputs/STY.mol2 +0 -0
  309. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/tcl/readbonds.tcl +0 -0
  310. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/tcl/readgrx.tcl +0 -0
  311. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/resources/tcl/render.tcl +0 -0
  312. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/schema/base.yaml +0 -0
  313. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/utils/__init__.py +0 -0
  314. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/utils/banner.py +0 -0
  315. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/utils/checkpoint.py +0 -0
  316. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/utils/convergence.py +0 -0
  317. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/utils/dataframetools.py +0 -0
  318. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/utils/inputcheck.py +0 -0
  319. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/utils/logsetup.py +0 -0
  320. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/utils/profiling.py +0 -0
  321. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/utils/stringthings.py +0 -0
  322. {htpolynet-2.12.0 → htpolynet-2.13.0}/src/htpolynet/utils/vmd_viz.py +0 -0
  323. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/__init__.py +0 -0
  324. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/conftest.py +0 -0
  325. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/__init__.py +0 -0
  326. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/fixtures/config1.gro +0 -0
  327. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/fixtures/config1.top +0 -0
  328. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/fixtures/config2.gro +0 -0
  329. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/fixtures/config2.top +0 -0
  330. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/fixtures/items31.edr +0 -0
  331. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/fixtures/items43.edr +0 -0
  332. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/fixtures/items45.edr +0 -0
  333. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/fixtures/short.mdp +0 -0
  334. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_bondtemplate.py +0 -0
  335. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_cap_placement.py +0 -0
  336. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_chain.py +0 -0
  337. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_checkout_shadowing.py +0 -0
  338. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_completion_bias.py +0 -0
  339. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_conda_sync.py +0 -0
  340. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_config_docs_coverage.py +0 -0
  341. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_configuration.py +0 -0
  342. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_convergence.py +0 -0
  343. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_cure_site_functionality.py +0 -0
  344. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_dataframetools.py +0 -0
  345. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_density_gate.py +0 -0
  346. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_gpu_usability.py +0 -0
  347. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_gromacs_get_energy_menu.py +0 -0
  348. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_gromacs_gmx_energy_trace.py +0 -0
  349. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_inputcheck.py +0 -0
  350. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_linkcell_pierce.py +0 -0
  351. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_mdrun_gpu_options.py +0 -0
  352. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_mol2_bond_fallback.py +0 -0
  353. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_molecule_charge_report.py +0 -0
  354. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_moleculetype_name.py +0 -0
  355. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_multibody_reactions.py +0 -0
  356. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_overlong_bond_report.py +0 -0
  357. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_paramcache.py +0 -0
  358. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_paramcache_ambertools.py +0 -0
  359. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_parameterize_react.py +0 -0
  360. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_piercings.py +0 -0
  361. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_placement_and_ringclose.py +0 -0
  362. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_plot_smoke.py +0 -0
  363. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_productsplice.py +0 -0
  364. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_projectfilesystem.py +0 -0
  365. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_relax_instrumentation.py +0 -0
  366. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_repair_charge_neutrality.py +0 -0
  367. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_repair_conversion.py +0 -0
  368. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_resources.py +0 -0
  369. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_ring.py +0 -0
  370. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_ring_cure_schema.py +0 -0
  371. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_ring_pierce_figs.py +0 -0
  372. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_ringcontroller.py +0 -0
  373. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_setup_claude.py +0 -0
  374. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_sibling_templates.py +0 -0
  375. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_slurm_script.py +0 -0
  376. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_smiles_input.py +0 -0
  377. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_software_provenance.py +0 -0
  378. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_templategeom.py +0 -0
  379. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_topology/test.top +0 -0
  380. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_topology.py +0 -0
  381. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_transrot_turn_scan.py +0 -0
  382. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_triplesearch.py +0 -0
  383. {htpolynet-2.12.0 → htpolynet-2.13.0}/tests/unit/test_user_frcmod.py +0 -0
@@ -7,6 +7,161 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.13.0] - 2026-09-29
11
+
12
+ ### Changed
13
+
14
+ - **Deformation and shear stages now say what a modulus from them is worth.** Every run
15
+ reports the strain it will reach and is told that **one ramp gives a modulus but not
16
+ its uncertainty**: eight independent ramps of one protocol on one network gave shear
17
+ moduli from 1.29 to 1.74 GPa --- 10% scatter --- while each run's own fit reported an
18
+ error an order of magnitude smaller. Take the scatter between seeds as the error bar,
19
+ not the fit's.
20
+
21
+ A run fast enough that little of it sits at low strain also draws a warning, since what
22
+ gets fitted is then a secant over a large window. It does not claim a bias, because
23
+ none is established: a single slow ramp appeared to show the default understating *G*
24
+ threefold and a replicate of that same protocol refuted it. Rate dependence past yield
25
+ is real and does replicate --- 1.22 +/- 0.06 GPa at `edot = 1e-3` against
26
+ 0.96 +/- 0.02 at `1e-4`. The default is unchanged.
27
+
28
+ - **Deformation and shear stages now sample stress ten times more often.** Both
29
+ inherited `nstenergy = 500` from the packaged `npt.mdp`, one frame per ps --- and
30
+ stress is the quantity these stages exist to measure. Tested on a real shear run:
31
+ going to a frame every 0.1 ps cut the standard error on the fitted modulus by
32
+ sqrt(10), which is the independent-sample scaling, so the extra frames carry real
33
+ information rather than repeating themselves. The cost is a larger `edr` and nothing
34
+ else --- no change to the trajectory, the ensemble, or the physics.
35
+
36
+ ### Fixed
37
+
38
+ - **Gromacs warnings were discarded, so nobody ever saw one.** htpolynet runs every
39
+ `grompp` with `-maxwarn 4`, so up to four warnings do not stop a run, and the command
40
+ wrapper only echoes captured output when a command *fails*. Between them, a warning on
41
+ a successful run reached neither the user nor the diagnostic log.
42
+
43
+ That is how the Berendsen barostat deprecation --- emitted by every constant-pressure
44
+ stage htpolynet runs, on every Gromacs since 2025 --- went unnoticed for as long as it
45
+ has been emitted, and it is why the shear stage's off-diagonal conflict had to be found
46
+ by running `grompp` by hand. Warnings are how Gromacs says a setup is questionable,
47
+ and they are worth seeing even when the run proceeds. They are now logged at WARNING
48
+ level, with the mdp that produced them.
49
+
50
+
51
+ - **Uniaxial deformation was rejected by Gromacs 2025 before it started, so Young's
52
+ modulus could not be measured at all.** From Gromacs 2025, combining `deform` with
53
+ generated velocities is a hard grompp *error* unless `deform-init-flow = yes` is set,
54
+ because the initial velocities have to carry the flow profile the deformation implies.
55
+ htpolynet never set it. Every `deform` stage therefore failed at grompp on a current
56
+ Gromacs --- not with a bad number, but with no run. Both `deform` and the new `shear`
57
+ now set it.
58
+
59
+ This was invisible because nothing ran the stage: `analysis/postsim.py` had no tests,
60
+ and the deformation traces on hand were produced by an older Gromacs. It was found by
61
+ putting a real mdp through `gmx grompp` while trying to build a shear fixture.
62
+
63
+ ### Added
64
+
65
+ - **The shear stage's box coupling is now a choice, because it changes the answer by
66
+ 29%.** `ring_cure`-style shear has to be run somehow, and there are three defensible
67
+ ways to hold the box while shearing it; measured on one network with replicates they
68
+ give *G* of 1.17, 1.35 and 1.51 GPa. That spread is wider than the trajectory scatter
69
+ of any of them, so it does not average away. `coupling: clamped` (the default, and
70
+ what every measurement so far used) keeps the two unsheared directions at pressure;
71
+ `coupling: isochoric` uses no barostat at all, needs no uncoupling, and is the only one
72
+ of the three that passes `grompp` with no warnings whatsoever.
73
+
74
+ The default is unchanged, and not because it is the best: the Poisson ratio read off
75
+ the box dimensions ranks it last of the three. It is unchanged because that is one
76
+ cross-check at one strain, and switching would silently move every *G* anyone has
77
+ measured. The stage now logs which coupling it used, so a *G* is never quoted without
78
+ it.
79
+
80
+ - **A `shear` postsim stage, for the shear modulus.** The counterpart of `deform`:
81
+ Gromacs' `deform` drives one off-diagonal element of the box matrix at a constant
82
+ rate, and *G* is the slope of shear stress against engineering shear strain, exactly
83
+ as *E* is the slope of tensile stress against tensile strain. `direction` names the
84
+ plane --- `xy`, `xz` or `yz` --- and `edot` is the shear rate in ps^-1.
85
+
86
+ The normal directions stay pressure-coupled at `P` while the off-diagonal is driven,
87
+ because the anisotropic barostat is given zero compressibility off the diagonal and so
88
+ does not oppose the deformation. The stage writes the driven box element and the
89
+ matching off-diagonal of the pressure tensor, with derived `-strain` and `-stress`
90
+ columns; `analysis.utils.compute_G` fits those, as `compute_E` does for tension.
91
+
92
+ One thing that differs from the tensile case and is easy to get wrong: the engineering
93
+ shear strain is the driven box element over the length of the sheared face and starts
94
+ at **zero**, so it carries no `-1`.
95
+
96
+ **A known disagreement, stated because it is not resolved in this release.** Shearing
97
+ by `deform` requires the barostat to be switched off for the Cartesian component the
98
+ shear moves, since Gromacs refuses the run otherwise. *G* from that configuration
99
+ comes out 1.51 +/- 0.05 GPa where a less constrained variant gives 1.17 +/- 0.02 on the
100
+ same network --- and only the latter is consistent with that network's own *E* and
101
+ Poisson ratio. So *G* here disagrees with *E* by about a quarter.
102
+
103
+ The tempting explanation, that the constraint inflates *G*, does not survive its own
104
+ test: a constant-volume variant fixes all three box dimensions rather than one, so it
105
+ is more constrained still, and its mean sits below the clamped value. The cause is
106
+ open. Treat *G* from this stage as disagreeing with *E* by roughly a quarter, and do
107
+ not assume you know why.
108
+
109
+ **The mdp is accepted by Gromacs; no *G* has been measured.** Putting it through
110
+ `gmx grompp` found two defects the unit tests could not: the barostat must be
111
+ uncoupled for the Cartesian component the shear moves, not merely off the diagonal ---
112
+ grompp warns of "spurious periodicity effects" otherwise --- and `deform-init-flow`
113
+ must be set, which is a hard error without. Both are fixed and grompp now accepts
114
+ every plane. The energy terms it traces (`Box-YX`, `Box-ZX`, `Box-ZY`, `Pres-XY`,
115
+ `Pres-XZ`, `Pres-ZY`) were confirmed present in Gromacs 2025.4.
116
+
117
+ **First real run, on a threading-filtered BADCy network of 12,600 atoms:** both stages
118
+ completed, the stress-strain curve has the right shape for a glassy thermoset --- an
119
+ elastic rise to about gamma 0.08, a roll-over, then a yield plateau near 160-175 MPa
120
+ --- and *G* comes out 1.3 +/- 0.2 GPa over gamma 0.08-0.10. `deform` with
121
+ `deform-init-flow` was also verified on Gromacs 2026.3, not only the 2025.4 used here.
122
+
123
+ That *G* is one window's slope, not a zero-strain tangent, and should not be quoted as
124
+ a converged modulus. Below gamma 0.03 the fit has no power at all --- the standard
125
+ error exceeds the estimate and the sign flips --- because per-frame virial noise is
126
+ 456 bar and a 300 ps ramp at `edot = 1e-3` puts only 20 frames below that strain.
127
+ Above it the fitted *G* falls from 2.08 to 1.31 GPa as the window grows, the same way
128
+ the uniaxial fixture's *E* falls from 4.74 to 2.72. A slower ramp, or more frequent
129
+ energy output at the same rate, is what a modulus fixture needs. `ROADMAP.md` carries
130
+ this, and the related finding that the uniaxial trace has no resolved elastic region
131
+ either.
132
+
133
+ - **Real simulation traces as test fixtures, for Tg and Young's modulus.** Until now
134
+ every test of those fits used synthetic data, where a clean straight line recovers its
135
+ slope to eight digits. `tests/unit/fixtures/` now carries a real 61-point temperature
136
+ ladder and a real 1001-frame uniaxial deformation, the latter written by
137
+ `PostSimDeform` itself.
138
+
139
+ They show what synthetic data cannot. On the real ladder, Tg spans **377 to 406 K**
140
+ across fit windows a reasonable person would choose; on the real deformation, E spans
141
+ **2420 to 4398 MPa**, nearly a factor of two. The R-squared of a perfectly sensible
142
+ modulus fit is under 0.5, because single-frame pressure in MD scatters hugely --- so
143
+ anyone tempted to add an R-squared quality gate should look at that first. All of
144
+ this is now pinned by tests, and `ROADMAP.md` carries what to do about it.
145
+
146
+ There is deliberately **no shear fixture**, and a test asserts its absence so that
147
+ adding one forces the accompanying tests to be written. No shear simulation has been
148
+ run.
149
+
150
+ - **Tests for the two numbers postsim exists to produce.** `analysis/postsim.py` was a
151
+ zero-coverage module, and `compute_E` and `compute_tg` --- the fits behind Young's
152
+ modulus and the glass transition --- had no tests at all, while the `shear` stage added
153
+ hours earlier did. Now covered: both fits against known slopes and a known
154
+ intersection, the mdp construction for every `deform` and `shear` direction, that the
155
+ driven axis is not pressure-coupled while the others are, and that an unknown direction
156
+ is refused rather than guessed.
157
+
158
+ Two of those tests document behavior rather than assert it is good. `compute_E` fitted
159
+ across a rolled-over stress curve understates the modulus by more than a factor of two,
160
+ which is what the fit window exists to prevent. And `compute_tg` trusts its windows: a
161
+ hot window reaching about 20 K below the transition biases Tg roughly 7 K low, with no
162
+ check and no warning. `ROADMAP.md` carries what a fix would look like.
163
+
164
+
10
165
  ## [2.12.0] - 2026-09-28
11
166
 
12
167
  ### Added
@@ -102,6 +257,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
102
257
  case for both filters is mechanism, not measured harm. Set
103
258
  `ring_cure.reject_new_threading: false` to reproduce the old behavior.
104
259
 
260
+ **Acceptance test, 24 builds on one image, filters the only difference:**
261
+
262
+ filtered (both on) 0 of 12 builds affected, 0 piercings
263
+ control (both off) 8 of 12 builds affected, 10 piercings
264
+
265
+ Fisher two-tailed p = 0.00135, reproduced here. All 24 completed at 233-234 rings and
266
+ conversion 0.971-0.975, so the filters cost no conversion and no rings. Eleven
267
+ threading declines prevented ten piercings --- a near-match worth quoting, since many
268
+ more would mean over-rejection and many fewer would mean missed cases --- at 0 to 3 per
269
+ build. The ladder's own `max_accept` declines are counted separately, so the two are
270
+ not summed by mistake.
271
+
272
+ Two limits stated rather than buried. Zero of twelve bounds the filtered rate below
273
+ **22%** at 95% confidence, not below zero. And the measurement used
274
+ `htpolynet piercings`, four of whose regression fixtures came from the control builds,
275
+ so the independence is in the implementation rather than in the test data.
276
+
105
277
 
106
278
  ### Changed
107
279
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: htpolynet
3
- Version: 2.12.0
3
+ Version: 2.13.0
4
4
  Summary: Automated MD System Builder for Amorphous Network Polymers
5
5
  Project-URL: Source, https://github.com/cameronabrams/htpolynet
6
6
  Project-URL: Documentation, https://htpolynet.readthedocs.io/
@@ -97,9 +97,243 @@ Coverage as of the last measurement: **38.8%** overall.
97
97
  statements, both at 0% — in the only way that is honest, since faking
98
98
  the whole AmberTools/Gromacs tool chain to unit-test the orchestration
99
99
  is a large effort for less confidence.
100
- - **Remaining zero-coverage modules**: `analysis/postsim.py` (203),
101
- `cli.py` (165), `analysis/analyze.py` (137), `utils/vmd_viz.py` (75),
102
- `utils/checkpoint.py` (54).
100
+ - **Remaining zero-coverage modules**: `cli.py` (165),
101
+ `analysis/analyze.py` (137), `utils/vmd_viz.py` (75),
102
+ `utils/checkpoint.py` (54). `analysis/postsim.py` came off this list in
103
+ 2.13.0: the mdp construction for `deform` and `shear` is covered, as are
104
+ `compute_E` and `compute_tg`, which produce the two numbers postsim exists
105
+ to produce. What is still untested there is the parts that run Gromacs.
106
+ - **No deformation run htpolynet produces resolves an elastic region.** Measured on
107
+ both a real uniaxial trace and the first real shear trace, fitting over increasing
108
+ upper strain limits:
109
+
110
+ E, furan epoxy, 1001 frames 5.13 -> 4.74 -> 3.90 -> 2.72 GPa as the window
111
+ grows from 0.02 to 0.10; no plateau
112
+ G, BADCy ring cure, 301 frames -0.63 (SE 1.79) at 0.02, no power at all below
113
+ 0.03; 1.3 +/- 0.2 over 0.08-0.10
114
+
115
+ The shear run has both problems; an earlier version of this entry said it had only the
116
+ first. It has too few **frames per unit strain** --- 1003 against the uniaxial trace's
117
+ 7526 --- so the low-strain fit has no statistical power, which a slower ramp cures, or
118
+ more cheaply a higher `nstenergy` at the same rate. And its fitted modulus also falls
119
+ with the window, the same way the uniaxial one does:
120
+
121
+ window 0.04 0.05 0.06 0.08 0.10
122
+ E (GPa) 4.74 4.32 3.90 3.31 2.72 falls 43%, still falling
123
+ G (GPa) 2.08 1.58 1.37 1.38 1.31 falls 37%, last three within
124
+ 0.07 of each other
125
+
126
+ So neither is a zero-strain tangent, and `compute_E` and `compute_G` both return one
127
+ window's slope as though it were.
128
+
129
+ **Sampling harder does not fix it, and that has now been tested.** Repeating the shear
130
+ run at ten times the energy output --- 10,003 frames per unit strain against 1003 ---
131
+ cut the standard error by sqrt(10), confirming the frames were already near-independent
132
+ and that denser output buys real information cheaply. htpolynet now asks for it: both
133
+ stages set `nstenergy` and `nstcalcenergy` to 50 rather than inheriting the packaged
134
+ 1 ps. But the slide survived: *G* over the same windows went 1.41, 1.30, 1.22 GPa at
135
+ standard errors of 0.11, 0.07, 0.05, so the fall is larger than the error bars and is
136
+ **physical, not statistical**. An apparent plateau in the sparser data was the error
137
+ bars, not the material.
138
+
139
+ - **The shear stage's *G* is 29% above a less constrained variant, and nobody knows
140
+ why.**
141
+ `reject`-free shear by `deform` needs the barostat switched off for the Cartesian
142
+ component the shear moves, or Gromacs refuses the run: *"an off-diagonal box element
143
+ has deform set while compressibility > 0 for the same component of another box
144
+ vector"*. Confirmed here and independently by htpolynet-study. But the clamp is not
145
+ free:
146
+
147
+ clamped (n=8) G = 1.51 +/- 0.05 E/G 2.01 implied nu +0.00
148
+ free-x (n=3) G = 1.17 +/- 0.02 E/G 2.59 implied nu +0.29
149
+ nu straight off the box dimensions nu +0.35 +/- 0.01
150
+
151
+ The difference is 0.34 +/- 0.05 GPa, 6.3 sigma, and only the unclamped number is
152
+ consistent with the network's own Poisson ratio or with *E* = 3.03 +/- 0.21 measured on
153
+ the same system. So htpolynet ships a shear stage whose *G* disagrees with its own
154
+ *E*, by a quarter.
155
+
156
+ **"The clamp inflates it" is the obvious explanation and it does not survive.**
157
+ Constant-volume shear fixes *all three* box dimensions, so it is more constrained than
158
+ the clamped stage, which fixes only one --- yet its mean sits *below* clamped:
159
+
160
+ clamped (n=8) 1.51 +/- 0.05 sd 0.15
161
+ free-x (n=3) 1.17 +/- 0.02 sd 0.04
162
+ NVT (n=3) 1.41 +/- 0.25 sd 0.43
163
+
164
+ If constraint simply raised *G*, NVT would be highest. At n=3 it is also consistent
165
+ with both of the others, so it decides nothing yet; separating 1.17 from 1.51 at two
166
+ sigma needs about thirteen replicates. What the NVT arm does show is that its
167
+ trajectory scatter is ten times free-x's and three times clamped's, which is worth
168
+ understanding in itself.
169
+
170
+ **There is a third option neither of us had tried, and it is clean.** Measured here
171
+ with `gmx grompp`:
172
+
173
+ pcoupl = no ACCEPTED, zero warnings, no clamp needed
174
+ C-rescale + clamped ERROR: "C-rescale does not support pressure
175
+ coupling type Anisotropic yet"
176
+ Berendsen anisotropic, free WARNING: off-diagonal/compressibility conflict
177
+
178
+ Constant-volume shear sidesteps the conflict entirely, because with no barostat there
179
+ is no compressibility to conflict with. Simple shear preserves volume to first order,
180
+ so it is a defensible protocol rather than a workaround --- but it is a different
181
+ ensemble from the one the stage now uses, and nobody has measured *G* that way here.
182
+
183
+ **Settled at n=12, and the answer is that there is no single answer.**
184
+
185
+ clamped 1.51 +/- 0.05 (n=8) E/G 2.01 implied nu +0.00
186
+ NVT 1.35 +/- 0.07 (n=12) E/G 2.25 implied nu +0.12
187
+ free-x 1.17 +/- 0.02 (n=3) E/G 2.59 implied nu +0.29
188
+ nu straight off the box dimensions +0.35
189
+
190
+ Three defensible protocols spanning 29%, wider than the trajectory scatter of any of
191
+ them, so **replication cannot fix it**. NVT lands between the other two, confirming
192
+ neither story: it constrains all three box dimensions yet sits below the singly
193
+ clamped run, so constraint does not simply raise *G*.
194
+
195
+ The Poisson ratio is the only independent arbiter available and it ranks free-x best,
196
+ NVT second, the shipped default last --- but that is one cross-check on a chord at 3%
197
+ strain, which is not enough to change a default on. So the coupling became a
198
+ documented option (`clamped`, `isochoric`) with the default unchanged and the choice
199
+ logged, rather than a silent switch.
200
+
201
+ **What would settle it: a modulus that does not come from a ramp at all.** Every
202
+ number in the table above is a non-equilibrium measurement --- impose a strain rate,
203
+ read the stress --- so they share the assumptions being argued about. Two standard
204
+ routes avoid that, and both are available in the Gromacs here; the enabling mdp for
205
+ each was checked with `grompp`.
206
+
207
+ *Strain fluctuations, at equilibrium.* Let the box fluctuate freely in shape and read
208
+ the elastic compliance off the fluctuations: `S = V <de de> / kT`, inverted for the
209
+ stiffness tensor and hence *E*, *G* and nu together. No strain rate and no clamping
210
+ decision exists to make. Needs `pcoupl = Parrinello-Rahman` with
211
+ `pcoupltype = anisotropic` and all six compressibility components non-zero, which is
212
+ **ACCEPTED with zero warnings** --- note that `pcoupltype = triclinic` is no longer a
213
+ valid enum, and that C-rescale cannot do anisotropic at all, so this is another reason
214
+ the barostat migration points at Parrinello-Rahman. The data required is only the box
215
+ trajectory, which is already in the `edr` as `Box-X/Y/Z` and `Box-YX/ZX/ZY`. The cost
216
+ is convergence: strain fluctuations are slow, and this wants nanoseconds rather than
217
+ the hundreds of picoseconds a ramp needs.
218
+
219
+ *Athermal elastic constants, statically.* Minimize, apply a small affine strain to the
220
+ box and coordinates (0.1 to 0.5%), re-minimize at fixed box, read the stress; repeat
221
+ for each independent strain component. That gives the full 0 K stiffness tensor, so
222
+ *E*, *G* and nu come from one calculation and are guaranteed mutually consistent. It
223
+ involves no thermostat, no barostat and no rate, so it is independent of everything
224
+ currently in dispute, and it is cheap --- a dozen short minimizations. The limitation
225
+ is that 0 K moduli are systematically stiffer than 300 K ones, so it arbitrates the
226
+ *ratio* `E/G` and nu cleanly while saying less about the absolute values.
227
+
228
+ Since what is actually in dispute is which coupling gives a *G* consistent with the
229
+ network's *E* and nu, the athermal route answers the question asked at a fraction of
230
+ the cost, and the fluctuation route answers the more general one later.
231
+
232
+ Note also, for the barostat entry above: **C-rescale cannot replace Berendsen in the
233
+ anisotropic stages** --- it does not support that coupling type --- so moving off
234
+ Berendsen is not a one-line substitution wherever `pcoupltype = anisotropic` is used.
235
+
236
+ - **RESOLVED for shear, 2026-09-28: G = 1.51 +/- 0.05 GPa** over gamma <= 0.03, from
237
+ eight independent ramps at `edot = 1e-4` on one BADCy network. Averaged over
238
+ replicates the modulus *does* flatten, which no single trajectory could show:
239
+
240
+ window G (GPa) sd across 8 ramps
241
+ 0.0075 2.71 1.88
242
+ 0.0100 2.21 0.94
243
+ 0.0150 1.68 0.27
244
+ 0.0200 1.60 0.20
245
+ 0.0300 1.51 0.15
246
+
247
+ 1.68 to 1.51 is 0.17 +/- 0.11, about 1.5 sigma --- a plateau, not a slide. Below
248
+ gamma 0.01 it stays unresolved even at n=8, with 70% scatter; that needs a larger cell
249
+ rather than more trajectories.
250
+
251
+ **The relentless slide both of us chased was largely a single-draw artifact.** Checked
252
+ against the uniaxial fixture the same way: every step from gamma 0.0075 to 0.04 is
253
+ 1.2 sigma or less, so at n=1 that curve cannot distinguish a plateau from a decline
254
+ either. What is real there is the fall past 0.04 --- 3.8 sigma to 0.06 and 9.8 sigma
255
+ to 0.10 --- which is the approach to yield, not the modulus.
256
+
257
+ **What actually dominates is trajectory-to-trajectory scatter, and it is large.** Two
258
+ runs of the same protocol on the same starting structure, differing only in the
259
+ velocity seed, at 100,000 frames per unit strain:
260
+
261
+ gamma bin run B run C separation
262
+ 0.005-0.010 287 +/- 21 122 +/- 20 5.7 sigma
263
+ 0.025-0.030 547 +/- 20 369 +/- 22 6.1 sigma
264
+
265
+ Between-trajectory scatter beats within-trajectory standard error sixfold. Across the
266
+ eight-replicate set the per-trajectory moduli were 1.51, 1.29, 1.51, 1.74, 1.63, 1.60,
267
+ 1.32 and 1.48 GPa --- 10% scatter, against fit errors an order smaller. So **one ramp
268
+ gives a modulus to about 10% but gives no usable uncertainty**, and a fit's own error
269
+ bar is not that uncertainty. An earlier version of this entry said no modulus was
270
+ quotable from one ramp, which was too strong.
271
+
272
+ A single slow ramp appeared to show the default rate understating *G* threefold ---
273
+ 3.5-4.5 GPa against 1.22. A replicate of that same protocol refuted it, giving
274
+ 1.35 +/- 0.50 where the first gave 3.51 +/- 0.80. That claim is withdrawn, and this
275
+ entry previously asserted it.
276
+
277
+ Rate dependence past yield is real and does survive replication: 1.22 +/- 0.06 GPa at
278
+ `edot = 1e-3` against 0.96 +/- 0.02 at `1e-4` over gamma <= 0.10. Whether rate biases
279
+ the *modulus* is unresolved.
280
+
281
+ htpolynet reports the strain a run will reach, tells every run that one ramp is not
282
+ quotable, and warns when the rate is fast enough that little of the run sits at low
283
+ strain --- without claiming a bias it cannot support. The default is unchanged.
284
+
285
+ **How uninterpretable a single ramp is, put a third way.** Fitting *E* and *G* on the
286
+ same network at the same rate over the same windows, and taking the implied Poisson
287
+ ratio from `E/G = 2(1 + nu)`:
288
+
289
+ window E (GPa) G (GPa) E/G implied nu
290
+ 0.03 3.07 +/- 0.16 1.29 +/- 0.10 2.37 +0.19
291
+ 0.05 3.00 +/- 0.07 1.39 +/- 0.05 2.16 +0.08
292
+ 0.10 1.24 +/- 0.15 0.96 +/- 0.02 1.29 -0.35
293
+ 0.15 0.90 +/- 0.05 0.92 +/- 0.01 0.98 -0.51
294
+
295
+ A real material needs `E/G` between 2 and 3. Six of eight windows imply a negative
296
+ Poisson ratio. A setup fault was ruled out first --- the uniaxial run drives x with y
297
+ and z left coupled at 1 bar, so Poisson contraction is allowed, and the box went
298
+ 5.21468 to 6.77918 nm, exactly the 0.30000 strain requested. The stage is right; one
299
+ trajectory is simply not a measurement.
300
+
301
+ What that leaves is a choice rather than a bug. At the strain rates MD can reach there
302
+ may be no linear regime to find, in which case the honest output is a secant modulus
303
+ with its strain window quoted alongside, not a single number called *E* or *G*. The
304
+ alternatives are extrapolating the tangent to zero strain, or ramping slowly enough
305
+ that a linear regime appears --- which is being tested.
306
+
307
+ Worth doing: fit over a ladder of windows and report the trend, or extrapolate to zero
308
+ strain, rather than returning one slope. Per-frame virial noise is 355-456 bar on
309
+ these systems, which is the floor any scheme has to work against.
310
+
311
+ - **Neither `compute_tg` nor `compute_E` records the fit window that produced a
312
+ number, and on real data the window moves the answer a lot.** Measured on the two
313
+ traces now in `tests/unit/fixtures/`:
314
+
315
+ compute_tg on a real ladder 377.1 to 406.3 K across cold/hot windows of
316
+ 8-20 and 10-30 points -- a 29 K spread
317
+ compute_E on a real deformation 2420 to 4398 MPa across four ordinary fit
318
+ windows -- nearly a factor of two
319
+
320
+ Both are numbers that go into papers, and nothing in the output says which window
321
+ produced one. On synthetic data the same functions recover their input to eight
322
+ digits, which is why this was invisible until real traces were used as fixtures.
323
+
324
+ Worth doing: have both functions return the window alongside the value, and have
325
+ `postsim` record it next to the trace. A stronger version would report the spread
326
+ across a range of windows as an uncertainty, which is closer to what the number
327
+ actually is.
328
+
329
+ - **`compute_tg` trusts its fit windows and does not check them.** It fits the
330
+ first `n_points[0]` and last `n_points[1]` points of a temperature ladder and
331
+ takes it on faith that each window lies wholly on one side of the transition.
332
+ It does not verify that, and it does not warn. A hot window reaching about
333
+ 20 K below Tg biases the answer roughly 7 K low --- small enough to look like
334
+ a real Tg and be quoted as one. A test now documents the bias. A fix would
335
+ be to check each window's residuals against its own line and report when a
336
+ window is not straight, which is what a straddled window looks like.
103
337
  - **`analysis/plot.py` is at 34%** after the smoke-test pass. The
104
338
  diagnostics-log parsers (`diagnostics_graphs`, `_token_match`,
105
339
  `_parse_data`) are the part most likely to rot silently — they already
@@ -1629,6 +1863,31 @@ Coverage as of the last measurement: **38.8%** overall.
1629
1863
 
1630
1864
  ## Simulation defaults
1631
1865
 
1866
+ - **Every constant-pressure stage uses the Berendsen barostat, which does not sample the
1867
+ NPT ensemble and is deprecated upstream.** `npt.mdp`, `drag-npt.mdp` and
1868
+ `relax-npt.mdp` all set `pcoupl = Berendsen`, and nothing in the Python overrides it,
1869
+ so this covers densification, precure and postcure equilibration, the CURE relax
1870
+ ladder, the ring cure's relax and equilibrate, and both deformation stages. Gromacs
1871
+ 2025 says so at every `grompp`: *"The Berendsen barostat does not generate any strictly
1872
+ correct ensemble, and should not be used for new production simulations... We recommend
1873
+ using the C-rescale barostat instead."*
1874
+
1875
+ Raised by htpolynet-study 2026-09-28 in the context of moduli, where it matters most:
1876
+ a barostat that does not sample the right volume fluctuations is a poor foundation for
1877
+ a mechanical measurement.
1878
+
1879
+ **The reason this has not simply been changed is reproducibility, not doubt.**
1880
+ Switching to C-rescale changes the sampled ensemble, so every density, Tg and modulus
1881
+ htpolynet has produced becomes not strictly comparable with anything produced after.
1882
+ There is precedent for taking that cost deliberately --- 2.7.0 changed the constraint
1883
+ scheme for the same kind of reason and said so in the notes --- and the same treatment
1884
+ fits here: change all three together, say plainly in the changelog that prior results
1885
+ are not comparable, and ideally re-measure one known system across the change so the
1886
+ size of the shift is on record rather than assumed.
1887
+
1888
+ Whoever takes it should also check whether `tau_p` wants revisiting: a value tuned for
1889
+ Berendsen's weak coupling is not necessarily right for C-rescale.
1890
+
1632
1891
  - **The density-convergence tolerance may be tight for example 6.** In the
1633
1892
  v2.10.0 sweep, example 6 failed the gate for the first time in four sweeps:
1634
1893
  "sem 1.070 exceeds tolerance 1.000" after 6 extensions, with the last window
@@ -398,7 +398,20 @@ The purpose of the ``postsim`` subcommand is to control the execution of several
398
398
  --no-banner suppress the startup banner
399
399
  --loglevel LOGLEVEL log level for the diagnostic file (debug|info)
400
400
 
401
- The simulations are controlled by the YAML-format config file, which is _distinct_ from the cfg file used to generate the project(s). The types of post-build MD simulations available are annealing, equilibration, temperature-ladder, and uniaxial deformation. Demonstrations of how the ladder and deformation simulations are used to compute the glass-transition temperature and Young's modulus are detailed in the tutorials.
401
+ The simulations are controlled by the YAML-format config file, which is _distinct_ from the cfg file used to generate the project(s). The types of post-build MD simulations available are annealing, equilibration, temperature-ladder, uniaxial deformation, and simple shear. Demonstrations of how the ladder and deformation simulations are used to compute the glass-transition temperature and Young's modulus are detailed in the tutorials.
402
+
403
+ A ``shear`` stage is the shear counterpart of ``deform``: Gromacs' ``deform`` drives one off-diagonal element of the box matrix at a constant rate, and the shear modulus *G* is the slope of shear stress against engineering shear strain, just as *E* is the slope of tensile stress against tensile strain. ``direction`` names the plane --- ``xy``, ``xz`` or ``yz`` --- and ``edot`` is the shear rate in ps\ :sup:`-1`. The normal directions stay pressure-coupled at ``P`` while the off-diagonal is driven, because the anisotropic barostat is given zero compressibility off the diagonal and so does not oppose the deformation.
404
+
405
+ .. code-block:: yaml
406
+
407
+ - shear:
408
+ direction: xy
409
+ T: 300.0
410
+ P: 1.0
411
+ edot: 0.001
412
+ ps: 1000
413
+
414
+ The stage writes ``shear-xy.csv`` with the driven box element and the matching off-diagonal of the pressure tensor, plus the derived ``-strain`` and ``-stress`` columns. ``htpolynet.analysis.utils.compute_G`` fits those to a modulus, as ``compute_E`` does for tension. Note that the engineering shear strain is the box element over the length of the sheared face and starts at zero, so unlike the tensile strain it carries no ``-1``.
402
415
 
403
416
  ``htpolynet analyze``
404
417
  !!!!!!!!!!!!!!!!!!!!!
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "htpolynet"
7
- version = "2.12.0"
7
+ version = "2.13.0"
8
8
  authors = [
9
9
  { name="Cameron F Abrams", email="cfa22@drexel.edu" },
10
10
  ]