From c7e12fd55b44c6db74edbf10ba596819333a7dd3 Mon Sep 17 00:00:00 2001 From: Subha Nayak <118820636+subhnayak@users.noreply.github.com> Date: Mon, 14 Jul 2025 13:06:52 +0530 Subject: [PATCH 01/25] update pyproj.toml to 0.9.0.dev4 (#1104) Co-authored-by: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> --- doc/changelog.d/1104.miscellaneous.md | 1 + pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 doc/changelog.d/1104.miscellaneous.md diff --git a/doc/changelog.d/1104.miscellaneous.md b/doc/changelog.d/1104.miscellaneous.md new file mode 100644 index 0000000000..2d9a272bf4 --- /dev/null +++ b/doc/changelog.d/1104.miscellaneous.md @@ -0,0 +1 @@ +Update pyproj.toml to 0.9.0.dev4 \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 02b9dc5c62..826f6c2410 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "flit_core.buildapi" [project] name = "ansys-meshing-prime" -version = "0.9.0.dev3" +version = "0.9.0.dev4" description = "PyPrimeMesh is a Python client to Ansys Prime Server, which delivers core Ansys meshing technology." readme = "README.md" requires-python = ">=3.10,<4" From 69e7c223efd90d2e6d9d2a6c4884cc98c09aab8c Mon Sep 17 00:00:00 2001 From: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> Date: Mon, 14 Jul 2025 07:39:39 +0000 Subject: [PATCH 02/25] chore: updating CHANGELOG for v0.9.0.dev4 --- CHANGELOG.md | 65 +++++++++++++++++++++++++++ doc/changelog.d/1005.dependencies.md | 1 - doc/changelog.d/1006.dependencies.md | 1 - doc/changelog.d/1008.documentation.md | 1 - doc/changelog.d/1009.documentation.md | 1 - doc/changelog.d/1010.maintenance.md | 1 - doc/changelog.d/1011.dependencies.md | 1 - doc/changelog.d/1015.miscellaneous.md | 1 - doc/changelog.d/1017.maintenance.md | 1 - doc/changelog.d/1018.documentation.md | 1 - doc/changelog.d/1019.maintenance.md | 1 - doc/changelog.d/1020.maintenance.md | 1 - doc/changelog.d/1021.dependencies.md | 1 - doc/changelog.d/1022.dependencies.md | 1 - doc/changelog.d/1023.documentation.md | 1 - doc/changelog.d/1025.documentation.md | 1 - doc/changelog.d/1026.miscellaneous.md | 1 - doc/changelog.d/1027.documentation.md | 1 - doc/changelog.d/1028.documentation.md | 1 - doc/changelog.d/1029.maintenance.md | 1 - doc/changelog.d/1031.maintenance.md | 1 - doc/changelog.d/1032.dependencies.md | 1 - doc/changelog.d/1033.miscellaneous.md | 1 - doc/changelog.d/1034.documentation.md | 1 - doc/changelog.d/1035.documentation.md | 1 - doc/changelog.d/1037.documentation.md | 1 - doc/changelog.d/1038.maintenance.md | 1 - doc/changelog.d/1039.maintenance.md | 1 - doc/changelog.d/1041.maintenance.md | 1 - doc/changelog.d/1045.maintenance.md | 1 - doc/changelog.d/1048.miscellaneous.md | 1 - doc/changelog.d/1050.maintenance.md | 1 - doc/changelog.d/1051.documentation.md | 1 - doc/changelog.d/1052.fixed.md | 1 - doc/changelog.d/1060.dependencies.md | 1 - doc/changelog.d/1065.miscellaneous.md | 1 - doc/changelog.d/1068.miscellaneous.md | 1 - doc/changelog.d/1071.miscellaneous.md | 1 - doc/changelog.d/1104.miscellaneous.md | 1 - doc/changelog.d/980.documentation.md | 1 - doc/changelog.d/988.maintenance.md | 1 - doc/changelog.d/990.dependencies.md | 1 - doc/changelog.d/992.dependencies.md | 1 - doc/changelog.d/993.dependencies.md | 1 - doc/changelog.d/994.dependencies.md | 1 - doc/changelog.d/995.maintenance.md | 1 - doc/changelog.d/996.dependencies.md | 1 - doc/changelog.d/999.dependencies.md | 1 - 48 files changed, 65 insertions(+), 47 deletions(-) delete mode 100644 doc/changelog.d/1005.dependencies.md delete mode 100644 doc/changelog.d/1006.dependencies.md delete mode 100644 doc/changelog.d/1008.documentation.md delete mode 100644 doc/changelog.d/1009.documentation.md delete mode 100644 doc/changelog.d/1010.maintenance.md delete mode 100644 doc/changelog.d/1011.dependencies.md delete mode 100644 doc/changelog.d/1015.miscellaneous.md delete mode 100644 doc/changelog.d/1017.maintenance.md delete mode 100644 doc/changelog.d/1018.documentation.md delete mode 100644 doc/changelog.d/1019.maintenance.md delete mode 100644 doc/changelog.d/1020.maintenance.md delete mode 100644 doc/changelog.d/1021.dependencies.md delete mode 100644 doc/changelog.d/1022.dependencies.md delete mode 100644 doc/changelog.d/1023.documentation.md delete mode 100644 doc/changelog.d/1025.documentation.md delete mode 100644 doc/changelog.d/1026.miscellaneous.md delete mode 100644 doc/changelog.d/1027.documentation.md delete mode 100644 doc/changelog.d/1028.documentation.md delete mode 100644 doc/changelog.d/1029.maintenance.md delete mode 100644 doc/changelog.d/1031.maintenance.md delete mode 100644 doc/changelog.d/1032.dependencies.md delete mode 100644 doc/changelog.d/1033.miscellaneous.md delete mode 100644 doc/changelog.d/1034.documentation.md delete mode 100644 doc/changelog.d/1035.documentation.md delete mode 100644 doc/changelog.d/1037.documentation.md delete mode 100644 doc/changelog.d/1038.maintenance.md delete mode 100644 doc/changelog.d/1039.maintenance.md delete mode 100644 doc/changelog.d/1041.maintenance.md delete mode 100644 doc/changelog.d/1045.maintenance.md delete mode 100644 doc/changelog.d/1048.miscellaneous.md delete mode 100644 doc/changelog.d/1050.maintenance.md delete mode 100644 doc/changelog.d/1051.documentation.md delete mode 100644 doc/changelog.d/1052.fixed.md delete mode 100644 doc/changelog.d/1060.dependencies.md delete mode 100644 doc/changelog.d/1065.miscellaneous.md delete mode 100644 doc/changelog.d/1068.miscellaneous.md delete mode 100644 doc/changelog.d/1071.miscellaneous.md delete mode 100644 doc/changelog.d/1104.miscellaneous.md delete mode 100644 doc/changelog.d/980.documentation.md delete mode 100644 doc/changelog.d/988.maintenance.md delete mode 100644 doc/changelog.d/990.dependencies.md delete mode 100644 doc/changelog.d/992.dependencies.md delete mode 100644 doc/changelog.d/993.dependencies.md delete mode 100644 doc/changelog.d/994.dependencies.md delete mode 100644 doc/changelog.d/995.maintenance.md delete mode 100644 doc/changelog.d/996.dependencies.md delete mode 100644 doc/changelog.d/999.dependencies.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 715503d285..0cbfe76b52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,71 @@ This project uses [towncrier](https://towncrier.readthedocs.io/) and the changes +## [0.9.0.dev4](https://github.com/ansys/pyprimemesh/releases/tag/v0.9.0.dev4) - July 14, 2025 + + +### Fixed + +- fix: Revert napoleon extension [#1052](https://github.com/ansys/pyprimemesh/pull/1052) + + +### Dependencies + +- build(deps): bump sphinx from 8.2.1 to 8.2.3 in the doc-dependencies group [#990](https://github.com/ansys/pyprimemesh/pull/990) +- build(deps): bump ansys-sphinx-theme[autoapi] from 1.3.2 to 1.3.3 in the doc-dependencies group [#992](https://github.com/ansys/pyprimemesh/pull/992) +- build(deps): bump the test-dependencies group across 1 directory with 2 updates [#993](https://github.com/ansys/pyprimemesh/pull/993), [#1060](https://github.com/ansys/pyprimemesh/pull/1060) +- build(deps): bump ansys-sphinx-theme[autoapi] from 1.3.3 to 1.4.2 in the doc-dependencies group [#994](https://github.com/ansys/pyprimemesh/pull/994) +- build(deps): bump pytest-cov from 6.0.0 to 6.1.1 in the test-dependencies group [#996](https://github.com/ansys/pyprimemesh/pull/996) +- build(deps): bump ansys/actions from 8 to 9 [#999](https://github.com/ansys/pyprimemesh/pull/999) +- build(deps): bump the pyvista group with 2 updates [#1005](https://github.com/ansys/pyprimemesh/pull/1005), [#1021](https://github.com/ansys/pyprimemesh/pull/1021) +- build(deps): bump ansys-tools-visualization-interface from 0.8.3 to 0.9.1 in the general-dependencies group [#1006](https://github.com/ansys/pyprimemesh/pull/1006) +- build(deps): bump pyvista/setup-headless-display-action from 3 to 4 [#1011](https://github.com/ansys/pyprimemesh/pull/1011) +- build(deps): bump ansys-sphinx-theme[autoapi] from 1.4.2 to 1.4.4 in the doc-dependencies group [#1022](https://github.com/ansys/pyprimemesh/pull/1022) +- build(deps): bump ansys-sphinx-theme[autoapi] from 1.4.4 to 1.5.2 in the doc-dependencies group [#1032](https://github.com/ansys/pyprimemesh/pull/1032) + + +### Miscellaneous + +- Update Dockerfile [#1015](https://github.com/ansys/pyprimemesh/pull/1015) +- fix to remove %s string while printing the server name [#1026](https://github.com/ansys/pyprimemesh/pull/1026) +- doc fix [#1033](https://github.com/ansys/pyprimemesh/pull/1033) +- Build(deps): bump ansys/actions from 9 to 10 [#1048](https://github.com/ansys/pyprimemesh/pull/1048) +- Build(deps): bump pytest from 8.4.0 to 8.4.1 in the test-dependencies group [#1065](https://github.com/ansys/pyprimemesh/pull/1065) +- Chore: update security.md [#1068](https://github.com/ansys/pyprimemesh/pull/1068) +- Doc: adding deep wiki link [#1071](https://github.com/ansys/pyprimemesh/pull/1071) +- Update pyproj.toml to 0.9.0.dev4 [#1104](https://github.com/ansys/pyprimemesh/pull/1104) + + +### Documentation + +- Update fileio.rst [#980](https://github.com/ansys/pyprimemesh/pull/980) +- Update index.rst [#1008](https://github.com/ansys/pyprimemesh/pull/1008), [#1023](https://github.com/ansys/pyprimemesh/pull/1023) +- Sraj/getting started [#1009](https://github.com/ansys/pyprimemesh/pull/1009) +- Maint/python 3.13 [#1018](https://github.com/ansys/pyprimemesh/pull/1018) +- Docker image [#1025](https://github.com/ansys/pyprimemesh/pull/1025) +- Update shellblcontrolstructs.py [#1027](https://github.com/ansys/pyprimemesh/pull/1027) +- Doc/changes [#1028](https://github.com/ansys/pyprimemesh/pull/1028) +- Fix docstring [#1034](https://github.com/ansys/pyprimemesh/pull/1034) +- doc: remove attributes from docs [#1035](https://github.com/ansys/pyprimemesh/pull/1035) +- fix: Avoid bad `trame-vtk` version [#1037](https://github.com/ansys/pyprimemesh/pull/1037) +- docs: remove extra colon in api docs [#1051](https://github.com/ansys/pyprimemesh/pull/1051) + + +### Maintenance + +- chore: update CHANGELOG for v0.8.0 [#988](https://github.com/ansys/pyprimemesh/pull/988) +- docs: Update ``CONTRIBUTORS.md`` with the latest contributors [#995](https://github.com/ansys/pyprimemesh/pull/995), [#1045](https://github.com/ansys/pyprimemesh/pull/1045) +- Sync ADO Changes for 252 [#1010](https://github.com/ansys/pyprimemesh/pull/1010) +- Maint/migrate examples to main [#1017](https://github.com/ansys/pyprimemesh/pull/1017) +- Update LICENSE [#1019](https://github.com/ansys/pyprimemesh/pull/1019) +- chore: update CHANGELOG for v0.8.1 [#1020](https://github.com/ansys/pyprimemesh/pull/1020) +- sync up client side changes from release/release-252 [#1029](https://github.com/ansys/pyprimemesh/pull/1029) +- revert the pyproj toml file [#1031](https://github.com/ansys/pyprimemesh/pull/1031) +- maint: check vulnerabilities [#1038](https://github.com/ansys/pyprimemesh/pull/1038) +- maint: create pull_request_template.md [#1039](https://github.com/ansys/pyprimemesh/pull/1039) +- maint: deploy pr docs [#1041](https://github.com/ansys/pyprimemesh/pull/1041) +- maint: temporary numpy fix [#1050](https://github.com/ansys/pyprimemesh/pull/1050) + ## [0.8.1](https://github.com/ansys/pyprimemesh/releases/tag/v0.8.1) - May 09, 2025 diff --git a/doc/changelog.d/1005.dependencies.md b/doc/changelog.d/1005.dependencies.md deleted file mode 100644 index c889568751..0000000000 --- a/doc/changelog.d/1005.dependencies.md +++ /dev/null @@ -1 +0,0 @@ -build(deps): bump the pyvista group with 2 updates \ No newline at end of file diff --git a/doc/changelog.d/1006.dependencies.md b/doc/changelog.d/1006.dependencies.md deleted file mode 100644 index 9e8c82b4cf..0000000000 --- a/doc/changelog.d/1006.dependencies.md +++ /dev/null @@ -1 +0,0 @@ -build(deps): bump ansys-tools-visualization-interface from 0.8.3 to 0.9.1 in the general-dependencies group \ No newline at end of file diff --git a/doc/changelog.d/1008.documentation.md b/doc/changelog.d/1008.documentation.md deleted file mode 100644 index 93489183ca..0000000000 --- a/doc/changelog.d/1008.documentation.md +++ /dev/null @@ -1 +0,0 @@ -Update index.rst \ No newline at end of file diff --git a/doc/changelog.d/1009.documentation.md b/doc/changelog.d/1009.documentation.md deleted file mode 100644 index cb208a2905..0000000000 --- a/doc/changelog.d/1009.documentation.md +++ /dev/null @@ -1 +0,0 @@ -Sraj/getting started \ No newline at end of file diff --git a/doc/changelog.d/1010.maintenance.md b/doc/changelog.d/1010.maintenance.md deleted file mode 100644 index 7415d38c5d..0000000000 --- a/doc/changelog.d/1010.maintenance.md +++ /dev/null @@ -1 +0,0 @@ -Sync ADO Changes for 252 \ No newline at end of file diff --git a/doc/changelog.d/1011.dependencies.md b/doc/changelog.d/1011.dependencies.md deleted file mode 100644 index 32f0fbb06f..0000000000 --- a/doc/changelog.d/1011.dependencies.md +++ /dev/null @@ -1 +0,0 @@ -build(deps): bump pyvista/setup-headless-display-action from 3 to 4 \ No newline at end of file diff --git a/doc/changelog.d/1015.miscellaneous.md b/doc/changelog.d/1015.miscellaneous.md deleted file mode 100644 index 93b13d9336..0000000000 --- a/doc/changelog.d/1015.miscellaneous.md +++ /dev/null @@ -1 +0,0 @@ -Update Dockerfile \ No newline at end of file diff --git a/doc/changelog.d/1017.maintenance.md b/doc/changelog.d/1017.maintenance.md deleted file mode 100644 index 3ae7699c90..0000000000 --- a/doc/changelog.d/1017.maintenance.md +++ /dev/null @@ -1 +0,0 @@ -Maint/migrate examples to main \ No newline at end of file diff --git a/doc/changelog.d/1018.documentation.md b/doc/changelog.d/1018.documentation.md deleted file mode 100644 index 7c7ccd07ae..0000000000 --- a/doc/changelog.d/1018.documentation.md +++ /dev/null @@ -1 +0,0 @@ -Maint/python 3.13 \ No newline at end of file diff --git a/doc/changelog.d/1019.maintenance.md b/doc/changelog.d/1019.maintenance.md deleted file mode 100644 index 3b6309972f..0000000000 --- a/doc/changelog.d/1019.maintenance.md +++ /dev/null @@ -1 +0,0 @@ -Update LICENSE \ No newline at end of file diff --git a/doc/changelog.d/1020.maintenance.md b/doc/changelog.d/1020.maintenance.md deleted file mode 100644 index e1ddf4c471..0000000000 --- a/doc/changelog.d/1020.maintenance.md +++ /dev/null @@ -1 +0,0 @@ -chore: update CHANGELOG for v0.8.1 \ No newline at end of file diff --git a/doc/changelog.d/1021.dependencies.md b/doc/changelog.d/1021.dependencies.md deleted file mode 100644 index c889568751..0000000000 --- a/doc/changelog.d/1021.dependencies.md +++ /dev/null @@ -1 +0,0 @@ -build(deps): bump the pyvista group with 2 updates \ No newline at end of file diff --git a/doc/changelog.d/1022.dependencies.md b/doc/changelog.d/1022.dependencies.md deleted file mode 100644 index 4b73f70ec7..0000000000 --- a/doc/changelog.d/1022.dependencies.md +++ /dev/null @@ -1 +0,0 @@ -build(deps): bump ansys-sphinx-theme[autoapi] from 1.4.2 to 1.4.4 in the doc-dependencies group \ No newline at end of file diff --git a/doc/changelog.d/1023.documentation.md b/doc/changelog.d/1023.documentation.md deleted file mode 100644 index 93489183ca..0000000000 --- a/doc/changelog.d/1023.documentation.md +++ /dev/null @@ -1 +0,0 @@ -Update index.rst \ No newline at end of file diff --git a/doc/changelog.d/1025.documentation.md b/doc/changelog.d/1025.documentation.md deleted file mode 100644 index c669f3feee..0000000000 --- a/doc/changelog.d/1025.documentation.md +++ /dev/null @@ -1 +0,0 @@ -Docker image \ No newline at end of file diff --git a/doc/changelog.d/1026.miscellaneous.md b/doc/changelog.d/1026.miscellaneous.md deleted file mode 100644 index b6ddcbdade..0000000000 --- a/doc/changelog.d/1026.miscellaneous.md +++ /dev/null @@ -1 +0,0 @@ -fix to remove %s string while printing the server name \ No newline at end of file diff --git a/doc/changelog.d/1027.documentation.md b/doc/changelog.d/1027.documentation.md deleted file mode 100644 index bbef122a0c..0000000000 --- a/doc/changelog.d/1027.documentation.md +++ /dev/null @@ -1 +0,0 @@ -Update shellblcontrolstructs.py \ No newline at end of file diff --git a/doc/changelog.d/1028.documentation.md b/doc/changelog.d/1028.documentation.md deleted file mode 100644 index 4b7148ffcd..0000000000 --- a/doc/changelog.d/1028.documentation.md +++ /dev/null @@ -1 +0,0 @@ -Doc/changes \ No newline at end of file diff --git a/doc/changelog.d/1029.maintenance.md b/doc/changelog.d/1029.maintenance.md deleted file mode 100644 index ff4219e4ea..0000000000 --- a/doc/changelog.d/1029.maintenance.md +++ /dev/null @@ -1 +0,0 @@ -sync up client side changes from release/release-252 \ No newline at end of file diff --git a/doc/changelog.d/1031.maintenance.md b/doc/changelog.d/1031.maintenance.md deleted file mode 100644 index b909647a6a..0000000000 --- a/doc/changelog.d/1031.maintenance.md +++ /dev/null @@ -1 +0,0 @@ -revert the pyproj toml file \ No newline at end of file diff --git a/doc/changelog.d/1032.dependencies.md b/doc/changelog.d/1032.dependencies.md deleted file mode 100644 index 8c7abcba39..0000000000 --- a/doc/changelog.d/1032.dependencies.md +++ /dev/null @@ -1 +0,0 @@ -build(deps): bump ansys-sphinx-theme[autoapi] from 1.4.4 to 1.5.2 in the doc-dependencies group \ No newline at end of file diff --git a/doc/changelog.d/1033.miscellaneous.md b/doc/changelog.d/1033.miscellaneous.md deleted file mode 100644 index 795649406e..0000000000 --- a/doc/changelog.d/1033.miscellaneous.md +++ /dev/null @@ -1 +0,0 @@ -doc fix \ No newline at end of file diff --git a/doc/changelog.d/1034.documentation.md b/doc/changelog.d/1034.documentation.md deleted file mode 100644 index 669619ba68..0000000000 --- a/doc/changelog.d/1034.documentation.md +++ /dev/null @@ -1 +0,0 @@ -Fix docstring \ No newline at end of file diff --git a/doc/changelog.d/1035.documentation.md b/doc/changelog.d/1035.documentation.md deleted file mode 100644 index 0883c6c749..0000000000 --- a/doc/changelog.d/1035.documentation.md +++ /dev/null @@ -1 +0,0 @@ -doc: remove attributes from docs \ No newline at end of file diff --git a/doc/changelog.d/1037.documentation.md b/doc/changelog.d/1037.documentation.md deleted file mode 100644 index 7df19cd975..0000000000 --- a/doc/changelog.d/1037.documentation.md +++ /dev/null @@ -1 +0,0 @@ -fix: Avoid bad `trame-vtk` version \ No newline at end of file diff --git a/doc/changelog.d/1038.maintenance.md b/doc/changelog.d/1038.maintenance.md deleted file mode 100644 index 9071e45eec..0000000000 --- a/doc/changelog.d/1038.maintenance.md +++ /dev/null @@ -1 +0,0 @@ -maint: check vulnerabilities \ No newline at end of file diff --git a/doc/changelog.d/1039.maintenance.md b/doc/changelog.d/1039.maintenance.md deleted file mode 100644 index c1ba7ab0fa..0000000000 --- a/doc/changelog.d/1039.maintenance.md +++ /dev/null @@ -1 +0,0 @@ -maint: create pull_request_template.md \ No newline at end of file diff --git a/doc/changelog.d/1041.maintenance.md b/doc/changelog.d/1041.maintenance.md deleted file mode 100644 index 6ce0b6d34a..0000000000 --- a/doc/changelog.d/1041.maintenance.md +++ /dev/null @@ -1 +0,0 @@ -maint: deploy pr docs \ No newline at end of file diff --git a/doc/changelog.d/1045.maintenance.md b/doc/changelog.d/1045.maintenance.md deleted file mode 100644 index 9e0131f237..0000000000 --- a/doc/changelog.d/1045.maintenance.md +++ /dev/null @@ -1 +0,0 @@ -docs: Update ``CONTRIBUTORS.md`` with the latest contributors \ No newline at end of file diff --git a/doc/changelog.d/1048.miscellaneous.md b/doc/changelog.d/1048.miscellaneous.md deleted file mode 100644 index 08ec7252a8..0000000000 --- a/doc/changelog.d/1048.miscellaneous.md +++ /dev/null @@ -1 +0,0 @@ -Build(deps): bump ansys/actions from 9 to 10 \ No newline at end of file diff --git a/doc/changelog.d/1050.maintenance.md b/doc/changelog.d/1050.maintenance.md deleted file mode 100644 index 123895c039..0000000000 --- a/doc/changelog.d/1050.maintenance.md +++ /dev/null @@ -1 +0,0 @@ -maint: temporary numpy fix \ No newline at end of file diff --git a/doc/changelog.d/1051.documentation.md b/doc/changelog.d/1051.documentation.md deleted file mode 100644 index 8fd6a5ce01..0000000000 --- a/doc/changelog.d/1051.documentation.md +++ /dev/null @@ -1 +0,0 @@ -docs: remove extra colon in api docs \ No newline at end of file diff --git a/doc/changelog.d/1052.fixed.md b/doc/changelog.d/1052.fixed.md deleted file mode 100644 index dd7871e3f2..0000000000 --- a/doc/changelog.d/1052.fixed.md +++ /dev/null @@ -1 +0,0 @@ -fix: Revert napoleon extension \ No newline at end of file diff --git a/doc/changelog.d/1060.dependencies.md b/doc/changelog.d/1060.dependencies.md deleted file mode 100644 index f7544789e4..0000000000 --- a/doc/changelog.d/1060.dependencies.md +++ /dev/null @@ -1 +0,0 @@ -build(deps): bump the test-dependencies group across 1 directory with 2 updates \ No newline at end of file diff --git a/doc/changelog.d/1065.miscellaneous.md b/doc/changelog.d/1065.miscellaneous.md deleted file mode 100644 index a04218191e..0000000000 --- a/doc/changelog.d/1065.miscellaneous.md +++ /dev/null @@ -1 +0,0 @@ -Build(deps): bump pytest from 8.4.0 to 8.4.1 in the test-dependencies group \ No newline at end of file diff --git a/doc/changelog.d/1068.miscellaneous.md b/doc/changelog.d/1068.miscellaneous.md deleted file mode 100644 index 21db96383b..0000000000 --- a/doc/changelog.d/1068.miscellaneous.md +++ /dev/null @@ -1 +0,0 @@ -Chore: update security.md \ No newline at end of file diff --git a/doc/changelog.d/1071.miscellaneous.md b/doc/changelog.d/1071.miscellaneous.md deleted file mode 100644 index c4a2b4bfea..0000000000 --- a/doc/changelog.d/1071.miscellaneous.md +++ /dev/null @@ -1 +0,0 @@ -Doc: adding deep wiki link \ No newline at end of file diff --git a/doc/changelog.d/1104.miscellaneous.md b/doc/changelog.d/1104.miscellaneous.md deleted file mode 100644 index 2d9a272bf4..0000000000 --- a/doc/changelog.d/1104.miscellaneous.md +++ /dev/null @@ -1 +0,0 @@ -Update pyproj.toml to 0.9.0.dev4 \ No newline at end of file diff --git a/doc/changelog.d/980.documentation.md b/doc/changelog.d/980.documentation.md deleted file mode 100644 index e6eaf87075..0000000000 --- a/doc/changelog.d/980.documentation.md +++ /dev/null @@ -1 +0,0 @@ -Update fileio.rst \ No newline at end of file diff --git a/doc/changelog.d/988.maintenance.md b/doc/changelog.d/988.maintenance.md deleted file mode 100644 index bf6ebae267..0000000000 --- a/doc/changelog.d/988.maintenance.md +++ /dev/null @@ -1 +0,0 @@ -chore: update CHANGELOG for v0.8.0 \ No newline at end of file diff --git a/doc/changelog.d/990.dependencies.md b/doc/changelog.d/990.dependencies.md deleted file mode 100644 index 4d741d4940..0000000000 --- a/doc/changelog.d/990.dependencies.md +++ /dev/null @@ -1 +0,0 @@ -build(deps): bump sphinx from 8.2.1 to 8.2.3 in the doc-dependencies group \ No newline at end of file diff --git a/doc/changelog.d/992.dependencies.md b/doc/changelog.d/992.dependencies.md deleted file mode 100644 index 4272ef36cd..0000000000 --- a/doc/changelog.d/992.dependencies.md +++ /dev/null @@ -1 +0,0 @@ -build(deps): bump ansys-sphinx-theme[autoapi] from 1.3.2 to 1.3.3 in the doc-dependencies group \ No newline at end of file diff --git a/doc/changelog.d/993.dependencies.md b/doc/changelog.d/993.dependencies.md deleted file mode 100644 index f7544789e4..0000000000 --- a/doc/changelog.d/993.dependencies.md +++ /dev/null @@ -1 +0,0 @@ -build(deps): bump the test-dependencies group across 1 directory with 2 updates \ No newline at end of file diff --git a/doc/changelog.d/994.dependencies.md b/doc/changelog.d/994.dependencies.md deleted file mode 100644 index 6b2a851b28..0000000000 --- a/doc/changelog.d/994.dependencies.md +++ /dev/null @@ -1 +0,0 @@ -build(deps): bump ansys-sphinx-theme[autoapi] from 1.3.3 to 1.4.2 in the doc-dependencies group \ No newline at end of file diff --git a/doc/changelog.d/995.maintenance.md b/doc/changelog.d/995.maintenance.md deleted file mode 100644 index 9e0131f237..0000000000 --- a/doc/changelog.d/995.maintenance.md +++ /dev/null @@ -1 +0,0 @@ -docs: Update ``CONTRIBUTORS.md`` with the latest contributors \ No newline at end of file diff --git a/doc/changelog.d/996.dependencies.md b/doc/changelog.d/996.dependencies.md deleted file mode 100644 index 5026a35c9e..0000000000 --- a/doc/changelog.d/996.dependencies.md +++ /dev/null @@ -1 +0,0 @@ -build(deps): bump pytest-cov from 6.0.0 to 6.1.1 in the test-dependencies group \ No newline at end of file diff --git a/doc/changelog.d/999.dependencies.md b/doc/changelog.d/999.dependencies.md deleted file mode 100644 index 420b96327e..0000000000 --- a/doc/changelog.d/999.dependencies.md +++ /dev/null @@ -1 +0,0 @@ -build(deps): bump ansys/actions from 8 to 9 \ No newline at end of file From a564c7c00685d11a000b5b9e5e90db2ec0aec481 Mon Sep 17 00:00:00 2001 From: Subha Nayak <118820636+subhnayak@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:46:36 +0530 Subject: [PATCH 03/25] fix for v0.9.0.dev4 pipeline issue (#1107) Co-authored-by: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> --- .github/workflows/ci_cd.yml | 4 ++++ doc/changelog.d/1107.miscellaneous.md | 1 + 2 files changed, 5 insertions(+) create mode 100644 doc/changelog.d/1107.miscellaneous.md diff --git a/.github/workflows/ci_cd.yml b/.github/workflows/ci_cd.yml index f7354e9bc5..2a49da53d1 100644 --- a/.github/workflows/ci_cd.yml +++ b/.github/workflows/ci_cd.yml @@ -207,6 +207,9 @@ jobs: if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') needs: [package, update-changelog] runs-on: ubuntu-latest + permissions: + id-token: write + contents: write steps: - name: Release to the public PyPI repository uses: ansys/actions/release-pypi-public@v10 @@ -218,6 +221,7 @@ jobs: - name: Release to GitHub uses: ansys/actions/release-github@v10 with: + token: ${{ secrets.GITHUB_TOKEN }} library-name: ${{ env.PACKAGE_NAME }} upload_dev_docs: diff --git a/doc/changelog.d/1107.miscellaneous.md b/doc/changelog.d/1107.miscellaneous.md new file mode 100644 index 0000000000..3605cf2888 --- /dev/null +++ b/doc/changelog.d/1107.miscellaneous.md @@ -0,0 +1 @@ +Fix for v0.9.0.dev4 pipeline issue \ No newline at end of file From 6e9563d07791b6c4fffe4818e0a4594d4007a344 Mon Sep 17 00:00:00 2001 From: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> Date: Tue, 15 Jul 2025 10:18:44 +0000 Subject: [PATCH 04/25] chore: updating CHANGELOG for v0.9.0.dev4 --- CHANGELOG.md | 7 +++++++ doc/changelog.d/1107.miscellaneous.md | 1 - 2 files changed, 7 insertions(+), 1 deletion(-) delete mode 100644 doc/changelog.d/1107.miscellaneous.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 0cbfe76b52..4a0f171e19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ This project uses [towncrier](https://towncrier.readthedocs.io/) and the changes +## [0.9.0.dev4](https://github.com/ansys/pyprimemesh/releases/tag/v0.9.0.dev4) - July 15, 2025 + + +### Miscellaneous + +- Fix for v0.9.0.dev4 pipeline issue [#1107](https://github.com/ansys/pyprimemesh/pull/1107) + ## [0.9.0.dev4](https://github.com/ansys/pyprimemesh/releases/tag/v0.9.0.dev4) - July 14, 2025 diff --git a/doc/changelog.d/1107.miscellaneous.md b/doc/changelog.d/1107.miscellaneous.md deleted file mode 100644 index 3605cf2888..0000000000 --- a/doc/changelog.d/1107.miscellaneous.md +++ /dev/null @@ -1 +0,0 @@ -Fix for v0.9.0.dev4 pipeline issue \ No newline at end of file From bcf8bad7ca61034afb0de06d047654296896bdf2 Mon Sep 17 00:00:00 2001 From: Subha Nayak <118820636+subhnayak@users.noreply.github.com> Date: Wed, 16 Jul 2025 11:16:09 +0530 Subject: [PATCH 05/25] include fix for broken methods links in API (#1109) Co-authored-by: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> --- .github/workflows/ci_cd.yml | 2 +- doc/changelog.d/1109.miscellaneous.md | 1 + doc/source/_templates/autosummary/class.rst | 15 ++++----------- 3 files changed, 6 insertions(+), 12 deletions(-) create mode 100644 doc/changelog.d/1109.miscellaneous.md diff --git a/.github/workflows/ci_cd.yml b/.github/workflows/ci_cd.yml index 2a49da53d1..4d21a27f57 100644 --- a/.github/workflows/ci_cd.yml +++ b/.github/workflows/ci_cd.yml @@ -144,7 +144,7 @@ jobs: token: ${{ secrets.GITHUB_TOKEN }} bot-user: ${{ secrets.PYANSYS_CI_BOT_USERNAME }} bot-email: ${{ secrets.PYANSYS_CI_BOT_EMAIL }} - maximum-pr-doc-deployments: 10 + maximum-pr-doc-deployments: 20 testing: name: Run Unit Tests diff --git a/doc/changelog.d/1109.miscellaneous.md b/doc/changelog.d/1109.miscellaneous.md new file mode 100644 index 0000000000..e4821041ba --- /dev/null +++ b/doc/changelog.d/1109.miscellaneous.md @@ -0,0 +1 @@ +Include fix for broken methods links in api \ No newline at end of file diff --git a/doc/source/_templates/autosummary/class.rst b/doc/source/_templates/autosummary/class.rst index a6dd4f11b6..c4eed9a4a3 100644 --- a/doc/source/_templates/autosummary/class.rst +++ b/doc/source/_templates/autosummary/class.rst @@ -1,26 +1,21 @@ .. vale off -{% set excluded_attrs = ['real', 'imag', 'numerator', 'denominator'] %} - -{% set excluded_methods = ['__init__', 'bit_length', 'conjugate', 'from_bytes', 'to_bytes', 'bit_count', 'as_integer_ratio', 'is_integer'] %} - -{% set filtered_methods = methods | reject('in', excluded_methods) | list %} {{ name | escape | underline}} .. currentmodule:: {{ module }} .. autoclass:: {{ objname }} - + {% block methods %} - {% if filtered_methods %} + {% if methods %} .. rubric:: {{ _('Methods') }} .. autosummary:: :toctree: - {% for item in filtered_methods %} -    {{ name }}.{{ item }} + {% for item in methods %} + {% if item != '__init__' %}{{ name }}.{{ item }}{% endif %} {%- endfor %} {% endif %} {% endblock %} @@ -32,9 +27,7 @@ .. autosummary:: :toctree: {% for item in attributes %} - {% if item not in excluded_attrs %} {{ name }}.{{ item }} - {% endif %} {%- endfor %} {% endif %} {% endblock %} From e8b4cf934b0f187cc2d5315a7d8daccd2e611c44 Mon Sep 17 00:00:00 2001 From: Subha Nayak <118820636+subhnayak@users.noreply.github.com> Date: Wed, 16 Jul 2025 14:01:27 +0530 Subject: [PATCH 06/25] removed the dev4 version from pyproj.toml (#1110) Co-authored-by: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> --- doc/changelog.d/1110.miscellaneous.md | 1 + pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 doc/changelog.d/1110.miscellaneous.md diff --git a/doc/changelog.d/1110.miscellaneous.md b/doc/changelog.d/1110.miscellaneous.md new file mode 100644 index 0000000000..cdea042a1e --- /dev/null +++ b/doc/changelog.d/1110.miscellaneous.md @@ -0,0 +1 @@ +Removed the dev4 version from pyproj.toml \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 826f6c2410..c4bad82d16 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "flit_core.buildapi" [project] name = "ansys-meshing-prime" -version = "0.9.0.dev4" +version = "0.9.0" description = "PyPrimeMesh is a Python client to Ansys Prime Server, which delivers core Ansys meshing technology." readme = "README.md" requires-python = ">=3.10,<4" From 796be9010a95aa43f57b41589595e2bb38c3d31b Mon Sep 17 00:00:00 2001 From: Subha Nayak <118820636+subhnayak@users.noreply.github.com> Date: Mon, 4 Aug 2025 15:47:15 +0530 Subject: [PATCH 07/25] Include changes for SP1 release for dev0 (#1118) Co-authored-by: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> --- .github/workflows/ci_cd.yml | 2 +- doc/changelog.d/1118.miscellaneous.md | 1 + pyproject.toml | 2 +- src/ansys/meshing/prime/core/mapdlcdbexportutils.py | 8 +++++--- src/ansys/meshing/prime/internals/launcher.py | 1 - 5 files changed, 8 insertions(+), 6 deletions(-) create mode 100644 doc/changelog.d/1118.miscellaneous.md diff --git a/.github/workflows/ci_cd.yml b/.github/workflows/ci_cd.yml index 4d21a27f57..eb56635d40 100644 --- a/.github/workflows/ci_cd.yml +++ b/.github/workflows/ci_cd.yml @@ -16,7 +16,7 @@ on: env: DOCKER_IMAGE_NAME: ghcr.io/ansys/prime - DOCKER_IMAGE_TAG: '25.2.0' + DOCKER_IMAGE_TAG: '25.2.1.dev0' MAIN_PYTHON_VERSION: '3.13' PACKAGE_NAME: 'ansys-meshing-prime' PACKAGE_NAMESPACE: 'ansys.meshing.prime' diff --git a/doc/changelog.d/1118.miscellaneous.md b/doc/changelog.d/1118.miscellaneous.md new file mode 100644 index 0000000000..b256c3315d --- /dev/null +++ b/doc/changelog.d/1118.miscellaneous.md @@ -0,0 +1 @@ +Include changes for SP1 release for dev0 \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index c4bad82d16..9a845efea8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "flit_core.buildapi" [project] name = "ansys-meshing-prime" -version = "0.9.0" +version = "0.9.1.dev0" description = "PyPrimeMesh is a Python client to Ansys Prime Server, which delivers core Ansys meshing technology." readme = "README.md" requires-python = ">=3.10,<4" diff --git a/src/ansys/meshing/prime/core/mapdlcdbexportutils.py b/src/ansys/meshing/prime/core/mapdlcdbexportutils.py index c67a7b5649..bc438ffb03 100644 --- a/src/ansys/meshing/prime/core/mapdlcdbexportutils.py +++ b/src/ansys/meshing/prime/core/mapdlcdbexportutils.py @@ -889,12 +889,14 @@ def _process_hyperfoam_data(self, property_dict, material, mat_id): hyperfoam_data = self._hyperfoam_with_test_data(n, uniaxial_test_data, poisson, mat_id) else: hyperfoam_data = self._hyperfoam_with_coeffs(n, data, mat_id) - self._logger.warning(f"{property_dict}") - self._logger.warning(f"{self._raw_materials_data[material]['UNIAXIAL TEST DATA']}") return hyperfoam_data def _hyperfoam_with_coeffs(self, n, data, mat_id): hyperfoam_coeff_data = '' + data = { + k: [float(x) for x in v if x is not None] if v is not None else None + for k, v in data.items() + } u1 = data['u1'] a1 = data['a1'] v1 = [0.0] * len(u1) @@ -957,7 +959,7 @@ def _hyperfoam_with_coeffs(self, n, data, mat_id): if n > 4: u5a = 2 * u5[i] / a5[i] a5a = a5[i] - hyperfoam_coeff_data += f", {u5a}, {a6a}" + hyperfoam_coeff_data += f", {u5a}, {a5a}" if n > 5: u6a = 2 * u6[i] / a6[i] a6a = a6[i] diff --git a/src/ansys/meshing/prime/internals/launcher.py b/src/ansys/meshing/prime/internals/launcher.py index ef468c9120..514c716af8 100644 --- a/src/ansys/meshing/prime/internals/launcher.py +++ b/src/ansys/meshing/prime/internals/launcher.py @@ -264,7 +264,6 @@ def launch_prime( client = Client(port=port, timeout=timeout) client.container_name = container_name print('using server from docker : The container name ', container_name) - logging.getLogger('PyPrimeMesh').info('uses server from container : ', container_name) return client server = launch_server_process( From 3b5f1066ec71ddd5399975fc564cbf62a27cbd44 Mon Sep 17 00:00:00 2001 From: Subha Nayak <118820636+subhnayak@users.noreply.github.com> Date: Thu, 7 Aug 2025 09:49:10 +0530 Subject: [PATCH 08/25] update the version for sp1 stable release (#1121) Co-authored-by: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> --- .github/workflows/ci_cd.yml | 2 +- doc/changelog.d/1121.miscellaneous.md | 1 + pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 doc/changelog.d/1121.miscellaneous.md diff --git a/.github/workflows/ci_cd.yml b/.github/workflows/ci_cd.yml index eb56635d40..1679442bf9 100644 --- a/.github/workflows/ci_cd.yml +++ b/.github/workflows/ci_cd.yml @@ -16,7 +16,7 @@ on: env: DOCKER_IMAGE_NAME: ghcr.io/ansys/prime - DOCKER_IMAGE_TAG: '25.2.1.dev0' + DOCKER_IMAGE_TAG: '25.2.1' MAIN_PYTHON_VERSION: '3.13' PACKAGE_NAME: 'ansys-meshing-prime' PACKAGE_NAMESPACE: 'ansys.meshing.prime' diff --git a/doc/changelog.d/1121.miscellaneous.md b/doc/changelog.d/1121.miscellaneous.md new file mode 100644 index 0000000000..07cc9fce18 --- /dev/null +++ b/doc/changelog.d/1121.miscellaneous.md @@ -0,0 +1 @@ +Update the version for sp1 stable release \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 9a845efea8..88c683fbc0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "flit_core.buildapi" [project] name = "ansys-meshing-prime" -version = "0.9.1.dev0" +version = "0.9.1" description = "PyPrimeMesh is a Python client to Ansys Prime Server, which delivers core Ansys meshing technology." readme = "README.md" requires-python = ">=3.10,<4" From aa559c9404670edb4a38e762282fb03ef6d81c1c Mon Sep 17 00:00:00 2001 From: Subha Nayak <118820636+subhnayak@users.noreply.github.com> Date: Wed, 10 Sep 2025 10:45:58 +0530 Subject: [PATCH 09/25] ado to GitHub 252 sp2 (#1142) Co-authored-by: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> --- .github/workflows/ci_cd.yml | 2 +- doc/changelog.d/1142.miscellaneous.md | 1 + docker/build_docker_linux.py | 2 +- pyproject.toml | 2 +- .../meshing/prime/autogen/fileiostructs.py | 208 ++++++++++++++- .../meshing/prime/core/mapdlcdbexportutils.py | 239 ++++++++++++++---- src/ansys/meshing/prime/internals/launcher.py | 1 + src/ansys/meshing/prime/internals/utils.py | 6 +- 8 files changed, 392 insertions(+), 69 deletions(-) create mode 100644 doc/changelog.d/1142.miscellaneous.md diff --git a/.github/workflows/ci_cd.yml b/.github/workflows/ci_cd.yml index 1679442bf9..63ed7c445f 100644 --- a/.github/workflows/ci_cd.yml +++ b/.github/workflows/ci_cd.yml @@ -16,7 +16,7 @@ on: env: DOCKER_IMAGE_NAME: ghcr.io/ansys/prime - DOCKER_IMAGE_TAG: '25.2.1' + DOCKER_IMAGE_TAG: '25.2.2' MAIN_PYTHON_VERSION: '3.13' PACKAGE_NAME: 'ansys-meshing-prime' PACKAGE_NAMESPACE: 'ansys.meshing.prime' diff --git a/doc/changelog.d/1142.miscellaneous.md b/doc/changelog.d/1142.miscellaneous.md new file mode 100644 index 0000000000..6ad1f3878e --- /dev/null +++ b/doc/changelog.d/1142.miscellaneous.md @@ -0,0 +1 @@ +Ado to GitHub 252 sp2 diff --git a/docker/build_docker_linux.py b/docker/build_docker_linux.py index 419f991588..ca08a6c9d4 100644 --- a/docker/build_docker_linux.py +++ b/docker/build_docker_linux.py @@ -144,7 +144,7 @@ def create_docker_image(dest_package_path): # Build the docker image print(">>> Building docker image. This might take some time...") out = subprocess.run( - ["docker", "build", "-f", "linux/Dockerfile", "-t", "ghcr.io/ansys/prime:latest", "."], + ["docker", "build", "-f", "linux/Dockerfile", "-t", "ghcr.io/ansys/prime:25.2.2", "."], cwd=os.path.dirname(os.path.abspath(__file__)), capture_output=True, ) diff --git a/pyproject.toml b/pyproject.toml index 88c683fbc0..c5de8b9c12 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "flit_core.buildapi" [project] name = "ansys-meshing-prime" -version = "0.9.1" +version = "0.9.2.dev0" description = "PyPrimeMesh is a Python client to Ansys Prime Server, which delivers core Ansys meshing technology." readme = "README.md" requires-python = ">=3.10,<4" diff --git a/src/ansys/meshing/prime/autogen/fileiostructs.py b/src/ansys/meshing/prime/autogen/fileiostructs.py index 7d7f2b9d90..a972cd920e 100644 --- a/src/ansys/meshing/prime/autogen/fileiostructs.py +++ b/src/ansys/meshing/prime/autogen/fileiostructs.py @@ -3460,6 +3460,14 @@ class ExportMapdlCdbParams(CoreObject): separate_blocks_format_type: SeparateBlocksFormatType, optional Controls the format type when writing separate element blocks. Only used when write_separate_blocks is true. + **This is a beta parameter**. **The behavior and name may change in the future**. + export_tie_as_cntgen: bool, optional + Option to export ties as cntgen. When true, translates ties and contact pairs into compact cntgen blocks in the exported file. The default value is false. + + **This is a beta parameter**. **The behavior and name may change in the future**. + export_coupling_as_sfcgen: bool, optional + Option to export coupling as sfcgen. When true, translates kinematic or distributing coupling into compact sfcgen blocks in the exported file. The default value is false. + **This is a beta parameter**. **The behavior and name may change in the future**. export_fasteners_as_swgen: bool, optional Option to export fasteners as swgen. When true, translates fasteners into compact swgen blocks in the exported file. The default value is false. @@ -3484,6 +3492,14 @@ class ExportMapdlCdbParams(CoreObject): contact_element_types: ContactElementTypeParams, optional Parameters for choosing element types for contact surfaces in TIEs and CONTACT PAIRs. + **This is a beta parameter**. **The behavior and name may change in the future**. + reorder_spotweldsurface: bool, optional + Parameters to choose the logic of spotweld computation. When false, computes spotwelds by prioritzing proximity of surface to spotweld. When true, computes spotwelds by prioritizing proximity of boundary surface to spotweld. + + **This is a beta parameter**. **The behavior and name may change in the future**. + skip_comments: bool, optional + Parameter to skip export of comments to the exported file. + **This is a beta parameter**. **The behavior and name may change in the future**. json_data: dict, optional JSON dictionary to create a ``ExportMapdlCdbParams`` object with provided parameters. @@ -3512,12 +3528,16 @@ def __initialize( write_separate_blocks: bool, write_components_with_element_blocks: bool, separate_blocks_format_type: SeparateBlocksFormatType, + export_tie_as_cntgen: bool, + export_coupling_as_sfcgen: bool, export_fasteners_as_swgen: bool, export_rigid_bodies_as_rbgen: bool, write_component_based_ties: bool, mortar_contact_for_ties: bool, write_thickness_file: bool, - contact_element_types: ContactElementTypeParams): + contact_element_types: ContactElementTypeParams, + reorder_spotweldsurface: bool, + skip_comments: bool): self._config_settings = config_settings self._pre_solution_settings = pre_solution_settings self._material_properties = material_properties @@ -3534,12 +3554,16 @@ def __initialize( self._write_separate_blocks = write_separate_blocks self._write_components_with_element_blocks = write_components_with_element_blocks self._separate_blocks_format_type = SeparateBlocksFormatType(separate_blocks_format_type) + self._export_tie_as_cntgen = export_tie_as_cntgen + self._export_coupling_as_sfcgen = export_coupling_as_sfcgen self._export_fasteners_as_swgen = export_fasteners_as_swgen self._export_rigid_bodies_as_rbgen = export_rigid_bodies_as_rbgen self._write_component_based_ties = write_component_based_ties self._mortar_contact_for_ties = mortar_contact_for_ties self._write_thickness_file = write_thickness_file self._contact_element_types = contact_element_types + self._reorder_spotweldsurface = reorder_spotweldsurface + self._skip_comments = skip_comments def __init__( self, @@ -3560,12 +3584,16 @@ def __init__( write_separate_blocks: bool = None, write_components_with_element_blocks: bool = None, separate_blocks_format_type: SeparateBlocksFormatType = None, + export_tie_as_cntgen: bool = None, + export_coupling_as_sfcgen: bool = None, export_fasteners_as_swgen: bool = None, export_rigid_bodies_as_rbgen: bool = None, write_component_based_ties: bool = None, mortar_contact_for_ties: bool = None, write_thickness_file: bool = None, contact_element_types: ContactElementTypeParams = None, + reorder_spotweldsurface: bool = None, + skip_comments: bool = None, json_data : dict = None, **kwargs): """Initialize a ``ExportMapdlCdbParams`` object. @@ -3637,6 +3665,14 @@ def __init__( separate_blocks_format_type: SeparateBlocksFormatType, optional Controls the format type when writing separate element blocks. Only used when write_separate_blocks is true. + **This is a beta parameter**. **The behavior and name may change in the future**. + export_tie_as_cntgen: bool, optional + Option to export ties as cntgen. When true, translates ties and contact pairs into compact cntgen blocks in the exported file. The default value is false. + + **This is a beta parameter**. **The behavior and name may change in the future**. + export_coupling_as_sfcgen: bool, optional + Option to export coupling as sfcgen. When true, translates kinematic or distributing coupling into compact sfcgen blocks in the exported file. The default value is false. + **This is a beta parameter**. **The behavior and name may change in the future**. export_fasteners_as_swgen: bool, optional Option to export fasteners as swgen. When true, translates fasteners into compact swgen blocks in the exported file. The default value is false. @@ -3661,6 +3697,14 @@ def __init__( contact_element_types: ContactElementTypeParams, optional Parameters for choosing element types for contact surfaces in TIEs and CONTACT PAIRs. + **This is a beta parameter**. **The behavior and name may change in the future**. + reorder_spotweldsurface: bool, optional + Parameters to choose the logic of spotweld computation. When false, computes spotwelds by prioritzing proximity of surface to spotweld. When true, computes spotwelds by prioritizing proximity of boundary surface to spotweld. + + **This is a beta parameter**. **The behavior and name may change in the future**. + skip_comments: bool, optional + Parameter to skip export of comments to the exported file. + **This is a beta parameter**. **The behavior and name may change in the future**. json_data: dict, optional JSON dictionary to create a ``ExportMapdlCdbParams`` object with provided parameters. @@ -3687,14 +3731,18 @@ def __init__( json_data["writeSeparateBlocks"] if "writeSeparateBlocks" in json_data else None, json_data["writeComponentsWithElementBlocks"] if "writeComponentsWithElementBlocks" in json_data else None, SeparateBlocksFormatType(json_data["separateBlocksFormatType"] if "separateBlocksFormatType" in json_data else None), + json_data["exportTieAsCntgen"] if "exportTieAsCntgen" in json_data else None, + json_data["exportCouplingAsSfcgen"] if "exportCouplingAsSfcgen" in json_data else None, json_data["exportFastenersAsSwgen"] if "exportFastenersAsSwgen" in json_data else None, json_data["exportRigidBodiesAsRbgen"] if "exportRigidBodiesAsRbgen" in json_data else None, json_data["writeComponentBasedTies"] if "writeComponentBasedTies" in json_data else None, json_data["mortarContactForTies"] if "mortarContactForTies" in json_data else None, json_data["writeThicknessFile"] if "writeThicknessFile" in json_data else None, - ContactElementTypeParams(model = model, json_data = json_data["contactElementTypes"] if "contactElementTypes" in json_data else None)) + ContactElementTypeParams(model = model, json_data = json_data["contactElementTypes"] if "contactElementTypes" in json_data else None), + json_data["reorderSpotweldsurface"] if "reorderSpotweldsurface" in json_data else None, + json_data["skipComments"] if "skipComments" in json_data else None) else: - all_field_specified = all(arg is not None for arg in [config_settings, pre_solution_settings, material_properties, boundary_conditions, analysis_settings, write_cells, enable_face_based_labels, label_export_params, write_by_zones, consider_general_connectors_as_spot_weld, analysis_type, simulation_type, analysis_settings_file_name, write_separate_blocks, write_components_with_element_blocks, separate_blocks_format_type, export_fasteners_as_swgen, export_rigid_bodies_as_rbgen, write_component_based_ties, mortar_contact_for_ties, write_thickness_file, contact_element_types]) + all_field_specified = all(arg is not None for arg in [config_settings, pre_solution_settings, material_properties, boundary_conditions, analysis_settings, write_cells, enable_face_based_labels, label_export_params, write_by_zones, consider_general_connectors_as_spot_weld, analysis_type, simulation_type, analysis_settings_file_name, write_separate_blocks, write_components_with_element_blocks, separate_blocks_format_type, export_tie_as_cntgen, export_coupling_as_sfcgen, export_fasteners_as_swgen, export_rigid_bodies_as_rbgen, write_component_based_ties, mortar_contact_for_ties, write_thickness_file, contact_element_types, reorder_spotweldsurface, skip_comments]) if all_field_specified: self.__initialize( config_settings, @@ -3713,12 +3761,16 @@ def __init__( write_separate_blocks, write_components_with_element_blocks, separate_blocks_format_type, + export_tie_as_cntgen, + export_coupling_as_sfcgen, export_fasteners_as_swgen, export_rigid_bodies_as_rbgen, write_component_based_ties, mortar_contact_for_ties, write_thickness_file, - contact_element_types) + contact_element_types, + reorder_spotweldsurface, + skip_comments) else: if model is None: raise ValueError("Invalid assignment. Either pass a model or specify all properties.") @@ -3742,12 +3794,16 @@ def __init__( write_separate_blocks if write_separate_blocks is not None else ( ExportMapdlCdbParams._default_params["write_separate_blocks"] if "write_separate_blocks" in ExportMapdlCdbParams._default_params else (json_data["writeSeparateBlocks"] if "writeSeparateBlocks" in json_data else None)), write_components_with_element_blocks if write_components_with_element_blocks is not None else ( ExportMapdlCdbParams._default_params["write_components_with_element_blocks"] if "write_components_with_element_blocks" in ExportMapdlCdbParams._default_params else (json_data["writeComponentsWithElementBlocks"] if "writeComponentsWithElementBlocks" in json_data else None)), separate_blocks_format_type if separate_blocks_format_type is not None else ( ExportMapdlCdbParams._default_params["separate_blocks_format_type"] if "separate_blocks_format_type" in ExportMapdlCdbParams._default_params else SeparateBlocksFormatType(json_data["separateBlocksFormatType"] if "separateBlocksFormatType" in json_data else None)), + export_tie_as_cntgen if export_tie_as_cntgen is not None else ( ExportMapdlCdbParams._default_params["export_tie_as_cntgen"] if "export_tie_as_cntgen" in ExportMapdlCdbParams._default_params else (json_data["exportTieAsCntgen"] if "exportTieAsCntgen" in json_data else None)), + export_coupling_as_sfcgen if export_coupling_as_sfcgen is not None else ( ExportMapdlCdbParams._default_params["export_coupling_as_sfcgen"] if "export_coupling_as_sfcgen" in ExportMapdlCdbParams._default_params else (json_data["exportCouplingAsSfcgen"] if "exportCouplingAsSfcgen" in json_data else None)), export_fasteners_as_swgen if export_fasteners_as_swgen is not None else ( ExportMapdlCdbParams._default_params["export_fasteners_as_swgen"] if "export_fasteners_as_swgen" in ExportMapdlCdbParams._default_params else (json_data["exportFastenersAsSwgen"] if "exportFastenersAsSwgen" in json_data else None)), export_rigid_bodies_as_rbgen if export_rigid_bodies_as_rbgen is not None else ( ExportMapdlCdbParams._default_params["export_rigid_bodies_as_rbgen"] if "export_rigid_bodies_as_rbgen" in ExportMapdlCdbParams._default_params else (json_data["exportRigidBodiesAsRbgen"] if "exportRigidBodiesAsRbgen" in json_data else None)), write_component_based_ties if write_component_based_ties is not None else ( ExportMapdlCdbParams._default_params["write_component_based_ties"] if "write_component_based_ties" in ExportMapdlCdbParams._default_params else (json_data["writeComponentBasedTies"] if "writeComponentBasedTies" in json_data else None)), mortar_contact_for_ties if mortar_contact_for_ties is not None else ( ExportMapdlCdbParams._default_params["mortar_contact_for_ties"] if "mortar_contact_for_ties" in ExportMapdlCdbParams._default_params else (json_data["mortarContactForTies"] if "mortarContactForTies" in json_data else None)), write_thickness_file if write_thickness_file is not None else ( ExportMapdlCdbParams._default_params["write_thickness_file"] if "write_thickness_file" in ExportMapdlCdbParams._default_params else (json_data["writeThicknessFile"] if "writeThicknessFile" in json_data else None)), - contact_element_types if contact_element_types is not None else ( ExportMapdlCdbParams._default_params["contact_element_types"] if "contact_element_types" in ExportMapdlCdbParams._default_params else ContactElementTypeParams(model = model, json_data = (json_data["contactElementTypes"] if "contactElementTypes" in json_data else None)))) + contact_element_types if contact_element_types is not None else ( ExportMapdlCdbParams._default_params["contact_element_types"] if "contact_element_types" in ExportMapdlCdbParams._default_params else ContactElementTypeParams(model = model, json_data = (json_data["contactElementTypes"] if "contactElementTypes" in json_data else None))), + reorder_spotweldsurface if reorder_spotweldsurface is not None else ( ExportMapdlCdbParams._default_params["reorder_spotweldsurface"] if "reorder_spotweldsurface" in ExportMapdlCdbParams._default_params else (json_data["reorderSpotweldsurface"] if "reorderSpotweldsurface" in json_data else None)), + skip_comments if skip_comments is not None else ( ExportMapdlCdbParams._default_params["skip_comments"] if "skip_comments" in ExportMapdlCdbParams._default_params else (json_data["skipComments"] if "skipComments" in json_data else None))) self._custom_params = kwargs if model is not None: [ model._logger.warning(f'Unsupported argument : {key}') for key in kwargs ] @@ -3773,12 +3829,16 @@ def set_default( write_separate_blocks: bool = None, write_components_with_element_blocks: bool = None, separate_blocks_format_type: SeparateBlocksFormatType = None, + export_tie_as_cntgen: bool = None, + export_coupling_as_sfcgen: bool = None, export_fasteners_as_swgen: bool = None, export_rigid_bodies_as_rbgen: bool = None, write_component_based_ties: bool = None, mortar_contact_for_ties: bool = None, write_thickness_file: bool = None, - contact_element_types: ContactElementTypeParams = None): + contact_element_types: ContactElementTypeParams = None, + reorder_spotweldsurface: bool = None, + skip_comments: bool = None): """Set the default values of the ``ExportMapdlCdbParams`` object. Parameters @@ -3815,6 +3875,10 @@ def set_default( Controls whether component definitions should be written within individual element blocks. write_components_with_element_blocks only has effect when write_separate_blocks is true. When write_components_with_element_blocks is true, writes component commands for each element block. When write_components_with_element_blocks is false, writes components separately. separate_blocks_format_type: SeparateBlocksFormatType, optional Controls the format type when writing separate element blocks. Only used when write_separate_blocks is true. + export_tie_as_cntgen: bool, optional + Option to export ties as cntgen. When true, translates ties and contact pairs into compact cntgen blocks in the exported file. The default value is false. + export_coupling_as_sfcgen: bool, optional + Option to export coupling as sfcgen. When true, translates kinematic or distributing coupling into compact sfcgen blocks in the exported file. The default value is false. export_fasteners_as_swgen: bool, optional Option to export fasteners as swgen. When true, translates fasteners into compact swgen blocks in the exported file. The default value is false. export_rigid_bodies_as_rbgen: bool, optional @@ -3827,6 +3891,10 @@ def set_default( Option to write a thickness file for spotweld fatigue analysis. If true, writes a file named [exportedFilename].cdb.thick.txt containing thickness information. contact_element_types: ContactElementTypeParams, optional Parameters for choosing element types for contact surfaces in TIEs and CONTACT PAIRs. + reorder_spotweldsurface: bool, optional + Parameters to choose the logic of spotweld computation. When false, computes spotwelds by prioritzing proximity of surface to spotweld. When true, computes spotwelds by prioritizing proximity of boundary surface to spotweld. + skip_comments: bool, optional + Parameter to skip export of comments to the exported file. """ args = locals() [ExportMapdlCdbParams._default_params.update({ key: value }) for key, value in args.items() if value is not None] @@ -3877,6 +3945,10 @@ def _jsonify(self) -> Dict[str, Any]: json_data["writeComponentsWithElementBlocks"] = self._write_components_with_element_blocks if self._separate_blocks_format_type is not None: json_data["separateBlocksFormatType"] = self._separate_blocks_format_type + if self._export_tie_as_cntgen is not None: + json_data["exportTieAsCntgen"] = self._export_tie_as_cntgen + if self._export_coupling_as_sfcgen is not None: + json_data["exportCouplingAsSfcgen"] = self._export_coupling_as_sfcgen if self._export_fasteners_as_swgen is not None: json_data["exportFastenersAsSwgen"] = self._export_fasteners_as_swgen if self._export_rigid_bodies_as_rbgen is not None: @@ -3889,11 +3961,15 @@ def _jsonify(self) -> Dict[str, Any]: json_data["writeThicknessFile"] = self._write_thickness_file if self._contact_element_types is not None: json_data["contactElementTypes"] = self._contact_element_types._jsonify() + if self._reorder_spotweldsurface is not None: + json_data["reorderSpotweldsurface"] = self._reorder_spotweldsurface + if self._skip_comments is not None: + json_data["skipComments"] = self._skip_comments [ json_data.update({ utils.to_camel_case(key) : value }) for key, value in self._custom_params.items()] return json_data def __str__(self) -> str: - message = "config_settings : %s\npre_solution_settings : %s\nmaterial_properties : %s\nboundary_conditions : %s\nanalysis_settings : %s\nwrite_cells : %s\nenable_face_based_labels : %s\nlabel_export_params : %s\nwrite_by_zones : %s\nconsider_general_connectors_as_spot_weld : %s\nanalysis_type : %s\nsimulation_type : %s\nanalysis_settings_file_name : %s\nwrite_separate_blocks : %s\nwrite_components_with_element_blocks : %s\nseparate_blocks_format_type : %s\nexport_fasteners_as_swgen : %s\nexport_rigid_bodies_as_rbgen : %s\nwrite_component_based_ties : %s\nmortar_contact_for_ties : %s\nwrite_thickness_file : %s\ncontact_element_types : %s" % (self._config_settings, self._pre_solution_settings, self._material_properties, self._boundary_conditions, self._analysis_settings, self._write_cells, self._enable_face_based_labels, '{ ' + str(self._label_export_params) + ' }', self._write_by_zones, self._consider_general_connectors_as_spot_weld, self._analysis_type, self._simulation_type, self._analysis_settings_file_name, self._write_separate_blocks, self._write_components_with_element_blocks, self._separate_blocks_format_type, self._export_fasteners_as_swgen, self._export_rigid_bodies_as_rbgen, self._write_component_based_ties, self._mortar_contact_for_ties, self._write_thickness_file, '{ ' + str(self._contact_element_types) + ' }') + message = "config_settings : %s\npre_solution_settings : %s\nmaterial_properties : %s\nboundary_conditions : %s\nanalysis_settings : %s\nwrite_cells : %s\nenable_face_based_labels : %s\nlabel_export_params : %s\nwrite_by_zones : %s\nconsider_general_connectors_as_spot_weld : %s\nanalysis_type : %s\nsimulation_type : %s\nanalysis_settings_file_name : %s\nwrite_separate_blocks : %s\nwrite_components_with_element_blocks : %s\nseparate_blocks_format_type : %s\nexport_tie_as_cntgen : %s\nexport_coupling_as_sfcgen : %s\nexport_fasteners_as_swgen : %s\nexport_rigid_bodies_as_rbgen : %s\nwrite_component_based_ties : %s\nmortar_contact_for_ties : %s\nwrite_thickness_file : %s\ncontact_element_types : %s\nreorder_spotweldsurface : %s\nskip_comments : %s" % (self._config_settings, self._pre_solution_settings, self._material_properties, self._boundary_conditions, self._analysis_settings, self._write_cells, self._enable_face_based_labels, '{ ' + str(self._label_export_params) + ' }', self._write_by_zones, self._consider_general_connectors_as_spot_weld, self._analysis_type, self._simulation_type, self._analysis_settings_file_name, self._write_separate_blocks, self._write_components_with_element_blocks, self._separate_blocks_format_type, self._export_tie_as_cntgen, self._export_coupling_as_sfcgen, self._export_fasteners_as_swgen, self._export_rigid_bodies_as_rbgen, self._write_component_based_ties, self._mortar_contact_for_ties, self._write_thickness_file, '{ ' + str(self._contact_element_types) + ' }', self._reorder_spotweldsurface, self._skip_comments) message += ''.join('\n' + str(key) + ' : ' + str(value) for key, value in self._custom_params.items()) return message @@ -4089,6 +4165,30 @@ def separate_blocks_format_type(self) -> SeparateBlocksFormatType: def separate_blocks_format_type(self, value: SeparateBlocksFormatType): self._separate_blocks_format_type = value + @property + def export_tie_as_cntgen(self) -> bool: + """Option to export ties as cntgen. When true, translates ties and contact pairs into compact cntgen blocks in the exported file. The default value is false. + + **This is a beta parameter**. **The behavior and name may change in the future**. + """ + return self._export_tie_as_cntgen + + @export_tie_as_cntgen.setter + def export_tie_as_cntgen(self, value: bool): + self._export_tie_as_cntgen = value + + @property + def export_coupling_as_sfcgen(self) -> bool: + """Option to export coupling as sfcgen. When true, translates kinematic or distributing coupling into compact sfcgen blocks in the exported file. The default value is false. + + **This is a beta parameter**. **The behavior and name may change in the future**. + """ + return self._export_coupling_as_sfcgen + + @export_coupling_as_sfcgen.setter + def export_coupling_as_sfcgen(self, value: bool): + self._export_coupling_as_sfcgen = value + @property def export_fasteners_as_swgen(self) -> bool: """Option to export fasteners as swgen. When true, translates fasteners into compact swgen blocks in the exported file. The default value is false. @@ -4161,6 +4261,30 @@ def contact_element_types(self) -> ContactElementTypeParams: def contact_element_types(self, value: ContactElementTypeParams): self._contact_element_types = value + @property + def reorder_spotweldsurface(self) -> bool: + """Parameters to choose the logic of spotweld computation. When false, computes spotwelds by prioritzing proximity of surface to spotweld. When true, computes spotwelds by prioritizing proximity of boundary surface to spotweld. + + **This is a beta parameter**. **The behavior and name may change in the future**. + """ + return self._reorder_spotweldsurface + + @reorder_spotweldsurface.setter + def reorder_spotweldsurface(self, value: bool): + self._reorder_spotweldsurface = value + + @property + def skip_comments(self) -> bool: + """Parameter to skip export of comments to the exported file. + + **This is a beta parameter**. **The behavior and name may change in the future**. + """ + return self._skip_comments + + @skip_comments.setter + def skip_comments(self, value: bool): + self._skip_comments = value + class ExportMapdlCdbResults(CoreObject): """Results associated with the MAPDL CDB export. @@ -4171,6 +4295,10 @@ class ExportMapdlCdbResults(CoreObject): summary_log: str, optional Summary log for the export operation in json format. + **This is a beta parameter**. **The behavior and name may change in the future**. + formatted_summary_log: str, optional + Formatted summary log for the export operation. + **This is a beta parameter**. **The behavior and name may change in the future**. zone_mesh_results: List[ZoneMeshResult], optional Zone-wise mesh information for elements in the exported model. @@ -4194,10 +4322,12 @@ class ExportMapdlCdbResults(CoreObject): def __initialize( self, summary_log: str, + formatted_summary_log: str, zone_mesh_results: List[ZoneMeshResult], error_code: ErrorCode, warning_codes: List[WarningCode]): self._summary_log = summary_log + self._formatted_summary_log = formatted_summary_log self._zone_mesh_results = zone_mesh_results self._error_code = ErrorCode(error_code) self._warning_codes = warning_codes @@ -4206,6 +4336,7 @@ def __init__( self, model: CommunicationManager=None, summary_log: str = None, + formatted_summary_log: str = None, zone_mesh_results: List[ZoneMeshResult] = None, error_code: ErrorCode = None, warning_codes: List[WarningCode] = None, @@ -4220,6 +4351,10 @@ def __init__( summary_log: str, optional Summary log for the export operation in json format. + **This is a beta parameter**. **The behavior and name may change in the future**. + formatted_summary_log: str, optional + Formatted summary log for the export operation. + **This is a beta parameter**. **The behavior and name may change in the future**. zone_mesh_results: List[ZoneMeshResult], optional Zone-wise mesh information for elements in the exported model. @@ -4241,14 +4376,16 @@ def __init__( if json_data: self.__initialize( json_data["summaryLog"] if "summaryLog" in json_data else None, + json_data["formattedSummaryLog"] if "formattedSummaryLog" in json_data else None, [ZoneMeshResult(model = model, json_data = data) for data in json_data["zoneMeshResults"]] if "zoneMeshResults" in json_data else None, ErrorCode(json_data["errorCode"] if "errorCode" in json_data else None), [WarningCode(data) for data in json_data["warningCodes"]] if "warningCodes" in json_data else None) else: - all_field_specified = all(arg is not None for arg in [summary_log, zone_mesh_results, error_code, warning_codes]) + all_field_specified = all(arg is not None for arg in [summary_log, formatted_summary_log, zone_mesh_results, error_code, warning_codes]) if all_field_specified: self.__initialize( summary_log, + formatted_summary_log, zone_mesh_results, error_code, warning_codes) @@ -4260,6 +4397,7 @@ def __init__( json_data = param_json["ExportMapdlCdbResults"] if "ExportMapdlCdbResults" in param_json else {} self.__initialize( summary_log if summary_log is not None else ( ExportMapdlCdbResults._default_params["summary_log"] if "summary_log" in ExportMapdlCdbResults._default_params else (json_data["summaryLog"] if "summaryLog" in json_data else None)), + formatted_summary_log if formatted_summary_log is not None else ( ExportMapdlCdbResults._default_params["formatted_summary_log"] if "formatted_summary_log" in ExportMapdlCdbResults._default_params else (json_data["formattedSummaryLog"] if "formattedSummaryLog" in json_data else None)), zone_mesh_results if zone_mesh_results is not None else ( ExportMapdlCdbResults._default_params["zone_mesh_results"] if "zone_mesh_results" in ExportMapdlCdbResults._default_params else [ZoneMeshResult(model = model, json_data = data) for data in (json_data["zoneMeshResults"] if "zoneMeshResults" in json_data else None)]), error_code if error_code is not None else ( ExportMapdlCdbResults._default_params["error_code"] if "error_code" in ExportMapdlCdbResults._default_params else ErrorCode(json_data["errorCode"] if "errorCode" in json_data else None)), warning_codes if warning_codes is not None else ( ExportMapdlCdbResults._default_params["warning_codes"] if "warning_codes" in ExportMapdlCdbResults._default_params else [WarningCode(data) for data in (json_data["warningCodes"] if "warningCodes" in json_data else None)])) @@ -4273,6 +4411,7 @@ def __init__( @staticmethod def set_default( summary_log: str = None, + formatted_summary_log: str = None, zone_mesh_results: List[ZoneMeshResult] = None, error_code: ErrorCode = None, warning_codes: List[WarningCode] = None): @@ -4282,6 +4421,8 @@ def set_default( ---------- summary_log: str, optional Summary log for the export operation in json format. + formatted_summary_log: str, optional + Formatted summary log for the export operation. zone_mesh_results: List[ZoneMeshResult], optional Zone-wise mesh information for elements in the exported model. error_code: ErrorCode, optional @@ -4308,6 +4449,8 @@ def _jsonify(self) -> Dict[str, Any]: json_data = {} if self._summary_log is not None: json_data["summaryLog"] = self._summary_log + if self._formatted_summary_log is not None: + json_data["formattedSummaryLog"] = self._formatted_summary_log if self._zone_mesh_results is not None: json_data["zoneMeshResults"] = [data._jsonify() for data in self._zone_mesh_results] if self._error_code is not None: @@ -4318,7 +4461,7 @@ def _jsonify(self) -> Dict[str, Any]: return json_data def __str__(self) -> str: - message = "summary_log : %s\nzone_mesh_results : %s\nerror_code : %s\nwarning_codes : %s" % (self._summary_log, '[' + ''.join('\n' + str(data) for data in self._zone_mesh_results) + ']', self._error_code, '[' + ''.join('\n' + str(data) for data in self._warning_codes) + ']') + message = "summary_log : %s\nformatted_summary_log : %s\nzone_mesh_results : %s\nerror_code : %s\nwarning_codes : %s" % (self._summary_log, self._formatted_summary_log, '[' + ''.join('\n' + str(data) for data in self._zone_mesh_results) + ']', self._error_code, '[' + ''.join('\n' + str(data) for data in self._warning_codes) + ']') message += ''.join('\n' + str(key) + ' : ' + str(value) for key, value in self._custom_params.items()) return message @@ -4334,6 +4477,18 @@ def summary_log(self) -> str: def summary_log(self, value: str): self._summary_log = value + @property + def formatted_summary_log(self) -> str: + """Formatted summary log for the export operation. + + **This is a beta parameter**. **The behavior and name may change in the future**. + """ + return self._formatted_summary_log + + @formatted_summary_log.setter + def formatted_summary_log(self, value: str): + self._formatted_summary_log = value + @property def zone_mesh_results(self) -> List[ZoneMeshResult]: """Zone-wise mesh information for elements in the exported model. @@ -5367,6 +5522,10 @@ class ImportAbaqusResults(CoreObject): summary_log: str, optional Summary log for the import operation in json format. + **This is a beta parameter**. **The behavior and name may change in the future**. + formatted_summary_log: str, optional + Formatted summary log for the import operation. + **This is a beta parameter**. **The behavior and name may change in the future**. error_code: ErrorCode, optional Error code associated with failure of operation. @@ -5386,9 +5545,11 @@ class ImportAbaqusResults(CoreObject): def __initialize( self, summary_log: str, + formatted_summary_log: str, error_code: ErrorCode, warning_codes: List[WarningCode]): self._summary_log = summary_log + self._formatted_summary_log = formatted_summary_log self._error_code = ErrorCode(error_code) self._warning_codes = warning_codes @@ -5396,6 +5557,7 @@ def __init__( self, model: CommunicationManager=None, summary_log: str = None, + formatted_summary_log: str = None, error_code: ErrorCode = None, warning_codes: List[WarningCode] = None, json_data : dict = None, @@ -5409,6 +5571,10 @@ def __init__( summary_log: str, optional Summary log for the import operation in json format. + **This is a beta parameter**. **The behavior and name may change in the future**. + formatted_summary_log: str, optional + Formatted summary log for the import operation. + **This is a beta parameter**. **The behavior and name may change in the future**. error_code: ErrorCode, optional Error code associated with failure of operation. @@ -5426,13 +5592,15 @@ def __init__( if json_data: self.__initialize( json_data["summaryLog"] if "summaryLog" in json_data else None, + json_data["formattedSummaryLog"] if "formattedSummaryLog" in json_data else None, ErrorCode(json_data["errorCode"] if "errorCode" in json_data else None), [WarningCode(data) for data in json_data["warningCodes"]] if "warningCodes" in json_data else None) else: - all_field_specified = all(arg is not None for arg in [summary_log, error_code, warning_codes]) + all_field_specified = all(arg is not None for arg in [summary_log, formatted_summary_log, error_code, warning_codes]) if all_field_specified: self.__initialize( summary_log, + formatted_summary_log, error_code, warning_codes) else: @@ -5443,6 +5611,7 @@ def __init__( json_data = param_json["ImportAbaqusResults"] if "ImportAbaqusResults" in param_json else {} self.__initialize( summary_log if summary_log is not None else ( ImportAbaqusResults._default_params["summary_log"] if "summary_log" in ImportAbaqusResults._default_params else (json_data["summaryLog"] if "summaryLog" in json_data else None)), + formatted_summary_log if formatted_summary_log is not None else ( ImportAbaqusResults._default_params["formatted_summary_log"] if "formatted_summary_log" in ImportAbaqusResults._default_params else (json_data["formattedSummaryLog"] if "formattedSummaryLog" in json_data else None)), error_code if error_code is not None else ( ImportAbaqusResults._default_params["error_code"] if "error_code" in ImportAbaqusResults._default_params else ErrorCode(json_data["errorCode"] if "errorCode" in json_data else None)), warning_codes if warning_codes is not None else ( ImportAbaqusResults._default_params["warning_codes"] if "warning_codes" in ImportAbaqusResults._default_params else [WarningCode(data) for data in (json_data["warningCodes"] if "warningCodes" in json_data else None)])) self._custom_params = kwargs @@ -5455,6 +5624,7 @@ def __init__( @staticmethod def set_default( summary_log: str = None, + formatted_summary_log: str = None, error_code: ErrorCode = None, warning_codes: List[WarningCode] = None): """Set the default values of the ``ImportAbaqusResults`` object. @@ -5463,6 +5633,8 @@ def set_default( ---------- summary_log: str, optional Summary log for the import operation in json format. + formatted_summary_log: str, optional + Formatted summary log for the import operation. error_code: ErrorCode, optional Error code associated with failure of operation. warning_codes: List[WarningCode], optional @@ -5487,6 +5659,8 @@ def _jsonify(self) -> Dict[str, Any]: json_data = {} if self._summary_log is not None: json_data["summaryLog"] = self._summary_log + if self._formatted_summary_log is not None: + json_data["formattedSummaryLog"] = self._formatted_summary_log if self._error_code is not None: json_data["errorCode"] = self._error_code if self._warning_codes is not None: @@ -5495,7 +5669,7 @@ def _jsonify(self) -> Dict[str, Any]: return json_data def __str__(self) -> str: - message = "summary_log : %s\nerror_code : %s\nwarning_codes : %s" % (self._summary_log, self._error_code, '[' + ''.join('\n' + str(data) for data in self._warning_codes) + ']') + message = "summary_log : %s\nformatted_summary_log : %s\nerror_code : %s\nwarning_codes : %s" % (self._summary_log, self._formatted_summary_log, self._error_code, '[' + ''.join('\n' + str(data) for data in self._warning_codes) + ']') message += ''.join('\n' + str(key) + ' : ' + str(value) for key, value in self._custom_params.items()) return message @@ -5511,6 +5685,18 @@ def summary_log(self) -> str: def summary_log(self, value: str): self._summary_log = value + @property + def formatted_summary_log(self) -> str: + """Formatted summary log for the import operation. + + **This is a beta parameter**. **The behavior and name may change in the future**. + """ + return self._formatted_summary_log + + @formatted_summary_log.setter + def formatted_summary_log(self, value: str): + self._formatted_summary_log = value + @property def error_code(self) -> ErrorCode: """Error code associated with failure of operation. diff --git a/src/ansys/meshing/prime/core/mapdlcdbexportutils.py b/src/ansys/meshing/prime/core/mapdlcdbexportutils.py index bc438ffb03..e2b225bcdb 100644 --- a/src/ansys/meshing/prime/core/mapdlcdbexportutils.py +++ b/src/ansys/meshing/prime/core/mapdlcdbexportutils.py @@ -664,9 +664,17 @@ class _MaterialProcessor: '_property_function_map', '_model', '_logger', + '_skip_comments', ) - def __init__(self, model: prime.Model, raw_materials_data, zone_data, hm_comments=False): + def __init__( + self, + model: prime.Model, + raw_materials_data, + zone_data, + hm_comments=False, + skip_comments=True, + ): self._raw_materials_data = raw_materials_data self._zone_data = zone_data self._mat_id = 0 @@ -683,9 +691,11 @@ def __init__(self, model: prime.Model, raw_materials_data, zone_data, hm_comment 'DAMAGE EVOLUTION': self._process_damage_evolution_data, 'DAMAGE INITIATION': self._process_damage_initiation_data, 'HYPERFOAM': self._process_hyperfoam_data, + 'VISCOELASTIC': self._process_viscoelastic_data, } self._model = model self._logger = model.python_logger + self._skip_comments = skip_comments def _map_zone_type_with_material(self): if self._zone_data is None: @@ -763,10 +773,11 @@ def _get_mat_comands(self, material): 'DAMAGE INITIATION', 'DAMAGE EVOLUTION', 'HYPERFOAM', + 'VISCOELASTIC', ] # self._logger.info(mat_data) mapdl_text_data = "" - hm_comment = self._enable_hm_comments + hm_comment = self._enable_hm_comments and self._skip_comments is False if hm_comment: mapdl_text_data += "!!HMNAME MAT \n" mapdl_text_data += f'!!{self._mat_id:>10} "{material}"\n' @@ -865,6 +876,108 @@ def _process_damage_initiation_data(self, property_dict, material, mat_id): damage_init_data += "\n" return damage_init_data + def get_weight_factor(self, mat_id, material): + weight_sum = 0 + weight_factor = 1 + all_mat_props = self._raw_materials_data[material] + if 'VISCOELASTIC' not in all_mat_props: + return weight_factor + mat_props = all_mat_props["VISCOELASTIC"] + if ( + mat_props["Parameters"] + and "TIME" in mat_props["Parameters"] + and mat_props["Parameters"]["TIME"] == "PRONY" + ): + g = mat_props["Data"]['g'] + if 'k' in mat_props["Data"]: + k = mat_props["Data"]['k'] + else: + k = [0.0] * len(g) + t = mat_props["Data"]['t'] + plastic_data = {} + for pnt in zip(g, k, t): + if float(pnt[1]) in plastic_data.keys(): + plastic_data[float(pnt[1])].append([float(pnt[0]), float(pnt[2])]) + else: + plastic_data[float(pnt[1])] = [[float(pnt[0]), float(pnt[2])]] + + if len(plastic_data.keys()) > 1: + self._logger.warning( + f"More than one temperature data is provided in the material " + f"(ID : {mat_id} Name: {material}). Please verify the material data." + ) + for tb_temp, data_temp in plastic_data.items(): + + data_for_temp = sorted(data_temp, key=lambda x: x[0]) + for count, plst_data in enumerate(data_for_temp): + weight_sum += float(plst_data[0]) + + if weight_sum > 1: + self._logger.warning( + f"Weight sum of the hyperleastic material {material} is more than 1" + ) + weight_factor = 1 / (1 - weight_sum) + # self._logger.info(f"weight_factor1 {weight_factor}") + return weight_factor + else: + self._logger.warning( + f"The visco-elasticity available in the material " + f"(ID : {mat_id} Name: {material}) is not translated. " + f"Only Prony series is supported." + ) + return weight_factor + + def _process_viscoelastic_data(self, property_dict, material, mat_id): + viscoelastic_data = '' + + if ( + property_dict["Parameters"] + and "TIME" in property_dict["Parameters"] + and property_dict["Parameters"]["TIME"] == "PRONY" + ): + g = property_dict["Data"]['g'] + if 'k' in property_dict["Data"]: + k = property_dict["Data"]['k'] + else: + k = [0.0] * len(g) + if 't' in property_dict["Data"]: + t = property_dict["Data"]['t'] + else: + t = [0.0] * len(g) + plastic_data = {} + for pnt in zip(g, k, t): + if float(pnt[1]) in plastic_data.keys(): + plastic_data[float(pnt[1])].append([float(pnt[0]), float(pnt[2])]) + else: + plastic_data[float(pnt[1])] = [[float(pnt[0]), float(pnt[2])]] + + if len(plastic_data.keys()) > 1: + self._logger.warning( + f"More than one temperature data is provided in the material " + f"(ID : {mat_id} Name: {mat_name}). Please verify the material data." + ) + + key = list(plastic_data.keys())[0] + data = plastic_data[key] + + viscoelastic_data += f"TB, PRONY, {mat_id},,,SHEAR\n" + for g, t in data: + viscoelastic_data += f"TBDATA,, {g}, {t}\n" + viscoelastic_data += "\n" + + viscoelastic_data += f"TB, PRONY, {mat_id},,,BULK\n" + for g, t in data: + viscoelastic_data += f"TBDATA,, {g}, {t}\n" + viscoelastic_data += "\n" + + else: + self._logger.warning( + f"Only TIME=PRONY is processed for VISCOELASTIC material. " + f"Material {material} is not processed completly." + ) + + return viscoelastic_data + def _process_hyperfoam_data(self, property_dict, material, mat_id): hyperfoam_data = '' data = [] @@ -888,10 +1001,13 @@ def _process_hyperfoam_data(self, property_dict, material, mat_id): ] hyperfoam_data = self._hyperfoam_with_test_data(n, uniaxial_test_data, poisson, mat_id) else: - hyperfoam_data = self._hyperfoam_with_coeffs(n, data, mat_id) + weight_factor = 1 + if not ('MODULI' in parameters and parameters['MODULI'] == 'INSTANTANEOUS'): + weight_factor = self.get_weight_factor(mat_id, material) + hyperfoam_data = self._hyperfoam_with_coeffs(n, data, mat_id, weight_factor) return hyperfoam_data - def _hyperfoam_with_coeffs(self, n, data, mat_id): + def _hyperfoam_with_coeffs(self, n, data, mat_id, weight_factor): hyperfoam_coeff_data = '' data = { k: [float(x) for x in v if x is not None] if v is not None else None @@ -936,32 +1052,32 @@ def _hyperfoam_with_coeffs(self, n, data, mat_id): if 'Temperature' in data: temperature = data['Temperature'] - hyperfoam_coeff_data += f"TB, HYPE, {mat_id},,{n},FOAM" + hyperfoam_coeff_data += f"TB, HYPE, {mat_id},,{n},FOAM\n" for i in range(len(temperature)): if temperature[i] is not None: hyperfoam_coeff_data += f"TBTEMP,{temperature[i]}\n" - u1a = 2 * u1[i] / a1[i] + u1a = 2 * u1[i] / a1[i] * weight_factor a1a = a1[i] hyperfoam_coeff_data += f"TBDATA, 1, {u1a}, {a1a}" if n > 1: - u2a = 2 * u2[i] / a2[i] + u2a = 2 * u2[i] / a2[i] * weight_factor a2a = a2[i] hyperfoam_coeff_data += f", {u2a}, {a2a}" if n > 2: - u3a = 2 * u3[i] / a3[i] + u3a = 2 * u3[i] / a3[i] * weight_factor a3a = a3[i] hyperfoam_coeff_data += f", {u3a}, {a3a}" if n > 3: - u4a = 2 * u4[i] / a4[i] + u4a = 2 * u4[i] / a4[i] * weight_factor a4a = a4[i] hyperfoam_coeff_data += "\n" hyperfoam_coeff_data += f"TBDATA, 7, {u4a}, {a4a}" if n > 4: - u5a = 2 * u5[i] / a5[i] + u5a = 2 * u5[i] / a5[i] * weight_factor a5a = a5[i] hyperfoam_coeff_data += f", {u5a}, {a5a}" if n > 5: - u6a = 2 * u6[i] / a6[i] + u6a = 2 * u6[i] / a6[i] * weight_factor a6a = a6[i] hyperfoam_coeff_data += f", {u6a}, {a6a}" hyperfoam_coeff_data += "\n" @@ -984,6 +1100,7 @@ def _hyperfoam_with_coeffs(self, n, data, mat_id): b6a = v6[i] / (1 - 2 * v6[i]) hyperfoam_coeff_data += f", {b6a}" hyperfoam_coeff_data += "\n" + hyperfoam_coeff_data += "\n" return hyperfoam_coeff_data def _hyperfoam_with_test_data(self, n, data, poisson, mat_id): @@ -1198,7 +1315,7 @@ def _process_damping_data(self, property_dict, material, mat_id): if 'ALPHA' in property_dict['Parameters']: damping_data += f"MP, ALPD, {mat_id}, {property_dict['Parameters']['ALPHA']} \n" if float(property_dict['Parameters']['BETA']) != 0.0: - self._logger.warning(f"Parameter {'BETA'} on *DAMPING is not processed.") + damping_data += f"MP, BETD, {mat_id}, {property_dict['Parameters']['BETA']} \n" if float(property_dict['Parameters']['COMPOSITE']) != 0.0: self._logger.warning(f"Parameter {'COMPOSITE'} on *DAMPING is not processed.") damping_data += f"\n" @@ -1375,7 +1492,13 @@ def _process_plastic_data(self, property_dict, material, mat_id): def _process_hyperelastic_data(self, property_dict, material, mat_id): hyperelastic_data = '' param_keys = property_dict["Parameters"].keys() + parameters = property_dict["Parameters"] data = [] + + weight_factor = 1 + if not ('MODULI' in parameters and parameters['MODULI'] == 'INSTANTANEOUS'): + weight_factor = self.get_weight_factor(mat_id, material) + if 'Data' in property_dict and property_dict['Data'] is not None: data = property_dict['Data'] if ( @@ -1425,6 +1548,10 @@ def _process_hyperelastic_data(self, property_dict, material, mat_id): temp_data_points = 1 temperature = [None] number_of_constants = 3 + data = { + k: [float(x) for x in v if x is not None] if v is not None else None + for k, v in data.items() + } if 'C10' in data.keys(): number_of_constants = 1 c10 = data['C10'] @@ -1451,12 +1578,14 @@ def _process_hyperelastic_data(self, property_dict, material, mat_id): if temperature[i] is not None: hyperelastic_data += f"TBTEMP, {temperature[i]}\n" if number_of_constants == 1: - hyperelastic_data += f"TBDATA, 1, {c10[i]}, {d1[i]}\n" + hyperelastic_data += f"TBDATA, 1, {c10[i]*weight_factor}, {d1[i]}\n" elif number_of_constants == 2: - hyperelastic_data += f"TBDATA, 1, {c10[i]}, {c20[i]}, {d1[i]}, {d2[i]}\n" + hyperelastic_data += f"TBDATA, 1, {c10[i]*weight_factor}, " + hyperelastic_data += f"{c20[i]*weight_factor}, {d1[i]}, {d2[i]}\n" elif number_of_constants == 3: hyperelastic_data += ( - f"TBDATA, 1, {c10[i]}, {c20[i]}, {c30[i]}, {d1[i]}, {d2[i]}, {d3[i]}\n" + f"TBDATA, 1, {c10[i]*weight_factor}, {c20[i]*weight_factor}, " + f"{c30[i]*weight_factor}, {d1[i]}, {d2[i]}, {d3[i]}\n" ) else: pass @@ -1572,9 +1701,12 @@ class _JointMaterialProcessor: '_property_function_map', '_model', '_logger', + '_skip_comments', ) - def __init__(self, model: prime.Model, raw_joint_materials_data, hm_comments=False): + def __init__( + self, model: prime.Model, raw_joint_materials_data, hm_comments=False, skip_comments=True + ): self._raw_joint_materials_data = raw_joint_materials_data self._mat_id = 0 self._enable_hm_comments = hm_comments @@ -1584,6 +1716,7 @@ def __init__(self, model: prime.Model, raw_joint_materials_data, hm_comments=Fal } self._model = model self._logger = model.python_logger + self._skip_comments = skip_comments def get_all_material_commands(self): mapdl_text_data_list = [] @@ -1600,7 +1733,7 @@ def _get_mat_comands(self, material): processed_entities = ['CONNECTOR ELASTICITY', 'CONNECTOR DAMPING'] # self._logger.info(mat_data) mapdl_text_data = "" - hm_comment = self._enable_hm_comments + hm_comment = self._enable_hm_comments and self._skip_comments is False if hm_comment: mapdl_text_data += "!!HMNAME MAT \n" mapdl_text_data += f'!!{self._mat_id:>10} "{material}"\n' @@ -3413,7 +3546,7 @@ def get_frequency_analysis_data(self, frequency_data): or ("Boundary" in self._simulation_data and self._simulation_data['Boundary']) ): frequency_analysis_commands += 'KEYW, BETA, 1\n' - frequency_analysis_commands += 'AIRL, AUTO, 1\n' + frequency_analysis_commands += 'AIRL, AUTO\n' if ( "MODAL DYNAMIC" in self._analysis_sequence or "STEADY STATE DYNAMICS" in self._analysis_sequence @@ -4633,6 +4766,7 @@ def generate_mapdl_commands( json_simulation_data["Materials"], json_simulation_data["Zones"], params.write_separate_blocks, + params.skip_comments, ) mat_cmds = mp.get_all_material_commands() all_mat_cmds = mat_cmds @@ -4641,7 +4775,10 @@ def generate_mapdl_commands( and json_simulation_data["ConnectorBehavior"] is not None ): jmp = _JointMaterialProcessor( - model, json_simulation_data["ConnectorBehavior"], params.write_separate_blocks + model, + json_simulation_data["ConnectorBehavior"], + params.write_separate_blocks, + params.skip_comments, ) joint_all_mat_cmds = jmp.get_all_material_commands() all_mat_cmds += joint_all_mat_cmds @@ -4742,36 +4879,36 @@ def generate_mapdl_commands( analysis_settings += '\nFINISH\n' if params.analysis_settings != None: analysis_settings += params.analysis_settings - analysis_settings += ( - '!--------------------------------------------------------------------------\n' - ) - # analysis_settings += '/copy,file0,err,,errfile,tmp\n' - # analysis_settings += '\n' - analysis_settings += '/delete,,cnm,,1\n' - analysis_settings += '/delete,,DSP,,\n' - analysis_settings += '/delete,,mcf,,\n' - analysis_settings += '/delete,,rfrq,,1\n' - analysis_settings += '/delete,,log,,1\n' - analysis_settings += '/delete,,emat,,1\n' - analysis_settings += '/delete,,esav,,1\n' - analysis_settings += '/delete,,err,,1\n' - analysis_settings += '/delete,,full,,1\n' - analysis_settings += '/delete,,mlv,,1\n' - analysis_settings += '/delete,,mode,,1\n' - # analysis_settings += '/delete,,rfrq,,1\n' - analysis_settings += '/delete,,out,,1\n' - # analysis_settings += '/delete,harmonic,rst,,1\n' - analysis_settings += '!/delete,,mntr,,\n' - analysis_settings += '/delete,,ldhi,,\n' - analysis_settings += '/delete,,r001,,1\n' - analysis_settings += '/delete,,rst,,1\n' - analysis_settings += '/delete,,stat,,1\n' - analysis_settings += '/delete,,db,,\n' - analysis_settings += '/delete,,rdb,,\n' - # analysis_settings += '\n' - # analysis_settings += '/rename,errfile,tmp,,file,err\n' - if "Step" in json_simulation_data: - for an_name in steps_data._assign_analysis: - analysis_settings += f'/delete,{an_name},rst,,1\n' - analysis_settings += '/exit,nosave\n' + analysis_settings += ( + '!--------------------------------------------------------------------------\n' + ) + # analysis_settings += '/copy,file0,err,,errfile,tmp\n' + # analysis_settings += '\n' + analysis_settings += '/delete,,cnm,,1\n' + analysis_settings += '/delete,,DSP,,\n' + analysis_settings += '/delete,,mcf,,\n' + analysis_settings += '/delete,,rfrq,,1\n' + analysis_settings += '/delete,,log,,1\n' + analysis_settings += '/delete,,emat,,1\n' + analysis_settings += '/delete,,esav,,1\n' + analysis_settings += '/delete,,err,,1\n' + analysis_settings += '/delete,,full,,1\n' + analysis_settings += '/delete,,mlv,,1\n' + analysis_settings += '/delete,,mode,,1\n' + # analysis_settings += '/delete,,rfrq,,1\n' + analysis_settings += '/delete,,out,,1\n' + # analysis_settings += '/delete,harmonic,rst,,1\n' + analysis_settings += '!/delete,,mntr,,\n' + analysis_settings += '/delete,,ldhi,,\n' + analysis_settings += '/delete,,r001,,1\n' + analysis_settings += '/delete,,rst,,1\n' + analysis_settings += '/delete,,stat,,1\n' + analysis_settings += '/delete,,db,,\n' + analysis_settings += '/delete,,rdb,,\n' + # analysis_settings += '\n' + # analysis_settings += '/rename,errfile,tmp,,file,err\n' + if "Step" in json_simulation_data: + for an_name in steps_data._assign_analysis: + analysis_settings += f'/delete,{an_name},rst,,1\n' + analysis_settings += '/exit,nosave\n' return all_mat_cmds, analysis_settings diff --git a/src/ansys/meshing/prime/internals/launcher.py b/src/ansys/meshing/prime/internals/launcher.py index 514c716af8..ef468c9120 100644 --- a/src/ansys/meshing/prime/internals/launcher.py +++ b/src/ansys/meshing/prime/internals/launcher.py @@ -264,6 +264,7 @@ def launch_prime( client = Client(port=port, timeout=timeout) client.container_name = container_name print('using server from docker : The container name ', container_name) + logging.getLogger('PyPrimeMesh').info('uses server from container : ', container_name) return client server = launch_server_process( diff --git a/src/ansys/meshing/prime/internals/utils.py b/src/ansys/meshing/prime/internals/utils.py index 6962e6d39d..5dbba30024 100644 --- a/src/ansys/meshing/prime/internals/utils.py +++ b/src/ansys/meshing/prime/internals/utils.py @@ -24,6 +24,7 @@ import os import shutil import subprocess +import uuid from contextlib import contextmanager from typing import List, Optional @@ -31,7 +32,6 @@ import ansys.meshing.prime.internals.defaults as defaults _LOCAL_PORTS = [] -_PRIME_CONTAINER_COUNT = 0 def make_unique_container_name(name: str): @@ -47,9 +47,7 @@ def make_unique_container_name(name: str): str Unique name with a numeric integer added as suffix. """ - global _PRIME_CONTAINER_COUNT - _PRIME_CONTAINER_COUNT = _PRIME_CONTAINER_COUNT + 1 - return f'{name}-{_PRIME_CONTAINER_COUNT}' + return f'{name}-' + str(uuid.uuid4()) def to_camel_case(snake_str): From b2263156461e6d953e25d38c952a740ce38870dc Mon Sep 17 00:00:00 2001 From: Subha Nayak <118820636+subhnayak@users.noreply.github.com> Date: Wed, 10 Sep 2025 18:03:09 +0530 Subject: [PATCH 10/25] updates to the version (#1143) Co-authored-by: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> --- .github/workflows/ci_cd.yml | 2 +- doc/changelog.d/1143.miscellaneous.md | 1 + docker/build_docker_linux.py | 2 +- src/ansys/meshing/prime/core/mapdlcdbexportutils.py | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 doc/changelog.d/1143.miscellaneous.md diff --git a/.github/workflows/ci_cd.yml b/.github/workflows/ci_cd.yml index 63ed7c445f..e6d7b8b624 100644 --- a/.github/workflows/ci_cd.yml +++ b/.github/workflows/ci_cd.yml @@ -16,7 +16,7 @@ on: env: DOCKER_IMAGE_NAME: ghcr.io/ansys/prime - DOCKER_IMAGE_TAG: '25.2.2' + DOCKER_IMAGE_TAG: '25.2.2.dev0' MAIN_PYTHON_VERSION: '3.13' PACKAGE_NAME: 'ansys-meshing-prime' PACKAGE_NAMESPACE: 'ansys.meshing.prime' diff --git a/doc/changelog.d/1143.miscellaneous.md b/doc/changelog.d/1143.miscellaneous.md new file mode 100644 index 0000000000..6dee9fb610 --- /dev/null +++ b/doc/changelog.d/1143.miscellaneous.md @@ -0,0 +1 @@ +Updates to the version diff --git a/docker/build_docker_linux.py b/docker/build_docker_linux.py index ca08a6c9d4..beeaa76ff8 100644 --- a/docker/build_docker_linux.py +++ b/docker/build_docker_linux.py @@ -144,7 +144,7 @@ def create_docker_image(dest_package_path): # Build the docker image print(">>> Building docker image. This might take some time...") out = subprocess.run( - ["docker", "build", "-f", "linux/Dockerfile", "-t", "ghcr.io/ansys/prime:25.2.2", "."], + ["docker", "build", "-f", "linux/Dockerfile", "-t", "ghcr.io/ansys/prime:25.2.2.dev0", "."], cwd=os.path.dirname(os.path.abspath(__file__)), capture_output=True, ) diff --git a/src/ansys/meshing/prime/core/mapdlcdbexportutils.py b/src/ansys/meshing/prime/core/mapdlcdbexportutils.py index e2b225bcdb..fd0fdb81c8 100644 --- a/src/ansys/meshing/prime/core/mapdlcdbexportutils.py +++ b/src/ansys/meshing/prime/core/mapdlcdbexportutils.py @@ -973,7 +973,7 @@ def _process_viscoelastic_data(self, property_dict, material, mat_id): else: self._logger.warning( f"Only TIME=PRONY is processed for VISCOELASTIC material. " - f"Material {material} is not processed completly." + f"Material {material} is not processed completely." ) return viscoelastic_data From c2ddced3657acab8a8ef67ee8441d3286e7fd939 Mon Sep 17 00:00:00 2001 From: srpyprime <94401560+srpyprime@users.noreply.github.com> Date: Wed, 17 Sep 2025 10:47:21 +0530 Subject: [PATCH 11/25] Update index.rst --- doc/source/getting_started/index.rst | 166 --------------------------- 1 file changed, 166 deletions(-) diff --git a/doc/source/getting_started/index.rst b/doc/source/getting_started/index.rst index 4f59d45fe3..b75d8c34a3 100644 --- a/doc/source/getting_started/index.rst +++ b/doc/source/getting_started/index.rst @@ -99,169 +99,3 @@ To launch PyPrimeMesh, use this code: with prime.launch_prime() as prime_client: model = prime_client.model - -Launching PyPrimeMesh through docker ------------------------------------- - -Ansys Prime Server is capable of being launched through docker. -Docker is an open platform for developing, shipping, and running apps in a containerized way. -Containers are standard units of software that package the code and all its dependencies. -Hence, the app runs quickly and reliably from one computing environment to another. - -Ansys Prime Server can be built as a Linux Docker container. -Hence, you should have a linux machine to run the Ansys Prime Server. - -Docker for Linux containers -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -To run the Linux Docker container for the Ansys Prime Server, -ensure that you follow these steps when installing the Docker: - -1. Install `Docker Engine `_. - -2. Restart your machine and start Docker Engine after completing the installation. - -Your Docker engine supports running Linux Docker containers, you can build or install the Ansys Prime Server image. - -.. note:: -Ansys Prime Server uses Intel MPI library for performing meshing operations. Intel MPI library requires NUMA support. -Docker desktop allows to run linux containers on windows using WSL. Existing Linux distributions used for WSL do not typically support NUMA. -It is expected that a custom Linux distribution would be required for WSL to run the Ansys Prime Server container to support NUMA. -Ansys does not recommend you to run the Ansys Prime Server image without NUMA support. - -Build or install the Ansys Prime Server image -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -You can install the Ansys Prime Server image in the following ways: - -• Download it from the GitHub Container Registry. - -• Build the Ansys Prime Server Linux container. - - -GitHub container registry -^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. note:: -You should have write access to the repository or should be a members of the Ansys organization. - -After installing Docker on your machine, follow these steps to download the Linux Docker container -for the Ansys Prime Server and install this image. - -1. Download the Docker image from the `PyPrimeMesh repository `_ on GitHub using your GitHub credentials. -2. Use a GitHub personal access token with permission for reading packages to authorize Docker to access the PyPrimeMesh repository. For more information, see `Managing your personal access tokens `_ in the GitHub documentation. -3. Save the token to a file using this command: - - .. code-block:: pycon - - echo XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX > GH_TOKEN.txt - -4. Authorize Docker to access the repository and run the commands for your OS. - - **Linux:** - - .. code-block:: pycon - - setenv GH_USERNAME - cat GH_TOKEN.txt | docker login ghcr.io -u $GH_USERNAME --password-stdin - -5. Pull the Ansys Prime Server locally using Docker using the following command: - - .. code-block:: pycon - - docker pull ghcr.io/ansys/prime:25.2.0 - - -Build the Ansys Prime Server linux container -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -You can build the Ansys Prime Server Docker containers from the PyPrimeMesh repository docker folder. -The docker folder has the linux/Dockerfile that builds the Linux-based Docker image. - -.. note:: - Ansys Prime Server does not support building windows-based docker images. - -You can build the docker image file as follows: - -• **Build from available Ansys installation**: Builds the Docker image using the Ansys installation available in the machine where the Docker image is being built. - -Prerequisites -'''''''''''''' - -Ensure that Docker is installed in your machine. If you do not have Docker available, see :ref:`Docker for Linux containers `. - - -Build from available Ansys installation -'''''''''''''''''''''''''''''''''''''''' - -To build your own image from your Ansys installation, follow these instructions: - -1. Go to the Docker folder in your local PyPrimeMesh repository. - -2. Execute the script with the following command (no specific location needed): - - .. code-block:: pycon - - python build_docker_linux.py - -For example, - - .. code-block:: pycon - - $AWP_ROOT252/commonfiles/CPython/3_10/linx64/Release/python/bin/python build_docker_linux.py $AWP_ROOT252 - -3. Check that the image has been created successfully. - -You can view the docker image created with latest tag as follows: - -.. figure:: ../images/docker_image.png - :width: 800pt - :align: center - -Launch the Ansys Prime Server -'''''''''''''''''''''''''''''' - -Ansys Prime Server can be launched using the PyPrimeMesh launcher. -You should set the following mandatory environment variable for launching the Ansys Prime Server: - -- PYPRIMEMESH_LAUNCH_CONTAINER: Launches the Ansys Prime Server form the PyPrimeMesh container. - -- PYPRIMEMESH_IMAGE_TAG: Latest version of the Ansys Prime Server docker image. - -- ANSYSLMD_LICENSE_FILE: License server required for launching the Ansys Prime Server. - -Setting the environment variable -''''''''''''''''''''''''''''''''' - -Define the following general environment variables prior to using the Ansys Prime Server launcher. - -**Linux** - - .. code-block:: pycon - - export PYPRIMEMESH_LAUNCH_CONTAINER=1 - export PYPRIMEMESH_IMAGE_TAG= - export ANSYSLMD_LICENSE_FILE= - -.. note:: - PyPrimeMesh supports Docker image creation from 2025 R1 version. - -Launching Ansys Prime Server -'''''''''''''''''''''''''''''' -Ensure that you have installed ``ansys-meshing-prime`` package before launching Ansys Prime Server. -To install ``ansys-meshing-prime`` package, refer :ref:`Installation`. -Ansys Prime Server can be launched as follows: - -.. code-block:: pycon - - >>> from ansys.meshing import prime - >>> client = prime.launch_prime() - >>> model = client.model - - - - - - - - - From 11f7cdebd3bfcdc391d5d2dcd0c211af357fa7b9 Mon Sep 17 00:00:00 2001 From: Subha Nayak <118820636+subhnayak@users.noreply.github.com> Date: Wed, 17 Sep 2025 15:26:30 +0530 Subject: [PATCH 12/25] stable release for 2025 R2 SP02 (#1153) Co-authored-by: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> --- .github/workflows/ci_cd.yml | 2 +- doc/changelog.d/1153.miscellaneous.md | 1 + pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 doc/changelog.d/1153.miscellaneous.md diff --git a/.github/workflows/ci_cd.yml b/.github/workflows/ci_cd.yml index e6d7b8b624..63ed7c445f 100644 --- a/.github/workflows/ci_cd.yml +++ b/.github/workflows/ci_cd.yml @@ -16,7 +16,7 @@ on: env: DOCKER_IMAGE_NAME: ghcr.io/ansys/prime - DOCKER_IMAGE_TAG: '25.2.2.dev0' + DOCKER_IMAGE_TAG: '25.2.2' MAIN_PYTHON_VERSION: '3.13' PACKAGE_NAME: 'ansys-meshing-prime' PACKAGE_NAMESPACE: 'ansys.meshing.prime' diff --git a/doc/changelog.d/1153.miscellaneous.md b/doc/changelog.d/1153.miscellaneous.md new file mode 100644 index 0000000000..2be2496ec8 --- /dev/null +++ b/doc/changelog.d/1153.miscellaneous.md @@ -0,0 +1 @@ +Stable release for 2025 R2 SP02 diff --git a/pyproject.toml b/pyproject.toml index c5de8b9c12..9ae43ed884 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "flit_core.buildapi" [project] name = "ansys-meshing-prime" -version = "0.9.2.dev0" +version = "0.9.2" description = "PyPrimeMesh is a Python client to Ansys Prime Server, which delivers core Ansys meshing technology." readme = "README.md" requires-python = ">=3.10,<4" From d0ae1898c7f0df84cfb9b049677d461d11e691dc Mon Sep 17 00:00:00 2001 From: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> Date: Wed, 17 Sep 2025 10:32:25 +0000 Subject: [PATCH 13/25] chore: updating CHANGELOG for v0.9.2 --- CHANGELOG.md | 13 +++++++++++++ doc/changelog.d/1109.miscellaneous.md | 1 - doc/changelog.d/1110.miscellaneous.md | 1 - doc/changelog.d/1118.miscellaneous.md | 1 - doc/changelog.d/1121.miscellaneous.md | 1 - doc/changelog.d/1142.miscellaneous.md | 1 - doc/changelog.d/1143.miscellaneous.md | 1 - doc/changelog.d/1153.miscellaneous.md | 1 - 8 files changed, 13 insertions(+), 7 deletions(-) delete mode 100644 doc/changelog.d/1109.miscellaneous.md delete mode 100644 doc/changelog.d/1110.miscellaneous.md delete mode 100644 doc/changelog.d/1118.miscellaneous.md delete mode 100644 doc/changelog.d/1121.miscellaneous.md delete mode 100644 doc/changelog.d/1142.miscellaneous.md delete mode 100644 doc/changelog.d/1143.miscellaneous.md delete mode 100644 doc/changelog.d/1153.miscellaneous.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a0f171e19..78162059c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,19 @@ This project uses [towncrier](https://towncrier.readthedocs.io/) and the changes +## [0.9.2](https://github.com/ansys/pyprimemesh/releases/tag/v0.9.2) - September 17, 2025 + + +### Miscellaneous + +- Include fix for broken methods links in api [#1109](https://github.com/ansys/pyprimemesh/pull/1109) +- Removed the dev4 version from pyproj.toml [#1110](https://github.com/ansys/pyprimemesh/pull/1110) +- Include changes for SP1 release for dev0 [#1118](https://github.com/ansys/pyprimemesh/pull/1118) +- Update the version for sp1 stable release [#1121](https://github.com/ansys/pyprimemesh/pull/1121) +- Ado to GitHub 252 sp2 [#1142](https://github.com/ansys/pyprimemesh/pull/1142) +- Updates to the version [#1143](https://github.com/ansys/pyprimemesh/pull/1143) +- Stable release for 2025 R2 SP02 [#1153](https://github.com/ansys/pyprimemesh/pull/1153) + ## [0.9.0.dev4](https://github.com/ansys/pyprimemesh/releases/tag/v0.9.0.dev4) - July 15, 2025 diff --git a/doc/changelog.d/1109.miscellaneous.md b/doc/changelog.d/1109.miscellaneous.md deleted file mode 100644 index e4821041ba..0000000000 --- a/doc/changelog.d/1109.miscellaneous.md +++ /dev/null @@ -1 +0,0 @@ -Include fix for broken methods links in api \ No newline at end of file diff --git a/doc/changelog.d/1110.miscellaneous.md b/doc/changelog.d/1110.miscellaneous.md deleted file mode 100644 index cdea042a1e..0000000000 --- a/doc/changelog.d/1110.miscellaneous.md +++ /dev/null @@ -1 +0,0 @@ -Removed the dev4 version from pyproj.toml \ No newline at end of file diff --git a/doc/changelog.d/1118.miscellaneous.md b/doc/changelog.d/1118.miscellaneous.md deleted file mode 100644 index b256c3315d..0000000000 --- a/doc/changelog.d/1118.miscellaneous.md +++ /dev/null @@ -1 +0,0 @@ -Include changes for SP1 release for dev0 \ No newline at end of file diff --git a/doc/changelog.d/1121.miscellaneous.md b/doc/changelog.d/1121.miscellaneous.md deleted file mode 100644 index 07cc9fce18..0000000000 --- a/doc/changelog.d/1121.miscellaneous.md +++ /dev/null @@ -1 +0,0 @@ -Update the version for sp1 stable release \ No newline at end of file diff --git a/doc/changelog.d/1142.miscellaneous.md b/doc/changelog.d/1142.miscellaneous.md deleted file mode 100644 index 6ad1f3878e..0000000000 --- a/doc/changelog.d/1142.miscellaneous.md +++ /dev/null @@ -1 +0,0 @@ -Ado to GitHub 252 sp2 diff --git a/doc/changelog.d/1143.miscellaneous.md b/doc/changelog.d/1143.miscellaneous.md deleted file mode 100644 index 6dee9fb610..0000000000 --- a/doc/changelog.d/1143.miscellaneous.md +++ /dev/null @@ -1 +0,0 @@ -Updates to the version diff --git a/doc/changelog.d/1153.miscellaneous.md b/doc/changelog.d/1153.miscellaneous.md deleted file mode 100644 index 2be2496ec8..0000000000 --- a/doc/changelog.d/1153.miscellaneous.md +++ /dev/null @@ -1 +0,0 @@ -Stable release for 2025 R2 SP02 From 526a30fd2de6fe42d584fbb69a8ae9406a7b37f0 Mon Sep 17 00:00:00 2001 From: Subha Nayak <118820636+subhnayak@users.noreply.github.com> Date: Thu, 18 Sep 2025 10:26:54 +0530 Subject: [PATCH 14/25] revert the index.rst code (#1156) Co-authored-by: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> --- doc/changelog.d/1156.miscellaneous.md | 1 + doc/source/getting_started/index.rst | 166 ++++++++++++++++++++++++++ 2 files changed, 167 insertions(+) create mode 100644 doc/changelog.d/1156.miscellaneous.md diff --git a/doc/changelog.d/1156.miscellaneous.md b/doc/changelog.d/1156.miscellaneous.md new file mode 100644 index 0000000000..9fc37e1ff0 --- /dev/null +++ b/doc/changelog.d/1156.miscellaneous.md @@ -0,0 +1 @@ +Revert the index.rst code diff --git a/doc/source/getting_started/index.rst b/doc/source/getting_started/index.rst index b75d8c34a3..4f59d45fe3 100644 --- a/doc/source/getting_started/index.rst +++ b/doc/source/getting_started/index.rst @@ -99,3 +99,169 @@ To launch PyPrimeMesh, use this code: with prime.launch_prime() as prime_client: model = prime_client.model + +Launching PyPrimeMesh through docker +------------------------------------ + +Ansys Prime Server is capable of being launched through docker. +Docker is an open platform for developing, shipping, and running apps in a containerized way. +Containers are standard units of software that package the code and all its dependencies. +Hence, the app runs quickly and reliably from one computing environment to another. + +Ansys Prime Server can be built as a Linux Docker container. +Hence, you should have a linux machine to run the Ansys Prime Server. + +Docker for Linux containers +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +To run the Linux Docker container for the Ansys Prime Server, +ensure that you follow these steps when installing the Docker: + +1. Install `Docker Engine `_. + +2. Restart your machine and start Docker Engine after completing the installation. + +Your Docker engine supports running Linux Docker containers, you can build or install the Ansys Prime Server image. + +.. note:: +Ansys Prime Server uses Intel MPI library for performing meshing operations. Intel MPI library requires NUMA support. +Docker desktop allows to run linux containers on windows using WSL. Existing Linux distributions used for WSL do not typically support NUMA. +It is expected that a custom Linux distribution would be required for WSL to run the Ansys Prime Server container to support NUMA. +Ansys does not recommend you to run the Ansys Prime Server image without NUMA support. + +Build or install the Ansys Prime Server image +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +You can install the Ansys Prime Server image in the following ways: + +• Download it from the GitHub Container Registry. + +• Build the Ansys Prime Server Linux container. + + +GitHub container registry +^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. note:: +You should have write access to the repository or should be a members of the Ansys organization. + +After installing Docker on your machine, follow these steps to download the Linux Docker container +for the Ansys Prime Server and install this image. + +1. Download the Docker image from the `PyPrimeMesh repository `_ on GitHub using your GitHub credentials. +2. Use a GitHub personal access token with permission for reading packages to authorize Docker to access the PyPrimeMesh repository. For more information, see `Managing your personal access tokens `_ in the GitHub documentation. +3. Save the token to a file using this command: + + .. code-block:: pycon + + echo XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX > GH_TOKEN.txt + +4. Authorize Docker to access the repository and run the commands for your OS. + + **Linux:** + + .. code-block:: pycon + + setenv GH_USERNAME + cat GH_TOKEN.txt | docker login ghcr.io -u $GH_USERNAME --password-stdin + +5. Pull the Ansys Prime Server locally using Docker using the following command: + + .. code-block:: pycon + + docker pull ghcr.io/ansys/prime:25.2.0 + + +Build the Ansys Prime Server linux container +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +You can build the Ansys Prime Server Docker containers from the PyPrimeMesh repository docker folder. +The docker folder has the linux/Dockerfile that builds the Linux-based Docker image. + +.. note:: + Ansys Prime Server does not support building windows-based docker images. + +You can build the docker image file as follows: + +• **Build from available Ansys installation**: Builds the Docker image using the Ansys installation available in the machine where the Docker image is being built. + +Prerequisites +'''''''''''''' + +Ensure that Docker is installed in your machine. If you do not have Docker available, see :ref:`Docker for Linux containers `. + + +Build from available Ansys installation +'''''''''''''''''''''''''''''''''''''''' + +To build your own image from your Ansys installation, follow these instructions: + +1. Go to the Docker folder in your local PyPrimeMesh repository. + +2. Execute the script with the following command (no specific location needed): + + .. code-block:: pycon + + python build_docker_linux.py + +For example, + + .. code-block:: pycon + + $AWP_ROOT252/commonfiles/CPython/3_10/linx64/Release/python/bin/python build_docker_linux.py $AWP_ROOT252 + +3. Check that the image has been created successfully. + +You can view the docker image created with latest tag as follows: + +.. figure:: ../images/docker_image.png + :width: 800pt + :align: center + +Launch the Ansys Prime Server +'''''''''''''''''''''''''''''' + +Ansys Prime Server can be launched using the PyPrimeMesh launcher. +You should set the following mandatory environment variable for launching the Ansys Prime Server: + +- PYPRIMEMESH_LAUNCH_CONTAINER: Launches the Ansys Prime Server form the PyPrimeMesh container. + +- PYPRIMEMESH_IMAGE_TAG: Latest version of the Ansys Prime Server docker image. + +- ANSYSLMD_LICENSE_FILE: License server required for launching the Ansys Prime Server. + +Setting the environment variable +''''''''''''''''''''''''''''''''' + +Define the following general environment variables prior to using the Ansys Prime Server launcher. + +**Linux** + + .. code-block:: pycon + + export PYPRIMEMESH_LAUNCH_CONTAINER=1 + export PYPRIMEMESH_IMAGE_TAG= + export ANSYSLMD_LICENSE_FILE= + +.. note:: + PyPrimeMesh supports Docker image creation from 2025 R1 version. + +Launching Ansys Prime Server +'''''''''''''''''''''''''''''' +Ensure that you have installed ``ansys-meshing-prime`` package before launching Ansys Prime Server. +To install ``ansys-meshing-prime`` package, refer :ref:`Installation`. +Ansys Prime Server can be launched as follows: + +.. code-block:: pycon + + >>> from ansys.meshing import prime + >>> client = prime.launch_prime() + >>> model = client.model + + + + + + + + + From eb9d2c17e0144516d9ac8de1f0492d7288de69a0 Mon Sep 17 00:00:00 2001 From: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> Date: Thu, 18 Sep 2025 05:01:03 +0000 Subject: [PATCH 15/25] chore: updating CHANGELOG for v0.9.2 --- CHANGELOG.md | 7 +++++++ doc/changelog.d/1156.miscellaneous.md | 1 - 2 files changed, 7 insertions(+), 1 deletion(-) delete mode 100644 doc/changelog.d/1156.miscellaneous.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 78162059c0..e439841fed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ This project uses [towncrier](https://towncrier.readthedocs.io/) and the changes +## [0.9.2](https://github.com/ansys/pyprimemesh/releases/tag/v0.9.2) - September 18, 2025 + + +### Miscellaneous + +- Revert the index.rst code [#1156](https://github.com/ansys/pyprimemesh/pull/1156) + ## [0.9.2](https://github.com/ansys/pyprimemesh/releases/tag/v0.9.2) - September 17, 2025 diff --git a/doc/changelog.d/1156.miscellaneous.md b/doc/changelog.d/1156.miscellaneous.md deleted file mode 100644 index 9fc37e1ff0..0000000000 --- a/doc/changelog.d/1156.miscellaneous.md +++ /dev/null @@ -1 +0,0 @@ -Revert the index.rst code From 9b043138d8a0f3d68ca9deb60767a75481cbb9d4 Mon Sep 17 00:00:00 2001 From: Subha Nayak <118820636+subhnayak@users.noreply.github.com> Date: Sat, 20 Sep 2025 12:17:16 +0530 Subject: [PATCH 16/25] updates the pyproj.toml (#1158) Co-authored-by: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> --- doc/changelog.d/1158.miscellaneous.md | 1 + pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 doc/changelog.d/1158.miscellaneous.md diff --git a/doc/changelog.d/1158.miscellaneous.md b/doc/changelog.d/1158.miscellaneous.md new file mode 100644 index 0000000000..9f5225420c --- /dev/null +++ b/doc/changelog.d/1158.miscellaneous.md @@ -0,0 +1 @@ +Updates the pyproj.toml diff --git a/pyproject.toml b/pyproject.toml index 9ae43ed884..3ffdcfc874 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "flit_core.buildapi" [project] name = "ansys-meshing-prime" -version = "0.9.2" +version = "0.9.3" description = "PyPrimeMesh is a Python client to Ansys Prime Server, which delivers core Ansys meshing technology." readme = "README.md" requires-python = ">=3.10,<4" From c08480274602782433979bd5955457935edeb223 Mon Sep 17 00:00:00 2001 From: Subha Nayak <118820636+subhnayak@users.noreply.github.com> Date: Mon, 22 Sep 2025 12:21:03 +0530 Subject: [PATCH 17/25] update the conf.py file for pyansys tags & update the ansys-sphinx-theme version (#1159) Co-authored-by: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> --- doc/changelog.d/1159.maintenance.md | 1 + doc/source/conf.py | 1 + pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 doc/changelog.d/1159.maintenance.md diff --git a/doc/changelog.d/1159.maintenance.md b/doc/changelog.d/1159.maintenance.md new file mode 100644 index 0000000000..c5e78fb08c --- /dev/null +++ b/doc/changelog.d/1159.maintenance.md @@ -0,0 +1 @@ +Update the conf.py file for pyansys tags & update the ansys-sphinx-theme version diff --git a/doc/source/conf.py b/doc/source/conf.py index 0ef0e741be..fd6703fae6 100755 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -32,6 +32,7 @@ "github_repo": "pyprimemesh", "github_version": "main", "doc_path": "doc/source", + "pyansys_tags": ["CAD", "Meshing"], } # specify the location of your github repo diff --git a/pyproject.toml b/pyproject.toml index 3ffdcfc874..85cfcd26f4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,7 +42,7 @@ tests = [ "pyvista[trame]==0.45.2", ] doc = [ - "ansys-sphinx-theme[autoapi]==1.5.2", + "ansys-sphinx-theme[autoapi]==1.6.1", "ansys-tools-visualization-interface==0.9.2", "jupyter-sphinx==0.5.3", "numpydoc==1.8.0", From ac413c5616525a5b0c8809d020327aaaecd070f6 Mon Sep 17 00:00:00 2001 From: Subha Nayak <118820636+subhnayak@users.noreply.github.com> Date: Mon, 22 Sep 2025 17:07:31 +0530 Subject: [PATCH 18/25] fix for search bar issue (#1160) Co-authored-by: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> --- doc/changelog.d/1160.miscellaneous.md | 1 + doc/source/conf.py | 2 -- doc/source/getting_started/index.rst | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) create mode 100644 doc/changelog.d/1160.miscellaneous.md diff --git a/doc/changelog.d/1160.miscellaneous.md b/doc/changelog.d/1160.miscellaneous.md new file mode 100644 index 0000000000..d26a7bae05 --- /dev/null +++ b/doc/changelog.d/1160.miscellaneous.md @@ -0,0 +1 @@ +Fix for search bar issue diff --git a/doc/source/conf.py b/doc/source/conf.py index fd6703fae6..8caa84c0e9 100755 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -41,8 +41,6 @@ "json_url": f"https://{cname}/versions.json", "version_match": get_version_match(__version__), }, - "check_switcher": False, - "navbar_end": ["version-switcher", "theme-switcher", "navbar-icon-links"], "navigation_with_keys": False, "github_url": "https://github.com/ansys/pyprimemesh", "show_prev_next": False, diff --git a/doc/source/getting_started/index.rst b/doc/source/getting_started/index.rst index 4f59d45fe3..e7c5754a7f 100644 --- a/doc/source/getting_started/index.rst +++ b/doc/source/getting_started/index.rst @@ -168,7 +168,7 @@ for the Ansys Prime Server and install this image. .. code-block:: pycon - docker pull ghcr.io/ansys/prime:25.2.0 + docker pull ghcr.io/ansys/prime:25.2.2 Build the Ansys Prime Server linux container From 500f842119fc4a9345a2ded3020fa6504e79ceea Mon Sep 17 00:00:00 2001 From: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> Date: Tue, 23 Sep 2025 04:07:04 +0000 Subject: [PATCH 19/25] chore: updating CHANGELOG for v0.9.3 --- CHANGELOG.md | 13 +++++++++++++ doc/changelog.d/1158.miscellaneous.md | 1 - doc/changelog.d/1159.maintenance.md | 1 - doc/changelog.d/1160.miscellaneous.md | 1 - 4 files changed, 13 insertions(+), 3 deletions(-) delete mode 100644 doc/changelog.d/1158.miscellaneous.md delete mode 100644 doc/changelog.d/1159.maintenance.md delete mode 100644 doc/changelog.d/1160.miscellaneous.md diff --git a/CHANGELOG.md b/CHANGELOG.md index e439841fed..44b3cd7693 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,19 @@ This project uses [towncrier](https://towncrier.readthedocs.io/) and the changes +## [0.9.3](https://github.com/ansys/pyprimemesh/releases/tag/v0.9.3) - September 23, 2025 + + +### Miscellaneous + +- Updates the pyproj.toml [#1158](https://github.com/ansys/pyprimemesh/pull/1158) +- Fix for search bar issue [#1160](https://github.com/ansys/pyprimemesh/pull/1160) + + +### Maintenance + +- Update the conf.py file for pyansys tags & update the ansys-sphinx-theme version [#1159](https://github.com/ansys/pyprimemesh/pull/1159) + ## [0.9.2](https://github.com/ansys/pyprimemesh/releases/tag/v0.9.2) - September 18, 2025 diff --git a/doc/changelog.d/1158.miscellaneous.md b/doc/changelog.d/1158.miscellaneous.md deleted file mode 100644 index 9f5225420c..0000000000 --- a/doc/changelog.d/1158.miscellaneous.md +++ /dev/null @@ -1 +0,0 @@ -Updates the pyproj.toml diff --git a/doc/changelog.d/1159.maintenance.md b/doc/changelog.d/1159.maintenance.md deleted file mode 100644 index c5e78fb08c..0000000000 --- a/doc/changelog.d/1159.maintenance.md +++ /dev/null @@ -1 +0,0 @@ -Update the conf.py file for pyansys tags & update the ansys-sphinx-theme version diff --git a/doc/changelog.d/1160.miscellaneous.md b/doc/changelog.d/1160.miscellaneous.md deleted file mode 100644 index d26a7bae05..0000000000 --- a/doc/changelog.d/1160.miscellaneous.md +++ /dev/null @@ -1 +0,0 @@ -Fix for search bar issue From 58c3a1a03c1c041a4a66329ed8a07756666e8b06 Mon Sep 17 00:00:00 2001 From: Martin Walters <104021577+waltersma@users.noreply.github.com> Date: Mon, 10 Nov 2025 11:18:42 +0000 Subject: [PATCH 20/25] Update pyproject.toml Pin graphics dependencies to avoid breaking changes --- pyproject.toml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 85cfcd26f4..75c66b9ce9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,7 +31,8 @@ dependencies = [ [project.optional-dependencies] graphics = [ - "ansys-tools-visualization-interface>=0.4.7,<1", + "ansys-tools-visualization-interface>=0.4.7,<=0.11.0", # pin to avoid breaking changes + "pyvista[trame]<=0.45.3", # pin to avoid breaking changes ] tests = [ "ansys-tools-visualization-interface==0.9.2", @@ -56,7 +57,8 @@ doc = [ "sphinxemoji==0.3.1", ] all = [ - "ansys-tools-visualization-interface>=0.2.6,<1", + "ansys-tools-visualization-interface>=0.4.7,<=0.11.0", # pin to avoid breaking changes + "pyvista[trame]<=0.45.3", # pin to avoid breaking changes ] [project.urls] From 59800948207bf505cace499207fe094e54546d5e Mon Sep 17 00:00:00 2001 From: Subha Nayak <118820636+subhnayak@users.noreply.github.com> Date: Fri, 5 Dec 2025 12:32:41 +0530 Subject: [PATCH 21/25] updates to release/0.9 (#1187) Co-authored-by: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> Co-authored-by: Alex Fernandez Luces --- .github/workflows/ci_cd.yml | 2 +- doc/changelog.d/1187.miscellaneous.md | 1 + doc/source/conf.py | 3 + doc/source/getting_started/index.rst | 54 +++++ .../config/vocabularies/ANSYS/accept.txt | 1 + docker/linux/Dockerfile | 4 +- pyproject.toml | 2 +- .../meshing/prime/autogen/wrapperstructs.py | 12 +- src/ansys/meshing/prime/internals/client.py | 67 +++++-- src/ansys/meshing/prime/internals/config.py | 6 + .../prime/internals/grpc_communicator.py | 64 +++++- src/ansys/meshing/prime/internals/launcher.py | 65 +++++- .../prime/internals/socket_communicator.py | 187 ------------------ src/ansys/meshing/prime/internals/utils.py | 13 +- 14 files changed, 262 insertions(+), 219 deletions(-) create mode 100644 doc/changelog.d/1187.miscellaneous.md delete mode 100644 src/ansys/meshing/prime/internals/socket_communicator.py diff --git a/.github/workflows/ci_cd.yml b/.github/workflows/ci_cd.yml index 63ed7c445f..cbf0bc4186 100644 --- a/.github/workflows/ci_cd.yml +++ b/.github/workflows/ci_cd.yml @@ -16,7 +16,7 @@ on: env: DOCKER_IMAGE_NAME: ghcr.io/ansys/prime - DOCKER_IMAGE_TAG: '25.2.2' + DOCKER_IMAGE_TAG: '25.2.3' MAIN_PYTHON_VERSION: '3.13' PACKAGE_NAME: 'ansys-meshing-prime' PACKAGE_NAMESPACE: 'ansys.meshing.prime' diff --git a/doc/changelog.d/1187.miscellaneous.md b/doc/changelog.d/1187.miscellaneous.md new file mode 100644 index 0000000000..17621f6bd1 --- /dev/null +++ b/doc/changelog.d/1187.miscellaneous.md @@ -0,0 +1 @@ +Updates to release/0.9 diff --git a/doc/source/conf.py b/doc/source/conf.py index 8caa84c0e9..d5873e7282 100755 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -11,6 +11,9 @@ from ansys.meshing.prime import __version__ viz_interface.DOCUMENTATION_BUILD = True +# Using env var instead +os.environ["PYANSYS_VISUALIZER_DOC_MODE"] = "true" +os.environ["PYANSYS_VISUALIZER_HTML_BACKEND"] = "true" # Project information project = 'ansys-meshing-prime' diff --git a/doc/source/getting_started/index.rst b/doc/source/getting_started/index.rst index e7c5754a7f..b63feaa9f7 100644 --- a/doc/source/getting_started/index.rst +++ b/doc/source/getting_started/index.rst @@ -70,6 +70,60 @@ To install a basic version of the client, use this command instead: pip install -e . +Connecting through gRPC +----------------------- + +PyPrimeMesh uses gRPC to provide secure communications between client and server. +When you run the client and server on the same machine: + +- For Linux OS, PyPrimeMesh uses UDS (Unix Domain Socket) for communications. + +- For Windows OS, PyPrimeMesh uses interceptor to validate gRPC connections, + ensures the client is running on the same Windows user account as the server and authenticates the client. + +When you launch PyPrimeMesh, gRPC establishes a connection between the Client and Server +through the secure option. **Secure** is the default option when you use launch_prime(). +You should always use the **Secure** option to establish a secured connection between the client and server. + +When you want to make an insecure connection between the client and server, +you may need to specify the connection type as follows: + +.. code-block:: python + + client = prime.launch_prime( + connection_type=prime.internals.config.ConnectionType.GRPC_INSECURE + ) + +.. note:: + Insecure option is not recommended. + +Connect securely using certificates +-------------------------------------- + +PyPrimeMesh offers secure connection using certificates. For secure connection with mutual TLS (mTLS), you may pass a client certificate directory and server certificate directory using client_certs_dir and server_certs_dir respectively to launch_prime(). + +client_certs_dir should contain the following files: + +- client.crt + +- client.key + +- ca.crt + +server_certs_dir should contain the following files: + +- server.crt + +- server.key + +- ca.crt + +.. note:: + - Ensure that ca.crt file is the same for the client and the server. You should not modify the + file names in the client_certs_dir and server_certs_dir respectively. + + - The path of input the files must be the same for server and client and should be on the shared network. + Dependencies ------------ diff --git a/doc/styles/config/vocabularies/ANSYS/accept.txt b/doc/styles/config/vocabularies/ANSYS/accept.txt index 2187858b64..70833f0aa4 100644 --- a/doc/styles/config/vocabularies/ANSYS/accept.txt +++ b/doc/styles/config/vocabularies/ANSYS/accept.txt @@ -6,6 +6,7 @@ automesh Boolean BRep CAD +client_certs_dir conformally [Dd]efeature defeaturing diff --git a/docker/linux/Dockerfile b/docker/linux/Dockerfile index 4fd5c101cf..a713e659e1 100644 --- a/docker/linux/Dockerfile +++ b/docker/linux/Dockerfile @@ -6,6 +6,8 @@ FROM rockylinux:8 as builder # Define the working directory WORKDIR /prime +COPY ./certs /prime/certs + COPY ./PyPrimeMeshPackage /prime RUN chmod -R 0755 /prime @@ -37,4 +39,4 @@ ENV AWP_ROOT252="/prime" LABEL org.opencontainers.image.authors="ANSYS Inc." LABEL org.opencontainers.image.vendor="ANSYS Inc." -ENTRYPOINT [ "/prime/meshing/Prime/runPrime.sh", "server", "--ip", "0.0.0.0" ] +ENTRYPOINT [ "/prime/meshing/Prime/runPrime.sh", "server", "--ip", "0.0.0.0" , "--secure", "yes", "--server_cert_dir", "/prime/certs"] diff --git a/pyproject.toml b/pyproject.toml index 75c66b9ce9..3b79647ed8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "flit_core.buildapi" [project] name = "ansys-meshing-prime" -version = "0.9.3" +version = "0.9.4" description = "PyPrimeMesh is a Python client to Ansys Prime Server, which delivers core Ansys meshing technology." readme = "README.md" requires-python = ">=3.10,<4" diff --git a/src/ansys/meshing/prime/autogen/wrapperstructs.py b/src/ansys/meshing/prime/autogen/wrapperstructs.py index cf907eb607..b67673afea 100644 --- a/src/ansys/meshing/prime/autogen/wrapperstructs.py +++ b/src/ansys/meshing/prime/autogen/wrapperstructs.py @@ -1829,11 +1829,11 @@ def __init__( **This is a beta parameter**. **The behavior and name may change in the future**. sizing_method: SizeFieldType, optional - Used to define sizing method for patching. + Method used to define sizing method for patching. **This is a beta parameter**. **The behavior and name may change in the future**. size_field_ids: Iterable[int], optional - Used to define size field based octree refinement. + Ids used to define size field based octree refinement. **This is a beta parameter**. **The behavior and name may change in the future**. patch_at_live: bool, optional @@ -1910,9 +1910,9 @@ def set_default( dead_regions: List[DeadRegion], optional List of dead regions. sizing_method: SizeFieldType, optional - Used to define sizing method for patching. + Method used to define sizing method for patching. size_field_ids: Iterable[int], optional - Used to define size field based octree refinement. + Ids used to define size field based octree refinement. patch_at_live: bool, optional Creates patches closer to live instead of dead. """ @@ -2005,7 +2005,7 @@ def dead_regions(self, value: List[DeadRegion]): @property def sizing_method(self) -> SizeFieldType: - """Used to define sizing method for patching. + """Method used to define sizing method for patching. **This is a beta parameter**. **The behavior and name may change in the future**. """ @@ -2017,7 +2017,7 @@ def sizing_method(self, value: SizeFieldType): @property def size_field_ids(self) -> Iterable[int]: - """Used to define size field based octree refinement. + """Ids used to define size field based octree refinement. **This is a beta parameter**. **The behavior and name may change in the future**. """ diff --git a/src/ansys/meshing/prime/internals/client.py b/src/ansys/meshing/prime/internals/client.py index 3bd2284977..de5271286e 100644 --- a/src/ansys/meshing/prime/internals/client.py +++ b/src/ansys/meshing/prime/internals/client.py @@ -23,6 +23,7 @@ import logging import os +from typing import Optional import ansys.meshing.prime.examples as examples import ansys.meshing.prime.internals.config as config @@ -49,7 +50,8 @@ class Client(object): Maximum time to wait for connection. The default is ``defaults.connection_timeout()``. credentials : Any, optional Credentials to connect to the server. The default is ``None``. - + client_certs_dir : Optional[str] + Directory containing client certificates for mutual TLS. Raises ------ ValueError @@ -64,7 +66,9 @@ def __init__( port: int = defaults.port(), timeout: float = defaults.connection_timeout(), credentials=None, - communicator_type="grpc", + connection_type: config.ConnectionType = config.ConnectionType.GRPC_SECURE, + uds_file: Optional[str] = None, + client_certs_dir: Optional[str] = None, **kwargs, ): """Initialize the client.""" @@ -72,23 +76,63 @@ def __init__( local = kwargs.get('local', False) if local and server_process is not None: raise ValueError('Local client cannot be instantiated with a server process') + + if connection_type == config.ConnectionType.GRPC_INSECURE: + print("Warning (Client): Modification of these configurations is not recommended.") + print( + "Please see the documentation for your installed product for additional information" + ) + self._local = local self._process = server_process self._comm = None if not local: - if communicator_type == "grpc": + if ( + connection_type == config.ConnectionType.GRPC_SECURE + or connection_type == config.ConnectionType.GRPC_INSECURE + ): try: from ansys.meshing.prime.internals.grpc_communicator import ( GRPCCommunicator, ) channel = kwargs.get('channel', None) + if channel is not None: self._comm = GRPCCommunicator(channel=channel, timeout=timeout) else: - self._comm = GRPCCommunicator( - ip=ip, port=port, timeout=timeout, credentials=credentials - ) + if ( + os.name == 'nt' + or connection_type == config.ConnectionType.GRPC_INSECURE + ): + if ( + connection_type == config.ConnectionType.GRPC_INSECURE + and client_certs_dir is not None + ): + print( + "Warning: Ignoring client certificate \ +directory for insecure connections" + ) + client_certs_dir = None + self._comm = GRPCCommunicator( + ip=ip, + port=port, + timeout=timeout, + credentials=credentials, + client_certs_dir=client_certs_dir, + ) + else: + if uds_file is None: + self._comm = GRPCCommunicator( + ip=ip, + port=port, + client_certs_dir=client_certs_dir, + timeout=timeout, + ) + else: + self._comm = GRPCCommunicator( + uds_file=uds_file, timeout=timeout, credentials=credentials + ) setattr(self, 'port', port) except ImportError as err: logging.getLogger('PyPrimeMesh').error( @@ -100,15 +144,8 @@ def __init__( logging.getLogger('PyPrimeMesh').error('Failed to connect to PRIME GRPC server') raise - elif communicator_type == "socket": - from ansys.meshing.prime.internals.socket_communicator import ( - SocketCommunicator, - ) - - self._comm = SocketCommunicator(ip=ip, port=port) - setattr(self, 'port', port) else: - logging.getLogger('PyPrimeMesh').error(f'Invalid server type: {communicator_type}') + logging.getLogger('PyPrimeMesh').error(f'Invalid server type: {connection_type}') raise else: @@ -173,14 +210,12 @@ def exit(self): assert self._local == False terminate_process(self._process) self._process = None - if config.using_container(): container_name = getattr(self, 'container_name') utils.stop_prime_github_container(container_name) elif config.has_pim(): self.remote_instance.delete() self.pim_client.close() - clear_examples = bool(int(os.environ.get('PYPRIMEMESH_CLEAR_EXAMPLES', '1'))) if clear_examples: download_manager = examples.DownloadManager() diff --git a/src/ansys/meshing/prime/internals/config.py b/src/ansys/meshing/prime/internals/config.py index e5d13f9532..1880078cca 100644 --- a/src/ansys/meshing/prime/internals/config.py +++ b/src/ansys/meshing/prime/internals/config.py @@ -22,6 +22,7 @@ """Configuration utility for PyPrimeMesh.""" from contextlib import contextmanager +from enum import Enum __all__ = [ 'enable_optimizing_numpy_arrays', @@ -44,6 +45,11 @@ from ansys.meshing.prime.internals.logger import PrimeLogger +class ConnectionType(Enum): + GRPC_SECURE = 1 + GRPC_INSECURE = 2 + + def _optimize_vectors(): """Get the value of the flag for optimizing vectors.""" return __DEFAULT_USE_BINARY diff --git a/src/ansys/meshing/prime/internals/grpc_communicator.py b/src/ansys/meshing/prime/internals/grpc_communicator.py index aa98c37a12..d9795a1f02 100644 --- a/src/ansys/meshing/prime/internals/grpc_communicator.py +++ b/src/ansys/meshing/prime/internals/grpc_communicator.py @@ -21,6 +21,7 @@ """Module for communications with the gRPC server.""" __all__ = ['GRPCCommunicator'] +import os from typing import Optional import grpc @@ -41,6 +42,50 @@ BUFFER_MESSAGE_LENGTH = defaults.max_message_length() - 100 +def get_secure_channel(client_certs_dir: str, server_host: str, server_port: int): + """Create a secure gRPC channel using the provided TLS files. + + Parameters + ---------- + tls_client_files : list + List of paths to the TLS files. The list should contain: + - client certificate file path + - client key file path + - CA certificate file path + Returns + ------- + grpc.Channel + A secure gRPC channel. + """ + target = f"{server_host}:{server_port}" + + if not os.path.exists(client_certs_dir): + raise FileNotFoundError(f"Client certificates directory does not exist: {client_certs_dir}") + + cert_file = f"{client_certs_dir}/client.crt" + key_file = f"{client_certs_dir}/client.key" + ca_file = f"{client_certs_dir}/ca.crt" + + with open(cert_file, 'rb') as f: + certificate_chain = f.read() + with open(key_file, 'rb') as f: + private_key = f.read() + with open(ca_file, 'rb') as f: + root_certificates = f.read() + + try: + creds = grpc.ssl_channel_credentials( + root_certificates=root_certificates, + private_key=private_key, + certificate_chain=certificate_chain, + ) + except Exception as e: + raise RuntimeError(f"Failed to create SSL channel credentials: {e}") + + channel = grpc.secure_channel(target, creds) + return channel + + def make_chunks(data, chunk_size): n = max(1, chunk_size) return (data[i : i + n] for i in range(0, len(data), n)) @@ -79,7 +124,10 @@ class GRPCCommunicator(Communicator): Maximum time to wait for connection. The default is ``10.0``. credentials : Any, optional Credentials for connecting to the server. The default is ``None``. - + uds_file : Optional[str], optional + Path to the Unix Domain Socket (UDS) file. The default is ``None``. + client_certs_dir : Optional[str], optional + Directory containing client certificates for mutual TLS. The default is ``None``. Raises ------ ConnectionError @@ -92,18 +140,30 @@ def __init__( port: Optional[int] = None, timeout: float = 10.0, credentials=None, + uds_file: Optional[str] = None, + client_certs_dir: Optional[str] = None, **kwargs, ): """Initialize the server connection.""" import os self._channel = kwargs.get('channel', None) + if self._channel is None and client_certs_dir is not None: + self._channel = get_secure_channel( + client_certs_dir=client_certs_dir, server_host=ip, server_port=port + ) + self._models = [] if self._channel is None: ip_addr = f"{ip}:{port}" channel_options = grpc_utils.get_default_channel_args() if credentials is None: - self._channel = grpc.insecure_channel(ip_addr, options=channel_options) + if uds_file is not None: + options = (('grpc.default_authority', 'localhost'),) + self._channel = grpc.insecure_channel(uds_file, options=options) + else: + options = (('grpc.default_authority', 'localhost'),) + self._channel = grpc.insecure_channel(ip_addr, options=options) else: self._channel = grpc.secure_channel(ip_addr, credentials, options=channel_options) diff --git a/src/ansys/meshing/prime/internals/launcher.py b/src/ansys/meshing/prime/internals/launcher.py index ef468c9120..31450082c3 100644 --- a/src/ansys/meshing/prime/internals/launcher.py +++ b/src/ansys/meshing/prime/internals/launcher.py @@ -24,6 +24,7 @@ import os import subprocess import sys +import uuid from typing import Optional import ansys.meshing.prime.internals.config as config @@ -72,6 +73,8 @@ def launch_server_process( ip: str = defaults.ip(), port: int = defaults.port(), n_procs: Optional[int] = None, + connection_type: config.ConnectionType = None, + server_certs_dir: Optional[str] = None, **kw, ) -> subprocess.Popen: """Launch a server process for Ansys Prime Server. @@ -89,6 +92,8 @@ def launch_server_process( processes to spawn. The default is ``None``, in which case the server is launched as the only process (normal mode). The process marked as ``Node 0`` hosts the gRPC server. + server_certs_dir : Optional[str] + Directory containing server certificates for mutual TLS. Returns ------- @@ -156,6 +161,9 @@ def launch_server_process( server_args.append(f'--scheduler') server_args.append(f'{scheduler}') + if os.name != 'nt' and connection_type == config.ConnectionType.GRPC_SECURE: + server_args.append(f'--uds={kw.get("uds_file", "")}') + kwargs = { 'stdin': subprocess.DEVNULL, } @@ -165,6 +173,14 @@ def launch_server_process( if sys.platform.startswith('win32'): kwargs['creationflags'] = subprocess.CREATE_NEW_PROCESS_GROUP + if connection_type == config.ConnectionType.GRPC_SECURE: + server_args.append("--secure=yes") + else: + server_args.append("--secure=no") + + if server_certs_dir is not None: + server_args.append(f"--server_cert_dir={server_certs_dir}") + logging.getLogger('PyPrimeMesh').info('Launching Ansys Prime Server') server = subprocess.Popen(server_args, **kwargs) return server @@ -214,6 +230,9 @@ def launch_prime( ip: str = defaults.ip(), port: int = defaults.port(), timeout: float = defaults.connection_timeout(), + connection_type: config.ConnectionType = config.ConnectionType.GRPC_SECURE, + client_certs_dir: Optional[str] = None, + server_certs_dir: Optional[str] = None, n_procs: Optional[int] = None, version: Optional[str] = None, **kwargs, @@ -236,6 +255,10 @@ def launch_prime( processes to spawn. The default is ``None``, in which case the server is launched as the only process (normal mode). The process marked as ``Node 0`` hosts the gRPC server. + client_certs_dir : Optional[str] + Directory containing client certificates for mutual TLS. + server_certs_dir : Optional[str] + Directory containing server certificates for mutual TLS. Returns ------- @@ -256,19 +279,50 @@ def launch_prime( if ip == defaults.ip(): port = utils.get_available_local_port(port) + channel = None + if ( + ip not in ["127.0.0.1", "localhost"] + and connection_type == config.ConnectionType.GRPC_SECURE + ): + if client_certs_dir is None or server_certs_dir is None: + raise RuntimeError(f"Please provide certificate directory for remote connections.") + missing = [ + f + for f in [ + f"{client_certs_dir}/client.crt", + f"{client_certs_dir}/client.key", + f"{client_certs_dir}/ca.crt", + ] + if not os.path.exists(f) + ] + if missing: + raise RuntimeError( + f"Missing required client TLS file(s) for mutual TLS: {', '.join(missing)}" + ) + launch_container = bool(int(os.environ.get('PYPRIMEMESH_LAUNCH_CONTAINER', '0'))) if launch_container: container_name = utils.make_unique_container_name('ansys-prime-server') utils.launch_prime_github_container(port=port, name=container_name, version=version) config.set_using_container(True) - client = Client(port=port, timeout=timeout) + client = Client(port=port, timeout=timeout, client_certs_dir=client_certs_dir) client.container_name = container_name print('using server from docker : The container name ', container_name) - logging.getLogger('PyPrimeMesh').info('uses server from container : ', container_name) return client + uds_file = None + if os.name != 'nt' and client_certs_dir is None: + uds_file = f'unix:/tmp/pyprimemesh-{uuid.uuid4()}.sock' + server = launch_server_process( - prime_root=prime_root, ip=ip, port=port, n_procs=n_procs, **kwargs + prime_root=prime_root, + ip=ip, + port=port, + n_procs=n_procs, + connection_type=connection_type, + uds_file=uds_file, + server_certs_dir=server_certs_dir, + **kwargs, ) return Client( @@ -276,5 +330,8 @@ def launch_prime( ip=ip, port=port, timeout=timeout, - communicator_type=kwargs.get('communicator_type', 'grpc'), + uds_file=uds_file, + connection_type=connection_type, + client_certs_dir=client_certs_dir, + channel=channel, ) diff --git a/src/ansys/meshing/prime/internals/socket_communicator.py b/src/ansys/meshing/prime/internals/socket_communicator.py deleted file mode 100644 index 0a25d214af..0000000000 --- a/src/ansys/meshing/prime/internals/socket_communicator.py +++ /dev/null @@ -1,187 +0,0 @@ -# Copyright (C) 2024 - 2025 ANSYS, Inc. and/or its affiliates. -# SPDX-License-Identifier: MIT -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -"""Module for communications with the socket server.""" -__all__ = ['SocketCommunicator'] -import json -import socket -from typing import Optional - -import numpy as np - -import ansys.meshing.prime.internals.json_utils as json -from ansys.meshing.prime.core.model import Model -from ansys.meshing.prime.internals.communicator import Communicator -from ansys.meshing.prime.internals.error_handling import ( - communicator_error_handler, - error_code_handler, -) - - -class NumpyEncoder(json.JSONEncoder): - def default(self, obj): - if isinstance(obj, np.ndarray): - return obj.tolist() - return super().default(obj) - - -class SocketCommunicator(Communicator): - """Manages communication with the socket server. - - Parameters - ---------- - ip : Optional[str], optional - IP address where the server is located. The default is ``None``. - port : Optional[int], optional - Port where the server is deployed. The default is ``None``. - timeout : float, optional - Maximum time to wait for connection. The default is ``10.0``. - credentials : Any, optional - Credentials for connecting to the server. The default is ``None``. - - Raises - ------ - ConnectionError - Could not connect to server. - """ - - def __init__( - self, - ip: Optional[str] = None, - port: Optional[int] = None, - timeout: float = 10.0, - credentials=None, - **kwargs, - ): - """Initialize the server connection.""" - self._models = [] - self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self._socket.bind(('', port)) - self._socket.listen(5) - self._communicator, self._address = self._socket.accept() - - @error_code_handler - @communicator_error_handler - def serve(self, model: Model, command: str, *args, **kwargs) -> dict: - """Serve model and send a command to the server. - - Parameters - ---------- - model : Model - Model to serve. - command : str - Command to send. - - Returns - ------- - dict - Response from the server. - - Raises - ------ - RuntimeError - Can not connect to server. - """ - self._send_string("ServeJson") - command = {"Command": command} - if len(args) > 0: - command.update({"ObjectID": args[0]}) - if kwargs is not None: - if "args" in kwargs: - command.update({"Args": kwargs["args"]}) - self._send_string(json.dumps(command, cls=NumpyEncoder)) - return json.loads(self._recv_string()) - - def _send_string(self, data): - byte_string = (data + '\0').encode('utf-8') - string_length = len(byte_string).to_bytes(4, 'little') - self._communicator.send(string_length) - self._communicator.send(byte_string) - - def _recv_string(self): - result_len = int.from_bytes(self._communicator.recv(4), byteorder="little") - result = "" - if result_len > 0: - result = self._communicator.recv(result_len).decode("utf-8") - return result - - def initialize_params(self, model: Model, param_name: str, *args) -> dict: - """Initialize parameters on the server side. - - Parameters - ---------- - model : Model - Model to initialize parameters on. - param_name : str - Parameter to initialize. - - Returns - ------- - dict - Response from the server. - - Raises - ------ - RuntimeError - Can not connect to server. - """ - self._send_string("GetParamDefaultJSon") - self._send_string(json.dumps({"ParamName": param_name})) - return json.loads(self._recv_string()) - - def run_on_server(self, model: Model, recipe: str) -> dict: - """Run commands on the server. - - Run commands on a model on the server. - - Parameters - ---------- - model : core.Model - Model to run commands on. - recipe : str - Commands to run. - - Returns - ------- - dict - Result from the server side. - - Raises - ------ - RuntimeError - Bad response from server. - RuntimeError - Can not connect to server. - """ - pass - - def close(self): - """Close opened channels.""" - self._communicator.close() - - def __del__(self): - """Close communication when deleting the instance.""" - self.close() - - @property - def models(self): - """List of models available.""" - return None diff --git a/src/ansys/meshing/prime/internals/utils.py b/src/ansys/meshing/prime/internals/utils.py index 5dbba30024..28c8ed6401 100644 --- a/src/ansys/meshing/prime/internals/utils.py +++ b/src/ansys/meshing/prime/internals/utils.py @@ -251,11 +251,22 @@ def launch_prime_github_container( f'{mount_host}:{mount_image}', '-e', f'ANSYSLMD_LICENSE_FILE={license_file}', + ] + graphics_port = int(os.environ.get('PRIME_GRAPHICS_PORT', '0')) + if graphics_port > 0: + print(f'PyPrimeMesh: using Prime graphics port {graphics_port}') + docker_command += ['-p', f'{graphics_port}:{graphics_port}'] + prime_arguments = [ f'{image_name}:{version}', '--port', f'{port}', ] - subprocess.run(docker_command, stdout=subprocess.DEVNULL) + print( + 'Warning: Secure connection is not supported ' + 'yet for Prime containers, using insecure connection.' + ) + prime_arguments.append('--secure=no') + subprocess.run(docker_command + prime_arguments, stdout=subprocess.DEVNULL) def stop_prime_github_container(name): From eafbe77b17263d34b7b7246e5d46770ca017f42d Mon Sep 17 00:00:00 2001 From: Subha Nayak <118820636+subhnayak@users.noreply.github.com> Date: Tue, 9 Dec 2025 15:32:58 +0530 Subject: [PATCH 22/25] changes to update the version (#1193) Co-authored-by: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> --- doc/changelog.d/1193.miscellaneous.md | 1 + docker/build_docker_linux.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 doc/changelog.d/1193.miscellaneous.md diff --git a/doc/changelog.d/1193.miscellaneous.md b/doc/changelog.d/1193.miscellaneous.md new file mode 100644 index 0000000000..bc9e5a64cc --- /dev/null +++ b/doc/changelog.d/1193.miscellaneous.md @@ -0,0 +1 @@ +Changes to update the version diff --git a/docker/build_docker_linux.py b/docker/build_docker_linux.py index beeaa76ff8..716dd4b07e 100644 --- a/docker/build_docker_linux.py +++ b/docker/build_docker_linux.py @@ -37,7 +37,7 @@ # Check input if len(sys.argv) < 2: print("Please specify Ansys installation folder.") - print("Example: {} /ansys_inc/v251".format(os.path.basename(__file__))) + print("Example: {} /ansys_inc/v252".format(os.path.basename(__file__))) sys.exit(1) AWP_ROOT = sys.argv[1] @@ -144,7 +144,7 @@ def create_docker_image(dest_package_path): # Build the docker image print(">>> Building docker image. This might take some time...") out = subprocess.run( - ["docker", "build", "-f", "linux/Dockerfile", "-t", "ghcr.io/ansys/prime:25.2.2.dev0", "."], + ["docker", "build", "-f", "linux/Dockerfile", "-t", "ghcr.io/ansys/prime:25.2.3", "."], cwd=os.path.dirname(os.path.abspath(__file__)), capture_output=True, ) From e539ad35fa74ca97da527a5795c2ecf663d8ce00 Mon Sep 17 00:00:00 2001 From: Martin Walters <104021577+waltersma@users.noreply.github.com> Date: Tue, 9 Dec 2025 16:43:00 +0000 Subject: [PATCH 23/25] Update pyproject.toml for ansys-sphinx-theme --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 3b79647ed8..dbfc27cc1d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,7 +43,7 @@ tests = [ "pyvista[trame]==0.45.2", ] doc = [ - "ansys-sphinx-theme[autoapi]==1.6.1", + "ansys-sphinx-theme[autoapi]==1.6.4", "ansys-tools-visualization-interface==0.9.2", "jupyter-sphinx==0.5.3", "numpydoc==1.8.0", From c2d9548bad50f3f9e3c3c24673b7e6c3d2fa8d54 Mon Sep 17 00:00:00 2001 From: Subha Nayak <118820636+subhnayak@users.noreply.github.com> Date: Fri, 12 Dec 2025 21:44:52 +0530 Subject: [PATCH 24/25] updates to docker file and connection type option for user (#1194) Co-authored-by: SUBHA nayak Co-authored-by: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> --- .github/workflows/ci_cd.yml | 1 + doc/changelog.d/1194.maintenance.md | 1 + doc/source/conf.py | 1 + src/ansys/meshing/prime/internals/launcher.py | 4 +++- src/ansys/meshing/prime/internals/utils.py | 21 ++++++++++++++----- tests/conftest.py | 13 ++++++++++-- 6 files changed, 33 insertions(+), 8 deletions(-) create mode 100644 doc/changelog.d/1194.maintenance.md diff --git a/.github/workflows/ci_cd.yml b/.github/workflows/ci_cd.yml index cbf0bc4186..98d0008734 100644 --- a/.github/workflows/ci_cd.yml +++ b/.github/workflows/ci_cd.yml @@ -130,6 +130,7 @@ jobs: PYPRIMEMESH_SPHINX_BUILD: 1 PYPRIMEMESH_IMAGE_TAG: ${{ env.DOCKER_IMAGE_TAG }} ANSYSLMD_LICENSE_FILE: '1055@${{ secrets.LICENSE_SERVER }}' + PRIME_MODE: "GRPC_INSECURE" doc-deploy-pr: name: "Deploy PR documentation" diff --git a/doc/changelog.d/1194.maintenance.md b/doc/changelog.d/1194.maintenance.md new file mode 100644 index 0000000000..d9010cbff1 --- /dev/null +++ b/doc/changelog.d/1194.maintenance.md @@ -0,0 +1 @@ +Updates to docker file and connection type option for user diff --git a/doc/source/conf.py b/doc/source/conf.py index d5873e7282..d71e11af16 100755 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -10,6 +10,7 @@ from ansys.meshing.prime import __version__ +os.environ["PRIME_MODE"] = "GRPC_INSECURE" viz_interface.DOCUMENTATION_BUILD = True # Using env var instead os.environ["PYANSYS_VISUALIZER_DOC_MODE"] = "true" diff --git a/src/ansys/meshing/prime/internals/launcher.py b/src/ansys/meshing/prime/internals/launcher.py index 31450082c3..913f2e9874 100644 --- a/src/ansys/meshing/prime/internals/launcher.py +++ b/src/ansys/meshing/prime/internals/launcher.py @@ -303,7 +303,9 @@ def launch_prime( launch_container = bool(int(os.environ.get('PYPRIMEMESH_LAUNCH_CONTAINER', '0'))) if launch_container: container_name = utils.make_unique_container_name('ansys-prime-server') - utils.launch_prime_github_container(port=port, name=container_name, version=version) + utils.launch_prime_github_container( + port=port, name=container_name, version=version, connection_type=connection_type + ) config.set_using_container(True) client = Client(port=port, timeout=timeout, client_certs_dir=client_certs_dir) client.container_name = container_name diff --git a/src/ansys/meshing/prime/internals/utils.py b/src/ansys/meshing/prime/internals/utils.py index 28c8ed6401..67a954d30e 100644 --- a/src/ansys/meshing/prime/internals/utils.py +++ b/src/ansys/meshing/prime/internals/utils.py @@ -210,6 +210,7 @@ def launch_prime_github_container( port: int = defaults.port(), name: str = "ansys-prime-server", version: Optional[str] = None, + connection_type: Optional['config.ConnectionType'] = None, ): """Launch a container. @@ -226,6 +227,9 @@ def launch_prime_github_container( Name of the container. The default is ``"ansys-prime-server"``. version : str, optional Version of the container to retrieve. The default is ``None``. + connection_type : config.ConnectionType, optional + Type of connection to use. The default is ``None``, which defaults to + ``config.ConnectionType.GRPC_SECURE``. Raises ------ @@ -261,11 +265,18 @@ def launch_prime_github_container( '--port', f'{port}', ] - print( - 'Warning: Secure connection is not supported ' - 'yet for Prime containers, using insecure connection.' - ) - prime_arguments.append('--secure=no') + + # Set default connection type if not provided + if connection_type is None: + connection_type = config.ConnectionType.GRPC_SECURE + + # Handle connection type + if ( + connection_type == config.ConnectionType.GRPC_INSECURE + or os.environ.get('PRIME_MODE', '').upper() == "GRPC_INSECURE" + ): + prime_arguments.append('--secure=no') + subprocess.run(docker_command + prime_arguments, stdout=subprocess.DEVNULL) diff --git a/tests/conftest.py b/tests/conftest.py index 3353fe4f5d..96e52adafe 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -57,10 +57,19 @@ def start_ansys_prime_server(self, prime_root=None, ip='127.0.0.1', port=50055, by default ``1``. """ if n_procs == 1: - self.client = prime.launch_prime(prime_root=prime_root, ip=ip, port=port) + self.client = prime.launch_prime( + prime_root=prime_root, + ip=ip, + port=port, + connection_type=prime.internals.config.ConnectionType.GRPC_INSECURE, + ) else: self.client = prime.launch_prime( - prime_root=prime_root, ip=ip, port=port, n_procs=n_procs + prime_root=prime_root, + ip=ip, + port=port, + n_procs=n_procs, + connection_type=prime.internals.config.ConnectionType.GRPC_INSECURE, ) def start_remote_client(self): From edca70da80e4e8b615174feec3616aefd00acc70 Mon Sep 17 00:00:00 2001 From: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> Date: Fri, 12 Dec 2025 16:18:30 +0000 Subject: [PATCH 25/25] chore: updating CHANGELOG for v0.9.4 --- CHANGELOG.md | 13 +++++++++++++ doc/changelog.d/1187.miscellaneous.md | 1 - doc/changelog.d/1193.miscellaneous.md | 1 - doc/changelog.d/1194.maintenance.md | 1 - 4 files changed, 13 insertions(+), 3 deletions(-) delete mode 100644 doc/changelog.d/1187.miscellaneous.md delete mode 100644 doc/changelog.d/1193.miscellaneous.md delete mode 100644 doc/changelog.d/1194.maintenance.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 44b3cd7693..7b0deabcda 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,19 @@ This project uses [towncrier](https://towncrier.readthedocs.io/) and the changes +## [0.9.4](https://github.com/ansys/pyprimemesh/releases/tag/v0.9.4) - December 12, 2025 + + +### Miscellaneous + +- Updates to release/0.9 [#1187](https://github.com/ansys/pyprimemesh/pull/1187) +- Changes to update the version [#1193](https://github.com/ansys/pyprimemesh/pull/1193) + + +### Maintenance + +- Updates to docker file and connection type option for user [#1194](https://github.com/ansys/pyprimemesh/pull/1194) + ## [0.9.3](https://github.com/ansys/pyprimemesh/releases/tag/v0.9.3) - September 23, 2025 diff --git a/doc/changelog.d/1187.miscellaneous.md b/doc/changelog.d/1187.miscellaneous.md deleted file mode 100644 index 17621f6bd1..0000000000 --- a/doc/changelog.d/1187.miscellaneous.md +++ /dev/null @@ -1 +0,0 @@ -Updates to release/0.9 diff --git a/doc/changelog.d/1193.miscellaneous.md b/doc/changelog.d/1193.miscellaneous.md deleted file mode 100644 index bc9e5a64cc..0000000000 --- a/doc/changelog.d/1193.miscellaneous.md +++ /dev/null @@ -1 +0,0 @@ -Changes to update the version diff --git a/doc/changelog.d/1194.maintenance.md b/doc/changelog.d/1194.maintenance.md deleted file mode 100644 index d9010cbff1..0000000000 --- a/doc/changelog.d/1194.maintenance.md +++ /dev/null @@ -1 +0,0 @@ -Updates to docker file and connection type option for user