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.
- {htpolynet-2.6.2 → htpolynet-2.7.0}/CHANGELOG.md +108 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/PKG-INFO +1 -1
- {htpolynet-2.6.2 → htpolynet-2.7.0}/ROADMAP.md +267 -10
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/configs/configs-for-run.rst +4 -4
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/program-flow.rst +54 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/pyproject.toml +1 -1
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/cure/curecontroller.py +154 -3
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/repair/cyanate_cap.py +43 -5
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/mdp/npt.mdp +2 -1
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/mdp/nvt.mdp +2 -1
- htpolynet-2.7.0/tests/unit/test_relax_instrumentation.py +151 -0
- htpolynet-2.7.0/tests/unit/test_repair_conversion.py +118 -0
- htpolynet-2.6.2/tests/unit/test_repair_conversion.py +0 -63
- {htpolynet-2.6.2 → htpolynet-2.7.0}/.claude/settings.json +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/.claude/skills/htpolynet/SKILL.md +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/.envrc +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/.github/workflows/conda-forge-sync.yml +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/.github/workflows/docker.yml +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/.github/workflows/release.yaml +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/.github/workflows/test.yml +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/.gitignore +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/.readthedocs.yaml +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/CITATION.cff +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/CLAUDE.md +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/LICENSE +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/MANIFEST.in +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/README.md +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docker/Dockerfile +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docker/compose.yml +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docker/docker-entrypoint.sh +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/Makefile +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/README.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/make.bat +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/requirements.txt +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/_static/.gitkeep +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/changelog.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/conf.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/0-liquid-styrene/configuration.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/0-liquid-styrene/index.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/0-liquid-styrene/introduction.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/0-liquid-styrene/monomer.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/0-liquid-styrene/postsim.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/0-liquid-styrene/results.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/0-liquid-styrene/run.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/configuration.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/index.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/introduction.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/monomer.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/pics/STY.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/pics/STYCC.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/pics/buildtraces.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/pics/cure_info.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/pics/densification-density.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/pics/final-box.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/pics/reaction_network.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/pics/sty-coloring.tcl +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/pics/sty-cured.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/pics/sty-detail.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/pics/sty-liq.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/pics/styrene-polymerization.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/postsim.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/reactions.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/results.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/1-polystyrene/run.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/configuration.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/index.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/introduction.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/BPA.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/GMA.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/HIE.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/buildtraces.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/cure_info.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/densification-density.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/four_dimers.eps +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/four_dimers.fig +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/four_dimers.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-coloring.tcl +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-cured.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-detail.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/gma-sty-liq.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/p1-traces.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/reaction_network.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/vesys.eps +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/vesys.fig +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/pics/vesys.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/postsim.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/reactions.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/results.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/2-bisgma-styrene-thermoset/run.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/configuration.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/index.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/introduction.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/monomers.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/DGE-epoxy.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/DGE-labelled.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/PAC-2d.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/PAC-labelled.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/buildtraces.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/cure_info.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/densification-density.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-coloring.tcl +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-cured.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-detail.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dge-pac-liq.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dgesys.eps +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dgesys.fig +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/dgesys.png +0 -0
- {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
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/postsim-typical.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/prod-e.png +0 -0
- {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
- {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
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/prod-tg.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/r1.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/r2.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/r3.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/reaction_network.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/rho_v_ns.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/short-e.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/pics/short-tg.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/postsim.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/reactions.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/results.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/3-pacm-dgeba-epoxy-thermoset/run.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/configuration.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/index.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/introduction.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/monomers.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/buildtraces.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/cure_info.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/densification-density.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-coloring.tcl +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-cured.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-detail.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/dfa-fde-liq.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/pics/reaction_network.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/postsim.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/reactions.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/results.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/4-dfda-fde-epoxy-thermoset/run.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/configuration.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/index.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/introduction.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/monomers.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/buildtraces.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/cure_info.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/densification-density.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-coloring.tcl +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-ipdi-cured.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-ipdi-detail.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/htpb-ipdi-liq.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/pics/reaction_network.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/postsim.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/reactions.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/results.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/5-htpb-ipdi/run.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/configuration.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/index.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/introduction.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/monomers.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-coloring.tcl +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-cured.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-detail.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/pics/badcy-liq.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/pics/buildtraces.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/pics/cure_info.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/pics/densification-density.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/pics/reaction_network.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/postsim.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/reactions.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/results.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/6-cyanate-ester/run.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/example-tutorials/index.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/htpolynetpackage.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/index.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/install.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/references/index.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/references/mol2-reference.pdf +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/references.bib +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/release-history.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/CURE.odg +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/bond_filter.odg +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/building-a-system.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/configs/configs-for-analyze.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/configs/configs-for-postsim.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/configuration-files.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/container-usage.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/flow1.odg +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/flow1yaml.odg +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/hydrogenated.eps +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/hydrogenated.fig +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/index.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/molecular-structure-inputs.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/pics/STY.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/pics/STYCC.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/pics/TypicalUsageFlow.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/pics/bond_filter.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/pics/chemdoodle-2dsketcher-emb.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/pics/chemdoodle-2dsketcher-styrene.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/pics/hydrogenated.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/pics/ring_pierce/ring_pierce_cases.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/pics/ring_pierce/ring_pierce_linkcell.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/postcure-repair.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/docs/source/user-guide/usage.rst +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/scripts/check-conda-sync.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/scripts/release.sh +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/scripts/render-detail.sh +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/scripts/render-detail.tcl +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/scripts/render-snapshot.sh +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/scripts/run_all_examples.sh +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/__init__.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/analysis/__init__.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/analysis/analyze.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/analysis/plot.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/analysis/postsim.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/analysis/utils.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/cli.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/core/__init__.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/core/bondtemplate.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/core/configuration.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/core/coordinates.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/core/molecule.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/core/paramcache.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/core/projectfilesystem.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/core/runtime.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/core/topocoord.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/core/topology.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/cure/__init__.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/cure/chain.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/cure/expandreactions.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/cure/reaction.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/external/__init__.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/external/ambertools.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/external/command.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/external/gromacs.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/external/slurm.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/external/smiles_input.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/external/software.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/geometry/__init__.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/geometry/bondlist.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/geometry/lattice.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/geometry/linkcell.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/geometry/matrix4.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/geometry/ring.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/io/__init__.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/io/gro.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/io/mol2.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/io/pdb.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/repair/__init__.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/repair/topology_surgery.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/README.md +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/__init__.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/claude/SKILL.md +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/example_depot/0-liquid-styrene.yaml +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/example_depot/1-polystyrene.yaml +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/example_depot/2-bisgma-styrene-thermoset.yaml +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/example_depot/3-pacm-dgeba-epoxy-thermoset.yaml +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/example_depot/4-dfda-fde-epoxy-thermoset.yaml +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/example_depot/5-htpb-ipdi.yaml +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/example_depot/6-cyanate-ester.yaml +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/mdp/README.md +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/mdp/drag-min.mdp +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/mdp/drag-npt.mdp +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/mdp/drag-nvt.mdp +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/mdp/min.mdp +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/mdp/relax-min.mdp +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/mdp/relax-npt.mdp +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/mdp/relax-nvt.mdp +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/mdp/single-molecule-min.mdp +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/mdp/single-molecule-nvt.mdp +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/inputs/DFA.pdb +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/inputs/DGE.mol2 +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/inputs/EMB.mol2 +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/inputs/FDE.pdb +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/inputs/GMA.mol2 +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/inputs/PAC.mol2 +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/inputs/STY.mol2 +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/make-monomers.sh +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/pics/DFA.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/pics/DGE.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/pics/EMB.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/pics/FDE.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/pics/GMA.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/pics/PAC.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/pics/STY.png +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/sample-inputs/DFA.pdb +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/sample-inputs/DGE.mol2 +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/sample-inputs/EMB.mol2 +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/sample-inputs/FDE.pdb +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/sample-inputs/GMA.mol2 +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/sample-inputs/PAC.mol2 +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/molecules/sample-inputs/STY.mol2 +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/tcl/readbonds.tcl +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/tcl/readgrx.tcl +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/resources/tcl/render.tcl +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/utils/__init__.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/utils/banner.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/utils/checkpoint.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/utils/dataframetools.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/utils/inputcheck.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/utils/logsetup.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/utils/profiling.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/utils/stringthings.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/src/htpolynet/utils/vmd_viz.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/__init__.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/conftest.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/__init__.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/fixtures/config1.gro +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/fixtures/config1.top +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/fixtures/config2.gro +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/fixtures/config2.top +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/fixtures/items31.edr +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/fixtures/items43.edr +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/fixtures/items45.edr +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/fixtures/short.mdp +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_bondtemplate.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_cap_placement.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_chain.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_completion_bias.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_configuration.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_dataframetools.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_gpu_usability.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_gromacs_get_energy_menu.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_gromacs_gmx_energy_trace.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_inputcheck.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_linkcell_pierce.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_paramcache.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_paramcache_ambertools.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_parameterize_react.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_plot_smoke.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_projectfilesystem.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_resources.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_ring.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_ring_pierce_figs.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_setup_claude.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_slurm_script.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_smiles_input.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_software_provenance.py +0 -0
- {htpolynet-2.6.2 → htpolynet-2.7.0}/tests/unit/test_topology/test.top +0 -0
- {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.
|
|
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
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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.
|
|
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
|
|
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
|
|
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
|