htpolynet 2.2.0__tar.gz → 2.3.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 (333) hide show
  1. htpolynet-2.3.0/.claude/skills/htpolynet/SKILL.md +71 -0
  2. {htpolynet-2.2.0 → htpolynet-2.3.0}/CHANGELOG.md +92 -0
  3. {htpolynet-2.2.0 → htpolynet-2.3.0}/CITATION.cff +6 -0
  4. {htpolynet-2.2.0 → htpolynet-2.3.0}/PKG-INFO +2 -1
  5. {htpolynet-2.2.0 → htpolynet-2.3.0}/README.md +1 -0
  6. htpolynet-2.3.0/ROADMAP.md +255 -0
  7. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/htpolynetpackage.rst +5 -0
  8. htpolynet-2.3.0/docs/source/user-guide/building-a-system.rst +172 -0
  9. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/user-guide/configs/configs-for-run.rst +6 -0
  10. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/user-guide/index.rst +1 -0
  11. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/user-guide/usage.rst +43 -9
  12. {htpolynet-2.2.0 → htpolynet-2.3.0}/pyproject.toml +1 -1
  13. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/cli.py +1 -1
  14. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/core/molecule.py +7 -0
  15. htpolynet-2.3.0/src/htpolynet/core/paramcache.py +132 -0
  16. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/core/projectfilesystem.py +1 -1
  17. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/core/runtime.py +107 -7
  18. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/external/ambertools.py +23 -4
  19. htpolynet-2.3.0/tests/unit/test_paramcache.py +326 -0
  20. htpolynet-2.3.0/tests/unit/test_paramcache_ambertools.py +198 -0
  21. htpolynet-2.2.0/ROADMAP.md +0 -116
  22. {htpolynet-2.2.0 → htpolynet-2.3.0}/.claude/settings.json +0 -0
  23. {htpolynet-2.2.0 → htpolynet-2.3.0}/.envrc +0 -0
  24. {htpolynet-2.2.0 → htpolynet-2.3.0}/.github/workflows/conda-forge-sync.yml +0 -0
  25. {htpolynet-2.2.0 → htpolynet-2.3.0}/.github/workflows/docker.yml +0 -0
  26. {htpolynet-2.2.0 → htpolynet-2.3.0}/.github/workflows/release.yaml +0 -0
  27. {htpolynet-2.2.0 → htpolynet-2.3.0}/.github/workflows/test.yml +0 -0
  28. {htpolynet-2.2.0 → htpolynet-2.3.0}/.gitignore +0 -0
  29. {htpolynet-2.2.0 → htpolynet-2.3.0}/.readthedocs.yaml +0 -0
  30. {htpolynet-2.2.0 → htpolynet-2.3.0}/CLAUDE.md +0 -0
  31. {htpolynet-2.2.0 → htpolynet-2.3.0}/LICENSE +0 -0
  32. {htpolynet-2.2.0 → htpolynet-2.3.0}/MANIFEST.in +0 -0
  33. {htpolynet-2.2.0 → htpolynet-2.3.0}/docker/Dockerfile +0 -0
  34. {htpolynet-2.2.0 → htpolynet-2.3.0}/docker/compose.yml +0 -0
  35. {htpolynet-2.2.0 → htpolynet-2.3.0}/docker/docker-entrypoint.sh +0 -0
  36. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/Makefile +0 -0
  37. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/README.rst +0 -0
  38. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/make.bat +0 -0
  39. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/requirements.txt +0 -0
  40. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/_static/.gitkeep +0 -0
  41. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/changelog.rst +0 -0
  42. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/conf.py +0 -0
  43. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/0-liquid-styrene/configuration.rst +0 -0
  44. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/0-liquid-styrene/index.rst +0 -0
  45. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/0-liquid-styrene/introduction.rst +0 -0
  46. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/0-liquid-styrene/monomer.rst +0 -0
  47. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/0-liquid-styrene/postsim.rst +0 -0
  48. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/0-liquid-styrene/results.rst +0 -0
  49. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/0-liquid-styrene/run.rst +0 -0
  50. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/1-polystyrene/configuration.rst +0 -0
  51. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/1-polystyrene/index.rst +0 -0
  52. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/1-polystyrene/introduction.rst +0 -0
  53. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/1-polystyrene/monomer.rst +0 -0
  54. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/1-polystyrene/pics/STY.png +0 -0
  55. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/1-polystyrene/pics/STYCC.png +0 -0
  56. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/1-polystyrene/pics/buildtraces.png +0 -0
  57. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/1-polystyrene/pics/cure_info.png +0 -0
  58. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/1-polystyrene/pics/densification-density.png +0 -0
  59. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/1-polystyrene/pics/final-box.png +0 -0
  60. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/1-polystyrene/pics/reaction_network.png +0 -0
  61. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/1-polystyrene/pics/sty-coloring.tcl +0 -0
  62. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/1-polystyrene/pics/sty-cured.png +0 -0
  63. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/1-polystyrene/pics/sty-detail.png +0 -0
  64. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/1-polystyrene/pics/sty-liq.png +0 -0
  65. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/1-polystyrene/pics/styrene-polymerization.png +0 -0
  66. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/1-polystyrene/postsim.rst +0 -0
  67. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/1-polystyrene/reactions.rst +0 -0
  68. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/1-polystyrene/results.rst +0 -0
  69. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/1-polystyrene/run.rst +0 -0
  70. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/configuration.rst +0 -0
  71. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/index.rst +0 -0
  72. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/introduction.rst +0 -0
  73. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/BPA.png +0 -0
  74. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/GMA.png +0 -0
  75. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/HIE.png +0 -0
  76. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/buildtraces.png +0 -0
  77. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/cure_info.png +0 -0
  78. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/densification-density.png +0 -0
  79. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/four_dimers.eps +0 -0
  80. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/four_dimers.fig +0 -0
  81. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/four_dimers.png +0 -0
  82. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-coloring.tcl +0 -0
  83. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-cured.png +0 -0
  84. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-detail.png +0 -0
  85. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-liq.png +0 -0
  86. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/p1-traces.png +0 -0
  87. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/reaction_network.png +0 -0
  88. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/vesys.eps +0 -0
  89. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/vesys.fig +0 -0
  90. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/vesys.png +0 -0
  91. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/postsim.rst +0 -0
  92. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/reactions.rst +0 -0
  93. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/results.rst +0 -0
  94. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/run.rst +0 -0
  95. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/configuration.rst +0 -0
  96. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/index.rst +0 -0
  97. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/introduction.rst +0 -0
  98. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/monomers.rst +0 -0
  99. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/DGE-epoxy.png +0 -0
  100. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/DGE-labelled.png +0 -0
  101. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/PAC-2d.png +0 -0
  102. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/PAC-labelled.png +0 -0
  103. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/buildtraces.png +0 -0
  104. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/cure_info.png +0 -0
  105. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/densification-density.png +0 -0
  106. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-coloring.tcl +0 -0
  107. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-cured.png +0 -0
  108. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-detail.png +0 -0
  109. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-liq.png +0 -0
  110. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dgesys.eps +0 -0
  111. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dgesys.fig +0 -0
  112. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dgesys.png +0 -0
  113. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/equil-rho_v_ns.png +0 -0
  114. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/postsim-typical.png +0 -0
  115. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/prod-e.png +0 -0
  116. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/prod-equil-rho_v_ns.png +0 -0
  117. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/prod-rho_v_ns.png +0 -0
  118. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/prod-tg.png +0 -0
  119. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/r1.png +0 -0
  120. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/r2.png +0 -0
  121. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/r3.png +0 -0
  122. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/reaction_network.png +0 -0
  123. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/rho_v_ns.png +0 -0
  124. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/short-e.png +0 -0
  125. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/short-tg.png +0 -0
  126. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/postsim.rst +0 -0
  127. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/reactions.rst +0 -0
  128. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/results.rst +0 -0
  129. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/run.rst +0 -0
  130. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/configuration.rst +0 -0
  131. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/index.rst +0 -0
  132. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/introduction.rst +0 -0
  133. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/monomers.rst +0 -0
  134. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/buildtraces.png +0 -0
  135. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/cure_info.png +0 -0
  136. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/densification-density.png +0 -0
  137. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-coloring.tcl +0 -0
  138. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-cured.png +0 -0
  139. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-detail.png +0 -0
  140. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-liq.png +0 -0
  141. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/reaction_network.png +0 -0
  142. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/postsim.rst +0 -0
  143. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/reactions.rst +0 -0
  144. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/results.rst +0 -0
  145. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/run.rst +0 -0
  146. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/5-htpb-ipdi/configuration.rst +0 -0
  147. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/5-htpb-ipdi/index.rst +0 -0
  148. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/5-htpb-ipdi/introduction.rst +0 -0
  149. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/5-htpb-ipdi/monomers.rst +0 -0
  150. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/buildtraces.png +0 -0
  151. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/cure_info.png +0 -0
  152. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/densification-density.png +0 -0
  153. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-coloring.tcl +0 -0
  154. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-ipdi-cured.png +0 -0
  155. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-ipdi-detail.png +0 -0
  156. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-ipdi-liq.png +0 -0
  157. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/reaction_network.png +0 -0
  158. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/5-htpb-ipdi/postsim.rst +0 -0
  159. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/5-htpb-ipdi/reactions.rst +0 -0
  160. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/5-htpb-ipdi/results.rst +0 -0
  161. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/5-htpb-ipdi/run.rst +0 -0
  162. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/6-cyanate-ester/configuration.rst +0 -0
  163. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/6-cyanate-ester/index.rst +0 -0
  164. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/6-cyanate-ester/introduction.rst +0 -0
  165. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/6-cyanate-ester/monomers.rst +0 -0
  166. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-coloring.tcl +0 -0
  167. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-cured.png +0 -0
  168. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-detail.png +0 -0
  169. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-liq.png +0 -0
  170. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/6-cyanate-ester/pics/buildtraces.png +0 -0
  171. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/6-cyanate-ester/pics/cure_info.png +0 -0
  172. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/6-cyanate-ester/pics/densification-density.png +0 -0
  173. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/6-cyanate-ester/pics/reaction_network.png +0 -0
  174. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/6-cyanate-ester/postsim.rst +0 -0
  175. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/6-cyanate-ester/reactions.rst +0 -0
  176. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/6-cyanate-ester/results.rst +0 -0
  177. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/6-cyanate-ester/run.rst +0 -0
  178. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/example-tutorials/index.rst +0 -0
  179. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/index.rst +0 -0
  180. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/install.rst +0 -0
  181. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/references/index.rst +0 -0
  182. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/references/mol2-reference.pdf +0 -0
  183. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/references.bib +0 -0
  184. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/release-history.rst +0 -0
  185. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/user-guide/CURE.odg +0 -0
  186. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/user-guide/bond_filter.odg +0 -0
  187. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/user-guide/configs/configs-for-analyze.rst +0 -0
  188. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/user-guide/configs/configs-for-postsim.rst +0 -0
  189. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/user-guide/configuration-files.rst +0 -0
  190. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/user-guide/container-usage.rst +0 -0
  191. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/user-guide/flow1.odg +0 -0
  192. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/user-guide/flow1yaml.odg +0 -0
  193. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/user-guide/hydrogenated.eps +0 -0
  194. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/user-guide/hydrogenated.fig +0 -0
  195. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/user-guide/molecular-structure-inputs.rst +0 -0
  196. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/user-guide/pics/STY.png +0 -0
  197. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/user-guide/pics/STYCC.png +0 -0
  198. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/user-guide/pics/TypicalUsageFlow.png +0 -0
  199. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/user-guide/pics/bond_filter.png +0 -0
  200. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/user-guide/pics/chemdoodle-2dsketcher-emb.png +0 -0
  201. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/user-guide/pics/chemdoodle-2dsketcher-styrene.png +0 -0
  202. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/user-guide/pics/hydrogenated.png +0 -0
  203. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/user-guide/pics/ring_pierce/ring_pierce_cases.png +0 -0
  204. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/user-guide/pics/ring_pierce/ring_pierce_linkcell.png +0 -0
  205. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/user-guide/postcure-repair.rst +0 -0
  206. {htpolynet-2.2.0 → htpolynet-2.3.0}/docs/source/user-guide/program-flow.rst +0 -0
  207. {htpolynet-2.2.0 → htpolynet-2.3.0}/scripts/check-conda-sync.py +0 -0
  208. {htpolynet-2.2.0 → htpolynet-2.3.0}/scripts/release.sh +0 -0
  209. {htpolynet-2.2.0 → htpolynet-2.3.0}/scripts/render-detail.sh +0 -0
  210. {htpolynet-2.2.0 → htpolynet-2.3.0}/scripts/render-detail.tcl +0 -0
  211. {htpolynet-2.2.0 → htpolynet-2.3.0}/scripts/render-snapshot.sh +0 -0
  212. {htpolynet-2.2.0 → htpolynet-2.3.0}/scripts/run_all_examples.sh +0 -0
  213. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/__init__.py +0 -0
  214. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/analysis/__init__.py +0 -0
  215. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/analysis/analyze.py +0 -0
  216. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/analysis/plot.py +0 -0
  217. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/analysis/postsim.py +0 -0
  218. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/analysis/utils.py +0 -0
  219. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/core/__init__.py +0 -0
  220. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/core/bondtemplate.py +0 -0
  221. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/core/configuration.py +0 -0
  222. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/core/coordinates.py +0 -0
  223. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/core/topocoord.py +0 -0
  224. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/core/topology.py +0 -0
  225. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/cure/__init__.py +0 -0
  226. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/cure/chain.py +0 -0
  227. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/cure/curecontroller.py +0 -0
  228. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/cure/expandreactions.py +0 -0
  229. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/cure/reaction.py +0 -0
  230. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/external/__init__.py +0 -0
  231. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/external/command.py +0 -0
  232. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/external/gromacs.py +0 -0
  233. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/external/slurm.py +0 -0
  234. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/external/smiles_input.py +0 -0
  235. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/external/software.py +0 -0
  236. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/geometry/__init__.py +0 -0
  237. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/geometry/bondlist.py +0 -0
  238. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/geometry/lattice.py +0 -0
  239. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/geometry/linkcell.py +0 -0
  240. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/geometry/matrix4.py +0 -0
  241. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/geometry/ring.py +0 -0
  242. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/io/__init__.py +0 -0
  243. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/io/gro.py +0 -0
  244. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/io/mol2.py +0 -0
  245. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/io/pdb.py +0 -0
  246. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/repair/__init__.py +0 -0
  247. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/repair/cyanate_cap.py +0 -0
  248. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/repair/topology_surgery.py +0 -0
  249. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/README.md +0 -0
  250. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/__init__.py +0 -0
  251. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/example_depot/0-liquid-styrene.yaml +0 -0
  252. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/example_depot/1-polystyrene.yaml +0 -0
  253. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/example_depot/2-bisgma-styrene-thermoset.yaml +0 -0
  254. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/example_depot/3-pacm-dgeba-epoxy-thermoset.yaml +0 -0
  255. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/example_depot/4-dfda-fde-epoxy-thermoset.yaml +0 -0
  256. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/example_depot/5-htpb-ipdi.yaml +0 -0
  257. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/example_depot/6-cyanate-ester.yaml +0 -0
  258. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/mdp/README.md +0 -0
  259. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/mdp/drag-min.mdp +0 -0
  260. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/mdp/drag-npt.mdp +0 -0
  261. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/mdp/drag-nvt.mdp +0 -0
  262. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/mdp/min.mdp +0 -0
  263. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/mdp/npt.mdp +0 -0
  264. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/mdp/nvt.mdp +0 -0
  265. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/mdp/relax-min.mdp +0 -0
  266. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/mdp/relax-npt.mdp +0 -0
  267. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/mdp/relax-nvt.mdp +0 -0
  268. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/mdp/single-molecule-min.mdp +0 -0
  269. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/mdp/single-molecule-nvt.mdp +0 -0
  270. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/molecules/inputs/DFA.pdb +0 -0
  271. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/molecules/inputs/DGE.mol2 +0 -0
  272. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/molecules/inputs/EMB.mol2 +0 -0
  273. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/molecules/inputs/FDE.pdb +0 -0
  274. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/molecules/inputs/GMA.mol2 +0 -0
  275. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/molecules/inputs/PAC.mol2 +0 -0
  276. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/molecules/inputs/STY.mol2 +0 -0
  277. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/molecules/make-monomers.sh +0 -0
  278. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/molecules/pics/DFA.png +0 -0
  279. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/molecules/pics/DGE.png +0 -0
  280. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/molecules/pics/EMB.png +0 -0
  281. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/molecules/pics/FDE.png +0 -0
  282. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/molecules/pics/GMA.png +0 -0
  283. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/molecules/pics/PAC.png +0 -0
  284. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/molecules/pics/STY.png +0 -0
  285. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/molecules/sample-inputs/DFA.pdb +0 -0
  286. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/molecules/sample-inputs/DGE.mol2 +0 -0
  287. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/molecules/sample-inputs/EMB.mol2 +0 -0
  288. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/molecules/sample-inputs/FDE.pdb +0 -0
  289. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/molecules/sample-inputs/GMA.mol2 +0 -0
  290. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/molecules/sample-inputs/PAC.mol2 +0 -0
  291. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/molecules/sample-inputs/STY.mol2 +0 -0
  292. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/tcl/readbonds.tcl +0 -0
  293. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/tcl/readgrx.tcl +0 -0
  294. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/resources/tcl/render.tcl +0 -0
  295. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/utils/__init__.py +0 -0
  296. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/utils/banner.py +0 -0
  297. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/utils/checkpoint.py +0 -0
  298. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/utils/dataframetools.py +0 -0
  299. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/utils/inputcheck.py +0 -0
  300. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/utils/logsetup.py +0 -0
  301. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/utils/profiling.py +0 -0
  302. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/utils/stringthings.py +0 -0
  303. {htpolynet-2.2.0 → htpolynet-2.3.0}/src/htpolynet/utils/vmd_viz.py +0 -0
  304. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/__init__.py +0 -0
  305. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/conftest.py +0 -0
  306. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/unit/__init__.py +0 -0
  307. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/unit/fixtures/config1.gro +0 -0
  308. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/unit/fixtures/config1.top +0 -0
  309. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/unit/fixtures/config2.gro +0 -0
  310. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/unit/fixtures/config2.top +0 -0
  311. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/unit/fixtures/items31.edr +0 -0
  312. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/unit/fixtures/items43.edr +0 -0
  313. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/unit/fixtures/items45.edr +0 -0
  314. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/unit/fixtures/short.mdp +0 -0
  315. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/unit/test_bondtemplate.py +0 -0
  316. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/unit/test_chain.py +0 -0
  317. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/unit/test_configuration.py +0 -0
  318. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/unit/test_dataframetools.py +0 -0
  319. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/unit/test_gpu_usability.py +0 -0
  320. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/unit/test_gromacs_get_energy_menu.py +0 -0
  321. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/unit/test_gromacs_gmx_energy_trace.py +0 -0
  322. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/unit/test_inputcheck.py +0 -0
  323. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/unit/test_linkcell_pierce.py +0 -0
  324. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/unit/test_parameterize_react.py +0 -0
  325. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/unit/test_plot_smoke.py +0 -0
  326. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/unit/test_projectfilesystem.py +0 -0
  327. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/unit/test_resources.py +0 -0
  328. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/unit/test_ring.py +0 -0
  329. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/unit/test_ring_pierce_figs.py +0 -0
  330. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/unit/test_slurm_script.py +0 -0
  331. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/unit/test_smiles_input.py +0 -0
  332. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/unit/test_topology/test.top +0 -0
  333. {htpolynet-2.2.0 → htpolynet-2.3.0}/tests/unit/test_topology.py +0 -0
