{ "info": { "author": "Nico Schl\u00f6mer", "author_email": "nico.schloemer@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Topic :: Scientific/Engineering", "Topic :: Scientific/Engineering :: Mathematics" ], "description": "

\n \"dmsh\"\n

The worst mesh generator you'll ever use.

\n

\n\n[![CircleCI](https://img.shields.io/circleci/project/github/nschloe/dmsh/master.svg?style=flat-square)](https://circleci.com/gh/nschloe/dmsh/tree/master)\n[![codecov](https://img.shields.io/codecov/c/github/nschloe/dmsh.svg?style=flat-square)](https://codecov.io/gh/nschloe/dmsh)\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg?style=flat-square)](https://github.com/ambv/black)\n[![PyPi Version](https://img.shields.io/pypi/v/dmsh.svg?style=flat-square)](https://pypi.org/project/dmsh)\n[![GitHub stars](https://img.shields.io/github/stars/nschloe/dmsh.svg?style=flat-square&logo=github&label=Stars&logoColor=white)](https://github.com/nschloe/dmsh)\n[![PyPi downloads](https://img.shields.io/pypi/dd/dmsh.svg?style=flat-square)](https://pypistats.org/packages/dmsh)\n\nInspired by [distmesh](http://persson.berkeley.edu/distmesh/), dmsh\n\n * is slow,\n * requires a lot of memory, and\n * isn't terribly robust either.\n\nOn the plus side,\n\n * it's got a usable interface,\n * is pure Python (and hence easily installable on any system), and\n * if it works, it produces pretty high-quality meshes.\n\nCombined with [optimesh](https://github.com/nschloe/optimesh), dmsh produces the\nhighest-quality 2D meshes in the west.\n\n### Examples\n\n#### Primitives\n\n![circle](https://nschloe.github.io/dmsh/circle.png) |\n![rectangle](https://nschloe.github.io/dmsh/rectangle.png) |\n![polygon](https://nschloe.github.io/dmsh/polygon.png)\n|:---:|:---:|:---:|\n\n```python\nimport dmsh\n\ngeo = dmsh.Circle([0.0, 0.0], 1.0)\nX, cells = dmsh.generate(geo, 0.1)\n\n# optionally optimize the mesh\nimport optimesh\nX, cells = optimesh.cvt.quasi_newton_uniform_full(X, cells, 1.0e-10, 100)\n\n# and write it to a file\nimport meshio\nmeshio.write_points_cells(\"circle.vtk\", X, {\"triangle\": cells})\n```\n\n```python\ngeo = dmsh.Rectangle(-1.0, +2.0, -1.0, +1.0)\nX, cells = dmsh.generate(geo, 0.1)\n```\n\n```python\ngeo = dmsh.Polygon(\n [\n [0.0, 0.0],\n [1.1, 0.0],\n [1.2, 0.5],\n [0.7, 0.6],\n [2.0, 1.0],\n [1.0, 2.0],\n [0.5, 1.5],\n ]\n)\nX, cells = dmsh.generate(geo, 0.1)\n```\n\n#### Combinations\n\n##### Difference\n\n![difference](https://nschloe.github.io/dmsh/difference.png) |\n![pacman](https://nschloe.github.io/dmsh/pacman.png) |\n![square_hole_refined](https://nschloe.github.io/dmsh/square_hole_refined.png)\n:-------------------:|:------------------:|:----:|\n\n```python\ngeo = dmsh.Difference(dmsh.Circle([-0.5, 0.0], 1.0), dmsh.Circle([+0.5, 0.0], 1.0))\nX, cells = dmsh.generate(geo, 0.1)\n```\n```python\ngeo = dmsh.Difference(\n dmsh.Circle([0.0, 0.0], 1.0),\n dmsh.Polygon([[0.0, 0.0], [1.5, 0.4], [1.5, -0.4]]),\n)\nX, cells = dmsh.generate(geo, 0.1, tol=1.0e-10)\n```\n\nThe following example uses a nonconstant edge length; it depends on the distance to the\ncircle `c`.\n```python\nr = dmsh.Rectangle(-1.0, +1.0, -1.0, +1.0)\nc = dmsh.Circle([0.0, 0.0], 0.3)\ngeo = dmsh.Difference(r, c)\n\nnumpy.random.seed(0)\nX, cells = dmsh.generate(\n geo, lambda pts: numpy.abs(c.dist(pts)) / 5 + 0.05, tol=1.0e-10\n)\n```\n\n##### Union\n\n![union](https://nschloe.github.io/dmsh/union.png) |\n![union-rect](https://nschloe.github.io/dmsh/union_rectangles.png) |\n![union-three-circles](https://nschloe.github.io/dmsh/union_three_circles.png) |\n:-------------------:|:------------------:|:----:|\n\n```python\ngeo = dmsh.Union([dmsh.Circle([-0.5, 0.0], 1.0), dmsh.Circle([+0.5, 0.0], 1.0)])\nX, cells = dmsh.generate(geo, 0.15)\n```\n```python\ngeo = dmsh.Union(\n [dmsh.Rectangle(-1.0, +0.5, -1.0, +0.5), dmsh.Rectangle(-0.5, +1.0, -0.5, +1.0)]\n)\nX, cells = dmsh.generate(geo, 0.15)\n```\n```python\nangles = numpy.pi * numpy.array([3.0 / 6.0, 7.0 / 6.0, 11.0 / 6.0])\ngeo = dmsh.Union(\n [\n dmsh.Circle([numpy.cos(angles[0]), numpy.sin(angles[0])], 1.0),\n dmsh.Circle([numpy.cos(angles[1]), numpy.sin(angles[1])], 1.0),\n dmsh.Circle([numpy.cos(angles[2]), numpy.sin(angles[2])], 1.0),\n ]\n)\nX, cells = dmsh.generate(geo, 0.15)\n```\n\n#### Intersection\n\n![intersection](https://nschloe.github.io/dmsh/intersection.png) |\n![intersection-three-circles](https://nschloe.github.io/dmsh/intersection_three_circles.png) |\n![halfspace](https://nschloe.github.io/dmsh/halfspace.png)\n:-------------------:|:------------------:|:----:|\n\n```python\ngeo = dmsh.Intersection(\n [dmsh.Circle([0.0, -0.5], 1.0), dmsh.Circle([0.0, +0.5], 1.0)]\n)\nX, cells = dmsh.generate(geo, 0.1, tol=1.0e-10)\n```\n\n```python\nangles = numpy.pi * numpy.array([3.0 / 6.0, 7.0 / 6.0, 11.0 / 6.0])\ngeo = dmsh.Intersection(\n [\n dmsh.Circle([numpy.cos(angles[0]), numpy.sin(angles[0])], 1.5),\n dmsh.Circle([numpy.cos(angles[1]), numpy.sin(angles[1])], 1.5),\n dmsh.Circle([numpy.cos(angles[2]), numpy.sin(angles[2])], 1.5),\n ]\n)\nX, cells = dmsh.generate(geo, 0.1, tol=1.0e-10)\n```\n\nThe following uses the `HalfSpace` primtive for cutting of a circle.\n```python\ngeo = dmsh.Intersection(\n [\n dmsh.HalfSpace(numpy.sqrt(0.5) * numpy.array([1.0, 1.0]), 0.0),\n dmsh.Circle([0.0, 0.0], 1.0),\n ]\n)\nX, cells = dmsh.generate(geo, 0.1)\n```\n\n### Rotation, translation, scaling\n\n![rotation](https://nschloe.github.io/dmsh/rotation.png) |\n![scaling](https://nschloe.github.io/dmsh/scaling.png)\n|:----:|:----:|\n\n```python\ngeo = dmsh.Rotation(dmsh.Rectangle(-1.0, +2.0, -1.0, +1.0), 0.1 * numpy.pi)\nX, cells = dmsh.generate(geo, 0.1, tol=1.0e-10)\n```\n```python\ngeo = dmsh.Translation(dmsh.Rectangle(-1.0, +2.0, -1.0, +1.0), [1.0, 1.0])\nX, cells = dmsh.generate(geo, 0.1, show=show)\n```\n```python\ngeo = dmsh.Scaling(dmsh.Rectangle(-1.0, +2.0, -1.0, +1.0), 2.0)\nX, cells = dmsh.generate(geo, 0.1, show=show, tol=1.0e-5)\n```\n\n### Local refinement\n\n![refinement-line](https://nschloe.github.io/dmsh/refinement_line.png)\n\nAll objects can be used to refine the mesh according to the distance to the object;\ne.g. a `Path`:\n```python\ngeo = dmsh.Rectangle(0.0, 1.0, 0.0, 1.0)\n\np1 = dmsh.Path([[0.4, 0.6], [0.6, 0.4]])\n\ndef edge_size(x):\n return 0.03 + 0.1 * p1.dist(x)\n\nX, cells = dmsh.generate(geo, edge_size, show=show, tol=1.0e-10)\n```\n\n\n\n### Installation\n\ndmsh is [available from the Python Package\nIndex](https://pypi.org/project/dmsh/), so simply type\n```\npip3 install dmsh --user\n```\nto install.\n\n### Testing\n\nTo run the dmsh unit tests, check out this repository and type\n```\npytest\n```\n\n### License\n\ndmsh is published under the [MIT license](https://en.wikipedia.org/wiki/MIT_License).\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/nschloe/dmsh", "keywords": "", "license": "License :: OSI Approved :: MIT License", "maintainer": "", "maintainer_email": "", "name": "dmsh", "package_url": "https://pypi.org/project/dmsh/", "platform": "", "project_url": "https://pypi.org/project/dmsh/", "project_urls": { "Homepage": "https://github.com/nschloe/dmsh" }, "release_url": "https://pypi.org/project/dmsh/0.1.3/", "requires_dist": [ "numpy", "scipy", "pypathlib", "matplotlib ; extra == 'all'", "matplotlib ; extra == 'plot'" ], "requires_python": ">=3", "summary": "High-quality 2D mesh generator based on distmesh", "version": "0.1.3" }, "last_serial": 5545138, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "4945537b89f31ebc4c8bf804fe778047", "sha256": "0de4f5d0873005ba827012bb9af834e6f8ec6e3ebd746ad8c4f684143b99d15f" }, "downloads": -1, "filename": "dmsh-0.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "4945537b89f31ebc4c8bf804fe778047", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 16176, "upload_time": "2018-07-24T10:51:59", "url": "https://files.pythonhosted.org/packages/30/54/320495b3c06199d768e821b2f8b99c83024a180153b396c4335c503753dd/dmsh-0.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "96ada838d446adb6cb42c0c1c0b6157a", "sha256": "18eff9a139ad5f6920a877bfd68ad82944829847f9ca12acd3a3c3302a201521" }, "downloads": -1, "filename": "dmsh-0.1.0.tar.gz", "has_sig": false, "md5_digest": "96ada838d446adb6cb42c0c1c0b6157a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13141, "upload_time": "2018-07-24T10:52:00", "url": "https://files.pythonhosted.org/packages/b2/85/28cf8cad2e03c5b504a5ec0ae83f44cffd853d69eafab3ac5d74cef4a280/dmsh-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "15326ce80a168cd0ebe2d2844389fbf5", "sha256": "c0ced00dae4dcd6490e93e55935caa4f8be8781683ff68353eff582e92bee58e" }, "downloads": -1, "filename": "dmsh-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "15326ce80a168cd0ebe2d2844389fbf5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 16406, "upload_time": "2019-07-02T09:12:15", "url": "https://files.pythonhosted.org/packages/cc/2f/b81bb8038c19f2c67fbf8b43ebb0f9d453dbe39a33d10420f64691215906/dmsh-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "99139acb0d84daca5d9b3274a82e3d24", "sha256": "b52bfabf321c9b5017bd7895a9728412060b00683cd9cfc6a91ad23625dc3489" }, "downloads": -1, "filename": "dmsh-0.1.1.tar.gz", "has_sig": false, "md5_digest": "99139acb0d84daca5d9b3274a82e3d24", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14457, "upload_time": "2019-07-02T09:12:17", "url": "https://files.pythonhosted.org/packages/46/3a/f28594acedc40fe66eadf8f659a4505f121e0b064d67596c4965ca325c10/dmsh-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "635a8ae00202d83fa46672b7f94f15c9", "sha256": "dde5dc1291c2dde129dd0652c28bca736c2db3e2270d91faa428f497d809f901" }, "downloads": -1, "filename": "dmsh-0.1.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "635a8ae00202d83fa46672b7f94f15c9", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 16557, "upload_time": "2019-07-15T16:57:50", "url": "https://files.pythonhosted.org/packages/1f/e1/73ec8d0822f241b88ccb5b9aa3e47f8a25099d8e6cc679caa635abfbad5a/dmsh-0.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f6cf5ea08c10fb21f7e750434a1ca8b2", "sha256": "9c6b243072d5943201f4661790117e2b072afb3be9a9f95f17317bc2d91b9477" }, "downloads": -1, "filename": "dmsh-0.1.2.tar.gz", "has_sig": false, "md5_digest": "f6cf5ea08c10fb21f7e750434a1ca8b2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14594, "upload_time": "2019-07-15T16:57:51", "url": "https://files.pythonhosted.org/packages/09/b9/9a9b43a760d84cc20aaea79daf9960e81170445407318e1512bb0c967266/dmsh-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "ce92cc7b42d0a51f936c5d3d03565d5c", "sha256": "4719689960790f9ede46449a25f7f9051f540471eee114a3e7966874243f65fd" }, "downloads": -1, "filename": "dmsh-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "ce92cc7b42d0a51f936c5d3d03565d5c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3", "size": 16762, "upload_time": "2019-07-17T10:27:26", "url": "https://files.pythonhosted.org/packages/a8/50/e258ca59e16a2ce8cc9baff7e57f854866c6d5dc2bc1370004c2d760d0f4/dmsh-0.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "078afb984138513a547e5c5cf9455fa1", "sha256": "8caeef5ce3c31ae18dfa5a83410316200b6affeedeab97b6b98f2fc5e632ddbe" }, "downloads": -1, "filename": "dmsh-0.1.3.tar.gz", "has_sig": false, "md5_digest": "078afb984138513a547e5c5cf9455fa1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 15015, "upload_time": "2019-07-17T10:27:28", "url": "https://files.pythonhosted.org/packages/7d/98/5c45d6a2ae89af1a00ed1f9cddc9cbfe30dc0e6f82fdcda930ee202716fa/dmsh-0.1.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "ce92cc7b42d0a51f936c5d3d03565d5c", "sha256": "4719689960790f9ede46449a25f7f9051f540471eee114a3e7966874243f65fd" }, "downloads": -1, "filename": "dmsh-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "ce92cc7b42d0a51f936c5d3d03565d5c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3", "size": 16762, "upload_time": "2019-07-17T10:27:26", "url": "https://files.pythonhosted.org/packages/a8/50/e258ca59e16a2ce8cc9baff7e57f854866c6d5dc2bc1370004c2d760d0f4/dmsh-0.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "078afb984138513a547e5c5cf9455fa1", "sha256": "8caeef5ce3c31ae18dfa5a83410316200b6affeedeab97b6b98f2fc5e632ddbe" }, "downloads": -1, "filename": "dmsh-0.1.3.tar.gz", "has_sig": false, "md5_digest": "078afb984138513a547e5c5cf9455fa1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 15015, "upload_time": "2019-07-17T10:27:28", "url": "https://files.pythonhosted.org/packages/7d/98/5c45d6a2ae89af1a00ed1f9cddc9cbfe30dc0e6f82fdcda930ee202716fa/dmsh-0.1.3.tar.gz" } ] }