Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • inducer/meshmode
  • eshoag2/meshmode
  • kaushikcfd/meshmode
  • xywei/meshmode
  • fikl2/meshmode
  • cory/meshmode
  • ben_sepanski/meshmode
  • njchris2/meshmode
8 results
Show changes
Commits on Source (2265)
Showing with 979 additions and 496 deletions
sudo chmod -R a+rwX /github/home || true
sudo chmod -R a+rwX /__w || true
sudo apt update
sudo apt upgrade -y
sudo apt install time
. "/root/myvenv/bin/activate"
grep -v loopy requirements.txt > /tmp/myreq.txt
# no need for these in the Firedrake tests
sed -i "/boxtree/ d" /tmp/myreq.txt
sed -i "/sumpy/ d" /tmp/myreq.txt
sed -i "/pytential/ d" /tmp/myreq.txt
sed -i "/pyopencl/ d" /tmp/myreq.txt
# This shouldn't be necessary, but...
# https://github.com/inducer/meshmode/pull/48#issuecomment-687519451
pip install pybind11
pip install pytest
pip install -r /tmp/myreq.txt
pip install pyopencl[pocl]
# Context: https://github.com/OP2/PyOP2/pull/605
python -m pip install --force-reinstall git+https://github.com/inducer/pytools.git
# bring in up-to-date loopy
pip uninstall -y loopy
pip install "git+https://github.com/inducer/loopy.git#egg=loopy"
pip install .
cd examples
for i in $(find . -name '*firedrake*.py' -exec grep -q __main__ '{}' \; -print ); do
echo "-----------------------------------------------------------------------"
echo "RUNNING $i"
echo "-----------------------------------------------------------------------"
dn=$(dirname "$i")
bn=$(basename "$i")
(cd $dn; time python3 "$bn")
done
# https://editorconfig.org/
# https://github.com/editorconfig/editorconfig-vim
# https://github.com/editorconfig/editorconfig-emacs
root = true
[*]
indent_style = space
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.py]
indent_size = 4
[*.rst]
indent_size = 4
[*.cpp]
indent_size = 2
[*.hpp]
indent_size = 2
# There may be one in doc/
[Makefile]
indent_style = tab
# https://github.com/microsoft/vscode/issues/1679
[*.md]
trim_trailing_whitespace = false
version: 2
updates:
# Set update schedule for GitHub Actions
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
# vim: sw=4
name: Gitlab mirror
on:
push:
branches:
- main
jobs:
autopush:
name: Automatic push to gitlab.tiker.net
if: startsWith(github.repository, 'inducer/')
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: |
curl -L -O https://tiker.net/ci-support-v0
. ./ci-support-v0
mirror_github_to_gitlab
env:
GITLAB_AUTOPUSH_KEY: ${{ secrets.GITLAB_AUTOPUSH_KEY }}
# vim: sw=4
name: CI
on:
push:
branches:
- main
pull_request:
schedule:
- cron: '17 3 * * 0'
concurrency:
group: ${{ github.head_ref || github.ref_name }}
cancel-in-progress: true
jobs:
typos:
name: Typos
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: crate-ci/typos@master
ruff:
name: Ruff
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
- name: "Main Script"
run: |
pip install ruff
ruff check
pylint:
name: Pylint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: "Main Script"
run: |
echo "- scipy" >> .test-conda-env-py3.yml
USE_CONDA_BUILD=1
curl -L -O https://gitlab.tiker.net/inducer/ci-support/raw/master/prepare-and-run-pylint.sh
. ./prepare-and-run-pylint.sh "$(basename $GITHUB_REPOSITORY)" examples/*.py test/test_*.py
mypy:
name: Mypy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: "Main Script"
run: |
curl -L -O https://tiker.net/ci-support-v0
. ./ci-support-v0
build_py_project_in_conda_env
python -m pip install mypy
./run-mypy.sh
pytest3:
name: Pytest Conda Py3
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: "Main Script"
run: |
sudo apt update && sudo apt install octave
export MPLBACKEND=Agg
curl -L -O https://tiker.net/ci-support-v0
. ./ci-support-v0
build_py_project_in_conda_env
test_py_project
firedrake:
name: Pytest Firedrake
runs-on: ubuntu-latest
container:
image: 'firedrakeproject/firedrake'
steps:
- name: "Checkout"
run: |
cd /root
mkdir meshmode
cd meshmode
git init
git remote add origin "https://github.com/$GITHUB_REPOSITORY.git"
git fetch origin "$GITHUB_REF"
git checkout FETCH_HEAD
- name: "Make a venv"
run: |
cd /root
python3 -m venv --system-site-packages myvenv
- name: "Dependencies"
run: |
cd /root/meshmode
. .ci/install-for-firedrake.sh
- name: "Test"
run: |
cd /root/meshmode
. /root/myvenv/bin/activate
cd test
python -m pytest --tb=native -rxsw test_firedrake_interop.py
firedrake_examples:
name: Examples Firedrake
runs-on: ubuntu-latest
container:
image: 'firedrakeproject/firedrake'
steps:
- name: "Checkout"
run: |
cd /root
mkdir meshmode
cd meshmode
git init
git remote add origin "https://github.com/$GITHUB_REPOSITORY.git"
git fetch origin "$GITHUB_REF"
git checkout FETCH_HEAD
- name: "Make a venv"
run: |
cd /root
python3 -m venv --system-site-packages myvenv
- name: "Dependencies"
run: |
cd /root/meshmode
. .ci/install-for-firedrake.sh
- name: "Examples"
run: |
cd /root/meshmode
. /root/myvenv/bin/activate
. ./.ci/run_firedrake_examples.sh
examples3:
name: Examples Conda Py3
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: "Main Script"
run: |
export MPLBACKEND=Agg
USE_CONDA_BUILD=1
curl -L -O https://gitlab.tiker.net/inducer/ci-support/raw/main/build-py-project-and-run-examples.sh
. ./build-py-project-and-run-examples.sh
# Test lazy eval
rm -f *.vtu
python simple-dg.py --lazy
docs:
name: Documentation
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
-
uses: actions/setup-python@v5
with:
python-version: '3.x'
- name: "Main Script"
run: |
# texlive is needed for sphinxcontrib-tikz
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
texlive-pictures texlive-latex-extra graphviz pdf2svg
curl -L -O https://gitlab.tiker.net/inducer/ci-support/raw/main/ci-support.sh
. ci-support.sh
# https://github.com/sphinx-contrib/tikz/issues/21
export EXTRA_INSTALL="sphinxcontrib-tikz!=0.4.18"
build_py_project_in_conda_env
# Work around
# intersphinx inventory 'https://firedrakeproject.org/objects.inv' not fetchable
# by deleting all the Firedrake stuff
rm -Rf meshmode/interop/firedrake
sed -i '/firedrakeproject/d' doc/conf.py
sed -i '/interop/d' doc/index.rst
rm doc/interop.rst
build_docs
downstream_tests:
strategy:
fail-fast: false
matrix:
downstream_project: [grudge, pytential, mirgecom, mirgecom_examples]
name: Tests for downstream project ${{ matrix.downstream_project }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: "Main Script"
env:
DOWNSTREAM_PROJECT: ${{ matrix.downstream_project }}
run: |
curl -L -O https://tiker.net/ci-support-v0
. ./ci-support-v0
if [[ "$DOWNSTREAM_PROJECT" == "grudge" && "$GITHUB_HEAD_REF" == "group-constr-drop-index" ]]; then
DOWNSTREAM_PROJECT=https://github.com/inducer/grudge.git@grad-test-overint
fi
test_downstream "$DOWNSTREAM_PROJECT"
# vim: sw=4
......@@ -13,5 +13,16 @@ distribute*egg
distribute*tar.gz
a.out
*.vtu
*.pvtu
*.h5
*.xmf
*.hdf
*.pdf
*.stl
.cache
.pytest_cache
.pylintrc.yml
.run-pylint.py
test/nodal-dg
Python 2.7 AMD CPU:
script:
- export PY_EXE=python2.7
- export PYOPENCL_TEST=amd:pu
- export EXTRA_INSTALL="numpy mako"
- curl -L -O -k https://gitlab.tiker.net/inducer/ci-support/raw/master/build-and-test-py-project.sh
- ". ./build-and-test-py-project.sh"
tags:
- python2.7
- amd-cl-cpu
Python 3 POCL:
script: |
export PY_EXE=python3
export PYOPENCL_TEST=portable:cpu
# cython is here because pytential (for now, for TS) depends on it
export EXTRA_INSTALL="pybind11 cython numpy mako mpi4py h5py oct2py"
curl -L -O https://gitlab.tiker.net/inducer/ci-support/raw/main/build-and-test-py-project.sh
. ./build-and-test-py-project.sh
tags:
- python3
- pocl
- mpi
except:
- tags
Python 2.7 POCL:
script:
- export PY_EXE=python2.7
- export PYOPENCL_TEST=portable
- export EXTRA_INSTALL="numpy mako"
- curl -L -O -k https://gitlab.tiker.net/inducer/ci-support/raw/master/build-and-test-py-project.sh
- ". ./build-and-test-py-project.sh"
artifacts:
reports:
junit: test/pytest.xml
Python 3 Nvidia Titan V:
script: |
export PY_EXE=python3
export PYOPENCL_TEST=nvi:titan
export EXTRA_INSTALL="pybind11 cython numpy mako oct2py"
# cython is here because pytential (for now, for TS) depends on it
curl -L -O https://gitlab.tiker.net/inducer/ci-support/raw/main/build-and-test-py-project.sh
. ./build-and-test-py-project.sh
tags:
- python2.7
- pocl
- python3
- nvidia-titan-v
except:
- tags
Python 3.5 POCL:
artifacts:
reports:
junit: test/pytest.xml
Python 3 POCL Examples:
script:
- export PY_EXE=python3.5
- export PYOPENCL_TEST=portable
- export EXTRA_INSTALL="numpy mako"
- curl -L -O -k https://gitlab.tiker.net/inducer/ci-support/raw/master/build-and-test-py-project.sh
- ". ./build-and-test-py-project.sh"
- test -n "$SKIP_EXAMPLES" && exit
- export PY_EXE=python3
- export PYOPENCL_TEST=portable:cpu
# cython is here because pytential (for now, for TS) depends on it
- export EXTRA_INSTALL="pybind11 cython numpy mako matplotlib"
- curl -L -O https://gitlab.tiker.net/inducer/ci-support/raw/main/build-py-project-and-run-examples.sh
- ". ./build-py-project-and-run-examples.sh"
tags:
- python3.5
- python3
- pocl
- large-node
except:
- tags
# The machine shop is too old for the Firedrake container.
# Lawrence Mitchell says that they likely build PETSc with -march=native
# on something like Skylake.
#
# Python 3 POCL Firedrake:
# tags:
# - "docker-runner"
# image: "firedrakeproject/firedrake"
# script:
# - . .ci/install-for-firedrake.sh
# - cd test
# - python -m pytest --tb=native --junitxml=pytest.xml -rxsw test_firedrake_interop.py
# artifacts:
# reports:
# junit: test/pytest.xml
#
# Python 3 POCL Firedrake Examples:
# tags:
# - "docker-runner"
# image: "firedrakeproject/firedrake"
# script:
# - . .ci/install-for-firedrake.sh
# - . ./.ci/run_firedrake_examples.sh
# artifacts:
# reports:
# junit: test/pytest.xml
Python 3 Conda:
script: |
export PYOPENCL_TEST=portable:cpu
export MPLBACKEND=Agg
curl -L -O https://gitlab.tiker.net/inducer/ci-support/raw/main/build-and-test-py-project-within-miniconda.sh
. ./build-and-test-py-project-within-miniconda.sh
tags:
# - docker-runner
- linux
- large-node
except:
- tags
Documentation:
script:
- EXTRA_INSTALL="numpy"
- curl -L -O -k https://gitlab.tiker.net/inducer/ci-support/raw/master/build-docs.sh
- ". ./build-docs.sh"
# https://github.com/sphinx-contrib/tikz/issues/21
- EXTRA_INSTALL="pybind11 cython numpy sphinxcontrib-tikz!=0.4.18"
- curl -L -O https://gitlab.tiker.net/inducer/ci-support/raw/main/build-docs.sh
- . ./build-docs.sh
tags:
- python3
Ruff:
script: |
pipx install ruff
ruff check
tags:
- docker-runner
except:
- tags
Pylint:
script: |
export PY_EXE=python3
EXTRA_INSTALL="Cython pybind11 numpy mako matplotlib scipy mpi4py h5py oct2py"
curl -L -O https://gitlab.tiker.net/inducer/ci-support/raw/master/prepare-and-run-pylint.sh
. ./prepare-and-run-pylint.sh "$CI_PROJECT_NAME" examples/*.py test/test_*.py
tags:
- python3
except:
- tags
Mypy:
script: |
EXTRA_INSTALL="Cython mpi4py"
curl -L -O https://tiker.net/ci-support-v0
. ./ci-support-v0
build_py_project_in_venv
python -m pip install mypy
./run-mypy.sh
tags:
- python3
except:
- tags
Downstream:
parallel:
matrix:
- DOWNSTREAM_PROJECT: [grudge, pytential, mirgecom, mirgecom_examples]
tags:
- python3.5
only:
- master
- large-node
- "docker-runner"
script: |
curl -L -O https://tiker.net/ci-support-v0
. ./ci-support-v0
test_downstream "$DOWNSTREAM_PROJECT"
# vim: sw=2
- arg: py-version
val: '3.10'
- arg: ignore
val:
- firedrake
- to_firedrake.py
- from_firedrake.py
- test_firedrake_interop.py
- arg: extension-pkg-whitelist
val: mayavi
name: test-conda-env
channels:
- conda-forge
- nodefaults
dependencies:
- python=3
- git
- libhwloc=2
- numpy
# 3.1 needed for SVM functionality
- pocl>=3.1
- mako
- pyopencl
- islpy
- gmsh
# Needed for nodal-DG interop
- oct2py
# for Pytential
- cython
# for pymetis
- pybind11
# for MPI-based tests
- openmpi
- mpi4py
# for xdmf/hdf5 visualizer
- h5py=*=mpi_openmpi*
# Only needed to make pylint succeed
- matplotlib-base
- pip
meshmode
========
meshmode: High-Order Meshes and Discontinuous Function Spaces
=============================================================
* `Source code on Github <https://github.com/inducer/meshmode>`_
* `Documentation <https://documen.tician.de/meshmode>`_
.. image:: https://gitlab.tiker.net/inducer/meshmode/badges/main/pipeline.svg
:alt: Gitlab Build Status
:target: https://gitlab.tiker.net/inducer/meshmode/commits/main
.. image:: https://github.com/inducer/meshmode/actions/workflows/ci.yml/badge.svg
:alt: Github Build Status
:target: https://github.com/inducer/meshmode/actions/workflows/ci.yml
.. image:: https://badge.fury.io/py/meshmode.svg
:alt: Python Package Index Release Page
:target: https://pypi.org/project/meshmode/
.. TODO
Meshmode provides the "boring bits" of high-order unstructured discretization,
for simplices (triangles, tetrahedra) and tensor products (quads, hexahedra).
Features:
- 1/2/3D, line/surface/volume discretizations in each, curvilinear supported.
- "Everything is a (separate) discretization." (mesh boundaries are, element surfaces are,
refined versions of the same mesh are) "Connections" transfer information
between discretizations.
- Periodic connectivity.
- Mesh partitioning (not just) for distributed execution (e.g. via MPI).
- Interpolatory, quadrature (overintegration), and modal element-local discretizations.
- Independent of execution environment (GPU/CPU, numpy, ...)
via `array contexts <https://github.com/inducer/arraycontext/>`__.
- Simple mesh refinement (via bisection). Adjacency currently only
maintained if conforming.
- Input from Gmsh, Visualization to Vtk (both high-order curvilinear).
- Easy data exchange with `Firedrake <https://www.firedrakeproject.org/>`__.
Meshmode emerged as the shared discretization layer for `pytential
<https://github.com/inducer/pytential/>`__ (layer potentials) and `grudge
<https://github.com/inducer/grudge>`__ (discontinuous Galerkin).
Places on the web related to meshmode:
* `Source code on Github <https://github.com/inducer/meshmode>`__
* `Documentation <https://documen.tician.de/meshmode>`__
# Makefile for Sphinx documentation
# Minimal makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
PAPER =
# You can set these variables from the command line, and also
# from the environment for the first two.
SPHINXOPTS ?= -n
SPHINXBUILD ?= python $(shell which sphinx-build)
SOURCEDIR = .
BUILDDIR = _build
# User-friendly check for sphinx-build
ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
endif
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
# Put it first so that "make" without argument is like "make help".
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " texinfo to make Texinfo files"
@echo " info to make Texinfo files and run them through makeinfo"
@echo " gettext to make PO message catalogs"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " xml to make Docutils-native XML files"
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
clean:
rm -rf $(BUILDDIR)/*
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
@echo "Build finished; now you can process the JSON files."
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/meshmode.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/meshmode.qhc"
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@echo "Build finished."
@echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/meshmode"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/meshmode"
@echo "# devhelp"
epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
latexpdf:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
latexpdfja:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through platex and dvipdfmx..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
texinfo:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
@echo "Run \`make' in that directory to run these through makeinfo" \
"(use \`make info' here to do that automatically)."
info:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo "Running Texinfo files through makeinfo..."
make -C $(BUILDDIR)/texinfo info
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
gettext:
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
@echo
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
@echo
@echo "The overview file is in $(BUILDDIR)/changes."
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
xml:
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
@echo
@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
.PHONY: help Makefile
pseudoxml:
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
@echo
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
DOF (Degree-of-Freedom) Arrays
==============================
.. automodule:: meshmode.dof_array
Array Contexts
==============
.. automodule:: meshmode.array_context
Metadata for Program Transformation
===================================
.. automodule:: meshmode.transform_metadata
# -*- coding: utf-8 -*-
#
# meshmode documentation build configuration file, created by
# sphinx-quickstart on Thu Jun 5 15:22:45 2014.
#
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
import sys
import os
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#sys.path.insert(0, os.path.abspath('.'))
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
'sphinx.ext.autodoc',
'sphinx.ext.doctest',
'sphinx.ext.intersphinx',
'sphinx.ext.mathjax',
]
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix of source filenames.
source_suffix = '.rst'
# The encoding of source files.
#source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'meshmode'
copyright = u'2014, Andreas Klöckner'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
ver_dic = {}
exec(compile(open("../meshmode/version.py").read(), "../meshmode/version.py", 'exec'), ver_dic)
version = ".".join(str(x) for x in ver_dic["VERSION"])
# The full version, including alpha/beta/rc tags.
release = ver_dic["VERSION_TEXT"]
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
#today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ['_build']
# The reST default role (used for this markup: `text`) to use for all
# documents.
#default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []
# If true, keep warnings as "system message" paragraphs in the built documents.
#keep_warnings = False
# -- Options for HTML output ----------------------------------------------
html_theme = "alabaster"
html_theme_options = {
"extra_nav_links": {
"🚀 Github": "https://github.com/inducer/meshmode",
"💾 Download Releases": "https://pypi.python.org/pypi/meshmode",
}
}
html_sidebars = {
'**': [
'about.html',
'navigation.html',
'relations.html',
'searchbox.html',
]
from importlib import metadata
from urllib.request import urlopen
_conf_url = \
"https://raw.githubusercontent.com/inducer/sphinxconfig/main/sphinxconfig.py"
with urlopen(_conf_url) as _inf:
exec(compile(_inf.read(), _conf_url, "exec"), globals())
extensions.extend([ # noqa: F821
"sphinx.ext.graphviz",
"sphinxcontrib.tikz",
])
tikz_tikzlibraries = "decorations.markings"
copyright = "2014-2024, Meshmode contributors"
release = metadata.version("meshmode")
version = ".".join(release.split(".")[:2])
intersphinx_mapping = {
"arraycontext": ("https://documen.tician.de/arraycontext", None),
"fenics": ("https://fenics.readthedocs.io/projects/fiat/en/latest", None),
"FInAT": ("https://finat.github.io/FInAT/", None),
"firedrake": ("https://www.firedrakeproject.org", None),
"gmsh_interop": ("https://documen.tician.de/gmsh_interop", None),
"h5py": ("https://docs.h5py.org/en/stable", None),
"loopy": ("https://documen.tician.de/loopy", None),
"meshpy": ("https://documen.tician.de/meshpy", None),
"modepy": ("https://documen.tician.de/modepy", None),
"mpi4py": ("https://mpi4py.readthedocs.io/en/stable", None),
"numpy": ("https://numpy.org/doc/stable", None),
"pymetis": ("https://documen.tician.de/pymetis", None),
"pyopencl": ("https://documen.tician.de/pyopencl", None),
"python": ("https://docs.python.org/3", None),
"pytools": ("https://documen.tician.de/pytools", None),
"recursivenodes": ("https://tisaac.gitlab.io/recursivenodes", None),
}
# Add any paths that contain custom themes here, relative to this directory.
#html_theme_path = []
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
#html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation.
#html_extra_path = []
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}
# If false, no module index is generated.
#html_domain_indices = True
# If false, no index is generated.
#html_use_index = True
# If true, the index is split into individual pages for each letter.
#html_split_index = False
# If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
#html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None
# Output file base name for HTML help builder.
htmlhelp_basename = 'meshmodedoc'
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#'preamble': '',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
('index', 'meshmode.tex', u'meshmode Documentation',
u'Andreas Klöckner', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
#latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False
# If true, show page references after internal links.
#latex_show_pagerefs = False
# If true, show URL addresses after external links.
#latex_show_urls = False
# Documents to append as an appendix to all manuals.
#latex_appendices = []
# If false, no module index is generated.
#latex_domain_indices = True
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
('index', 'meshmode', u'meshmode Documentation',
[u'Andreas Klöckner'], 1)
]
# If true, show URL addresses after external links.
#man_show_urls = False
# -- Options for Texinfo output -------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
('index', 'meshmode', u'meshmode Documentation',
u'Andreas Klöckner', 'meshmode', 'One line description of project.',
'Miscellaneous'),
]
# Documents to append as an appendix to all manuals.
#texinfo_appendices = []
# If false, no module index is generated.
#texinfo_domain_indices = True
# How to display URL addresses: 'footnote', 'no', or 'inline'.
#texinfo_show_urls = 'footnote'
# If true, do not generate a @detailmenu in the "Top" node's menu.
#texinfo_no_detailmenu = False
# Some modules need to import things just so that sphinx can resolve symbols in
# type annotations. Often, we do not want these imports (e.g. of PyOpenCL) when
# in normal use (because they would introduce unintended side effects or hard
# dependencies). This flag exists so that these imports only occur during doc
# build. Since sphinx appears to resolve type hints lexically (as it should),
# this needs to be cross-module (since, e.g. an inherited arraycontext
# docstring can be read by sphinx when building meshmode, a dependent package),
# this needs a setting of the same name across all packages involved, that's
# why this name is as global-sounding as it is.
import sys
# Example configuration for intersphinx: refer to the Python standard library.
intersphinx_mapping = {'http://docs.python.org/': None}
sys._BUILDING_SPHINX_DOCS = True
Connections: Interpolating between Discretizations
==================================================
.. automodule:: meshmode.discretization.connection
......@@ -6,16 +6,11 @@ Abstract interface
.. automodule:: meshmode.discretization
Composite polynomial discretization
-----------------------------------
Element Groups for Composite Polynomial Discretization
------------------------------------------------------
.. automodule:: meshmode.discretization.poly_element
Connection/interpolation
------------------------
.. automodule:: meshmode.discretization.connection
Visualization
-------------
......
Distributed memory
==================
.. automodule:: meshmode.distributed
......@@ -7,8 +7,14 @@ Contents:
:maxdepth: 2
mesh
array
discretization
connection
distributed
interop
misc
🚀 Github <https://github.com/inducer/meshmode>
💾 Download Releases <https://pypi.org/project/meshmode>
Indices and tables
==================
......
Interoperability with Other Discretization Packages
===================================================
Functionality in this subpackage helps import and export data to/from other
pieces of software, typically PDE solvers.
Nodal DG
--------
.. automodule:: meshmode.interop.nodal_dg
Firedrake
---------
Function Spaces/Discretizations
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Users wishing to interact with :mod:`meshmode` from :mod:`firedrake`
will create a
:class:`~meshmode.interop.firedrake.connection.FiredrakeConnection`
using :func:`~meshmode.interop.firedrake.connection.build_connection_from_firedrake`,
while users wishing
to interact with :mod:`firedrake` from :mod:`meshmode` will use
will create a
:class:`~meshmode.interop.firedrake.connection.FiredrakeConnection`
using :func:`~meshmode.interop.firedrake.connection.build_connection_to_firedrake`.
It is not recommended to create a
:class:`~meshmode.interop.firedrake.connection.FiredrakeConnection` directly.
.. automodule:: meshmode.interop.firedrake.connection
Meshes
^^^^^^
.. automodule:: meshmode.interop.firedrake.mesh
Reference Cells
^^^^^^^^^^^^^^^
.. automodule:: meshmode.interop.firedrake.reference_cell
Implementation Details
^^^^^^^^^^^^^^^^^^^^^^
Converting between :mod:`firedrake` and :mod:`meshmode` is in general
straightforward. Some language is different:
* In a mesh, a :mod:`meshmode` "element" is a :mod:`firedrake` "cell"
* A :class:`~meshmode.discretization.Discretization` is a :mod:`firedrake`
:class:`~firedrake.functionspaceimpl.WithGeometry`, usually
created by calling the function :func:`~firedrake.functionspace.FunctionSpace`
and referred to as a "function space"
* In a mesh, any vertices, faces, cells, etc. are :mod:`firedrake`
"entities" (see `the PETSc documentation on DMPLEX <https://petsc.org/release/manualpages/DMPlex/>`__
for more info on how topological mesh information is stored
in :mod:`firedrake`).
Other than carefully tabulating how and which vertices/faces
correspond to other vertices/faces/cells, there are two main difficulties.
1. :mod:`meshmode` has discontinuous polynomial function spaces
which may use different unit nodes than :mod:`firedrake`.
2. :mod:`meshmode` requires that all mesh elements be positively oriented,
:mod:`firedrake` does not. Meanwhile, when :mod:`firedrake` creates
a mesh, it changes the element ordering and the local vertex ordering.
(1.) is easily handled by insisting that the :mod:`firedrake`
:class:`~firedrake.functionspaceimpl.WithGeometry` uses polynomial elements
and that the group of the :class:`~meshmode.discretization.Discretization`
being converted is a
:class:`~meshmode.discretization.poly_element.InterpolatoryQuadratureSimplexElementGroup`
of the same order. Then, on each element, the function space being
represented is the same in :mod:`firedrake` and :mod:`meshmode`.
We may simply resample to one system or another's unit nodes.
To handle (2.),
once we associate a :mod:`meshmode`
element to the correct :mod:`firedrake` cell, we have something
like this picture:
.. graphviz::
digraph{
// created with graphviz2.38 dot
// NODES
mmNodes [label="Meshmode\nnodes"];
mmRef [label="Meshmode\nunit nodes"];
fdRef [label="Firedrake\nunit nodes"];
fdNodes [label="Firedrake\nnodes"];
// EDGES
mmRef -> mmNodes [label=" f "];
fdRef -> fdNodes [label=" g "];
}
(Assume we have already
ensured that :mod:`meshmode` and :mod:`firedrake` use the
same reference element by mapping :mod:`firedrake`'s reference
element onto :mod:`meshmode`'s).
If :math:`f=g`, then we can resample function values from
one node set to the other. However, if :mod:`firedrake`
has reordered the vertices or if we flipped their order to
ensure :mod:`meshmode` has positively-oriented elements,
there is some map :math:`A` applied to the reference element
which implements this permutation of barycentric coordinates.
In this case, :math:`f=g\circ A`. Now, we have a connected diagram:
.. graphviz::
digraph{
// created with graphviz2.38 dot
// NODES
mmNodes [label="Meshmode\nnodes"];
mmRef [label="Meshmode\nunit nodes"];
fdRef [label="Firedrake\nunit nodes"];
fdRef2 [label="Firedrake\nunit nodes"];
fdNodes [label="Firedrake\nnodes"];
// EDGES
{rank=same; mmRef; fdRef;}
{rank=same; mmNodes; fdNodes;}
mmRef -> fdRef [label="Resampling", dir="both"];
mmRef -> mmNodes [label=" f "];
fdRef -> fdRef2 [label=" A "];
fdRef2 -> fdNodes [label=" g "];
}
In short, once we reorder the :mod:`firedrake` nodes so
that the mapping from the :mod:`meshmode` and :mod:`firedrake`
reference elements are the same, we can resample function values
at nodes from one set of unit nodes to another (and then undo
the reordering if converting function values
from :mod:`meshmode` to :mod:`firedrake`). The
information for this whole reordering process is
stored in
:attr:`~meshmode.interop.firedrake.connection.FiredrakeConnection.mm2fd_node_mapping`,
an array which associates each :mod:`meshmode` node
to the :mod:`firedrake` node found by tracing the
above diagram (i.e. it stores
:math:`g\circ A\circ \text{Resampling} \circ f^{-1}`).
For Developers: Firedrake Function Space Design Crash Course
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
In Firedrake, meshes and function spaces have a close relationship.
In particular, this is due to some structure described in this
`Firedrake pull request <https://github.com/firedrakeproject/firedrake/pull/627>`_.
If you wish to develop on / add to the implementation of conversion
between :mod:`meshmode` and :mod:`firedrake`, you will need
to understand their design style. Below is a crash course.
In short, it is the idea
that every function space should have a mesh, and the coordinates of the mesh
should be representable as a function on that same mesh, which must live
on some function space on the mesh... etc.
Under the hood, we divide between topological and geometric objects,
roughly as so:
(1) A reference element defined using :mod:`finat` and :mod:`FIAT`
is used to define what meshmode calls the unit nodes and unit
vertices. It is worth noting that :mod:`firedrake` does
not require a positive orientation of elements and that its
reference triangle is different than specified in :mod:`modepy`.
(2) A `~firedrake.mesh.MeshTopology`
which holds information about connectivity
and other topological properties, but nothing about geometry/coordinates
etc.
(3) A class :class:`~firedrake.functionspaceimpl.FunctionSpace`
created from a :mod:`finat` element and a
`~firedrake.mesh.MeshTopology` which allows us to
define functions mapping the nodes (defined by the
:mod:`finat` element) of each element in the
`~firedrake.mesh.MeshTopology` to some values.
Note that the function :func:`~firedrake.functionspace.FunctionSpace`
in the firedrake API is used to create objects of class
:class:`~firedrake.functionspaceimpl.FunctionSpace`
and :class:`~firedrake.functionspaceimpl.WithGeometry` (see
(6)).
(4) A `~firedrake.function.CoordinatelessFunction`
(in the sense that its *domain* has no coordinates)
which is a function in a
:class:`~firedrake.functionspaceimpl.FunctionSpace`.
(5) A `~firedrake.mesh.MeshGeometry` created from a
:class:`~firedrake.functionspaceimpl.FunctionSpace`
and a `~firedrake.function.CoordinatelessFunction`
in that :class:`~firedrake.functionspaceimpl.FunctionSpace`
which maps each dof to its geometric coordinates.
(6) A :class:`~firedrake.functionspaceimpl.WithGeometry` which is a
:class:`~firedrake.functionspaceimpl.FunctionSpace` together
with a `~firedrake.mesh.MeshGeometry`.
This is the object returned
usually returned to the user by a call
to the :mod:`firedrake` function
:func:`~firedrake.functionspace.FunctionSpace`.
(7) A :class:`~firedrake.function.Function` is defined on a
:class:`~firedrake.functionspaceimpl.WithGeometry`.
Thus, by the coordinates of a mesh geometry we mean
(a) On the hidden back-end: a `~firedrake.function.CoordinatelessFunction`
*f* on some function space defined only on the mesh topology.
(b) On the front-end: A :class:`~firedrake.function.Function`
with the values of *f* but defined
on a :class:`~firedrake.functionspaceimpl.WithGeometry`
created from the :class:`~firedrake.functionspaceimpl.FunctionSpace`
*f* lives in and the `~firedrake.mesh.MeshGeometry` *f* defines.
Basically, it's this picture (where :math:`a\to b` if :math:`b` depends on :math:`a`)
.. warning::
In general, the :class:`~firedrake.functionspaceimpl.FunctionSpace`
of the coordinates function
of a :class:`~firedrake.functionspaceimpl.WithGeometry` may not be the same
:class:`~firedrake.functionspaceimpl.FunctionSpace`
as for functions which live in the
:class:`~firedrake.functionspaceimpl.WithGeometry`.
This picture
only shows how the class definitions depend on each other.
.. graphviz::
digraph{
// created with graphviz2.38 dot
// NODES
top [label="Topological\nMesh"];
ref [label="Reference\nElement"];
fspace [label="Function Space"];
coordless [label="Coordinateless\nFunction"];
geo [label="Geometric\nMesh"];
withgeo [label="With\nGeometry"];
// EDGES
top -> fspace;
ref -> fspace;
fspace -> coordless;
top -> geo;
coordless -> geo [label="Mesh\nCoordinates"];
fspace -> withgeo;
geo -> withgeo;
}
......@@ -2,19 +2,89 @@ Common infrastructure
=====================
.. automodule:: meshmode
.. automodule:: meshmode.mesh.tools
Mesh management
===============
.. automodule:: meshmode.mesh
.. currentmodule:: meshmode.mesh
Design of the Data Structure
----------------------------
Why does a :class:`Mesh` need to be broken into :class:`MeshElementGroup` instances?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Elements can be of different types (e.g. triangle, quadrilateral,
tetrahedron, what have you). In addition, elements may vary in the
polynomial degree used to represent them (see also below).
All these bits of information could in principle be stored by element,
but having large, internally homogeneous groups is a good thing from an
efficiency standpoint. (So that you can, e.g., launch one GPU kernel to
deal with all order-3 triangles, instead of maybe having to dispatch
based on type and size inside the kernel)
What is the difference between 'vertices' and 'nodes'?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Nodes exist mainly to represent the (potentially non-affine) deformation of
each element, by a one-to-one correspondence with
:attr:`MeshElementGroup.unit_nodes`. They are unique to each element. Vertices
on the other hand exist to clarify whether or not a point shared by two
elements is actually identical (or just happens to be "close"). This is done by
assigning (single, globally shared) vertex numbers and having elements refer to
them.
Consider the following picture:
.. tikz:: Mesh nodes and vertices
:libs: decorations.markings
:align: center
:xscale: 60
\tikzset{-node-/.style={decoration={
markings,
mark=at position #1 with {
\draw[fill=green!60!black, line width=0.4] circle [radius=0.1];}},
postaction={decorate}}}
\draw [thick, -node-=.33,-node-=0.66] (0, 0) to (3, 0);
\draw [thick, -node-=.33,-node-=0.66] (3, 0) to (0, 3);
\draw [thick, -node-=.33,-node-=0.66] (0, 3) to (0, 0);
\draw [fill=green!60!black] (0, 0) circle [radius=0.1];
\draw [fill=green!60!black] (3, 0) circle [radius=0.1];
\draw [fill=green!60!black] (0, 3) circle [radius=0.1];
\draw [fill=green!60!black] (1, 1) circle [radius=0.1];
\draw [ultra thick,bend left,->] (1.5, 2.5) to (3.5, 2.5);
.. autoclass:: MeshElementGroup
:members:
:undoc-members:
\begin{scope}[shift={(4, 2)},rotate=-47]
\draw [thick, -node-=.33,-node-=0.66] (0, 0) to [bend left] (3, 0);
\draw [thick, -node-=.33,-node-=0.66] (3, 0) to [bend right] (0, 3);
\draw [thick, -node-=.33,-node-=0.66] (0, 3) to [bend right] (0, 0);
\draw [dashed] (3, 0) to [bend left] (5, 3);
\draw [dashed] (5, 3) to [bend right] (0, 3);
.. autoclass:: Mesh
:members:
:undoc-members:
\draw [fill=magenta!60] (0, 0) circle [radius=0.15];
\draw [fill=magenta!60] (0, 3) circle [radius=0.15];
\draw [fill=magenta!60] (3, 0) circle [radius=0.15];
\draw [fill=green!60!black] (0.75, 1.5) circle [radius=0.1];
\end{scope}
\node at (1.5, -0.5) [below] {Reference Element};
\draw [fill=green!60!black] (0.25, -1.5) circle [radius=0.1]
node [right] {~ unit nodes};
\node at (6.5, -0.5) [below] {Mesh Element};
\draw [fill=green!60!black] (5.5, -1.5) circle [radius=0.1]
node [right] {~ nodes (unique)};
\draw [fill=magenta!60] (5.5, -2) circle [radius=0.15]
node [right] {~ vertices (shared)};
Mesh Data Structure
-------------------
.. automodule:: meshmode.mesh
Mesh generation
---------------
......@@ -27,8 +97,18 @@ Mesh input/output
.. automodule:: meshmode.mesh.io
Mesh processing
-----------------
---------------
.. automodule:: meshmode.mesh.processing
Mesh refinement
---------------
.. automodule:: meshmode.mesh.refinement
Mesh visualization
------------------
.. automodule:: meshmode.mesh.visualization
.. vim: sw=4