@@ -0,0 +1,71 @@
1
+ ---
2
+ name: htpolynet
3
+ description: Build crosslinked polymer systems with htpolynet — authoring a run configuration, parameterizing monomers, running a cure, and reading the results. Use when the task involves an htpolynet YAML config, the `htpolynet` command (run, input-check, gen-slurm-script, plots, postsim, analyze, make-viz), a monomer's active form or sacrificial hydrogens, a cure that stalls below its target conversion, or sizing an htpolynet build for a cluster.
4
+ ---
5
+
6
+ # Working with htpolynet
7
+
8
+ **Read `docs/source/user-guide/building-a-system.rst` first.** It is the
9
+ procedure, start to finish, and it is maintained alongside the code. This
10
+ file exists to route you there and to carry the few things that are easy to
11
+ get wrong before you get that far. Do not restate the docs here; when they
12
+ and this file disagree, the docs are right.
13
+
14
+ ## Start from an example, never from an empty file
15
+
16
+ `htpolynet fetch-example <n>` unpacks a working configuration. Pick the one
17
+ closest in **reaction topology** — chain growth, A2+B3 step growth,
18
+ cyclotrimerization — not the one closest in chemistry. Adapt it. Writing a
19
+ config from scratch is the slowest route and the one that produces silent
20
+ errors.
21
+
22
+ Run the example unmodified once before editing, to confirm the toolchain and
23
+ to get a known-good log to diff against.
24
+
25
+ ## Monomers are described in their active form
26
+
27
+ The most common conceptual error, and it produces a build that completes and
28
+ is wrong rather than one that fails. htpolynet conserves valence: bonding
29
+ atoms each give up a sacrificial hydrogen, so you describe the monomer with
30
+ its reactive sites already saturated. Styrene is described as ethylbenzene.
31
+ See `docs/source/user-guide/molecular-structure-inputs.rst`.
32
+
33
+ In SMILES bracket atoms the hydrogen count is explicit: `[C:1]` means *zero*
34
+ implicit hydrogens. For an sp³ carbon you almost always want `[CH2:1]` or
35
+ `[CH3:1]`. A wrong count usually surfaces much later as a missing GAFF angle
36
+ parameter in `tleap`.
37
+
38
+ ## Subcommand routing
39
+
40
+ | Intent | Command |
41
+ |---|---|
42
+ | Build a system | `htpolynet run <cfg>` |
43
+ | Size it before queueing | `htpolynet input-check <cfg>` |
44
+ | Stop after parameterization | `htpolynet run --param-only <cfg>` |
45
+ | Submit to a cluster | `htpolynet gen-slurm-script <cfg>` |
46
+ | Plot a finished build | `htpolynet plots build --proj <dir>` |
47
+ | Post-build MD / analysis | `htpolynet postsim`, `htpolynet analyze` |
48
+ | Rebuild VMD viz files | `htpolynet make-viz` |
49
+ | Report the environment | `htpolynet info` |
50
+
51
+ ## Non-obvious facts
52
+
53
+ - **The container image cannot use a GPU.** Its Gromacs is conda-forge,
54
+ built against OpenCL, which Gromacs no longer uses for NVIDIA devices.
55
+ Target CPU partitions; never suggest `--gres=gpu` or `--nv`.
56
+ - **Size core requests from `htpolynet input-check`**, which reports the
57
+ initial atom count.
58
+ - **A cure stalling below its target conversion** is usually a reaction
59
+ template that never matches — suspect `symmetry_equivalent_atoms` and
60
+ reactive-atom names before suspecting the chemistry.
61
+ - **Builds are not reproducible run to run.** There is no seed control, so
62
+ replicas come free but an exact rebuild does not. Record the commit.
63
+
64
+ ## Do not
65
+
66
+ - Do not write workarounds into this file. If the tool surprises a user in a
67
+ way that requires a ritual to avoid, that is a bug: fix it in code, or file
68
+ it in `ROADMAP.md` with enough context to act on later. A skill that
69
+ teaches people to route around a defect keeps the defect.
70
+ - Do not hand-roll a release, a version bump, or a `CHANGELOG` rotation; see
71
+ `CLAUDE.md`.
@@ -7,6 +7,98 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.3.0] - 2026-08-23
11
+
12
+ ### Fixed
13
+
14
+ - **A cached parameterization is no longer reused for a run that asked for
15
+ different AmberTools directives.** `molecules/parameterized` is keyed on
16
+ molecule name alone, and nothing in that key reflected the charge method.
17
+ A configuration specifying `charge_method: bcc` therefore reused, without
18
+ warning, a `gas` parameterization checked into the user library under the
19
+ same residue name, logging only `Using cached parameterization for TAZ`.
20
+ Measured on a cyanate-ester triazine, the cached `gas` entry carries ring
21
+ C +0.1185 / N -0.2249 where a real `bcc` run gives +0.6539 / -0.7160 --
22
+ 5.5x on the charge of the crosslink node -- and the result was a network
23
+ built with `bcc` on one monomer and Gasteiger on another, with nothing in
24
+ the output recording it. The failure was silent and invalidated results
25
+ without failing the build.
26
+
27
+ Each parameterization now writes a `.parm` record beside its
28
+ gro/top/itp/tpx/grx files listing the `charge_method`, `net_charge` and
29
+ `atom_type` that produced it, and that record is checked into the library
30
+ with them. A run whose directives disagree with the record treats the
31
+ cache as a miss and re-parameterizes, saying which directives differed.
32
+
33
+ A library entry written before this release carries no record. Those are
34
+ still used -- an existing library keeps working rather than
35
+ re-parameterizing wholesale -- but each one logs a warning naming the
36
+ charge method that could not be verified, and the parameterization stage
37
+ ends with a block listing every such molecule and the count. Rebuild them
38
+ with `--force-parameterization` if you need certainty about what a build
39
+ used.
40
+
41
+ Re-parameterizing after a mismatch checks its output in only under
42
+ `--force-checkin`, so a library entry is never silently replaced by one
43
+ built with different directives.
44
+
45
+ ### Added
46
+
47
+ - `ambertools.net_charge` and `ambertools.atom_type` configuration
48
+ directives, defaulting to `0` and `gaff`. The net charge was previously
49
+ hardcoded as `-nc 0` in the antechamber invocation, so an ionic or
50
+ zwitterionic monomer was parameterized as though it were neutral with no
51
+ way to say otherwise. The defaults reproduce the previous commands
52
+ exactly.
53
+
54
+ - A procedural page in the user guide, **Building a System, Start to
55
+ Finish**. The guide was strong on reference and had nothing on order of
56
+ operations: start from the nearest bundled example rather than an empty
57
+ file, describe monomers in their active form, check what you can before
58
+ spending compute, and a short list of failures that are known rather than
59
+ mysterious. It states plainly what `input-check` does not yet verify and
60
+ that there is no seed control, so builds are not reproducible run to run.
61
+
62
+ - A Claude skill (`.claude/skills/htpolynet/`) for users working in a clone
63
+ of the repository. It routes to the guide rather than restating it, and
64
+ carries the subcommand table and the handful of facts that are easy to get
65
+ wrong early.
66
+
67
+ - Test coverage for the parameterization record: 34 tests comparing records
68
+ without external tools, and 6 that run antechamber under both charge
69
+ methods to confirm the record describes what actually ran, that the
70
+ directive it guards changes the charges, and that a library holding a
71
+ `gas` entry refuses a `bcc` request while still reusing it for a `gas`
72
+ one. The latter skip when the AmberTools chain is absent.
73
+
74
+ ### Changed
75
+
76
+ - The `-lib` description in the user guide corrected. It said htpolynet
77
+ would "check-in the results of parameterized molecules ... in
78
+ `lib/molecules/parameterized`", which is false: `-lib` governs lookup
79
+ only, and check-in always goes to the per-user cache at `~/.htpolynet`
80
+ (or `$HTPOLYNET_CACHE`). A user who set `-lib` expecting to contain a
81
+ run's output was not contained, and nothing announced the writes.
82
+ `HTPOLYNET_CACHE` is now documented as the variable that actually governs
83
+ where products land.
84
+
85
+ - The user guide's "Parameterization caching" section corrected to match the
86
+ new behavior. It stated that a stale entry is silently reused when you
87
+ change "SMILES, atom-naming, or charge method" and that the cache is
88
+ "keyed by molecule name only"; the charge-method half of the first and all
89
+ of the second are no longer true. The warning now covers exactly what the
90
+ record does not: a constituent's structure, atom-naming or geometry
91
+ changing without a rename.
92
+
93
+ - `--force-checkin`'s help text corrected. It said "force check-in of
94
+ generated parameter files to the system library", which reads as though
95
+ check-in happens only when the flag is given. It does not: a molecule
96
+ whose name the library does not yet hold is checked in either way, and the
97
+ flag governs only whether an entry already there is *overwritten*. It
98
+ also named the wrong library -- check-in goes to the per-user library at
99
+ `~/.htpolynet` (or `$HTPOLYNET_CACHE`), not the system library. Behavior
100
+ is unchanged.
101
+
10
102
  ## [2.2.0] - 2026-08-23
