htpolynet 2.6.2__tar.gz → 2.7.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 (340) hide show
  1. {htpolynet-2.6.2 → htpolynet-2.7.0}/CHANGELOG.md +108 -0
  2. {htpolynet-2.6.2 → htpolynet-2.7.0}/PKG-INFO +1 -1
  3. {htpolynet-2.6.2 → htpolynet-2.7.0}/ROADMAP.md +267 -10
  4. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/configs/configs-for-run.rst +4 -4
  5. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/program-flow.rst +54 -0
  6. {htpolynet-2.6.2 → htpolynet-2.7.0}/pyproject.toml +1 -1
  7. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/cure/curecontroller.py +154 -3
  8. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/repair/cyanate_cap.py +43 -5
  9. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/mdp/npt.mdp +2 -1
  10. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/mdp/nvt.mdp +2 -1
  11. htpolynet-2.7.0/tests/unit/test_relax_instrumentation.py +151 -0
  12. htpolynet-2.7.0/tests/unit/test_repair_conversion.py +118 -0
  13. htpolynet-2.6.2/tests/unit/test_repair_conversion.py +0 -63
  14. {htpolynet-2.6.2 → htpolynet-2.7.0}/.claude/settings.json +0 -0
  15. {htpolynet-2.6.2 → htpolynet-2.7.0}/.claude/skills/htpolynet/SKILL.md +0 -0
  16. {htpolynet-2.6.2 → htpolynet-2.7.0}/.envrc +0 -0
  17. {htpolynet-2.6.2 → htpolynet-2.7.0}/.github/workflows/conda-forge-sync.yml +0 -0
  18. {htpolynet-2.6.2 → htpolynet-2.7.0}/.github/workflows/docker.yml +0 -0
  19. {htpolynet-2.6.2 → htpolynet-2.7.0}/.github/workflows/release.yaml +0 -0
  20. {htpolynet-2.6.2 → htpolynet-2.7.0}/.github/workflows/test.yml +0 -0
  21. {htpolynet-2.6.2 → htpolynet-2.7.0}/.gitignore +0 -0
  22. {htpolynet-2.6.2 → htpolynet-2.7.0}/.readthedocs.yaml +0 -0
  23. {htpolynet-2.6.2 → htpolynet-2.7.0}/CITATION.cff +0 -0
  24. {htpolynet-2.6.2 → htpolynet-2.7.0}/CLAUDE.md +0 -0
  25. {htpolynet-2.6.2 → htpolynet-2.7.0}/LICENSE +0 -0
  26. {htpolynet-2.6.2 → htpolynet-2.7.0}/MANIFEST.in +0 -0
  27. {htpolynet-2.6.2 → htpolynet-2.7.0}/README.md +0 -0
  28. {htpolynet-2.6.2 → htpolynet-2.7.0}/docker/Dockerfile +0 -0
  29. {htpolynet-2.6.2 → htpolynet-2.7.0}/docker/compose.yml +0 -0
  30. {htpolynet-2.6.2 → htpolynet-2.7.0}/docker/docker-entrypoint.sh +0 -0
  31. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/Makefile +0 -0
  32. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/README.rst +0 -0
  33. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/make.bat +0 -0
  34. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/requirements.txt +0 -0
  35. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/_static/.gitkeep +0 -0
  36. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/changelog.rst +0 -0
  37. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/conf.py +0 -0
  38. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/0-liquid-styrene/configuration.rst +0 -0
  39. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/0-liquid-styrene/index.rst +0 -0
  40. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/0-liquid-styrene/introduction.rst +0 -0
  41. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/0-liquid-styrene/monomer.rst +0 -0
  42. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/0-liquid-styrene/postsim.rst +0 -0
  43. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/0-liquid-styrene/results.rst +0 -0
  44. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/0-liquid-styrene/run.rst +0 -0
  45. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/configuration.rst +0 -0
  46. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/index.rst +0 -0
  47. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/introduction.rst +0 -0
  48. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/monomer.rst +0 -0
  49. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/pics/STY.png +0 -0
  50. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/pics/STYCC.png +0 -0
  51. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/pics/buildtraces.png +0 -0
  52. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/pics/cure_info.png +0 -0
  53. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/pics/densification-density.png +0 -0
  54. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/pics/final-box.png +0 -0
  55. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/pics/reaction_network.png +0 -0
  56. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/pics/sty-coloring.tcl +0 -0
  57. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/pics/sty-cured.png +0 -0
  58. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/pics/sty-detail.png +0 -0
  59. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/pics/sty-liq.png +0 -0
  60. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/pics/styrene-polymerization.png +0 -0
  61. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/postsim.rst +0 -0
  62. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/reactions.rst +0 -0
  63. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/results.rst +0 -0
  64. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/run.rst +0 -0
  65. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/configuration.rst +0 -0
  66. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/index.rst +0 -0
  67. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/introduction.rst +0 -0
  68. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/BPA.png +0 -0
  69. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/GMA.png +0 -0
  70. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/HIE.png +0 -0
  71. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/buildtraces.png +0 -0
  72. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/cure_info.png +0 -0
  73. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/densification-density.png +0 -0
  74. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/four_dimers.eps +0 -0
  75. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/four_dimers.fig +0 -0
  76. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/four_dimers.png +0 -0
  77. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-coloring.tcl +0 -0
  78. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-cured.png +0 -0
  79. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-detail.png +0 -0
  80. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-liq.png +0 -0
  81. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/p1-traces.png +0 -0
  82. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/reaction_network.png +0 -0
  83. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/vesys.eps +0 -0
  84. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/vesys.fig +0 -0
  85. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/vesys.png +0 -0
  86. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/postsim.rst +0 -0
  87. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/reactions.rst +0 -0
  88. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/results.rst +0 -0
  89. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/run.rst +0 -0
  90. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/configuration.rst +0 -0
  91. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/index.rst +0 -0
  92. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/introduction.rst +0 -0
  93. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/monomers.rst +0 -0
  94. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/DGE-epoxy.png +0 -0
  95. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/DGE-labelled.png +0 -0
  96. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/PAC-2d.png +0 -0
  97. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/PAC-labelled.png +0 -0
  98. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/buildtraces.png +0 -0
  99. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/cure_info.png +0 -0
  100. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/densification-density.png +0 -0
  101. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-coloring.tcl +0 -0
  102. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-cured.png +0 -0
  103. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-detail.png +0 -0
  104. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-liq.png +0 -0
  105. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dgesys.eps +0 -0
  106. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dgesys.fig +0 -0
  107. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dgesys.png +0 -0
  108. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/equil-rho_v_ns.png +0 -0
  109. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/postsim-typical.png +0 -0
  110. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/prod-e.png +0 -0
  111. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/prod-equil-rho_v_ns.png +0 -0
  112. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/prod-rho_v_ns.png +0 -0
  113. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/prod-tg.png +0 -0
  114. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/r1.png +0 -0
  115. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/r2.png +0 -0
  116. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/r3.png +0 -0
  117. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/reaction_network.png +0 -0
  118. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/rho_v_ns.png +0 -0
  119. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/short-e.png +0 -0
  120. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/short-tg.png +0 -0
  121. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/postsim.rst +0 -0
  122. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/reactions.rst +0 -0
  123. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/results.rst +0 -0
  124. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/run.rst +0 -0
  125. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/configuration.rst +0 -0
  126. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/index.rst +0 -0
  127. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/introduction.rst +0 -0
  128. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/monomers.rst +0 -0
  129. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/buildtraces.png +0 -0
  130. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/cure_info.png +0 -0
  131. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/densification-density.png +0 -0
  132. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-coloring.tcl +0 -0
  133. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-cured.png +0 -0
  134. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-detail.png +0 -0
  135. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-liq.png +0 -0
  136. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/reaction_network.png +0 -0
  137. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/postsim.rst +0 -0
  138. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/reactions.rst +0 -0
  139. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/results.rst +0 -0
  140. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/run.rst +0 -0
  141. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/configuration.rst +0 -0
  142. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/index.rst +0 -0
  143. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/introduction.rst +0 -0
  144. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/monomers.rst +0 -0
  145. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/buildtraces.png +0 -0
  146. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/cure_info.png +0 -0
  147. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/densification-density.png +0 -0
  148. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-coloring.tcl +0 -0
  149. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-ipdi-cured.png +0 -0
  150. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-ipdi-detail.png +0 -0
  151. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-ipdi-liq.png +0 -0
  152. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/reaction_network.png +0 -0
  153. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/postsim.rst +0 -0
  154. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/reactions.rst +0 -0
  155. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/results.rst +0 -0
  156. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/run.rst +0 -0
  157. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/configuration.rst +0 -0
  158. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/index.rst +0 -0
  159. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/introduction.rst +0 -0
  160. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/monomers.rst +0 -0
  161. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-coloring.tcl +0 -0
  162. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-cured.png +0 -0
  163. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-detail.png +0 -0
  164. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-liq.png +0 -0
  165. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/pics/buildtraces.png +0 -0
  166. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/pics/cure_info.png +0 -0
  167. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/pics/densification-density.png +0 -0
  168. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/pics/reaction_network.png +0 -0
  169. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/postsim.rst +0 -0
  170. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/reactions.rst +0 -0
  171. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/results.rst +0 -0
  172. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/run.rst +0 -0
  173. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/index.rst +0 -0
  174. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/htpolynetpackage.rst +0 -0
  175. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/index.rst +0 -0
  176. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/install.rst +0 -0
  177. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/references/index.rst +0 -0
  178. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/references/mol2-reference.pdf +0 -0
  179. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/references.bib +0 -0
  180. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/release-history.rst +0 -0
  181. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/CURE.odg +0 -0
  182. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/bond_filter.odg +0 -0
  183. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/building-a-system.rst +0 -0
  184. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/configs/configs-for-analyze.rst +0 -0
  185. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/configs/configs-for-postsim.rst +0 -0
  186. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/configuration-files.rst +0 -0
  187. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/container-usage.rst +0 -0
  188. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/flow1.odg +0 -0
  189. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/flow1yaml.odg +0 -0
  190. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/hydrogenated.eps +0 -0
  191. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/hydrogenated.fig +0 -0
  192. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/index.rst +0 -0
  193. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/molecular-structure-inputs.rst +0 -0
  194. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/pics/STY.png +0 -0
  195. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/pics/STYCC.png +0 -0
  196. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/pics/TypicalUsageFlow.png +0 -0
  197. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/pics/bond_filter.png +0 -0
  198. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/pics/chemdoodle-2dsketcher-emb.png +0 -0
  199. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/pics/chemdoodle-2dsketcher-styrene.png +0 -0
  200. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/pics/hydrogenated.png +0 -0
  201. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/pics/ring_pierce/ring_pierce_cases.png +0 -0
  202. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/pics/ring_pierce/ring_pierce_linkcell.png +0 -0
  203. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/postcure-repair.rst +0 -0
  204. {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/usage.rst +0 -0
  205. {htpolynet-2.6.2 → htpolynet-2.7.0}/scripts/check-conda-sync.py +0 -0
  206. {htpolynet-2.6.2 → htpolynet-2.7.0}/scripts/release.sh +0 -0
  207. {htpolynet-2.6.2 → htpolynet-2.7.0}/scripts/render-detail.sh +0 -0
  208. {htpolynet-2.6.2 → htpolynet-2.7.0}/scripts/render-detail.tcl +0 -0
  209. {htpolynet-2.6.2 → htpolynet-2.7.0}/scripts/render-snapshot.sh +0 -0
  210. {htpolynet-2.6.2 → htpolynet-2.7.0}/scripts/run_all_examples.sh +0 -0
  211. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/__init__.py +0 -0
  212. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/analysis/__init__.py +0 -0
  213. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/analysis/analyze.py +0 -0
  214. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/analysis/plot.py +0 -0
  215. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/analysis/postsim.py +0 -0
  216. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/analysis/utils.py +0 -0
  217. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/cli.py +0 -0
  218. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/core/__init__.py +0 -0
  219. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/core/bondtemplate.py +0 -0
  220. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/core/configuration.py +0 -0
  221. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/core/coordinates.py +0 -0
  222. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/core/molecule.py +0 -0
  223. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/core/paramcache.py +0 -0
  224. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/core/projectfilesystem.py +0 -0
  225. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/core/runtime.py +0 -0
  226. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/core/topocoord.py +0 -0
  227. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/core/topology.py +0 -0
  228. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/cure/__init__.py +0 -0
  229. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/cure/chain.py +0 -0
  230. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/cure/expandreactions.py +0 -0
  231. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/cure/reaction.py +0 -0
  232. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/external/__init__.py +0 -0
  233. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/external/ambertools.py +0 -0
  234. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/external/command.py +0 -0
  235. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/external/gromacs.py +0 -0
  236. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/external/slurm.py +0 -0
  237. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/external/smiles_input.py +0 -0
  238. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/external/software.py +0 -0
  239. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/geometry/__init__.py +0 -0
  240. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/geometry/bondlist.py +0 -0
  241. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/geometry/lattice.py +0 -0
  242. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/geometry/linkcell.py +0 -0
  243. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/geometry/matrix4.py +0 -0
  244. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/geometry/ring.py +0 -0
  245. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/io/__init__.py +0 -0
  246. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/io/gro.py +0 -0
  247. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/io/mol2.py +0 -0
  248. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/io/pdb.py +0 -0
  249. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/repair/__init__.py +0 -0
  250. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/repair/topology_surgery.py +0 -0
  251. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/README.md +0 -0
  252. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/__init__.py +0 -0
  253. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/claude/SKILL.md +0 -0
  254. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/example_depot/0-liquid-styrene.yaml +0 -0
  255. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/example_depot/1-polystyrene.yaml +0 -0
  256. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/example_depot/2-bisgma-styrene-thermoset.yaml +0 -0
  257. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/example_depot/3-pacm-dgeba-epoxy-thermoset.yaml +0 -0
  258. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/example_depot/4-dfda-fde-epoxy-thermoset.yaml +0 -0
  259. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/example_depot/5-htpb-ipdi.yaml +0 -0
  260. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/example_depot/6-cyanate-ester.yaml +0 -0
  261. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/mdp/README.md +0 -0
  262. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/mdp/drag-min.mdp +0 -0
  263. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/mdp/drag-npt.mdp +0 -0
  264. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/mdp/drag-nvt.mdp +0 -0
  265. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/mdp/min.mdp +0 -0
  266. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/mdp/relax-min.mdp +0 -0
  267. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/mdp/relax-npt.mdp +0 -0
  268. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/mdp/relax-nvt.mdp +0 -0
  269. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/mdp/single-molecule-min.mdp +0 -0
  270. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/mdp/single-molecule-nvt.mdp +0 -0
  271. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/inputs/DFA.pdb +0 -0
  272. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/inputs/DGE.mol2 +0 -0
  273. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/inputs/EMB.mol2 +0 -0
  274. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/inputs/FDE.pdb +0 -0
  275. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/inputs/GMA.mol2 +0 -0
  276. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/inputs/PAC.mol2 +0 -0
  277. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/inputs/STY.mol2 +0 -0
  278. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/make-monomers.sh +0 -0
  279. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/pics/DFA.png +0 -0
  280. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/pics/DGE.png +0 -0
  281. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/pics/EMB.png +0 -0
  282. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/pics/FDE.png +0 -0
  283. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/pics/GMA.png +0 -0
  284. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/pics/PAC.png +0 -0
  285. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/pics/STY.png +0 -0
  286. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/sample-inputs/DFA.pdb +0 -0
  287. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/sample-inputs/DGE.mol2 +0 -0
  288. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/sample-inputs/EMB.mol2 +0 -0
  289. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/sample-inputs/FDE.pdb +0 -0
  290. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/sample-inputs/GMA.mol2 +0 -0
  291. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/sample-inputs/PAC.mol2 +0 -0
  292. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/sample-inputs/STY.mol2 +0 -0
  293. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/tcl/readbonds.tcl +0 -0
  294. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/tcl/readgrx.tcl +0 -0
  295. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/tcl/render.tcl +0 -0
  296. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/utils/__init__.py +0 -0
  297. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/utils/banner.py +0 -0
  298. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/utils/checkpoint.py +0 -0
  299. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/utils/dataframetools.py +0 -0
  300. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/utils/inputcheck.py +0 -0
  301. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/utils/logsetup.py +0 -0
  302. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/utils/profiling.py +0 -0
  303. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/utils/stringthings.py +0 -0
  304. {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/utils/vmd_viz.py +0 -0
  305. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/__init__.py +0 -0
  306. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/conftest.py +0 -0
  307. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/__init__.py +0 -0
  308. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/fixtures/config1.gro +0 -0
  309. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/fixtures/config1.top +0 -0
  310. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/fixtures/config2.gro +0 -0
  311. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/fixtures/config2.top +0 -0
  312. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/fixtures/items31.edr +0 -0
  313. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/fixtures/items43.edr +0 -0
  314. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/fixtures/items45.edr +0 -0
  315. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/fixtures/short.mdp +0 -0
  316. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_bondtemplate.py +0 -0
  317. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_cap_placement.py +0 -0
  318. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_chain.py +0 -0
  319. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_completion_bias.py +0 -0
  320. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_configuration.py +0 -0
  321. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_dataframetools.py +0 -0
  322. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_gpu_usability.py +0 -0
  323. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_gromacs_get_energy_menu.py +0 -0
  324. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_gromacs_gmx_energy_trace.py +0 -0
  325. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_inputcheck.py +0 -0
  326. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_linkcell_pierce.py +0 -0
  327. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_paramcache.py +0 -0
  328. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_paramcache_ambertools.py +0 -0
  329. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_parameterize_react.py +0 -0
  330. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_plot_smoke.py +0 -0
  331. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_projectfilesystem.py +0 -0
  332. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_resources.py +0 -0
  333. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_ring.py +0 -0
  334. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_ring_pierce_figs.py +0 -0
  335. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_setup_claude.py +0 -0
  336. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_slurm_script.py +0 -0
  337. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_smiles_input.py +0 -0
  338. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_software_provenance.py +0 -0
  339. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_topology/test.top +0 -0
  340. {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_topology.py +0 -0
@@ -7,6 +7,114 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.7.0] - 2026-09-08
11
+
12
+ ### Changed
13
+
14
+ - **The per-iteration equilibration now constrains hydrogen bonds only, not
15
+ all bonds.** The packaged `npt.mdp` and `nvt.mdp` paired `dt = 0.002` with
16
+ `constraints = all-bonds` and set no `lincs_order`, so GROMACS used its
17
+ default LINCS accuracy (order 4). That is marginal whenever heavy-atom
18
+ bonds are constrained, and for a halogenated monomer it was fatal: a
19
+ fluorinated bisphenol died at `4-cure_equilibrate-npt` in **7 of 7** build
20
+ attempts, at cure iteration 5-7 of ~10, with exit codes 1 and 139. `LINCS`
21
+ appeared 14 times in that bridge's `diagnostics.log` and **zero** times in
22
+ each of seven other bridges built identically -- a perfect discriminator
23
+ across eight chemistries. In a melt of pristine, uncrosslinked monomers at
24
+ production density, with no cure at all, step-0 pressure was -1.34e5 bar;
25
+ `h-bonds` took it to -495 bar and the LINCS constraint rmsd from 4.5e-4 to
26
+ 7.3e-7. With the new settings the whole eight-bridge series rebuilt **32 of
27
+ 32**, the fluorinated one reaching a bond conversion of 0.900 in all four
28
+ replicates. `h-bonds` is also the conventional pairing with a 2 fs
29
+ timestep.
30
+
31
+ **This changes the sampled ensemble**, so structures and densities from
32
+ earlier versions are not strictly comparable with new ones, and because
33
+ `postsim` inherits `npt.mdp` it changes the production measurement too, not
34
+ just the cure. The drag and relax ladders are unaffected -- they always ran
35
+ unconstrained at 1 fs.
36
+
37
+ - **`lincs_order = 8` in the packaged `npt.mdp` and `nvt.mdp`.** Independent
38
+ of the constraint change: it improves the accuracy of the constraint solve
39
+ without changing which bonds are constrained, so it does not itself alter
40
+ the ensemble. On the diagnostic melt above, order 8 alone reduced the
41
+ pressure artifact 4.8-fold.
42
+
43
+ ### Added
44
+
45
+ - **The CURE relax stages now report the density they produce.** The relax
46
+ ladder is the only above-`Tg` constant-pressure time in a cure -- roughly
47
+ 120 ps of it, at the defaults -- and nothing looked at the density it
48
+ produced: `_do_relax` delegates to `_distance_attenuation`, which never
49
+ calls `TopoCoord.equilibrate()`, the only method that traced Density. The
50
+ per-stage relax table gains a `Density (kg/m3)` column, read from the NPT
51
+ `.edr` each stage already wrote. Drag is deliberately excluded, since it
52
+ runs under restraints and its density is not comparable.
53
+
54
+ - **The CURE relax stages now report reactive-species mobility (Varshney's
55
+ criterion).** After each relax ladder, htpolynet reports the rmsd
56
+ displacement of atoms that still carry an unused reactive site, and what
57
+ fraction of them moved at least one `CURE.controls.search_radius` during
58
+ the window. Varshney sized the original 40 ps relaxation window on exactly
59
+ this requirement -- that unreacted species diffuse far enough between
60
+ reactions to find new partners -- but the requirement decays over a cure as
61
+ those species are bonded into the growing network, and until now nothing
62
+ reported when a window had stopped satisfying it. A build where fewer than
63
+ 25 % of still-reactive atoms cross a search radius now says so, because its
64
+ later bonds are being chosen from a nearly frozen neighborhood.
65
+
66
+ Both reports are pure observation: they change no simulation input and
67
+ gate nothing. Every failure path is swallowed and logged at debug level,
68
+ so instrumentation cannot fail a build. A run resuming mid-ladder skips
69
+ the mobility report rather than measuring only the tail of its window.
70
+
71
+ - **`repair-summary.yaml` now reports the pre-repair bond histogram.** A new
72
+ `prerepair_bond_counts` key gives how many crosslinkers carried 0, 1, ... up
73
+ to `full_bond_count` bonds *before* repair dismantled any of them. Repair
74
+ rewrites the topology and the final structure does not record which cap came
75
+ from which ring, so this distribution was previously unrecoverable after the
76
+ fact -- only `n_complete`, its top bin, survived. It is the statistic that
77
+ makes the independence assumption behind "crosslinker conversion = bond
78
+ conversion cubed" directly testable, and that relationship is now known to
79
+ be wrong in a way that matters: audited against 54 builds, the effective
80
+ exponent runs about 3.5 near a bond conversion of 0.55, 3.0 near 0.73 and
81
+ 2.6-2.7 near 0.90, so the deviation from the cube changes sign and no single
82
+ power law fits. The histogram is zero-filled, so the shape of the summary
83
+ does not depend on the box, and it is cross-checked against the completion
84
+ count on every build -- the two are computed independently, and a
85
+ disagreement now warns.
86
+
87
+ ### Documentation
88
+
89
+ - **The constraint trap is documented where someone hitting it will look.**
90
+ The failure above surfaces at the equilibration step immediately after the
91
+ relax ladder, so the natural diagnosis is that the relax schedule is too
92
+ coarse. It is not: the drag and relax ladders run unconstrained at a 1 fs
93
+ timestep and cannot be responsible, and refining them makes matters worse --
94
+ a three-variant array (increment 0.08 to 0.04 to 0.02, plus a double-MD arm)
95
+ confirmed that, with quadrupling the stage count degrading the result. The
96
+ CURE section of the program-flow page now says which stages are constrained
97
+ and which are not, and says to look at the constraints rather than the
98
+ ladder when LINCS warnings appear at `cure_equilibrate`.
99
+
100
+ - **Four defaults in the `CURE.controls` table were wrong.** The table and
101
+ `curedict_defaults` had drifted apart: `radial_increment` is 0.05 and was
102
+ documented as 0.25, `max_iterations` is 100 and was documented as 150,
103
+ `desired_conversion` is 0.5 and was documented as 0.95, and
104
+ `min_allowable_bondcycle_length` is -1 rather than 0 (any value <= 0
105
+ disallows all cycles, so the documented *behavior* was right and only the
106
+ literal was wrong). `desired_conversion` is the costly one: a user who
107
+ read "default 0.95" and omitted the key got a half-cure. Every shipped
108
+ example that cures sets it explicitly, which is why nothing caught this.
109
+
110
+ - **`desired_conversion` now says which conversion it means.** The
111
+ `CURE.controls` table described it as "target conversion", which every
112
+ reader takes to be the crosslinker conversion an experiment measures. It
113
+ is the *bond* conversion -- bonds formed over bonds possible -- and the
114
+ crosslinker conversion is lower: at a nominal 90 % cure, an audit of 30
115
+ builds found 75.2 triazines complete per 100, not 90. The row now says
116
+ so and links to the fuller explanation under postcure repair.
117
+
10
118
  ## [2.6.2] - 2026-08-31
11
119
 
12
120
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: htpolynet
3
- Version: 2.6.2
3
+ Version: 2.7.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/
@@ -74,15 +74,23 @@ Rough ordering within each section is by value, not by effort.
74
74
 
75
75
  Coverage as of the last measurement: **38.8%** overall.
76
76
 
77
- - **`repair/` has no tests at all** — `cyanate_cap.py` (208 statements)
78
- and `topology_surgery.py` (125), both at 0%. This is the highest-value
79
- gap: the postcure repair stage makes the strongest correctness claim in
80
- the project ("atom conservation is exact"), and right now the only
81
- thing checking it is reading a residue census at the end of a
82
- multi-hour build. It is pure topology manipulation, so it can be tested
83
- deterministically in milliseconds against a synthetic `TopoCoord`
84
- carrying triazines at k=0,1,2,3 — assert atom counts, the residue
85
- census, cap placement, and that no unreacted bridge -OH survives.
77
+ - **`repair/`'s driver has no test.** `test_cap_placement.py` and
78
+ `test_repair_conversion.py` now cover the placement search and the
79
+ reported statistics, but `triazine_to_cyanate_cap` itself and all of
80
+ `topology_surgery.py` (125 statements) are still untouched. This is the
81
+ highest-value gap: the postcure repair stage makes the strongest
82
+ correctness claim in the project ("atom conservation is exact"), and
83
+ right now the only thing checking it in-tree is reading a residue census
84
+ at the end of a multi-hour build. (An external audit of 54 builds at
85
+ v2.6.2 found the accounting exact everywhere -- `3*TAZ_final + CYN ==
86
+ 720` in all 54, every surviving triazine with exactly 3 aryl-ether bonds
87
+ across 7,501 examined, zero bare -OH -- and a six-defect negative control
88
+ was caught by 2-10 checks each. That is real evidence, but it is not a
89
+ test and it does not run on a PR.) It is pure topology manipulation, so
90
+ it can be tested deterministically in milliseconds against a synthetic
91
+ `TopoCoord` carrying triazines at k=0,1,2,3 — assert atom counts, the
92
+ residue census, cap placement, and that no unreacted bridge -OH
93
+ survives.
86
94
  - **An end-to-end example in CI.** A deliberately tiny build (a
87
95
  20-molecule, few-ps variant of example 0) run inside the container
88
96
  would cover `core/runtime.py` and `cure/curecontroller.py` — 1,056
@@ -431,6 +439,17 @@ Coverage as of the last measurement: **38.8%** overall.
431
439
  r(chi_bond, n/f) = +0.905; counts run 3 to 8, n/f 1.00 to 2.67. Docs cite
432
440
  the four-run evidence now.
433
441
 
442
+ **The deviation changes sign, 2026-09-03** (study session, 54 builds
443
+ audited at v2.6.2): near `chi_bond` 0.900 the observed crosslinker count
444
+ runs *above* the cube -- 180.60 against 175.39 predicted over 30 builds,
445
+ +2.17 pp at t = +10.8 against a replicate sd of 2.63 triazines -- while at
446
+ `chi_bond` <= 0.64 it runs below, 32.17 against 41.28 over 6 builds, -3.80
447
+ pp. The compact way to say it is that the effective exponent
448
+ `ln(chi_OCN)/ln(chi_bond)` is not 3 and is not constant: ~3.5 near
449
+ `chi_bond` 0.55, ~3.0 near 0.73, ~2.6--2.7 near 0.90. No single power law
450
+ fits, so the cube is a local estimate around 0.9 and nothing more. This is
451
+ consistent with the 1.020 +/- 0.029 above, and puts a significance on it.
452
+
434
453
  - **A config-time version of that warning, before any compute is spent.**
435
454
  Largely superseded by the completed-crosslinker check that shipped -- nothing
436
455
  needs a proxy for a quantity that is exactly known by the time the cure
@@ -519,7 +538,13 @@ Coverage as of the last measurement: **38.8%** overall.
519
538
  incrementally as caps land, or placing in order of how constrained each site
520
539
  is rather than in match order. Do it if the reported clearance warnings turn
521
540
  out to correlate with builds that still die -- the instrumentation to decide
522
- that now exists, and did not before.
541
+ that now exists, and did not before. One thing the instrumentation still
542
+ does not report is how far a transferred cap actually travelled:
543
+ `_greedy_match` can reach the globally nearest free oxygen after ten radius
544
+ doublings, and one audited build transferred 72 of 177 caps, but
545
+ `repair-summary.yaml` carries clearance statistics only, so an external
546
+ audit could not bound the transfer distance. Report it alongside the
547
+ clearances.
523
548
 
524
549
  - **`bdf.loc[:abs_max]` takes one bond more than the limit.** In
525
550
  `curecontroller.py::_searchbonds`, the truncation that applies
@@ -531,8 +556,240 @@ Coverage as of the last measurement: **38.8%** overall.
531
556
  Worth doing at a version boundary where a small reproducibility break is
532
557
  already expected, not before.
533
558
 
559
+ - **An algebraic self-check that no build currently runs.** For an A2 monomer
560
+ of `A` atoms in the 360-bisphenol/240-triazine example, the total atom count
561
+ is `360*A + 2160 - 1440` regardless of conversion -- verified at 12600
562
+ (bpa, A = 33), 9720 (bpo, A = 25) and 14760 (tmb, A = 39). It is
563
+ conversion-independent and closed-form, so any atom dropped or duplicated
564
+ anywhere in cure or repair breaks it. Cheap to assert at the end of repair.
565
+
566
+ - **`_distance_attenuation` runs an open-loop stage ladder.** In
567
+ `cure/curecontroller.py:606`, `this_nstages = int(maxL/d['increment'])` is
568
+ computed once from the initial maximum bond length, and the loop then runs
569
+ that many stages whatever happens. `maxL` *is* recomputed inside the loop,
570
+ but only to log it -- it never extends, shortens or aborts the ladder -- and
571
+ `restore_bond_parameters(saveT)` runs each stage whether or not the bonds
572
+ actually closed. So a stage schedule that fails to bring a bond in has no
573
+ way to say so. Robustness only; it was ruled out as the cause of the
574
+ halogen failure below (quadrupling the stage count made that *worse*).
575
+ The densification entry below is the same shape of problem -- a number
576
+ computed once and trusted thereafter.
577
+
578
+ - **If anything gates on density convergence, it should be densification,
579
+ not cure.** The initial 200 -> ~1100 kg/m3 compaction is one-shot,
580
+ involves a large volume change, and currently runs on fixed `nsteps`
581
+ (`runtime_defaults['densification']['equilibration']`,
582
+ `core/runtime.py:78-86`). That is the direct analogue of pestifer's use of
583
+ `density_equilibrate` -- a terminal, run-until-converged replacement for a
584
+ hand-written NPT ladder -- and it is cheap, because it happens once per
585
+ build rather than ~10 times.
586
+
587
+ What to port from `pestifer/util/density_convergence.py` is only the
588
+ criterion: an **autocorrelation-corrected SEM**, `sigma/sqrt(N/tau_int)`,
589
+ because NPT cell density is autocorrelated over hundreds of steps and a
590
+ naive block-means SEM is optimistic by ~1.5x. That also makes the test
591
+ size-aware for free, since `sigma/mean ~ 1/sqrt(N_atoms)` while tau is
592
+ roughly size-independent. Port the explicit **ceiling outcome** too, so a
593
+ build that never settled says so instead of silently reporting a density.
594
+ Do **not** port the chunking (`next_chunk_steps`, `is_patch_grid_crash`):
595
+ that exists because NAMD fixes its patch/PME grid at the start of each
596
+ `run`, and GROMACS rescales the box within one `mdrun` without that
597
+ failure mode. The chunking is most of pestifer's complexity and none of
598
+ its value here.
599
+
600
+ - **Decided against: gating and extending `CURE.relax` on density
601
+ convergence.** Raised by Cameron 2026-09-05 from the observation that
602
+ pestifer has a gate system htpolynet does not; recommended by the study
603
+ session, twice revised, then withdrawn 2026-09-07 once the experiment that
604
+ tested it had run. Recorded here so it is not re-proposed from the same
605
+ premises. **The verdict is "not now, on these grounds", not "never"** --
606
+ both legs of it have stated limits, recorded below with the evidence.
607
+
608
+ **The experiment.** Arm R16 raised `CURE.relax` NPT `nsteps` 2000 ->
609
+ 32000, i.e. above-`Tg` relaxation during cure from ~120 ps to ~1.9 ns, on
610
+ two chemistries at matched conversion, n = 4:
611
+
612
+ bpa 1187.52 -> 1192.19 kg/m3 +4.67 +/- 2.61 (+1.8 sigma)
613
+ bpf 1257.65 -> 1255.44 -2.21 +/- 2.15 (-1.0 sigma)
614
+
615
+ Sixteen times the relaxation closes **17 % of the density deficit, and not
616
+ significantly**; bpf, the control that should not move, did not. The
617
+ premise -- that the fixed relaxation window generates the deficit and a
618
+ gate would recover it -- survives only as a minor contributor.
619
+
620
+ **R16 is underpowered for the effect it found, and must not be recorded as
621
+ settled beyond its power.** Resolving +4.7 kg/m3 at 3 sigma needs n ~ 11 at
622
+ the observed scatter; this is n = 4. "17 % of the deficit at +1.8 sigma" is
623
+ a point estimate, not a tight upper bound, and better statistics could move
624
+ it. What it does rule out is a *large* effect of relaxation duration --
625
+ which is what the gate would have had to deliver to be worth its cost.
626
+
627
+ **The stronger reason, which does not depend on that result.** R16 ran a
628
+ fixed multiple, never to convergence, so ask what convergence would cost.
629
+ Restoring the start-of-cure crossing fraction needs ~4.4x the displacement
630
+ of unreacted species, which under `sqrt(t)` is ~19x the time: ~37 ns of
631
+ relax per build against a 39.2 ns production ladder, roughly doubling
632
+ build cost. **And `sqrt(t)` does not hold.** Past the gel point the
633
+ unreacted species are bonded into the network -- topologically
634
+ constrained, not merely slow -- and no amount of NPT time restores a
635
+ capture-radius displacement to a covalently tethered fragment. So an
636
+ honestly implemented gate would hit its ceiling on every late-cure
637
+ iteration and report "may not have settled", correctly, with nothing to be
638
+ done about it. It detects a condition it cannot cure.
639
+
640
+ **The limit on that argument:** arrest is inferred partly from gelation
641
+ physics, not purely measured. The study's displacement trace is still
642
+ falling at the last cure iteration, 4.63 -> 4.08 -> 3.72 A -- consistent
643
+ with approaching arrest, but not a demonstrated plateau. Measuring the
644
+ plateau directly would settle it either way, and is a smaller experiment
645
+ than powering R16 up.
646
+
647
+ **And a structural mismatch.** Pestifer uses `density_equilibrate` as a
648
+ terminal, one-shot replacement for a hand-written NPT ladder at the end of
649
+ a build -- somewhere you can afford to run until converged. The proposal
650
+ put the same machinery in an inner loop that executes ~10 times per build.
651
+ The economics are entirely different.
652
+
653
+ What does *not* change is the mechanism the proposal was built to explain,
654
+ which is still unexplained. If the box is under-relaxed while bonds are
655
+ forming, bonds form between whichever atoms happen to be adjacent in a
656
+ too-open configuration, and **the topology is then permanent** -- a later
657
+ remelt relaxes coordinates but cannot rewire bonds. That still ties
658
+ together three otherwise-awkward results from the study's 64-build series:
659
+ post-cure annealing is refuted as a cause of the density deficit (the
660
+ ladder opens 2 ns at `Tg`+112 K, erasing pre-ladder history), the uncured
661
+ monomer melt matches experimental dilatometry to 0.19 % while the cured
662
+ network is 2.25 % low, and cure shrinkage is strongly bridge-dependent
663
+ (+0.033 to -0.004 ml/g) and anti-correlates with monomer van der Waals
664
+ volume. R16 says more relax time is not the fix; it does not say the
665
+ mechanism is wrong.
666
+
667
+ **The production ladder does not need a gate either.** Two structures with
668
+ opposite histories held 5 ns at 480 K converge from opposite sides and
669
+ stall 4.25 kg/m3 apart with the ladder's own hold inside that bracket;
670
+ within-hold drift on the glassy branch is -0.35 to +0.53 kg/m3 per 667 ps
671
+ across four replicates; and replicate scatter is topological rather than
672
+ equilibrative (sd 3.2 kg/m3 at high conversion against 0.7 at `chi_OCN` 0).
673
+
674
+ **Reference values for the instrumentation that did ship in v2.7.0.** The
675
+ relax and mobility numbers a user now sees in their own log mean nothing
676
+ without something to compare them against, and these are the only measured
677
+ ones we have. Window size: the default relax sequence ends in an NPT
678
+ segment of 2000 steps and `relax-npt.mdp` runs `dt = 0.001`, so 2 ps per
679
+ stage; at the default `nstages: 6` over ~10 iterations that is roughly
680
+ **120 ps of above-`Tg` constant-pressure time across an entire cure**,
681
+ against a 39.2 ns production ladder. Density at cure termination is still
682
+ climbing, bpa +1.29 +/- 0.62 and bpf +1.48 +/- 0.28 kg/m3 per iteration
683
+ over the second half of cure (2.1 and 5.3 sigma, n = 4 per chemistry) --
684
+ though a rising density is *partly* expected, since crosslinking genuinely
685
+ densifies, and that slope cannot separate real densification from
686
+ incomplete relaxation. Reactive-species mobility over cure: bpa 18.1 ->
687
+ 3.7 A with crossing fraction 97 % -> 13 %, bpf 17.4 -> 4.4 A and
688
+ 97 % -> 22 %. All measured by the study session.
689
+
690
+ - **Published gating designs we have not evaluated.** Audited by the study
691
+ session 2026-09-05. These gate *bond acceptance*, not density, so R16's
692
+ refutation of the density gate leaves them untouched.
693
+
694
+ - **Rejection on relaxation failure -- Moore et al. 2021**
695
+ (*Macromolecules* 54:6275), on di(cyanate ester)s, which is *our*
696
+ chemistry. Verbatim: "If a failure occurred during relaxation following
697
+ bond formation, the bond was removed and the crosslink cycle was
698
+ repeated with different bonds selected for crosslinking." That is bond
699
+ *acceptance* conditioned on a measured relaxation outcome. The same
700
+ paper caps bonds at **1 % of total per iteration** and terminates on
701
+ **stall** -- no new bonds in 20 iterations -- rather than on a step
702
+ count. Both are directly comparable to knobs we have:
703
+ `max_conversion_per_iteration` defaults to 1.0, i.e. no cap at all, and
704
+ we terminate on conversion or `max_iterations`.
705
+ - **Arrhenius kinetics gating -- Schichtel & Chattopadhyay 2020**
706
+ (*Comput. Mater. Sci.*): bonding probability from cure temperature,
707
+ cutoff distance and an activation energy. Their sec 2.4 *demonstrates*
708
+ the failure mode rather than merely flagging it -- a density trajectory
709
+ they call "not physical", ending in a metastable configuration, from
710
+ "accelerated reaction kinetics caused by the usage of higher
711
+ probabilities."
712
+
713
+ Rejection catches a bond that will not relax at all; Arrhenius sets the
714
+ rate. Neither sees gradual under-relaxation, but neither costs what the
715
+ density gate would have, and both act where R16 says the leverage is not
716
+ -- on which bonds form, rather than on how long the box is given
717
+ afterwards.
718
+
719
+ **A calibration number worth having before anyone panics about our
720
+ deficit.** Moore uses a fixed 40 ps NPT relaxation window at 800 K -- the
721
+ same number Varshney chose in 2008, with the same stated rationale, to let
722
+ unreacted species diffuse between reactions -- and reports a **4.77 %**
723
+ density deficit in BADCy after 100 ns of post-cure equilibration at 293 K.
724
+ Ours is 2.25 %. So the fixed-window architecture is universal from 2008 to
725
+ a 2021 GPU workflow, the resulting deficit does not equilibrate away, and
726
+ htpolynet is not an outlier. That makes this a field-wide design question
727
+ rather than a bug, which raises the value of getting it right and lowers
728
+ the urgency.
729
+
730
+ Nobody here has read either paper; the quotations above are the study
731
+ session's, and both citations should be checked against the originals
732
+ before being repeated anywhere public. The same applies to Varshney 2008,
733
+ which the v2.7.0 docs now name as the origin of the 40 ps relaxation
734
+ window and its mobility criterion -- that attribution is the study
735
+ session's too, and it is the one of the three that has already been
736
+ published in our documentation. Verify it first if any of them.
737
+
738
+ ## Simulation defaults
739
+
740
+ - **The halogen constraint failure is fixed but not explained.** v2.7.0
741
+ switched the per-iteration equilibration to `constraints = h-bonds` with
742
+ `lincs_order = 8`, which took a fluorinated bisphenol from 0 of 7 builds to
743
+ 4 of 4, and the eight-bridge series from 7 failures to 32 of 32. What is
744
+ still not understood is the *timing*. The constraint artifact is present
745
+ from the very first NPT step -- a melt of pristine, uncrosslinked BAF
746
+ monomers at production density shows step-0 pressure of -1.34e5 bar, with
747
+ no cure involved at all -- yet the old builds survived densification,
748
+ precure and 4-6 cure iterations before dying. So it was a predisposing
749
+ cause plus a threshold in the network's tolerance for it, not a single
750
+ trigger, and nobody knows what sets the threshold. The failing structures
751
+ were not preserved, so the LINCS atom indices were never mapped to
752
+ residues; anyone chasing this should trap and keep them first. The
753
+ diagnostic that identified it is worth reusing: halving `dt` made the
754
+ artifact ~4x *worse*, and 1/dt^2 scaling is the signature of a one-shot
755
+ constraint start-up projection rather than a physical clash.
756
+
757
+ - **`mdp_to_dict` crashes on any mdp line containing two `=` signs.** In
758
+ `external/gromacs.py:239` it does `k,v = l.split('=')`, which raises
759
+ `ValueError: too many values to unpack` rather than reporting anything
760
+ useful. No packaged template trips it today -- checked across all eleven --
761
+ but any comment containing an equals sign does, including the obvious one
762
+ someone would write next to a timestep. It also does not strip `;`
763
+ comments, so the comment text becomes part of the value and is re-emitted
764
+ attached to it; GROMACS tolerates that, but `mdp_get` on a commented
765
+ numeric key would not survive a `float()`. Split on the first `=` only,
766
+ and strip comments.
767
+
768
+ - **`postsim` inherits `npt.mdp` wholesale, so cure defaults govern the
769
+ production measurement.** `analysis/postsim.py:81` checks out `npt` and
770
+ renames it; `build_mdp()` overrides `ref_t`, `ref_p`, `nsteps`, velocity
771
+ generation and `tcoupl` (to `v-rescale`) but never touches `dt`,
772
+ `constraints`, `lincs_*` or `pcoupl`. So whatever is chosen above also sets
773
+ the timestep and constraint scheme of every postsim run, and the barostat
774
+ there is still **Berendsen**, which does not sample a correct NPT ensemble
775
+ and is deprecated in modern GROMACS. Changing the barostat is a physics
776
+ change to published numbers; changing it silently would be worse than
777
+ leaving it, so it wants a release note and probably a config knob.
778
+
534
779
  ## Usability
535
780
 
781
+ - **The atom-serial column in `final.gro` wraps modulo 10000, and nothing
782
+ says so.** That is the GROMACS `.gro` format, not an htpolynet bug -- atom
783
+ 10000 prints as `0` -- but every htpolynet system large enough to matter
784
+ crosses it, and the natural analysis script joins `final.gro` to `final.top`
785
+ on that column. In one 12,600-atom build 2,601 atoms (21%) have a `.gro`
786
+ serial that differs from their `.top` index, so such a script is silently
787
+ wrong for a fifth of the box with no error anywhere. Worth a sentence in the
788
+ analysis docs saying to join on line order, not on the serial. Same family
789
+ as the existing trap that `min_clearance_nm` is a substring of
790
+ `blind_min_clearance_nm` while PyYAML emits keys alphabetically, so a naive
791
+ grep of `repair-summary.yaml` picks the wrong one.
792
+
536
793
  - **`gen-slurm-script` doesn't stage to scratch.** The emitted script
537
794
  runs in the submit directory. A cure run does heavy small-file I/O
538
795
  every iteration, so on a cluster whose home and group storage are NFS
@@ -216,13 +216,13 @@ In this section we show all subdirectives for each of the five main directives i
216
216
  ``CURE.controls`` parameter Type Description (default)
217
217
  ================================== ================= ======================
218
218
  ``search_radius`` float initial search radius in nm (default 0.5)
219
- ``radial_increment`` float increment in nm by which search radius is increased if not enough bonds are found at current radius (default 0.25)
219
+ ``radial_increment`` float increment in nm by which search radius is increased if not enough bonds are found at current radius (default 0.05)
220
220
  ``min_bonds_per_iteration`` int grow the radius until at least this many bonds have been identified, then proceed with whatever the count is at the current radius (default 10). Effective floor is clamped against the remaining bonds needed to reach ``desired_conversion`` and against ``max_conversion_per_iteration``, so demanding e.g. 50 near end-of-cure never stalls the build. Setting to 1 reproduces the un-batched legacy behavior.
221
- ``max_iterations`` int absolute maximum number of allowed iterations (default 150)
222
- ``desired_conversion`` float [0-1] target conversion between 0 and 1.0 (default 0.95)
221
+ ``max_iterations`` int absolute maximum number of allowed iterations (default 100)
222
+ ``desired_conversion`` float [0-1] target **bond** conversion -- bonds formed over bonds possible -- between 0 and 1.0 (default 0.5). This is not the crosslinker conversion an experiment measures, which is lower; see :ref:`what repair reports <postcure_repair_reporting>`. Note the default is a half-cure, not the 0.95 the examples use; every shipped example that cures sets the value explicitly rather than relying on it.
223
223
  ``late_threshold`` float [0-1] conversion above which bond probabilities are ignored (default 0.85)
224
224
  ``max_conversion_per_iteration`` float [0-1] upper limit, as a fraction of total reactable bonds, on the new bonds formed in any single iteration (default 1.0)
225
- ``min_allowable_bondcycle_length`` int minimum number of C atoms allowed in a cycle of C-C bonds that form via polymerization (default 0, disallow all such cycles)
225
+ ``min_allowable_bondcycle_length`` int minimum number of C atoms allowed in a cycle of C-C bonds that form via polymerization (default -1; any value <= 0 disallows all such cycles)
226
226
  ``completion_bias`` bool rank bond candidates by how many bonds their ``B``-side residue already carries, and only then by distance, so that partly-reacted crosslinkers are completed before untouched ones are started (default ``False``)
227
227
  ================================== ================= ======================
228
228
 
@@ -75,6 +75,60 @@ The Connect-Update-Relax-Equilibrate (CURE) algorithm
75
75
 
76
76
  The algorithm used to create new bonds and polymerize a system is called the CURE algorithm, depicted above. This is just a slightly modified version of a standard search-radius-type algorithm, first used by Li and Strahan to study EPON/DETDA thermosets (:cite:t:`Li2010Crosslinking`). The CURE algorithm begins by executing a search for new bonds on a frozen system configuration. Bonds are downselected through a series of filters to arrive at a final set of bonds to form. If the distance between any pair of "bond-designate" atoms is greater than some threshold (the ``trigger_distance`` parameter in the :ref:`drag subdirective <cure.drag>` of the ``CURE`` directive of a configuration file), a series of MD simulations that slowly bring all to-be-bound atom closer together is performed. Then the topology is updated, where ``htpolynet`` applies the charges, atom type, and bonded interaction templates from the oligomer template set to each bond. After the update, a series of relaxation MD simulations bring all bonds to their equilibrium lengths. Then a short NPT MD simulation equilibrates the overall density before initiating the next CURE iteration. CURE iterations continue until (a) a desired conversion is reached, or (b) no new allowable bonds are identified.
77
77
 
78
+ .. note::
79
+
80
+ The drag and relax stages run **unconstrained**, at a 1 fs timestep, because
81
+ the bonds they are manipulating are deliberately far from equilibrium. Only
82
+ the per-iteration equilibration (and, later, ``postsim``) uses a 2 fs
83
+ timestep with constraints, and as of v2.7.0 it constrains **hydrogen bonds
84
+ only**, with ``lincs_order = 8``.
85
+
86
+ Before v2.7.0 it constrained *all* bonds at 2 fs with the GROMACS default
87
+ LINCS accuracy, which is marginal whenever heavy-atom bonds are constrained
88
+ and was fatal for halogenated monomers: a fluorinated bisphenol failed every
89
+ build attempt, dying at the equilibration step several cure iterations in.
90
+ The trap was that the failure surfaces immediately after the relax ladder,
91
+ so the natural diagnosis is that the relax schedule is too coarse -- and it
92
+ is not, since that ladder is unconstrained and cannot be responsible.
93
+ Refining it makes matters worse. If you see LINCS warnings at
94
+ ``cure_equilibrate``, look at the constraints, not at the ladder.
95
+
96
+ .. _relax_diagnostics:
97
+
98
+ What the relax stages report
99
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
100
+
101
+ As of v2.7.0 the relax ladder reports two diagnostics per CURE iteration. Both
102
+ are pure observation: they change no simulation input and gate nothing.
103
+
104
+ The per-stage table gains a **Density** column, read from the NPT ``.edr`` each
105
+ stage already wrote. The relax stages are the only above-:math:`T_g`
106
+ constant-pressure time in a cure -- roughly 120 ps of it at the defaults,
107
+ against a production ladder measured in nanoseconds -- so this is where you can
108
+ see whether the box is still densifying when the cure stops. Drag stages are
109
+ excluded, because they run under restraints and their density is not
110
+ comparable.
111
+
112
+ After each ladder, ``htpolynet`` reports **reactive-species mobility**: the rmsd
113
+ displacement of atoms that still carry an unused reactive site, and the fraction
114
+ of them that moved at least one ``CURE.controls.search_radius`` during the
115
+ window. This is the criterion the fixed-relaxation-window convention was
116
+ originally sized against -- that unreacted species diffuse far enough between
117
+ reactions to find new partners -- and it has been in use, at 40 ps, since
118
+ Varshney and co-workers introduced it in 2008.
119
+
120
+ That requirement decays over a cure. Past the gel point the still-reactive
121
+ species are bonded into the growing network, and are then topologically
122
+ constrained rather than merely slow, so more relaxation time does not restore
123
+ their mobility. A build in which fewer than 25 % of still-reactive atoms cross
124
+ a search radius emits a warning, because its later bonds are being chosen from a
125
+ nearly frozen neighborhood. Treat that as a statement about the *validity range
126
+ of the protocol*, not as an error: nothing is wrong with the run, but its late
127
+ bonds are less well sampled than its early ones.
128
+
129
+ A run resuming mid-ladder from a checkpoint skips the mobility report, since the
130
+ window it could measure is only the tail of the real one.
131
+
78
132
  .. _bondsearch_filters:
79
133
 
80
134
  Identifying allowable bonds: Bondsearch filters
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "htpolynet"
7
- version = "2.6.2"
7
+ version = "2.7.0"
8
8
  authors = [
9
9
  { name="Cameron F Abrams", email="cfa22@drexel.edu" },
10
10
  ]