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