11
103
 
12
104
  ### Changed
@@ -18,6 +18,12 @@ authors:
18
18
  email: cfa22@drexel.edu
19
19
  affiliation: Drexel University
20
20
  repository-code: https://github.com/cameronabrams/htpolynet
21
+ identifiers:
22
+ - type: doi
23
+ value: 10.5281/zenodo.22070252
24
+ description: >-
25
+ Concept DOI for htpolynet; always resolves to the latest
26
+ archived release.
21
27
  url: https://htpolynet.readthedocs.io/
22
28
  license: MIT
23
29
  version: 2.1.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: htpolynet
3
- Version: 2.2.0
3
+ Version: 2.3.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/
@@ -42,6 +42,7 @@ Description-Content-Type: text/markdown
42
42
  [![License: MIT](https://img.shields.io/pypi/l/htpolynet)](https://github.com/cameronabrams/htpolynet/blob/main/LICENSE)
43
43
  [![Docs](https://readthedocs.org/projects/htpolynet/badge/?version=latest)](https://htpolynet.readthedocs.io/en/latest/)
44
44
  [![PyPI Downloads](https://static.pepy.tech/badge/htpolynet)](https://pepy.tech/projects/htpolynet)
45
+ [![DOI](https://img.shields.io/badge/DOI-10.5281%2Fzenodo.22070252-blue)](https://doi.org/10.5281/zenodo.22070252)
45
46
 
46
47
  htpolynet is a Python utility for generating atomistic models of cross-linked polymer networks together with appropriate topology and parameter files required for molecular dynamics simulations using Gromacs. It is intended as a fully automated system builder requiring as inputs only the molecular structures of any monomer species, a description of the polymerization chemistry, and a handful of options describing desired system size and composition. htpolynet uses the Generalized Amber Force Field for atom-typing and parameter generation.
47
48
 
@@ -8,6 +8,7 @@
8
8
  [![License: MIT](https://img.shields.io/pypi/l/htpolynet)](https://github.com/cameronabrams/htpolynet/blob/main/LICENSE)
9
9
  [![Docs](https://readthedocs.org/projects/htpolynet/badge/?version=latest)](https://htpolynet.readthedocs.io/en/latest/)
10
10
  [![PyPI Downloads](https://static.pepy.tech/badge/htpolynet)](https://pepy.tech/projects/htpolynet)
11
+ [![DOI](https://img.shields.io/badge/DOI-10.5281%2Fzenodo.22070252-blue)](https://doi.org/10.5281/zenodo.22070252)
11
12
 
12
13
  htpolynet is a Python utility for generating atomistic models of cross-linked polymer networks together with appropriate topology and parameter files required for molecular dynamics simulations using Gromacs. It is intended as a fully automated system builder requiring as inputs only the molecular structures of any monomer species, a description of the polymerization chemistry, and a handful of options describing desired system size and composition. htpolynet uses the Generalized Amber Force Field for atom-typing and parameter generation.
13
14
 
@@ -0,0 +1,255 @@
1
+ # Roadmap
2
+
3
+ Ideas worth doing that we haven't done yet. This is a living list, not a
4
+ commitment or a schedule. When something here gets done, it moves to
5
+ `CHANGELOG.md` and comes off this page.
6
+
7
+ Rough ordering within each section is by value, not by effort.
8
+
9
+ ## Container and deployment
10
+
11
+ - **CUDA-enabled Gromacs in the container image.** The published image
12
+ installs Gromacs from conda-forge, whose default linux-64 package is
13
+ built with OpenCL (not CUDA) and generic `AVX2_256` SIMD. Gromacs no
14
+ longer drives NVIDIA devices through OpenCL, so the image cannot use a
15
+ GPU at all, and on an AVX-512 host it also leaves single-core
16
+ throughput on the table. For reference, Picotte's own module is
17
+ `AVX_512` + CUDA. Doing this well probably means a second image tag
18
+ (e.g. `:cuda`) built against `gromacs=*=nompi_cuda*` rather than
19
+ changing the default, since it pulls in the CUDA runtime and inflates
20
+ the image substantially, and it needs a GPU-equipped runner or a
21
+ manual build to verify. The CPU image should stay the default so that
22
+ `docker run` on a laptop keeps working. Note that
23
+ `software.gpu_unusable_reasons()` already reasons about this correctly,
24
+ so a CUDA image would simply start passing its checks rather than
25
+ needing new logic.
26
+ - **Publish a digest or version tag people can pin.** `:latest` moves
27
+ every week via the scheduled rebuild, so a run recorded as "built with
28
+ the container" is not reproducible. Per-commit tags already exist;
29
+ what's missing is documenting that users should pin one.
30
+ - **Retire `ghcr.io/abramsgroup/htpolynet`.** Superseded by the
31
+ `cameronabrams` package; still public and still serving a June image to
32
+ anyone with an old link.
33
+
34
+ ## Testing and CI
35
+
36
+ Coverage as of the last measurement: **38.8%** overall.
37
+
38
+ - **`repair/` has no tests at all** — `cyanate_cap.py` (208 statements)
39
+ and `topology_surgery.py` (125), both at 0%. This is the highest-value
40
+ gap: the postcure repair stage makes the strongest correctness claim in
41
+ the project ("atom conservation is exact"), and right now the only
42
+ thing checking it is reading a residue census at the end of a
43
+ multi-hour build. It is pure topology manipulation, so it can be tested
44
+ deterministically in milliseconds against a synthetic `TopoCoord`
45
+ carrying triazines at k=0,1,2,3 — assert atom counts, the residue
46
+ census, cap placement, and that no unreacted bridge -OH survives.
47
+ - **An end-to-end example in CI.** A deliberately tiny build (a
48
+ 20-molecule, few-ps variant of example 0) run inside the container
49
+ would cover `core/runtime.py` and `cure/curecontroller.py` — 1,056
50
+ statements, both at 0% — in the only way that is honest, since faking
51
+ the whole AmberTools/Gromacs tool chain to unit-test the orchestration
52
+ is a large effort for less confidence.
53
+ - **Remaining zero-coverage modules**: `analysis/postsim.py` (203),
54
+ `cli.py` (165), `analysis/analyze.py` (137), `utils/vmd_viz.py` (75),
55
+ `utils/checkpoint.py` (54).
56
+ - **`analysis/plot.py` is at 34%** after the smoke-test pass. The
57
+ diagnostics-log parsers (`diagnostics_graphs`, `_token_match`,
58
+ `_parse_data`) are the part most likely to rot silently — they already
59
+ broke once when modules were renamed — and they are testable against a
60
+ small captured log fixture.
61
+ - **Coverage reporting in CI**, so the number is visible on a PR rather
62
+ than something we remember to measure by hand.
63
+
64
+ ## Release and distribution
65
+
66
+ - **External services still keyed to the old repo identity.** The Aug 2026
67
+ transfer from `AbramsGroup/HTPolyNet` to `cameronabrams/htpolynet` moved
68
+ the code but left every integration pointing at the old owner. Three
69
+ broke and were fixed during the 2.2.0 release: the GHCR package path
70
+ (docs referenced a package that had never been published under the new
71
+ owner), PyPI trusted publishing (`invalid-publisher` — the claim no
72
+ longer matched, so the v2.2.0 upload failed until the publisher was
73
+ re-registered), and Read the Docs, whose project `repository.url` is
74
+ **still** `https://github.com/AbramsGroup/htpolynet`. Builds succeed
75
+ anyway because GitHub redirects the clone, but tag versions never sync —
76
+ `/en/v2.2.0/` 404s and the API reports "No Version matches the given
77
+ query". Fix the RTD project URL, then activate the tagged version. Worth
78
+ keeping this list as the checklist if the repo ever moves again.
79
+
80
+
81
+ - **Mint a software DOI.** Enable the Zenodo GitHub integration for
82
+ `cameronabrams/htpolynet`, then the next `scripts/release.sh` run
83
+ archives the release automatically. Afterwards, add the concept DOI (not
84
+ the version DOI) as a README badge and an `identifiers` entry in
85
+ `CITATION.cff`. Note that enabling is not retroactive: releases before
86
+ the toggle are not archived. Also note that adding a `.zenodo.json`
87
+ would make Zenodo ignore `CITATION.cff` entirely — only worth doing if
88
+ we need Zenodo-specific fields such as `grants` for funder linkage.
89
+ - **Per-minor Python classifiers.** `pyproject.toml` declares only
90
+ `Programming Language :: Python :: 3`, so the PyPI Python badge reads an
91
+ uninformative `python: 3`. Adding `:: 3.10` through `:: 3.13` would make
92
+ it read `3.10 | 3.11 | 3.12 | 3.13`, which CI already verifies at both
93
+ ends.
94
+
95
+ ## Usability
96
+
97
+ - **`gen-slurm-script` doesn't stage to scratch.** The emitted script
98
+ runs in the submit directory. A cure run does heavy small-file I/O
99
+ every iteration, so on a cluster whose home and group storage are NFS
100
+ that is the wrong place. The cluster-correct pattern is to run in
101
+ node-local or parallel scratch and copy results back, with a `trap` so
102
+ partial results survive a timeout. It also cannot emit a job array,
103
+ which is the right shape for sweeping a set of configs.
104
+ - **`-restart` is documented as "EXPERIMENTAL: broken at the cure
105
+ stage".** A build that dies mid-cure currently has to start over — the
106
+ worst possible time to lose work, since cure is the longest stage.
107
+ - **Make `input-check` a real config linter.** It currently reports only
108
+ the initial atom count. Everything a new config gets wrong is checkable
109
+ cheaply and statically, before the user spends hours discovering it:
110
+ (a) that each `symmetry_equivalent_atoms` group really is topologically
111
+ equivalent — RDKit canonical ranks with `breakTies=False` settle it in
112
+ about ten lines, and a wrong group silently generates reaction templates
113
+ the cure stage will never match; (b) that the A2+B3 site counts actually
114
+ balance at the given monomer `count`s, and that `desired_conversion` is
115
+ reachable given them; (c) that no `reactive_atoms` name collides with the
116
+ bare element names `_reset_names_to_element` assigns to every unmapped
117
+ atom, since the repair stage looks atoms up by name; (d) that the
118
+ requested `charge_method` matches the provenance record of any cached
119
+ parameterization of the same name -- the build itself now rejects a
120
+ mismatch, but reporting it in the pre-flight is cheaper than discovering
121
+ mid-run that half the molecules need re-parameterizing. Building the
122
+ cyanate-ester bridge series meant doing (a) and (b) by hand in a throwaway
123
+ RDKit script, which is exactly the work a user should not have to
124
+ reinvent.
125
+ - **`-lib` is read-only, and nothing says so.** `pfs.checkout()` and
126
+ `pfs.exists()` consult the `-lib` user library first, then the user cache,
127
+ then the system library -- but `pfs.checkin()` writes unconditionally to the
128
+ user cache, and `UserLibrary` has no `checkin()` method at all. So pointing
129
+ a run at `-lib somewhere` redirects where it *reads* parameterizations from
130
+ while leaving where it *writes* them untouched. That asymmetry is invisible
131
+ from the flag, from `--help`, and from the docs, and it is a natural thing
132
+ to get wrong: a user who passes `-lib` for provenance reasonably concludes
133
+ their products are being contained there. Either `checkin()` should prefer
134
+ the user library when one is configured, or the flag and docs should say
135
+ plainly that it governs lookup only. Verified empirically 2026-08-23: with
136
+ `userlibrary` set, `pfs.checkin()` still landed the file in the user cache.
137
+
138
+ What makes this more than a naming problem is that the writes are silent
139
+ and cumulative. Nothing logs them, nothing warns, and a run that is
140
+ quietly depositing molecules into a shared library looks identical to one
141
+ that is not -- the only way to discover it is to audit mtimes, which
142
+ nobody does unprompted. The calibration study ran three sweeps believing
143
+ `-lib` contained it, and would have added roughly seventy entries to
144
+ `~/.htpolynet` across its remaining bridges; it was caught by reading
145
+ `checkin()`, not by anything the tool said. Whatever the fix, a run should
146
+ be able to say where its parameterizations went -- which is the same
147
+ requirement as the build manifest below, approached from the write side
148
+ rather than the read side. The two may well be one item: *where did this
149
+ come from, and what produced it*.
150
+
151
+ - **No way to run without writing to the user library.** `pfs.checkin()`
152
+ declines to *replace* an entry unless `--force-checkin` is given, but it
153
+ always *writes* one the library does not yet hold, so any run adds every
154
+ molecule name it produces to `~/.htpolynet`. The flag's help text said
155
+ "force check-in of generated parameter files to the system library", which
156
+ reads as though check-in happens only with the flag, and it named the wrong
157
+ library; that wording is fixed, but the missing capability is real. The
158
+ calibration study wanted exactly this: a way to develop against a config
159
+ without its intermediate products accumulating in a library shared with
160
+ other work. Today the only lever is pointing `HTPOLYNET_CACHE` elsewhere,
161
+ which is a blunt instrument because it also hides the entries you *do* want
162
+ to reuse. A `--no-checkin` flag threaded through
163
+ `Runtime._checkin_parameterization()` would cover it in a few lines.
164
+
165
+ - **Two different defaults for `charge_method`.** `AMBERTOOLS_DEFAULTS` in
166
+ `external/ambertools.py` says `bcc`, which is what a direct
167
+ `GAFFParameterize()` call with no directives gets; `Runtime.runtime_defaults`
168
+ says `gas`, which is what every actual build gets, because
169
+ `_apply_runtime_defaults()` fills it in before AmberTools is ever reached.
170
+ Both were already there and the provenance record is consistent either way
171
+ -- whichever default applies is the one recorded -- so this is a
172
+ readability trap rather than a live bug. It is still worth collapsing to
173
+ one value, and the answer is probably `gas`, since changing what builds
174
+ default to would silently change everyone's charges, which is the exact
175
+ class of harm the record was added to prevent.
176
+
177
+ - **Nothing durable records that a build reused parameterizations of
178
+ unverified provenance.** The parameterization stage now warns per molecule
179
+ and again in a block at the end of the stage, but both live only in the
180
+ log, and a log is the first thing discarded. Someone reading a result six
181
+ months later -- or a reviewer asking what a published network was actually
182
+ parameterized with -- has no artifact to check. htpolynet writes no build
183
+ manifest today; `profile.json` holds timings only, and the diagnostic log
184
+ is the log. A small `build-manifest.json` in the project directory listing
185
+ each molecule, its origin (`newly parameterized` / `previously
186
+ parameterized`), and its provenance record where one exists would carry
187
+ that, and would be worth more than this one flag: it is also the natural
188
+ home for the config hash, the htpolynet and AmberTools versions, and the
189
+ seed once seeds exist. Raised by the calibration study, which caught the
190
+ original cache bug from a wall-clock anomaly rather than from any log line.
191
+ See also the `-lib` entry above: "a run should be able to say where its
192
+ parameterizations went" and "a result should be able to say what produced
193
+ it" are the same requirement from two directions, and a manifest that
194
+ recorded the check-in destination would answer both.
195
+
196
+ - **A cached parameterization is not checked against the input structure
197
+ it was built from.** The provenance record added alongside the cache now
198
+ covers `charge_method`, `net_charge` and `atom_type` -- everything in the
199
+ AmberTools invocation -- but not the structure antechamber consumed. So
200
+ editing `lib/molecules/inputs/TAZ.mol2` and re-running still reuses the
201
+ parameterization of the *old* geometry, silently, exactly as the charge
202
+ method used to. Hashing the input would close it, and for a monomer that
203
+ is easy: `Molecule.parameterize()` has the input file in the working
204
+ directory at the moment it runs. Two things stopped it going in with the
205
+ rest: (a) a molecule built by a reaction has no stable input to hash --
206
+ `generate()` writes its mol2 from the merged reactant TopoCoord, whose
207
+ coordinates vary run to run, so hashing it would make every generated
208
+ molecule a permanent cache miss; the hash would have to be recorded only
209
+ for `origin == 'unparameterized'` monomers and compared only when both
210
+ sides carry one. (b) `Runtime._cached_parameterization_mismatch()` runs
211
+ before `generate()` checks the input structure out, and `pfs` has no way
212
+ to resolve a library file to an absolute path without copying it into the
213
+ working directory -- `checkout()` always copies. A `pfs.locate(filename)`
214
+ returning the resolved source path across user library, user cache and
215
+ system library is the missing piece, and is worth having on its own.
216
+
217
+ - **No seed control anywhere, so a build cannot be reproduced.** Three
218
+ independent sources of randomness are all unseeded: `random.sample` for
219
+ conformer selection (`core/runtime.py`), `np.random.random()` for the
220
+ per-bond probability test (`cure/curecontroller.py`), and every `.mdp`
221
+ sets `gen-vel = yes` without `gen-seed`, so Gromacs picks a pseudo-random
222
+ one per run. Two runs of one config therefore diverge — example 6 gave 57
223
+ vs 60 incomplete triazines on two machines at the same 0.90 conversion.
224
+ That is convenient in one direction (independent replicas of a
225
+ quenched-disorder ensemble come free by re-running) but it means a build
226
+ reported in a paper cannot be reproduced exactly, and a failure seen once
227
+ may not reappear. The fix is a top-level `seed:` that feeds all three:
228
+ seed `random` and `np.random` at startup and write `gen-seed` into every
229
+ generated mdp, with replicas then requested by varying it rather than by
230
+ relying on entropy.
231
+ - **Drop the pre-3.5 matplotlib fallback** in `analysis/plot.py`'s
232
+ `_get_cmap()` once `matplotlib>=3.6` is a safe floor; the
233
+ `matplotlib.colormaps` registry is then always present.
234
+
235
+ ## Example depot
236
+
237
+ - **Example 5 is still not laptop-scale.** The `68d81fb` retune cut the
238
+ monomer pool to make HTPB/IPDI "fit in a reasonable wall time on a
239
+ laptop", but a validation run on 16 CPU cores took **10h17m** — about
240
+ ten times any other example (the next longest, PACM/DGEBA, was 2h15m).
241
+ The cost is structural: densification starts at 10 kg/m³ in a 27 nm box
242
+ and needs all 50 NPT repeats to compress geometrically (a steady 2.9%
243
+ box-side reduction per repeat) up to ~860 kg/m³, and the cure stage then
244
+ does drag/relax on long chains. Worth revisiting whether the low
245
+ starting density is really necessary, or whether the example can start
246
+ denser with a shorter densification.
247
+
248
+
249
+ - **More cyanate-ester variants.** Example 6 covers bisphenol-A
250
+ dicyanate. The same reaction and repair machinery carries over to other
251
+ bisphenol bridges with only a SMILES swap in `constituents` — bisphenol
252
+ F (methylene), bisphenol E (methylethylidene), hexafluorobisphenol A,
253
+ thioether, sulfone, dicyclopentadiene. A homologous series would
254
+ exercise the repair stage across chemistries and give the tutorials a
255
+ structure-property story.
@@ -55,6 +55,11 @@ htpolynet.core
55
55
  :undoc-members:
56
56
  :show-inheritance:
57
57
 
58
+ .. automodule:: htpolynet.core.paramcache
59
+ :members:
60
+ :undoc-members:
61
+ :show-inheritance:
62
+
58
63
  .. automodule:: htpolynet.core.projectfilesystem
59
64
  :members:
60
65
  :undoc-members:
@@ -0,0 +1,172 @@
1
+ .. _building_a_system:
2
+
3
+ Building a System, Start to Finish
4
+ ----------------------------------
5
+
6
+ The other pages in this guide are reference: what each subcommand accepts,
7
+ what each configuration directive means, what the program does internally.
8
+ This page is the procedure — the order to do things in, and where each step
9
+ can go wrong. It assumes ``htpolynet`` is installed (see :doc:`/install`)
10
+ and that ``htpolynet info`` reports AmberTools and Gromacs on your ``PATH``.
11
+
12
+ Start from the nearest example, not from an empty file
13
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
14
+
15
+ A working configuration is a few hundred lines and most of it is not
16
+ chemistry-specific. Writing one from scratch is the slowest possible route.
17
+ Pick whichever bundled example is closest in *reaction topology* to what you
18
+ want and edit it:
19
+
20
+ .. code-block:: console
21
+
22
+ $ htpolynet fetch-example 1 # linear chain growth (polystyrene)
23
+ $ htpolynet fetch-example 2 # A2 + B4 thermoset (bisGMA/styrene)
24
+ $ htpolynet fetch-example 3 # amine + epoxy (PACM/DGEBA)
25
+ $ htpolynet fetch-example 6 # cyclotrimerization (cyanate ester)
26
+
27
+ Closeness in topology matters more than closeness in chemistry. If you are
28
+ building a step-growth thermoset from a difunctional and a tetrafunctional
29
+ monomer, example 2 is a better starting point than an example that happens
30
+ to share a functional group but polymerizes by chain growth.
31
+
32
+ Run the example unmodified once before editing it. It confirms your
33
+ toolchain works, and it gives you a known-good log to compare against when
34
+ your own configuration misbehaves.
35
+
36
+ Describe monomers in their *active* form
37
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
38
+
39
+ This is the single most common conceptual error, and it produces a build
40
+ that runs to completion and is wrong rather than one that fails.
41
+
42
+ ``htpolynet`` conserves valence: when two atoms bond, each gives up a
43
+ **sacrificial hydrogen**. So the structure you describe is not the textbook
44
+ monomer — it is the monomer with its reactive sites already saturated.
45
+ Styrene is described as ethylbenzene. See
46
+ :ref:`molecular_structure_inputs` for the full explanation and pictures;
47
+ do not skip it.
48
+
49
+ Prefer writing SMILES directly into the ``constituents`` block with
50
+ RDKit atom-map labels, which names reactive atoms by chemical identity
51
+ rather than by file index:
52
+
53
+ .. code-block:: yaml
54
+
55
+ constituents:
56
+ STY:
57
+ smiles: "c1ccccc1[CH2:1][CH3:2]"
58
+ reactive_atoms: {1: C1, 2: C2}
59
+
60
+ Watch the hydrogen counts inside brackets. ``[C:1]`` means *zero* implicit
61
+ hydrogens; for an sp³ carbon you nearly always want ``[CH2:1]`` or
62
+ ``[CH3:1]``. A wrong count typically surfaces much later as a missing GAFF
63
+ angle parameter in ``tleap``, which is a long way from its cause.
64
+
65
+ Check what you can before spending compute
66
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
67
+
68
+ .. code-block:: console
69
+
70
+ $ htpolynet input-check my-system.yaml
71
+
72
+ This reports the atom count of the initial system, which is what you size a
73
+ core request against. It is fast and worth running every time you change
74
+ monomer counts.
75
+
76
+ Be aware of what it does **not** yet check. It does not verify that
77
+ ``symmetry_equivalent_atoms`` groups really are topologically equivalent,
78
+ that your A2 + B3 site counts balance, or that ``desired_conversion`` is
79
+ reachable given the monomer counts you supplied. Those are all silent
80
+ failure modes today: a wrong symmetry group generates reaction templates
81
+ the cure stage will simply never match, and the build spends its full
82
+ wall-clock reaching a conversion it could never have reached. If a cure
83
+ stalls well below the conversion you asked for, suspect these first.
84
+
85
+ Run it
86
+ ^^^^^^
87
+
88
+ .. code-block:: console
89
+
90
+ $ htpolynet run my-system.yaml
91
+
92
+ Locally this is fine for the bundled examples. For anything production-sized,
93
+ generate a batch script rather than writing one:
94
+
95
+ .. code-block:: console
96
+
97
+ $ htpolynet gen-slurm-script my-system.yaml
98
+
99
+ Size the core request from the ``input-check`` atom count. If you are using
100
+ the container image, target **CPU partitions**: its Gromacs comes from
101
+ conda-forge and is built against OpenCL, which Gromacs no longer uses to
102
+ drive NVIDIA devices, so the image cannot use a GPU. Requesting
103
+ ``--gres=gpu`` or passing ``--nv`` buys nothing and may cost you queue time.
104
+ See :doc:`container-usage`.
105
+
106
+ Parameterization runs first and is cached across projects and across
107
+ directories. The first run of a new chemistry pays several minutes per
108
+ species; later runs reuse that work. Read
109
+ :ref:`parameterization_caching` before you rely on it — in particular,
110
+ editing a monomer's structure without renaming it will silently reuse the
111
+ old parameterization.
112
+
113
+ Replicas, and what "the same" means
114
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
115
+
116
+ Each ``htpolynet run`` in the same base directory creates its own project
117
+ directory, so replicas are just repeated invocations of the same
118
+ configuration.
119
+
120
+ There is currently **no seed control**. Conformer selection, the per-bond
121
+ probability test, and Gromacs velocity generation are all unseeded, so two
122
+ runs of one configuration diverge. This is convenient in one direction —
123
+ independent replicas of a quenched-disorder ensemble come free — but it
124
+ means a specific build cannot be reproduced exactly, and a failure seen
125
+ once may not reappear. Record the commit you built with if the result
126
+ matters.
127
+
128
+ Look at what you built
129
+ ^^^^^^^^^^^^^^^^^^^^^^
130
+
131
+ .. code-block:: console
132
+
133
+ $ htpolynet plots build --proj proj-0
134
+ $ htpolynet make-viz -top final.top -gro final.gro
135
+
136
+ ``plots build`` gives traces, the reaction graph, and cluster-size
137
+ distributions; ``make-viz`` regenerates VMD visualization files from an
138
+ existing topology/coordinate pair. For thermomechanical properties, run
139
+ post-build simulations and analyses:
140
+
141
+ .. code-block:: console
142
+
143
+ $ htpolynet postsim postsim.yaml --proj proj-0
144
+ $ htpolynet plots post --proj proj-0
145
+ $ htpolynet analyze analyze.yaml --proj proj-0
146
+
147
+ See :doc:`configs/configs-for-postsim` and :doc:`configs/configs-for-analyze`.
148
+
149
+ When something goes wrong
150
+ ^^^^^^^^^^^^^^^^^^^^^^^^^
151
+
152
+ A short list of traps that are known rather than mysterious:
153
+
154
+ * **The cure stalls below your target conversion.** Usually a reaction
155
+ template that never matches: check ``symmetry_equivalent_atoms`` and your
156
+ reactive-atom names before suspecting the chemistry.
157
+
158
+ * **A ``tleap`` error about a missing parameter.** Usually an atom typed
159
+ wrongly because of a hydrogen-count error in a SMILES bracket atom.
160
+
161
+ * **Results that do not match the configuration you are reading.** Suspect
162
+ a stale cache entry: a structure edit without a rename reuses the old
163
+ parameterization. ``--force-parameterization`` rebuilds.
164
+
165
+ * **A build that dies during cure.** ``-restart`` is documented as
166
+ experimental and is currently broken at the cure stage, which is the worst
167
+ place to lose work since cure is the longest phase. Treat a dead cure as
168
+ a restart from the beginning.
169
+
170
+ * **Anything else.** Run ``htpolynet info`` and include its output when
171
+ reporting a problem; it reports the versions of every external tool the
172
+ build depends on.