--- /srv/reproducible-results/rbuild-debian/r-b-build.AksSbvje/b1/dune-geometry_2.9.0-2_armhf.changes +++ /srv/reproducible-results/rbuild-debian/r-b-build.AksSbvje/b2/dune-geometry_2.9.0-2_armhf.changes ├── Files │ @@ -1,4 +1,4 @@ │ │ 62eb159f49aa7be4ccba695ab95d2f6a 375732 debug optional libdune-geometry-dev-dbgsym_2.9.0-2_armhf.deb │ 062e74ea8ea81ad8aa297a16461939ed 289064 libdevel optional libdune-geometry-dev_2.9.0-2_armhf.deb │ - a7f7f73d2169124e6eccfe55f216bf1a 1079968 doc optional libdune-geometry-doc_2.9.0-2_all.deb │ + bfe66f325ac96f75df9e68d1d0be8a6d 1079504 doc optional libdune-geometry-doc_2.9.0-2_all.deb ├── libdune-geometry-doc_2.9.0-2_all.deb │ ├── file list │ │ @@ -1,3 +1,3 @@ │ │ -rw-r--r-- 0 0 0 4 2023-01-12 17:09:23.000000 debian-binary │ │ --rw-r--r-- 0 0 0 12292 2023-01-12 17:09:23.000000 control.tar.xz │ │ --rw-r--r-- 0 0 0 1067484 2023-01-12 17:09:23.000000 data.tar.xz │ │ +-rw-r--r-- 0 0 0 12192 2023-01-12 17:09:23.000000 control.tar.xz │ │ +-rw-r--r-- 0 0 0 1067120 2023-01-12 17:09:23.000000 data.tar.xz │ ├── control.tar.xz │ │ ├── control.tar │ │ │ ├── ./md5sums │ │ │ │ ├── ./md5sums │ │ │ │ │┄ Files differ │ │ │ │ ├── line order │ │ │ │ │ @@ -8,56 +8,56 @@ │ │ │ │ │ usr/share/doc/libdune-geometry-doc/appl/refelements/gg_quadrilateral.png │ │ │ │ │ usr/share/doc/libdune-geometry-doc/appl/refelements/gg_tetrahedron.png │ │ │ │ │ usr/share/doc/libdune-geometry-doc/appl/refelements/gg_tetrahedron_edges.png │ │ │ │ │ usr/share/doc/libdune-geometry-doc/appl/refelements/gg_triangle.png │ │ │ │ │ usr/share/doc/libdune-geometry-doc/changelog.Debian.gz │ │ │ │ │ usr/share/doc/libdune-geometry-doc/changelog.gz │ │ │ │ │ usr/share/doc/libdune-geometry-doc/copyright │ │ │ │ │ -usr/share/doc/libdune-geometry-doc/doxygen/a00041.html │ │ │ │ │ +usr/share/doc/libdune-geometry-doc/doxygen/a00080.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00164.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00167.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00170.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00170_source.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00173.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00173_source.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00176.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00176_source.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00179.html │ │ │ │ │ -usr/share/doc/libdune-geometry-doc/doxygen/a00179_source.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00182.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00182_source.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00185.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00185_source.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00188.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00188_source.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00191.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00191_source.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00194.html │ │ │ │ │ +usr/share/doc/libdune-geometry-doc/doxygen/a00194_source.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00197.html │ │ │ │ │ +usr/share/doc/libdune-geometry-doc/doxygen/a00197_source.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00200.html │ │ │ │ │ +usr/share/doc/libdune-geometry-doc/doxygen/a00200_source.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00203.html │ │ │ │ │ +usr/share/doc/libdune-geometry-doc/doxygen/a00203_source.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00206.html │ │ │ │ │ +usr/share/doc/libdune-geometry-doc/doxygen/a00206_source.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00209.html │ │ │ │ │ +usr/share/doc/libdune-geometry-doc/doxygen/a00209_source.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00212.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00212_source.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00215.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00215_source.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00218.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00218_source.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00221.html │ │ │ │ │ -usr/share/doc/libdune-geometry-doc/doxygen/a00221_source.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00224.html │ │ │ │ │ -usr/share/doc/libdune-geometry-doc/doxygen/a00224_source.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00227.html │ │ │ │ │ -usr/share/doc/libdune-geometry-doc/doxygen/a00227_source.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00230.html │ │ │ │ │ -usr/share/doc/libdune-geometry-doc/doxygen/a00230_source.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00233.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00236.html │ │ │ │ │ -usr/share/doc/libdune-geometry-doc/doxygen/a00236_source.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00239.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00242.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00243.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00243.png │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00244.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00244.png │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00245.html │ ├── data.tar.xz │ │ ├── data.tar │ │ │ ├── file list │ │ │ │ @@ -16,57 +16,57 @@ │ │ │ │ -rw-r--r-- 0 root (0) root (0) 29836 2022-10-20 18:03:11.000000 ./usr/share/doc/libdune-geometry-doc/appl/refelements/gg_tetrahedron.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 22586 2022-10-20 18:03:11.000000 ./usr/share/doc/libdune-geometry-doc/appl/refelements/gg_tetrahedron_edges.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 6480 2022-10-20 18:03:11.000000 ./usr/share/doc/libdune-geometry-doc/appl/refelements/gg_triangle.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 694 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/changelog.Debian.gz │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3307 2022-10-20 18:03:11.000000 ./usr/share/doc/libdune-geometry-doc/changelog.gz │ │ │ │ -rw-r--r-- 0 root (0) root (0) 2567 2023-01-12 15:07:27.000000 ./usr/share/doc/libdune-geometry-doc/copyright │ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/ │ │ │ │ --rw-r--r-- 0 root (0) root (0) 2905 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00041.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 2905 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00080.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 2879 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00164.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 2877 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00167.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5370 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00170.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 114793 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00170_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 17085 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00173.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 90522 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00173_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4299 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00176.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7739 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00176_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6532 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00179.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 35675 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00179_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10877 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00182.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 69584 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00182_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5394 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00185.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 42875 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00185_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5101 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00188.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 113364 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00188_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5211 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00191.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 66217 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00191_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9350 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00194.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9943 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00197.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 14083 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00200.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9908 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00203.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10281 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00206.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9799 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00209.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 13182 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00212.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 93054 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00212_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4911 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00215.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 15874 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00215_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7802 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00218.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 164962 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00218_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5488 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00221.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 28855 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00221_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4912 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00224.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8836 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00224_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6965 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00227.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 28712 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00227_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 3230 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00230.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 27063 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00230_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 11397 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00233.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5678 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00236.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 35629 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00236_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4154 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00239.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4299 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00170.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7739 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00170_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5678 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00173.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 35629 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00173_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10877 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00176.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 69584 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00176_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4154 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00179.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 13182 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00182.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 93054 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00182_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5370 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00185.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 114793 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00185_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5211 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00188.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 66217 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00188_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4911 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00191.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 15874 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00191_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5394 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00194.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 42875 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00194_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4912 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00197.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8836 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00197_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6532 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00200.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 35675 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00200_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 3230 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00203.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 27063 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00203_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5101 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00206.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 113364 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00206_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6965 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00209.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 28712 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00209_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5488 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00212.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 28855 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00212_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7802 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00215.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 164962 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00215_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 17085 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00218.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 90522 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00218_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 11397 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00221.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 14083 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00224.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10281 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00227.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9943 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00230.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9799 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00233.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9908 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00236.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9350 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00239.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 5790 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00242.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 4842 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00243.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 10871 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00243.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 25486 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00244.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3180 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00244.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 50022 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00245.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3110 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00245.png │ │ │ │ @@ -296,15 +296,15 @@ │ │ │ │ -rw-r--r-- 0 root (0) root (0) 6589 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/dir_b609f53bbb5e26b8e9292001c59476a3.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 2497 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/dir_b609f53bbb5e26b8e9292001c59476a3_dep.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3858 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/dir_de8ef2d1b4283b99fcb86ec9d2fa66db.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 2277 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/dir_de8ef2d1b4283b99fcb86ec9d2fa66db_dep.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3773 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/dir_e68e8157741866f444e17edd764ebbae.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 746 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/doc.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 33676 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/doxygen.css │ │ │ │ --rw-r--r-- 0 root (0) root (0) 27930 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/dune-geometry.tag.gz │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 27922 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/dune-geometry.tag.gz │ │ │ │ -rw-r--r-- 0 root (0) root (0) 4452 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/dynsections.js │ │ │ │ -rw-r--r-- 0 root (0) root (0) 13386 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/files.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 616 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/folderclosed.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 597 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/folderopen.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 2838 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/form_0.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3980 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/form_1.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 2671 2023-01-12 17:09:23.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/form_10.png │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00170.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: affinegeometry.hh File Reference │ │ │ │ +dune-geometry: refinement.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,46 +62,30 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
│ │ │ │ -Classes | │ │ │ │ -Namespaces
│ │ │ │ -
affinegeometry.hh File Reference
│ │ │ │ +
refinement.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

An implementation of the Geometry interface for affine geometries. │ │ │ │ +

This file simply includes all Refinement implementations so you don't have to do them separately. │ │ │ │ More...

│ │ │ │ -
#include <cmath>
│ │ │ │ -#include <dune/common/fmatrix.hh>
│ │ │ │ -#include <dune/common/fvector.hh>
│ │ │ │ -#include <dune/geometry/type.hh>
│ │ │ │ +
#include "refinement/base.cc"
│ │ │ │ +#include "refinement/hcube.cc"
│ │ │ │ +#include "refinement/simplex.cc"
│ │ │ │ +#include "refinement/hcubetriangulation.cc"
│ │ │ │ +#include "refinement/prismtriangulation.cc"
│ │ │ │ +#include "refinement/pyramidtriangulation.cc"
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Classes

class  Dune::AffineGeometry< ct, mydim, cdim >
 Implementation of the Geometry interface for affine geometries. More...
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Namespaces

namespace  Dune
 
namespace  Dune::Geo
 
│ │ │ │

Detailed Description

│ │ │ │ -

An implementation of the Geometry interface for affine geometries.

│ │ │ │ -
Author
Martin Nolte
│ │ │ │ +

This file simply includes all Refinement implementations so you don't have to do them separately.

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,31 +4,23 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ -Classes | Namespaces │ │ │ │ │ -affinegeometry.hh File Reference │ │ │ │ │ -An implementation of the Geometry interface for affine geometries. More... │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +refinement.hh File Reference │ │ │ │ │ +This file simply includes all Refinement implementations so you don't have to │ │ │ │ │ +do them separately. More... │ │ │ │ │ +#include "refinement/base.cc" │ │ │ │ │ +#include "refinement/hcube.cc" │ │ │ │ │ +#include "refinement/simplex.cc" │ │ │ │ │ +#include "refinement/hcubetriangulation.cc" │ │ │ │ │ +#include "refinement/prismtriangulation.cc" │ │ │ │ │ +#include "refinement/pyramidtriangulation.cc" │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ - Classes │ │ │ │ │ -class  Dune::AffineGeometry<_ct,_mydim,_cdim_> │ │ │ │ │ -  Implementation of the Geometry interface for affine geometries. More... │ │ │ │ │ -  │ │ │ │ │ - Namespaces │ │ │ │ │ -namespace  Dune │ │ │ │ │ -  │ │ │ │ │ -namespace  Dune::Geo │ │ │ │ │ -  │ │ │ │ │ ***** Detailed Description ***** │ │ │ │ │ -An implementation of the Geometry interface for affine geometries. │ │ │ │ │ - Author │ │ │ │ │ - Martin Nolte │ │ │ │ │ +This file simply includes all Refinement implementations so you don't have to │ │ │ │ │ +do them separately. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00170_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: affinegeometry.hh Source File │ │ │ │ +dune-geometry: refinement.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,654 +62,42 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
affinegeometry.hh
│ │ │ │ +
refinement.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
2// vi: set et ts=4 sw=2 sts=2:
│ │ │ │
3// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
5#ifndef DUNE_GEOMETRY_AFFINEGEOMETRY_HH
│ │ │ │ -
6#define DUNE_GEOMETRY_AFFINEGEOMETRY_HH
│ │ │ │ +
5#ifndef DUNE_GEOMETRY_REFINEMENT_HH
│ │ │ │ +
6#define DUNE_GEOMETRY_REFINEMENT_HH
│ │ │ │
7
│ │ │ │ -
13#include <cmath>
│ │ │ │ -
14
│ │ │ │ -
15#include <dune/common/fmatrix.hh>
│ │ │ │ -
16#include <dune/common/fvector.hh>
│ │ │ │ -
17
│ │ │ │ -
18#include <dune/geometry/type.hh>
│ │ │ │ -
19
│ │ │ │ -
20namespace Dune
│ │ │ │ -
21{
│ │ │ │ -
22
│ │ │ │ -
23 // External Forward Declarations
│ │ │ │ -
24 // -----------------------------
│ │ │ │ -
25
│ │ │ │ -
26 namespace Geo
│ │ │ │ -
27 {
│ │ │ │ -
28
│ │ │ │ -
29 template< typename Implementation >
│ │ │ │ -
30 class ReferenceElement;
│ │ │ │ -
31
│ │ │ │ -
32 template< class ctype, int dim >
│ │ │ │ - │ │ │ │ -
34
│ │ │ │ -
35 template< class ctype, int dim >
│ │ │ │ -
36 struct ReferenceElements;
│ │ │ │ -
37
│ │ │ │ -
38 }
│ │ │ │ -
39
│ │ │ │ -
40
│ │ │ │ -
41 namespace Impl
│ │ │ │ -
42 {
│ │ │ │ -
43
│ │ │ │ -
44 // FieldMatrixHelper
│ │ │ │ -
45 // -----------------
│ │ │ │ -
46
│ │ │ │ -
47 template< class ct >
│ │ │ │ -
48 struct FieldMatrixHelper
│ │ │ │ -
49 {
│ │ │ │ -
50 typedef ct ctype;
│ │ │ │ -
51
│ │ │ │ -
52 template< int m, int n >
│ │ │ │ -
53 static void Ax ( const FieldMatrix< ctype, m, n > &A, const FieldVector< ctype, n > &x, FieldVector< ctype, m > &ret )
│ │ │ │ -
54 {
│ │ │ │ -
55 for( int i = 0; i < m; ++i )
│ │ │ │ -
56 {
│ │ │ │ -
57 ret[ i ] = ctype( 0 );
│ │ │ │ -
58 for( int j = 0; j < n; ++j )
│ │ │ │ -
59 ret[ i ] += A[ i ][ j ] * x[ j ];
│ │ │ │ -
60 }
│ │ │ │ -
61 }
│ │ │ │ -
62
│ │ │ │ -
63 template< int m, int n >
│ │ │ │ -
64 static void ATx ( const FieldMatrix< ctype, m, n > &A, const FieldVector< ctype, m > &x, FieldVector< ctype, n > &ret )
│ │ │ │ -
65 {
│ │ │ │ -
66 for( int i = 0; i < n; ++i )
│ │ │ │ -
67 {
│ │ │ │ -
68 ret[ i ] = ctype( 0 );
│ │ │ │ -
69 for( int j = 0; j < m; ++j )
│ │ │ │ -
70 ret[ i ] += A[ j ][ i ] * x[ j ];
│ │ │ │ -
71 }
│ │ │ │ -
72 }
│ │ │ │ -
73
│ │ │ │ -
74 template< int m, int n, int p >
│ │ │ │ -
75 static void AB ( const FieldMatrix< ctype, m, n > &A, const FieldMatrix< ctype, n, p > &B, FieldMatrix< ctype, m, p > &ret )
│ │ │ │ -
76 {
│ │ │ │ -
77 for( int i = 0; i < m; ++i )
│ │ │ │ -
78 {
│ │ │ │ -
79 for( int j = 0; j < p; ++j )
│ │ │ │ -
80 {
│ │ │ │ -
81 ret[ i ][ j ] = ctype( 0 );
│ │ │ │ -
82 for( int k = 0; k < n; ++k )
│ │ │ │ -
83 ret[ i ][ j ] += A[ i ][ k ] * B[ k ][ j ];
│ │ │ │ -
84 }
│ │ │ │ -
85 }
│ │ │ │ -
86 }
│ │ │ │ -
87
│ │ │ │ -
88 template< int m, int n, int p >
│ │ │ │ -
89 static void ATBT ( const FieldMatrix< ctype, m, n > &A, const FieldMatrix< ctype, p, m > &B, FieldMatrix< ctype, n, p > &ret )
│ │ │ │ -
90 {
│ │ │ │ -
91 for( int i = 0; i < n; ++i )
│ │ │ │ -
92 {
│ │ │ │ -
93 for( int j = 0; j < p; ++j )
│ │ │ │ -
94 {
│ │ │ │ -
95 ret[ i ][ j ] = ctype( 0 );
│ │ │ │ -
96 for( int k = 0; k < m; ++k )
│ │ │ │ -
97 ret[ i ][ j ] += A[ k ][ i ] * B[ j ][ k ];
│ │ │ │ -
98 }
│ │ │ │ -
99 }
│ │ │ │ -
100 }
│ │ │ │ -
101
│ │ │ │ -
102 template< int m, int n >
│ │ │ │ -
103 static void ATA_L ( const FieldMatrix< ctype, m, n > &A, FieldMatrix< ctype, n, n > &ret )
│ │ │ │ -
104 {
│ │ │ │ -
105 for( int i = 0; i < n; ++i )
│ │ │ │ -
106 {
│ │ │ │ -
107 for( int j = 0; j <= i; ++j )
│ │ │ │ -
108 {
│ │ │ │ -
109 ret[ i ][ j ] = ctype( 0 );
│ │ │ │ -
110 for( int k = 0; k < m; ++k )
│ │ │ │ -
111 ret[ i ][ j ] += A[ k ][ i ] * A[ k ][ j ];
│ │ │ │ -
112 }
│ │ │ │ -
113 }
│ │ │ │ -
114 }
│ │ │ │ -
115
│ │ │ │ -
116 template< int m, int n >
│ │ │ │ -
117 static void ATA ( const FieldMatrix< ctype, m, n > &A, FieldMatrix< ctype, n, n > &ret )
│ │ │ │ -
118 {
│ │ │ │ -
119 for( int i = 0; i < n; ++i )
│ │ │ │ -
120 {
│ │ │ │ -
121 for( int j = 0; j <= i; ++j )
│ │ │ │ -
122 {
│ │ │ │ -
123 ret[ i ][ j ] = ctype( 0 );
│ │ │ │ -
124 for( int k = 0; k < m; ++k )
│ │ │ │ -
125 ret[ i ][ j ] += A[ k ][ i ] * A[ k ][ j ];
│ │ │ │ -
126 ret[ j ][ i ] = ret[ i ][ j ];
│ │ │ │ -
127 }
│ │ │ │ -
128
│ │ │ │ -
129 ret[ i ][ i ] = ctype( 0 );
│ │ │ │ -
130 for( int k = 0; k < m; ++k )
│ │ │ │ -
131 ret[ i ][ i ] += A[ k ][ i ] * A[ k ][ i ];
│ │ │ │ -
132 }
│ │ │ │ -
133 }
│ │ │ │ -
134
│ │ │ │ -
135 template< int m, int n >
│ │ │ │ -
136 static void AAT_L ( const FieldMatrix< ctype, m, n > &A, FieldMatrix< ctype, m, m > &ret )
│ │ │ │ -
137 {
│ │ │ │ -
138 /*
│ │ │ │ -
139 if (m==2) {
│ │ │ │ -
140 ret[0][0] = A[0]*A[0];
│ │ │ │ -
141 ret[1][1] = A[1]*A[1];
│ │ │ │ -
142 ret[1][0] = A[0]*A[1];
│ │ │ │ -
143 }
│ │ │ │ -
144 else
│ │ │ │ -
145 */
│ │ │ │ -
146 for( int i = 0; i < m; ++i )
│ │ │ │ -
147 {
│ │ │ │ -
148 for( int j = 0; j <= i; ++j )
│ │ │ │ -
149 {
│ │ │ │ -
150 ctype &retij = ret[ i ][ j ];
│ │ │ │ -
151 retij = A[ i ][ 0 ] * A[ j ][ 0 ];
│ │ │ │ -
152 for( int k = 1; k < n; ++k )
│ │ │ │ -
153 retij += A[ i ][ k ] * A[ j ][ k ];
│ │ │ │ -
154 }
│ │ │ │ -
155 }
│ │ │ │ -
156 }
│ │ │ │ -
157
│ │ │ │ -
158 template< int m, int n >
│ │ │ │ -
159 static void AAT ( const FieldMatrix< ctype, m, n > &A, FieldMatrix< ctype, m, m > &ret )
│ │ │ │ -
160 {
│ │ │ │ -
161 for( int i = 0; i < m; ++i )
│ │ │ │ -
162 {
│ │ │ │ -
163 for( int j = 0; j < i; ++j )
│ │ │ │ -
164 {
│ │ │ │ -
165 ret[ i ][ j ] = ctype( 0 );
│ │ │ │ -
166 for( int k = 0; k < n; ++k )
│ │ │ │ -
167 ret[ i ][ j ] += A[ i ][ k ] * A[ j ][ k ];
│ │ │ │ -
168 ret[ j ][ i ] = ret[ i ][ j ];
│ │ │ │ -
169 }
│ │ │ │ -
170 ret[ i ][ i ] = ctype( 0 );
│ │ │ │ -
171 for( int k = 0; k < n; ++k )
│ │ │ │ -
172 ret[ i ][ i ] += A[ i ][ k ] * A[ i ][ k ];
│ │ │ │ -
173 }
│ │ │ │ -
174 }
│ │ │ │ -
175
│ │ │ │ -
176 template< int n >
│ │ │ │ -
177 static void Lx ( const FieldMatrix< ctype, n, n > &L, const FieldVector< ctype, n > &x, FieldVector< ctype, n > &ret )
│ │ │ │ -
178 {
│ │ │ │ -
179 for( int i = 0; i < n; ++i )
│ │ │ │ -
180 {
│ │ │ │ -
181 ret[ i ] = ctype( 0 );
│ │ │ │ -
182 for( int j = 0; j <= i; ++j )
│ │ │ │ -
183 ret[ i ] += L[ i ][ j ] * x[ j ];
│ │ │ │ -
184 }
│ │ │ │ -
185 }
│ │ │ │ -
186
│ │ │ │ -
187 template< int n >
│ │ │ │ -
188 static void LTx ( const FieldMatrix< ctype, n, n > &L, const FieldVector< ctype, n > &x, FieldVector< ctype, n > &ret )
│ │ │ │ -
189 {
│ │ │ │ -
190 for( int i = 0; i < n; ++i )
│ │ │ │ -
191 {
│ │ │ │ -
192 ret[ i ] = ctype( 0 );
│ │ │ │ -
193 for( int j = i; j < n; ++j )
│ │ │ │ -
194 ret[ i ] += L[ j ][ i ] * x[ j ];
│ │ │ │ -
195 }
│ │ │ │ -
196 }
│ │ │ │ -
197
│ │ │ │ -
198 template< int n >
│ │ │ │ -
199 static void LTL ( const FieldMatrix< ctype, n, n > &L, FieldMatrix< ctype, n, n > &ret )
│ │ │ │ -
200 {
│ │ │ │ -
201 for( int i = 0; i < n; ++i )
│ │ │ │ -
202 {
│ │ │ │ -
203 for( int j = 0; j < i; ++j )
│ │ │ │ -
204 {
│ │ │ │ -
205 ret[ i ][ j ] = ctype( 0 );
│ │ │ │ -
206 for( int k = i; k < n; ++k )
│ │ │ │ -
207 ret[ i ][ j ] += L[ k ][ i ] * L[ k ][ j ];
│ │ │ │ -
208 ret[ j ][ i ] = ret[ i ][ j ];
│ │ │ │ -
209 }
│ │ │ │ -
210 ret[ i ][ i ] = ctype( 0 );
│ │ │ │ -
211 for( int k = i; k < n; ++k )
│ │ │ │ -
212 ret[ i ][ i ] += L[ k ][ i ] * L[ k ][ i ];
│ │ │ │ -
213 }
│ │ │ │ -
214 }
│ │ │ │ -
215
│ │ │ │ -
216 template< int n >
│ │ │ │ -
217 static void LLT ( const FieldMatrix< ctype, n, n > &L, FieldMatrix< ctype, n, n > &ret )
│ │ │ │ -
218 {
│ │ │ │ -
219 for( int i = 0; i < n; ++i )
│ │ │ │ -
220 {
│ │ │ │ -
221 for( int j = 0; j < i; ++j )
│ │ │ │ -
222 {
│ │ │ │ -
223 ret[ i ][ j ] = ctype( 0 );
│ │ │ │ -
224 for( int k = 0; k <= j; ++k )
│ │ │ │ -
225 ret[ i ][ j ] += L[ i ][ k ] * L[ j ][ k ];
│ │ │ │ -
226 ret[ j ][ i ] = ret[ i ][ j ];
│ │ │ │ -
227 }
│ │ │ │ -
228 ret[ i ][ i ] = ctype( 0 );
│ │ │ │ -
229 for( int k = 0; k <= i; ++k )
│ │ │ │ -
230 ret[ i ][ i ] += L[ i ][ k ] * L[ i ][ k ];
│ │ │ │ -
231 }
│ │ │ │ -
232 }
│ │ │ │ -
233
│ │ │ │ -
234 template< int n >
│ │ │ │ -
235 static bool cholesky_L ( const FieldMatrix< ctype, n, n > &A, FieldMatrix< ctype, n, n > &ret, const bool checkSingular = false )
│ │ │ │ -
236 {
│ │ │ │ -
237 using std::sqrt;
│ │ │ │ -
238 for( int i = 0; i < n; ++i )
│ │ │ │ -
239 {
│ │ │ │ -
240 ctype &rii = ret[ i ][ i ];
│ │ │ │ -
241
│ │ │ │ -
242 ctype xDiag = A[ i ][ i ];
│ │ │ │ -
243 for( int j = 0; j < i; ++j )
│ │ │ │ -
244 xDiag -= ret[ i ][ j ] * ret[ i ][ j ];
│ │ │ │ -
245
│ │ │ │ -
246 // in some cases A can be singular, e.g. when checking local for
│ │ │ │ -
247 // outside points during checkInside
│ │ │ │ -
248 if( checkSingular && ! ( xDiag > ctype( 0 )) )
│ │ │ │ -
249 return false ;
│ │ │ │ -
250
│ │ │ │ -
251 // otherwise this should be true always
│ │ │ │ -
252 assert( xDiag > ctype( 0 ) );
│ │ │ │ -
253 rii = sqrt( xDiag );
│ │ │ │ +
250// The interface (template<...> class StaticRefinement) is not included here
│ │ │ │ +
251// since it derives from parts which I consider implementation. Look
│ │ │ │ +
252// into refinement/base.cc if the documentation is above is not enough.
│ │ │ │ +
253#include "refinement/base.cc"
│ │ │ │
254
│ │ │ │ -
255 ctype invrii = ctype( 1 ) / rii;
│ │ │ │ -
256 for( int k = i+1; k < n; ++k )
│ │ │ │ -
257 {
│ │ │ │ -
258 ctype x = A[ k ][ i ];
│ │ │ │ -
259 for( int j = 0; j < i; ++j )
│ │ │ │ -
260 x -= ret[ i ][ j ] * ret[ k ][ j ];
│ │ │ │ -
261 ret[ k ][ i ] = invrii * x;
│ │ │ │ -
262 }
│ │ │ │ -
263 }
│ │ │ │ -
264
│ │ │ │ -
265 // return true for meaning A is non-singular
│ │ │ │ -
266 return true;
│ │ │ │ -
267 }
│ │ │ │ -
268
│ │ │ │ -
269 template< int n >
│ │ │ │ -
270 static ctype detL ( const FieldMatrix< ctype, n, n > &L )
│ │ │ │ -
271 {
│ │ │ │ -
272 ctype det( 1 );
│ │ │ │ -
273 for( int i = 0; i < n; ++i )
│ │ │ │ -
274 det *= L[ i ][ i ];
│ │ │ │ -
275 return det;
│ │ │ │ -
276 }
│ │ │ │ -
277
│ │ │ │ -
278 template< int n >
│ │ │ │ -
279 static ctype invL ( FieldMatrix< ctype, n, n > &L )
│ │ │ │ -
280 {
│ │ │ │ -
281 ctype det( 1 );
│ │ │ │ -
282 for( int i = 0; i < n; ++i )
│ │ │ │ -
283 {
│ │ │ │ -
284 ctype &lii = L[ i ][ i ];
│ │ │ │ -
285 det *= lii;
│ │ │ │ -
286 lii = ctype( 1 ) / lii;
│ │ │ │ -
287 for( int j = 0; j < i; ++j )
│ │ │ │ -
288 {
│ │ │ │ -
289 ctype &lij = L[ i ][ j ];
│ │ │ │ -
290 ctype x = lij * L[ j ][ j ];
│ │ │ │ -
291 for( int k = j+1; k < i; ++k )
│ │ │ │ -
292 x += L[ i ][ k ] * L[ k ][ j ];
│ │ │ │ -
293 lij = (-lii) * x;
│ │ │ │ -
294 }
│ │ │ │ -
295 }
│ │ │ │ -
296 return det;
│ │ │ │ -
297 }
│ │ │ │ -
298
│ │ │ │ -
299 // calculates x := L^{-1} x
│ │ │ │ -
300 template< int n >
│ │ │ │ -
301 static void invLx ( FieldMatrix< ctype, n, n > &L, FieldVector< ctype, n > &x )
│ │ │ │ -
302 {
│ │ │ │ -
303 for( int i = 0; i < n; ++i )
│ │ │ │ -
304 {
│ │ │ │ -
305 for( int j = 0; j < i; ++j )
│ │ │ │ -
306 x[ i ] -= L[ i ][ j ] * x[ j ];
│ │ │ │ -
307 x[ i ] /= L[ i ][ i ];
│ │ │ │ -
308 }
│ │ │ │ -
309 }
│ │ │ │ -
310
│ │ │ │ -
311 // calculates x := L^{-T} x
│ │ │ │ -
312 template< int n >
│ │ │ │ -
313 static void invLTx ( FieldMatrix< ctype, n, n > &L, FieldVector< ctype, n > &x )
│ │ │ │ -
314 {
│ │ │ │ -
315 for( int i = n; i > 0; --i )
│ │ │ │ -
316 {
│ │ │ │ -
317 for( int j = i; j < n; ++j )
│ │ │ │ -
318 x[ i-1 ] -= L[ j ][ i-1 ] * x[ j ];
│ │ │ │ -
319 x[ i-1 ] /= L[ i-1 ][ i-1 ];
│ │ │ │ -
320 }
│ │ │ │ -
321 }
│ │ │ │ -
322
│ │ │ │ -
323 template< int n >
│ │ │ │ -
324 static ctype spdDetA ( const FieldMatrix< ctype, n, n > &A )
│ │ │ │ -
325 {
│ │ │ │ -
326 // return A[0][0]*A[1][1]-A[1][0]*A[1][0];
│ │ │ │ -
327 FieldMatrix< ctype, n, n > L;
│ │ │ │ -
328 cholesky_L( A, L );
│ │ │ │ -
329 return detL( L );
│ │ │ │ -
330 }
│ │ │ │ -
331
│ │ │ │ -
332 template< int n >
│ │ │ │ -
333 static ctype spdInvA ( FieldMatrix< ctype, n, n > &A )
│ │ │ │ -
334 {
│ │ │ │ -
335 FieldMatrix< ctype, n, n > L;
│ │ │ │ -
336 cholesky_L( A, L );
│ │ │ │ -
337 const ctype det = invL( L );
│ │ │ │ -
338 LTL( L, A );
│ │ │ │ -
339 return det;
│ │ │ │ -
340 }
│ │ │ │ -
341
│ │ │ │ -
342 // calculate x := A^{-1} x
│ │ │ │ -
343 template< int n >
│ │ │ │ -
344 static bool spdInvAx ( FieldMatrix< ctype, n, n > &A, FieldVector< ctype, n > &x, const bool checkSingular = false )
│ │ │ │ -
345 {
│ │ │ │ -
346 FieldMatrix< ctype, n, n > L;
│ │ │ │ -
347 const bool invertible = cholesky_L( A, L, checkSingular );
│ │ │ │ -
348 if( ! invertible ) return invertible ;
│ │ │ │ -
349 invLx( L, x );
│ │ │ │ -
350 invLTx( L, x );
│ │ │ │ -
351 return invertible;
│ │ │ │ -
352 }
│ │ │ │ -
353
│ │ │ │ -
354 template< int m, int n >
│ │ │ │ -
355 static ctype detATA ( const FieldMatrix< ctype, m, n > &A )
│ │ │ │ -
356 {
│ │ │ │ -
357 if( m >= n )
│ │ │ │ -
358 {
│ │ │ │ -
359 FieldMatrix< ctype, n, n > ata;
│ │ │ │ -
360 ATA_L( A, ata );
│ │ │ │ -
361 return spdDetA( ata );
│ │ │ │ -
362 }
│ │ │ │ -
363 else
│ │ │ │ -
364 return ctype( 0 );
│ │ │ │ -
365 }
│ │ │ │ -
366
│ │ │ │ -
372 template< int m, int n >
│ │ │ │ -
373 static ctype sqrtDetAAT ( const FieldMatrix< ctype, m, n > &A )
│ │ │ │ -
374 {
│ │ │ │ -
375 using std::abs;
│ │ │ │ -
376 using std::sqrt;
│ │ │ │ -
377 // These special cases are here not only for speed reasons:
│ │ │ │ -
378 // The general implementation aborts if the matrix is almost singular,
│ │ │ │ -
379 // and the special implementation provide a stable way to handle that case.
│ │ │ │ -
380 if( (n == 2) && (m == 2) )
│ │ │ │ -
381 {
│ │ │ │ -
382 // Special implementation for 2x2 matrices: faster and more stable
│ │ │ │ -
383 return abs( A[ 0 ][ 0 ]*A[ 1 ][ 1 ] - A[ 1 ][ 0 ]*A[ 0 ][ 1 ] );
│ │ │ │ -
384 }
│ │ │ │ -
385 else if( (n == 3) && (m == 3) )
│ │ │ │ -
386 {
│ │ │ │ -
387 // Special implementation for 3x3 matrices
│ │ │ │ -
388 const ctype v0 = A[ 0 ][ 1 ] * A[ 1 ][ 2 ] - A[ 1 ][ 1 ] * A[ 0 ][ 2 ];
│ │ │ │ -
389 const ctype v1 = A[ 0 ][ 2 ] * A[ 1 ][ 0 ] - A[ 1 ][ 2 ] * A[ 0 ][ 0 ];
│ │ │ │ -
390 const ctype v2 = A[ 0 ][ 0 ] * A[ 1 ][ 1 ] - A[ 1 ][ 0 ] * A[ 0 ][ 1 ];
│ │ │ │ -
391 return abs( v0 * A[ 2 ][ 0 ] + v1 * A[ 2 ][ 1 ] + v2 * A[ 2 ][ 2 ] );
│ │ │ │ -
392 }
│ │ │ │ -
393 else if ( (n == 3) && (m == 2) )
│ │ │ │ -
394 {
│ │ │ │ -
395 // Special implementation for 2x3 matrices
│ │ │ │ -
396 const ctype v0 = A[ 0 ][ 0 ] * A[ 1 ][ 1 ] - A[ 0 ][ 1 ] * A[ 1 ][ 0 ];
│ │ │ │ -
397 const ctype v1 = A[ 0 ][ 0 ] * A[ 1 ][ 2 ] - A[ 1 ][ 0 ] * A[ 0 ][ 2 ];
│ │ │ │ -
398 const ctype v2 = A[ 0 ][ 1 ] * A[ 1 ][ 2 ] - A[ 0 ][ 2 ] * A[ 1 ][ 1 ];
│ │ │ │ -
399 return sqrt( v0*v0 + v1*v1 + v2*v2);
│ │ │ │ -
400 }
│ │ │ │ -
401 else if( n >= m )
│ │ │ │ -
402 {
│ │ │ │ -
403 // General case
│ │ │ │ -
404 FieldMatrix< ctype, m, m > aat;
│ │ │ │ -
405 AAT_L( A, aat );
│ │ │ │ -
406 return spdDetA( aat );
│ │ │ │ -
407 }
│ │ │ │ -
408 else
│ │ │ │ -
409 return ctype( 0 );
│ │ │ │ -
410 }
│ │ │ │ -
411
│ │ │ │ -
412 // A^{-1}_L = (A^T A)^{-1} A^T
│ │ │ │ -
413 // => A^{-1}_L A = I
│ │ │ │ -
414 template< int m, int n >
│ │ │ │ -
415 static ctype leftInvA ( const FieldMatrix< ctype, m, n > &A, FieldMatrix< ctype, n, m > &ret )
│ │ │ │ -
416 {
│ │ │ │ -
417 static_assert((m >= n), "Matrix has no left inverse.");
│ │ │ │ -
418 FieldMatrix< ctype, n, n > ata;
│ │ │ │ -
419 ATA_L( A, ata );
│ │ │ │ -
420 const ctype det = spdInvA( ata );
│ │ │ │ -
421 ATBT( ata, A, ret );
│ │ │ │ -
422 return det;
│ │ │ │ -
423 }
│ │ │ │ -
424
│ │ │ │ -
425 template< int m, int n >
│ │ │ │ -
426 static void leftInvAx ( const FieldMatrix< ctype, m, n > &A, const FieldVector< ctype, m > &x, FieldVector< ctype, n > &y )
│ │ │ │ -
427 {
│ │ │ │ -
428 static_assert((m >= n), "Matrix has no left inverse.");
│ │ │ │ -
429 FieldMatrix< ctype, n, n > ata;
│ │ │ │ -
430 ATx( A, x, y );
│ │ │ │ -
431 ATA_L( A, ata );
│ │ │ │ -
432 spdInvAx( ata, y );
│ │ │ │ -
433 }
│ │ │ │ -
434
│ │ │ │ -
436 template< int m, int n >
│ │ │ │ -
437 static ctype rightInvA ( const FieldMatrix< ctype, m, n > &A, FieldMatrix< ctype, n, m > &ret )
│ │ │ │ -
438 {
│ │ │ │ -
439 static_assert((n >= m), "Matrix has no right inverse.");
│ │ │ │ -
440 using std::abs;
│ │ │ │ -
441 if( (n == 2) && (m == 2) )
│ │ │ │ -
442 {
│ │ │ │ -
443 const ctype det = (A[ 0 ][ 0 ]*A[ 1 ][ 1 ] - A[ 1 ][ 0 ]*A[ 0 ][ 1 ]);
│ │ │ │ -
444 const ctype detInv = ctype( 1 ) / det;
│ │ │ │ -
445 ret[ 0 ][ 0 ] = A[ 1 ][ 1 ] * detInv;
│ │ │ │ -
446 ret[ 1 ][ 1 ] = A[ 0 ][ 0 ] * detInv;
│ │ │ │ -
447 ret[ 1 ][ 0 ] = -A[ 1 ][ 0 ] * detInv;
│ │ │ │ -
448 ret[ 0 ][ 1 ] = -A[ 0 ][ 1 ] * detInv;
│ │ │ │ -
449 return abs( det );
│ │ │ │ -
450 }
│ │ │ │ -
451 else
│ │ │ │ -
452 {
│ │ │ │ -
453 FieldMatrix< ctype, m , m > aat;
│ │ │ │ -
454 AAT_L( A, aat );
│ │ │ │ -
455 const ctype det = spdInvA( aat );
│ │ │ │ -
456 ATBT( A , aat , ret );
│ │ │ │ -
457 return det;
│ │ │ │ -
458 }
│ │ │ │ -
459 }
│ │ │ │ -
460
│ │ │ │ -
461 template< int m, int n >
│ │ │ │ -
462 static bool xTRightInvA ( const FieldMatrix< ctype, m, n > &A, const FieldVector< ctype, n > &x, FieldVector< ctype, m > &y )
│ │ │ │ -
463 {
│ │ │ │ -
464 static_assert((n >= m), "Matrix has no right inverse.");
│ │ │ │ -
465 FieldMatrix< ctype, m, m > aat;
│ │ │ │ -
466 Ax( A, x, y );
│ │ │ │ -
467 AAT_L( A, aat );
│ │ │ │ -
468 // check whether aat is singular and return true if non-singular
│ │ │ │ -
469 return spdInvAx( aat, y, true );
│ │ │ │ -
470 }
│ │ │ │ -
471 };
│ │ │ │ -
472
│ │ │ │ -
473 } // namespace Impl
│ │ │ │ -
474
│ │ │ │ -
475
│ │ │ │ -
476
│ │ │ │ -
482 template< class ct, int mydim, int cdim>
│ │ │ │ - │ │ │ │ -
484 {
│ │ │ │ -
485 public:
│ │ │ │ -
486
│ │ │ │ -
488 typedef ct ctype;
│ │ │ │ -
489
│ │ │ │ -
491 static const int mydimension= mydim;
│ │ │ │ -
492
│ │ │ │ -
494 static const int coorddimension = cdim;
│ │ │ │ -
495
│ │ │ │ -
497 typedef FieldVector< ctype, mydimension > LocalCoordinate;
│ │ │ │ -
498
│ │ │ │ -
500 typedef FieldVector< ctype, coorddimension > GlobalCoordinate;
│ │ │ │ -
501
│ │ │ │ -
503 typedef ctype Volume;
│ │ │ │ -
504
│ │ │ │ -
506 typedef FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed;
│ │ │ │ -
507
│ │ │ │ -
509 typedef FieldMatrix< ctype, coorddimension, mydimension > JacobianInverseTransposed;
│ │ │ │ -
510
│ │ │ │ -
512 typedef FieldMatrix< ctype, coorddimension, mydimension > Jacobian;
│ │ │ │ -
513
│ │ │ │ -
515 typedef FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse;
│ │ │ │ -
516
│ │ │ │ -
517 private:
│ │ │ │ - │ │ │ │ -
520
│ │ │ │ - │ │ │ │ -
522
│ │ │ │ -
523 // Helper class to compute a matrix pseudo inverse
│ │ │ │ -
524 typedef Impl::FieldMatrixHelper< ct > MatrixHelper;
│ │ │ │ -
525
│ │ │ │ -
526 public:
│ │ │ │ -
528 AffineGeometry ( const ReferenceElement &refElement, const GlobalCoordinate &origin,
│ │ │ │ -
529 const JacobianTransposed &jt )
│ │ │ │ -
530 : refElement_(refElement), origin_(origin), jacobianTransposed_(jt)
│ │ │ │ -
531 {
│ │ │ │ -
532 integrationElement_ = MatrixHelper::template rightInvA< mydimension, coorddimension >( jacobianTransposed_, jacobianInverseTransposed_ );
│ │ │ │ -
533 }
│ │ │ │ -
534
│ │ │ │ - │ │ │ │ -
537 const JacobianTransposed &jt )
│ │ │ │ -
538 : AffineGeometry(ReferenceElements::general( gt ), origin, jt)
│ │ │ │ -
539 { }
│ │ │ │ -
540
│ │ │ │ -
542 template< class CoordVector >
│ │ │ │ -
543 AffineGeometry ( const ReferenceElement &refElement, const CoordVector &coordVector )
│ │ │ │ -
544 : refElement_(refElement), origin_(coordVector[0])
│ │ │ │ -
545 {
│ │ │ │ -
546 for( int i = 0; i < mydimension; ++i )
│ │ │ │ -
547 jacobianTransposed_[ i ] = coordVector[ i+1 ] - origin_;
│ │ │ │ -
548 integrationElement_ = MatrixHelper::template rightInvA< mydimension, coorddimension >( jacobianTransposed_, jacobianInverseTransposed_ );
│ │ │ │ -
549 }
│ │ │ │ -
550
│ │ │ │ -
552 template< class CoordVector >
│ │ │ │ -
553 AffineGeometry ( Dune::GeometryType gt, const CoordVector &coordVector )
│ │ │ │ -
554 : AffineGeometry(ReferenceElements::general( gt ), coordVector)
│ │ │ │ -
555 { }
│ │ │ │ -
556
│ │ │ │ -
558 bool affine () const { return true; }
│ │ │ │ -
559
│ │ │ │ -
561 Dune::GeometryType type () const { return refElement_.type(); }
│ │ │ │ -
562
│ │ │ │ -
564 int corners () const { return refElement_.size( mydimension ); }
│ │ │ │ -
565
│ │ │ │ -
567 GlobalCoordinate corner ( int i ) const
│ │ │ │ -
568 {
│ │ │ │ -
569 return global( refElement_.position( i, mydimension ) );
│ │ │ │ -
570 }
│ │ │ │ -
571
│ │ │ │ -
573 GlobalCoordinate center () const { return global( refElement_.position( 0, 0 ) ); }
│ │ │ │ -
574
│ │ │ │ - │ │ │ │ -
582 {
│ │ │ │ -
583 GlobalCoordinate global( origin_ );
│ │ │ │ -
584 jacobianTransposed_.umtv( local, global );
│ │ │ │ -
585 return global;
│ │ │ │ -
586 }
│ │ │ │ -
587
│ │ │ │ - │ │ │ │ -
602 {
│ │ │ │ -
603 LocalCoordinate local;
│ │ │ │ -
604 jacobianInverseTransposed_.mtv( global - origin_, local );
│ │ │ │ -
605 return local;
│ │ │ │ -
606 }
│ │ │ │ -
607
│ │ │ │ -
618 ctype integrationElement ([[maybe_unused]] const LocalCoordinate &local) const
│ │ │ │ -
619 {
│ │ │ │ -
620 return integrationElement_;
│ │ │ │ -
621 }
│ │ │ │ -
622
│ │ │ │ -
624 Volume volume () const
│ │ │ │ -
625 {
│ │ │ │ -
626 return integrationElement_ * refElement_.volume();
│ │ │ │ -
627 }
│ │ │ │ -
628
│ │ │ │ -
635 const JacobianTransposed &jacobianTransposed ([[maybe_unused]] const LocalCoordinate &local) const
│ │ │ │ -
636 {
│ │ │ │ -
637 return jacobianTransposed_;
│ │ │ │ -
638 }
│ │ │ │ -
639
│ │ │ │ -
646 const JacobianInverseTransposed &jacobianInverseTransposed ([[maybe_unused]] const LocalCoordinate &local) const
│ │ │ │ -
647 {
│ │ │ │ -
648 return jacobianInverseTransposed_;
│ │ │ │ -
649 }
│ │ │ │ -
650
│ │ │ │ -
657 Jacobian jacobian ([[maybe_unused]] const LocalCoordinate &local) const
│ │ │ │ -
658 {
│ │ │ │ -
659 return jacobianTransposed_.transposed();
│ │ │ │ -
660 }
│ │ │ │ -
661
│ │ │ │ -
668 JacobianInverse jacobianInverse ([[maybe_unused]] const LocalCoordinate &local) const
│ │ │ │ -
669 {
│ │ │ │ -
670 return jacobianInverseTransposed_.transposed();
│ │ │ │ -
671 }
│ │ │ │ -
672
│ │ │ │ - │ │ │ │ -
674 {
│ │ │ │ -
675 return geometry.refElement_;
│ │ │ │ -
676 }
│ │ │ │ -
677
│ │ │ │ -
678 private:
│ │ │ │ -
679 ReferenceElement refElement_;
│ │ │ │ -
680 GlobalCoordinate origin_;
│ │ │ │ -
681 JacobianTransposed jacobianTransposed_;
│ │ │ │ -
682 JacobianInverseTransposed jacobianInverseTransposed_;
│ │ │ │ -
683 ctype integrationElement_;
│ │ │ │ -
684 };
│ │ │ │ -
685
│ │ │ │ -
686} // namespace Dune
│ │ │ │ -
687
│ │ │ │ -
688#endif // #ifndef DUNE_GEOMETRY_AFFINEGEOMETRY_HH
│ │ │ │ -
A unique label for each type of element that can occur in a grid.
│ │ │ │ -
unspecified-type ReferenceElement
Returns the type of reference element for the argument type T.
Definition: referenceelements.hh:497
│ │ │ │ -
Definition: affinegeometry.hh:21
│ │ │ │ -
This class provides access to geometric and topological properties of a reference element.
Definition: referenceelement.hh:52
│ │ │ │ -
CoordinateField volume() const
obtain the volume of the reference element
Definition: referenceelement.hh:241
│ │ │ │ -
decltype(auto) type(int i, int c) const
obtain the type of subentity (i,c)
Definition: referenceelement.hh:171
│ │ │ │ -
int size(int c) const
number of subentities of codimension c
Definition: referenceelement.hh:94
│ │ │ │ -
decltype(auto) position(int i, int c) const
position of the barycenter of entity (i,c)
Definition: referenceelement.hh:203
│ │ │ │ -
Definition: affinegeometry.hh:33
│ │ │ │ -
Class providing access to the singletons of the reference elements.
Definition: referenceelements.hh:170
│ │ │ │ -
Implementation of the Geometry interface for affine geometries.
Definition: affinegeometry.hh:484
│ │ │ │ -
AffineGeometry(const ReferenceElement &refElement, const CoordVector &coordVector)
Create affine geometry from reference element and a vector of vertex coordinates.
Definition: affinegeometry.hh:543
│ │ │ │ -
AffineGeometry(Dune::GeometryType gt, const GlobalCoordinate &origin, const JacobianTransposed &jt)
Create affine geometry from GeometryType, one vertex, and the Jacobian matrix.
Definition: affinegeometry.hh:536
│ │ │ │ -
FieldVector< ctype, mydimension > LocalCoordinate
Type for local coordinate vector.
Definition: affinegeometry.hh:497
│ │ │ │ -
Dune::GeometryType type() const
Obtain the type of the reference element.
Definition: affinegeometry.hh:561
│ │ │ │ -
static const int mydimension
Dimension of the geometry.
Definition: affinegeometry.hh:491
│ │ │ │ -
AffineGeometry(const ReferenceElement &refElement, const GlobalCoordinate &origin, const JacobianTransposed &jt)
Create affine geometry from reference element, one vertex, and the Jacobian matrix.
Definition: affinegeometry.hh:528
│ │ │ │ -
ctype Volume
Type used for volume.
Definition: affinegeometry.hh:503
│ │ │ │ -
JacobianInverse jacobianInverse(const LocalCoordinate &local) const
Obtain the Jacobian's inverse.
Definition: affinegeometry.hh:668
│ │ │ │ -
friend ReferenceElement referenceElement(const AffineGeometry &geometry)
Definition: affinegeometry.hh:673
│ │ │ │ -
AffineGeometry(Dune::GeometryType gt, const CoordVector &coordVector)
Create affine geometry from GeometryType and a vector of vertex coordinates.
Definition: affinegeometry.hh:553
│ │ │ │ -
ctype integrationElement(const LocalCoordinate &local) const
Obtain the integration element.
Definition: affinegeometry.hh:618
│ │ │ │ -
FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse
Type for the inverse Jacobian matrix.
Definition: affinegeometry.hh:515
│ │ │ │ -
FieldMatrix< ctype, coorddimension, mydimension > Jacobian
Type for the Jacobian matrix.
Definition: affinegeometry.hh:512
│ │ │ │ -
const JacobianInverseTransposed & jacobianInverseTransposed(const LocalCoordinate &local) const
Obtain the transposed of the Jacobian's inverse.
Definition: affinegeometry.hh:646
│ │ │ │ -
FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed
Type for the transposed Jacobian matrix.
Definition: affinegeometry.hh:506
│ │ │ │ -
GlobalCoordinate corner(int i) const
Obtain coordinates of the i-th corner.
Definition: affinegeometry.hh:567
│ │ │ │ -
int corners() const
Obtain number of corners of the corresponding reference element.
Definition: affinegeometry.hh:564
│ │ │ │ -
FieldMatrix< ctype, coorddimension, mydimension > JacobianInverseTransposed
Type for the transposed inverse Jacobian matrix.
Definition: affinegeometry.hh:509
│ │ │ │ -
static const int coorddimension
Dimension of the world space.
Definition: affinegeometry.hh:494
│ │ │ │ -
GlobalCoordinate global(const LocalCoordinate &local) const
Evaluate the mapping.
Definition: affinegeometry.hh:581
│ │ │ │ -
GlobalCoordinate center() const
Obtain the centroid of the mapping's image.
Definition: affinegeometry.hh:573
│ │ │ │ -
Jacobian jacobian(const LocalCoordinate &local) const
Obtain the Jacobian.
Definition: affinegeometry.hh:657
│ │ │ │ -
ct ctype
Type used for coordinates.
Definition: affinegeometry.hh:488
│ │ │ │ -
FieldVector< ctype, coorddimension > GlobalCoordinate
Type for coordinate vector in world space.
Definition: affinegeometry.hh:500
│ │ │ │ -
bool affine() const
Always true: this is an affine geometry.
Definition: affinegeometry.hh:558
│ │ │ │ -
const JacobianTransposed & jacobianTransposed(const LocalCoordinate &local) const
Obtain the transposed of the Jacobian.
Definition: affinegeometry.hh:635
│ │ │ │ -
Volume volume() const
Obtain the volume of the element.
Definition: affinegeometry.hh:624
│ │ │ │ -
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:125
│ │ │ │ +
255#include "refinement/hcube.cc"
│ │ │ │ +
256#include "refinement/simplex.cc"
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
260
│ │ │ │ +
261#endif // DUNE_GEOMETRY_REFINEMENT_HH
│ │ │ │ +
This file contains the Refinement implementation for simplices (triangles, tetrahedrons....
│ │ │ │ +
This file contains the parts independent of a particular Refinement implementation.
│ │ │ │ + │ │ │ │ +
This file contains the Refinement implementation for hypercubes (quadrilaterals, hexahedrons,...
│ │ │ │ + │ │ │ │ +
This file contains the Refinement implementation for triangulating hypercubes (quadrilateral -> trian...
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,797 +4,47 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ -affinegeometry.hh │ │ │ │ │ +refinement.hh │ │ │ │ │ Go_to_the_documentation_of_this_file. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ - 5#ifndef DUNE_GEOMETRY_AFFINEGEOMETRY_HH │ │ │ │ │ - 6#define DUNE_GEOMETRY_AFFINEGEOMETRY_HH │ │ │ │ │ + 5#ifndef DUNE_GEOMETRY_REFINEMENT_HH │ │ │ │ │ + 6#define DUNE_GEOMETRY_REFINEMENT_HH │ │ │ │ │ 7 │ │ │ │ │ - 13#include │ │ │ │ │ - 14 │ │ │ │ │ - 15#include │ │ │ │ │ - 16#include │ │ │ │ │ - 17 │ │ │ │ │ - 18#include │ │ │ │ │ - 19 │ │ │ │ │ -20namespace Dune │ │ │ │ │ - 21{ │ │ │ │ │ - 22 │ │ │ │ │ - 23 // External Forward Declarations │ │ │ │ │ - 24 // ----------------------------- │ │ │ │ │ - 25 │ │ │ │ │ -26 namespace Geo │ │ │ │ │ - 27 { │ │ │ │ │ - 28 │ │ │ │ │ - 29 template< typename Implementation > │ │ │ │ │ - 30 class ReferenceElement; │ │ │ │ │ - 31 │ │ │ │ │ - 32 template< class ctype, int dim > │ │ │ │ │ -33 class ReferenceElementImplementation; │ │ │ │ │ - 34 │ │ │ │ │ - 35 template< class ctype, int dim > │ │ │ │ │ - 36 struct ReferenceElements; │ │ │ │ │ - 37 │ │ │ │ │ - 38 } │ │ │ │ │ - 39 │ │ │ │ │ - 40 │ │ │ │ │ - 41 namespace Impl │ │ │ │ │ - 42 { │ │ │ │ │ - 43 │ │ │ │ │ - 44 // FieldMatrixHelper │ │ │ │ │ - 45 // ----------------- │ │ │ │ │ - 46 │ │ │ │ │ - 47 template< class ct > │ │ │ │ │ - 48 struct FieldMatrixHelper │ │ │ │ │ - 49 { │ │ │ │ │ - 50 typedef ct ctype; │ │ │ │ │ - 51 │ │ │ │ │ - 52 template< int m, int n > │ │ │ │ │ - 53 static void Ax ( const FieldMatrix< ctype, m, n > &A, const FieldVector< │ │ │ │ │ -ctype, n > &x, FieldVector< ctype, m > &ret ) │ │ │ │ │ - 54 { │ │ │ │ │ - 55 for( int i = 0; i < m; ++i ) │ │ │ │ │ - 56 { │ │ │ │ │ - 57 ret[ i ] = ctype( 0 ); │ │ │ │ │ - 58 for( int j = 0; j < n; ++j ) │ │ │ │ │ - 59 ret[ i ] += A[ i ][ j ] * x[ j ]; │ │ │ │ │ - 60 } │ │ │ │ │ - 61 } │ │ │ │ │ - 62 │ │ │ │ │ - 63 template< int m, int n > │ │ │ │ │ - 64 static void ATx ( const FieldMatrix< ctype, m, n > &A, const FieldVector< │ │ │ │ │ -ctype, m > &x, FieldVector< ctype, n > &ret ) │ │ │ │ │ - 65 { │ │ │ │ │ - 66 for( int i = 0; i < n; ++i ) │ │ │ │ │ - 67 { │ │ │ │ │ - 68 ret[ i ] = ctype( 0 ); │ │ │ │ │ - 69 for( int j = 0; j < m; ++j ) │ │ │ │ │ - 70 ret[ i ] += A[ j ][ i ] * x[ j ]; │ │ │ │ │ - 71 } │ │ │ │ │ - 72 } │ │ │ │ │ - 73 │ │ │ │ │ - 74 template< int m, int n, int p > │ │ │ │ │ - 75 static void AB ( const FieldMatrix< ctype, m, n > &A, const FieldMatrix< │ │ │ │ │ -ctype, n, p > &B, FieldMatrix< ctype, m, p > &ret ) │ │ │ │ │ - 76 { │ │ │ │ │ - 77 for( int i = 0; i < m; ++i ) │ │ │ │ │ - 78 { │ │ │ │ │ - 79 for( int j = 0; j < p; ++j ) │ │ │ │ │ - 80 { │ │ │ │ │ - 81 ret[ i ][ j ] = ctype( 0 ); │ │ │ │ │ - 82 for( int k = 0; k < n; ++k ) │ │ │ │ │ - 83 ret[ i ][ j ] += A[ i ][ k ] * B[ k ][ j ]; │ │ │ │ │ - 84 } │ │ │ │ │ - 85 } │ │ │ │ │ - 86 } │ │ │ │ │ - 87 │ │ │ │ │ - 88 template< int m, int n, int p > │ │ │ │ │ - 89 static void ATBT ( const FieldMatrix< ctype, m, n > &A, const FieldMatrix< │ │ │ │ │ -ctype, p, m > &B, FieldMatrix< ctype, n, p > &ret ) │ │ │ │ │ - 90 { │ │ │ │ │ - 91 for( int i = 0; i < n; ++i ) │ │ │ │ │ - 92 { │ │ │ │ │ - 93 for( int j = 0; j < p; ++j ) │ │ │ │ │ - 94 { │ │ │ │ │ - 95 ret[ i ][ j ] = ctype( 0 ); │ │ │ │ │ - 96 for( int k = 0; k < m; ++k ) │ │ │ │ │ - 97 ret[ i ][ j ] += A[ k ][ i ] * B[ j ][ k ]; │ │ │ │ │ - 98 } │ │ │ │ │ - 99 } │ │ │ │ │ - 100 } │ │ │ │ │ - 101 │ │ │ │ │ - 102 template< int m, int n > │ │ │ │ │ - 103 static void ATA_L ( const FieldMatrix< ctype, m, n > &A, FieldMatrix< │ │ │ │ │ -ctype, n, n > &ret ) │ │ │ │ │ - 104 { │ │ │ │ │ - 105 for( int i = 0; i < n; ++i ) │ │ │ │ │ - 106 { │ │ │ │ │ - 107 for( int j = 0; j <= i; ++j ) │ │ │ │ │ - 108 { │ │ │ │ │ - 109 ret[ i ][ j ] = ctype( 0 ); │ │ │ │ │ - 110 for( int k = 0; k < m; ++k ) │ │ │ │ │ - 111 ret[ i ][ j ] += A[ k ][ i ] * A[ k ][ j ]; │ │ │ │ │ - 112 } │ │ │ │ │ - 113 } │ │ │ │ │ - 114 } │ │ │ │ │ - 115 │ │ │ │ │ - 116 template< int m, int n > │ │ │ │ │ - 117 static void ATA ( const FieldMatrix< ctype, m, n > &A, FieldMatrix< ctype, │ │ │ │ │ -n, n > &ret ) │ │ │ │ │ - 118 { │ │ │ │ │ - 119 for( int i = 0; i < n; ++i ) │ │ │ │ │ - 120 { │ │ │ │ │ - 121 for( int j = 0; j <= i; ++j ) │ │ │ │ │ - 122 { │ │ │ │ │ - 123 ret[ i ][ j ] = ctype( 0 ); │ │ │ │ │ - 124 for( int k = 0; k < m; ++k ) │ │ │ │ │ - 125 ret[ i ][ j ] += A[ k ][ i ] * A[ k ][ j ]; │ │ │ │ │ - 126 ret[ j ][ i ] = ret[ i ][ j ]; │ │ │ │ │ - 127 } │ │ │ │ │ - 128 │ │ │ │ │ - 129 ret[ i ][ i ] = ctype( 0 ); │ │ │ │ │ - 130 for( int k = 0; k < m; ++k ) │ │ │ │ │ - 131 ret[ i ][ i ] += A[ k ][ i ] * A[ k ][ i ]; │ │ │ │ │ - 132 } │ │ │ │ │ - 133 } │ │ │ │ │ - 134 │ │ │ │ │ - 135 template< int m, int n > │ │ │ │ │ - 136 static void AAT_L ( const FieldMatrix< ctype, m, n > &A, FieldMatrix< │ │ │ │ │ -ctype, m, m > &ret ) │ │ │ │ │ - 137 { │ │ │ │ │ - 138 /* │ │ │ │ │ - 139 if (m==2) { │ │ │ │ │ - 140 ret[0][0] = A[0]*A[0]; │ │ │ │ │ - 141 ret[1][1] = A[1]*A[1]; │ │ │ │ │ - 142 ret[1][0] = A[0]*A[1]; │ │ │ │ │ - 143 } │ │ │ │ │ - 144 else │ │ │ │ │ - 145 */ │ │ │ │ │ - 146 for( int i = 0; i < m; ++i ) │ │ │ │ │ - 147 { │ │ │ │ │ - 148 for( int j = 0; j <= i; ++j ) │ │ │ │ │ - 149 { │ │ │ │ │ - 150 ctype &retij = ret[ i ][ j ]; │ │ │ │ │ - 151 retij = A[ i ][ 0 ] * A[ j ][ 0 ]; │ │ │ │ │ - 152 for( int k = 1; k < n; ++k ) │ │ │ │ │ - 153 retij += A[ i ][ k ] * A[ j ][ k ]; │ │ │ │ │ - 154 } │ │ │ │ │ - 155 } │ │ │ │ │ - 156 } │ │ │ │ │ - 157 │ │ │ │ │ - 158 template< int m, int n > │ │ │ │ │ - 159 static void AAT ( const FieldMatrix< ctype, m, n > &A, FieldMatrix< ctype, │ │ │ │ │ -m, m > &ret ) │ │ │ │ │ - 160 { │ │ │ │ │ - 161 for( int i = 0; i < m; ++i ) │ │ │ │ │ - 162 { │ │ │ │ │ - 163 for( int j = 0; j < i; ++j ) │ │ │ │ │ - 164 { │ │ │ │ │ - 165 ret[ i ][ j ] = ctype( 0 ); │ │ │ │ │ - 166 for( int k = 0; k < n; ++k ) │ │ │ │ │ - 167 ret[ i ][ j ] += A[ i ][ k ] * A[ j ][ k ]; │ │ │ │ │ - 168 ret[ j ][ i ] = ret[ i ][ j ]; │ │ │ │ │ - 169 } │ │ │ │ │ - 170 ret[ i ][ i ] = ctype( 0 ); │ │ │ │ │ - 171 for( int k = 0; k < n; ++k ) │ │ │ │ │ - 172 ret[ i ][ i ] += A[ i ][ k ] * A[ i ][ k ]; │ │ │ │ │ - 173 } │ │ │ │ │ - 174 } │ │ │ │ │ - 175 │ │ │ │ │ - 176 template< int n > │ │ │ │ │ - 177 static void Lx ( const FieldMatrix< ctype, n, n > &L, const FieldVector< │ │ │ │ │ -ctype, n > &x, FieldVector< ctype, n > &ret ) │ │ │ │ │ - 178 { │ │ │ │ │ - 179 for( int i = 0; i < n; ++i ) │ │ │ │ │ - 180 { │ │ │ │ │ - 181 ret[ i ] = ctype( 0 ); │ │ │ │ │ - 182 for( int j = 0; j <= i; ++j ) │ │ │ │ │ - 183 ret[ i ] += L[ i ][ j ] * x[ j ]; │ │ │ │ │ - 184 } │ │ │ │ │ - 185 } │ │ │ │ │ - 186 │ │ │ │ │ - 187 template< int n > │ │ │ │ │ - 188 static void LTx ( const FieldMatrix< ctype, n, n > &L, const FieldVector< │ │ │ │ │ -ctype, n > &x, FieldVector< ctype, n > &ret ) │ │ │ │ │ - 189 { │ │ │ │ │ - 190 for( int i = 0; i < n; ++i ) │ │ │ │ │ - 191 { │ │ │ │ │ - 192 ret[ i ] = ctype( 0 ); │ │ │ │ │ - 193 for( int j = i; j < n; ++j ) │ │ │ │ │ - 194 ret[ i ] += L[ j ][ i ] * x[ j ]; │ │ │ │ │ - 195 } │ │ │ │ │ - 196 } │ │ │ │ │ - 197 │ │ │ │ │ - 198 template< int n > │ │ │ │ │ - 199 static void LTL ( const FieldMatrix< ctype, n, n > &L, FieldMatrix< ctype, │ │ │ │ │ -n, n > &ret ) │ │ │ │ │ - 200 { │ │ │ │ │ - 201 for( int i = 0; i < n; ++i ) │ │ │ │ │ - 202 { │ │ │ │ │ - 203 for( int j = 0; j < i; ++j ) │ │ │ │ │ - 204 { │ │ │ │ │ - 205 ret[ i ][ j ] = ctype( 0 ); │ │ │ │ │ - 206 for( int k = i; k < n; ++k ) │ │ │ │ │ - 207 ret[ i ][ j ] += L[ k ][ i ] * L[ k ][ j ]; │ │ │ │ │ - 208 ret[ j ][ i ] = ret[ i ][ j ]; │ │ │ │ │ - 209 } │ │ │ │ │ - 210 ret[ i ][ i ] = ctype( 0 ); │ │ │ │ │ - 211 for( int k = i; k < n; ++k ) │ │ │ │ │ - 212 ret[ i ][ i ] += L[ k ][ i ] * L[ k ][ i ]; │ │ │ │ │ - 213 } │ │ │ │ │ - 214 } │ │ │ │ │ - 215 │ │ │ │ │ - 216 template< int n > │ │ │ │ │ - 217 static void LLT ( const FieldMatrix< ctype, n, n > &L, FieldMatrix< ctype, │ │ │ │ │ -n, n > &ret ) │ │ │ │ │ - 218 { │ │ │ │ │ - 219 for( int i = 0; i < n; ++i ) │ │ │ │ │ - 220 { │ │ │ │ │ - 221 for( int j = 0; j < i; ++j ) │ │ │ │ │ - 222 { │ │ │ │ │ - 223 ret[ i ][ j ] = ctype( 0 ); │ │ │ │ │ - 224 for( int k = 0; k <= j; ++k ) │ │ │ │ │ - 225 ret[ i ][ j ] += L[ i ][ k ] * L[ j ][ k ]; │ │ │ │ │ - 226 ret[ j ][ i ] = ret[ i ][ j ]; │ │ │ │ │ - 227 } │ │ │ │ │ - 228 ret[ i ][ i ] = ctype( 0 ); │ │ │ │ │ - 229 for( int k = 0; k <= i; ++k ) │ │ │ │ │ - 230 ret[ i ][ i ] += L[ i ][ k ] * L[ i ][ k ]; │ │ │ │ │ - 231 } │ │ │ │ │ - 232 } │ │ │ │ │ - 233 │ │ │ │ │ - 234 template< int n > │ │ │ │ │ - 235 static bool cholesky_L ( const FieldMatrix< ctype, n, n > &A, FieldMatrix< │ │ │ │ │ -ctype, n, n > &ret, const bool checkSingular = false ) │ │ │ │ │ - 236 { │ │ │ │ │ - 237 using std::sqrt; │ │ │ │ │ - 238 for( int i = 0; i < n; ++i ) │ │ │ │ │ - 239 { │ │ │ │ │ - 240 ctype &rii = ret[ i ][ i ]; │ │ │ │ │ - 241 │ │ │ │ │ - 242 ctype xDiag = A[ i ][ i ]; │ │ │ │ │ - 243 for( int j = 0; j < i; ++j ) │ │ │ │ │ - 244 xDiag -= ret[ i ][ j ] * ret[ i ][ j ]; │ │ │ │ │ - 245 │ │ │ │ │ - 246 // in some cases A can be singular, e.g. when checking local for │ │ │ │ │ - 247 // outside points during checkInside │ │ │ │ │ - 248 if( checkSingular && ! ( xDiag > ctype( 0 )) ) │ │ │ │ │ - 249 return false ; │ │ │ │ │ - 250 │ │ │ │ │ - 251 // otherwise this should be true always │ │ │ │ │ - 252 assert( xDiag > ctype( 0 ) ); │ │ │ │ │ - 253 rii = sqrt( xDiag ); │ │ │ │ │ + 250// The interface (template<...> class StaticRefinement) is not included │ │ │ │ │ +here │ │ │ │ │ + 251// since it derives from parts which I consider implementation. Look │ │ │ │ │ + 252// into refinement/base.cc if the documentation is above is not enough. │ │ │ │ │ + 253#include "refinement/base.cc" │ │ │ │ │ 254 │ │ │ │ │ - 255 ctype invrii = ctype( 1 ) / rii; │ │ │ │ │ - 256 for( int k = i+1; k < n; ++k ) │ │ │ │ │ - 257 { │ │ │ │ │ - 258 ctype x = A[ k ][ i ]; │ │ │ │ │ - 259 for( int j = 0; j < i; ++j ) │ │ │ │ │ - 260 x -= ret[ i ][ j ] * ret[ k ][ j ]; │ │ │ │ │ - 261 ret[ k ][ i ] = invrii * x; │ │ │ │ │ - 262 } │ │ │ │ │ - 263 } │ │ │ │ │ - 264 │ │ │ │ │ - 265 // return true for meaning A is non-singular │ │ │ │ │ - 266 return true; │ │ │ │ │ - 267 } │ │ │ │ │ - 268 │ │ │ │ │ - 269 template< int n > │ │ │ │ │ - 270 static ctype detL ( const FieldMatrix< ctype, n, n > &L ) │ │ │ │ │ - 271 { │ │ │ │ │ - 272 ctype det( 1 ); │ │ │ │ │ - 273 for( int i = 0; i < n; ++i ) │ │ │ │ │ - 274 det *= L[ i ][ i ]; │ │ │ │ │ - 275 return det; │ │ │ │ │ - 276 } │ │ │ │ │ - 277 │ │ │ │ │ - 278 template< int n > │ │ │ │ │ - 279 static ctype invL ( FieldMatrix< ctype, n, n > &L ) │ │ │ │ │ - 280 { │ │ │ │ │ - 281 ctype det( 1 ); │ │ │ │ │ - 282 for( int i = 0; i < n; ++i ) │ │ │ │ │ - 283 { │ │ │ │ │ - 284 ctype &lii = L[ i ][ i ]; │ │ │ │ │ - 285 det *= lii; │ │ │ │ │ - 286 lii = ctype( 1 ) / lii; │ │ │ │ │ - 287 for( int j = 0; j < i; ++j ) │ │ │ │ │ - 288 { │ │ │ │ │ - 289 ctype &lij = L[ i ][ j ]; │ │ │ │ │ - 290 ctype x = lij * L[ j ][ j ]; │ │ │ │ │ - 291 for( int k = j+1; k < i; ++k ) │ │ │ │ │ - 292 x += L[ i ][ k ] * L[ k ][ j ]; │ │ │ │ │ - 293 lij = (-lii) * x; │ │ │ │ │ - 294 } │ │ │ │ │ - 295 } │ │ │ │ │ - 296 return det; │ │ │ │ │ - 297 } │ │ │ │ │ - 298 │ │ │ │ │ - 299 // calculates x := L^{-1} x │ │ │ │ │ - 300 template< int n > │ │ │ │ │ - 301 static void invLx ( FieldMatrix< ctype, n, n > &L, FieldVector< ctype, n > │ │ │ │ │ -&x ) │ │ │ │ │ - 302 { │ │ │ │ │ - 303 for( int i = 0; i < n; ++i ) │ │ │ │ │ - 304 { │ │ │ │ │ - 305 for( int j = 0; j < i; ++j ) │ │ │ │ │ - 306 x[ i ] -= L[ i ][ j ] * x[ j ]; │ │ │ │ │ - 307 x[ i ] /= L[ i ][ i ]; │ │ │ │ │ - 308 } │ │ │ │ │ - 309 } │ │ │ │ │ - 310 │ │ │ │ │ - 311 // calculates x := L^{-T} x │ │ │ │ │ - 312 template< int n > │ │ │ │ │ - 313 static void invLTx ( FieldMatrix< ctype, n, n > &L, FieldVector< ctype, n │ │ │ │ │ -> &x ) │ │ │ │ │ - 314 { │ │ │ │ │ - 315 for( int i = n; i > 0; --i ) │ │ │ │ │ - 316 { │ │ │ │ │ - 317 for( int j = i; j < n; ++j ) │ │ │ │ │ - 318 x[ i-1 ] -= L[ j ][ i-1 ] * x[ j ]; │ │ │ │ │ - 319 x[ i-1 ] /= L[ i-1 ][ i-1 ]; │ │ │ │ │ - 320 } │ │ │ │ │ - 321 } │ │ │ │ │ - 322 │ │ │ │ │ - 323 template< int n > │ │ │ │ │ - 324 static ctype spdDetA ( const FieldMatrix< ctype, n, n > &A ) │ │ │ │ │ - 325 { │ │ │ │ │ - 326 // return A[0][0]*A[1][1]-A[1][0]*A[1][0]; │ │ │ │ │ - 327 FieldMatrix< ctype, n, n > L; │ │ │ │ │ - 328 cholesky_L( A, L ); │ │ │ │ │ - 329 return detL( L ); │ │ │ │ │ - 330 } │ │ │ │ │ - 331 │ │ │ │ │ - 332 template< int n > │ │ │ │ │ - 333 static ctype spdInvA ( FieldMatrix< ctype, n, n > &A ) │ │ │ │ │ - 334 { │ │ │ │ │ - 335 FieldMatrix< ctype, n, n > L; │ │ │ │ │ - 336 cholesky_L( A, L ); │ │ │ │ │ - 337 const ctype det = invL( L ); │ │ │ │ │ - 338 LTL( L, A ); │ │ │ │ │ - 339 return det; │ │ │ │ │ - 340 } │ │ │ │ │ - 341 │ │ │ │ │ - 342 // calculate x := A^{-1} x │ │ │ │ │ - 343 template< int n > │ │ │ │ │ - 344 static bool spdInvAx ( FieldMatrix< ctype, n, n > &A, FieldVector< ctype, │ │ │ │ │ -n > &x, const bool checkSingular = false ) │ │ │ │ │ - 345 { │ │ │ │ │ - 346 FieldMatrix< ctype, n, n > L; │ │ │ │ │ - 347 const bool invertible = cholesky_L( A, L, checkSingular ); │ │ │ │ │ - 348 if( ! invertible ) return invertible ; │ │ │ │ │ - 349 invLx( L, x ); │ │ │ │ │ - 350 invLTx( L, x ); │ │ │ │ │ - 351 return invertible; │ │ │ │ │ - 352 } │ │ │ │ │ - 353 │ │ │ │ │ - 354 template< int m, int n > │ │ │ │ │ - 355 static ctype detATA ( const FieldMatrix< ctype, m, n > &A ) │ │ │ │ │ - 356 { │ │ │ │ │ - 357 if( m >= n ) │ │ │ │ │ - 358 { │ │ │ │ │ - 359 FieldMatrix< ctype, n, n > ata; │ │ │ │ │ - 360 ATA_L( A, ata ); │ │ │ │ │ - 361 return spdDetA( ata ); │ │ │ │ │ - 362 } │ │ │ │ │ - 363 else │ │ │ │ │ - 364 return ctype( 0 ); │ │ │ │ │ - 365 } │ │ │ │ │ - 366 │ │ │ │ │ - 372 template< int m, int n > │ │ │ │ │ - 373 static ctype sqrtDetAAT ( const FieldMatrix< ctype, m, n > &A ) │ │ │ │ │ - 374 { │ │ │ │ │ - 375 using std::abs; │ │ │ │ │ - 376 using std::sqrt; │ │ │ │ │ - 377 // These special cases are here not only for speed reasons: │ │ │ │ │ - 378 // The general implementation aborts if the matrix is almost singular, │ │ │ │ │ - 379 // and the special implementation provide a stable way to handle that │ │ │ │ │ -case. │ │ │ │ │ - 380 if( (n == 2) && (m == 2) ) │ │ │ │ │ - 381 { │ │ │ │ │ - 382 // Special implementation for 2x2 matrices: faster and more stable │ │ │ │ │ - 383 return abs( A[ 0 ][ 0 ]*A[ 1 ][ 1 ] - A[ 1 ][ 0 ]*A[ 0 ][ 1 ] ); │ │ │ │ │ - 384 } │ │ │ │ │ - 385 else if( (n == 3) && (m == 3) ) │ │ │ │ │ - 386 { │ │ │ │ │ - 387 // Special implementation for 3x3 matrices │ │ │ │ │ - 388 const ctype v0 = A[ 0 ][ 1 ] * A[ 1 ][ 2 ] - A[ 1 ][ 1 ] * A[ 0 ][ 2 ]; │ │ │ │ │ - 389 const ctype v1 = A[ 0 ][ 2 ] * A[ 1 ][ 0 ] - A[ 1 ][ 2 ] * A[ 0 ][ 0 ]; │ │ │ │ │ - 390 const ctype v2 = A[ 0 ][ 0 ] * A[ 1 ][ 1 ] - A[ 1 ][ 0 ] * A[ 0 ][ 1 ]; │ │ │ │ │ - 391 return abs( v0 * A[ 2 ][ 0 ] + v1 * A[ 2 ][ 1 ] + v2 * A[ 2 ][ 2 ] ); │ │ │ │ │ - 392 } │ │ │ │ │ - 393 else if ( (n == 3) && (m == 2) ) │ │ │ │ │ - 394 { │ │ │ │ │ - 395 // Special implementation for 2x3 matrices │ │ │ │ │ - 396 const ctype v0 = A[ 0 ][ 0 ] * A[ 1 ][ 1 ] - A[ 0 ][ 1 ] * A[ 1 ][ 0 ]; │ │ │ │ │ - 397 const ctype v1 = A[ 0 ][ 0 ] * A[ 1 ][ 2 ] - A[ 1 ][ 0 ] * A[ 0 ][ 2 ]; │ │ │ │ │ - 398 const ctype v2 = A[ 0 ][ 1 ] * A[ 1 ][ 2 ] - A[ 0 ][ 2 ] * A[ 1 ][ 1 ]; │ │ │ │ │ - 399 return sqrt( v0*v0 + v1*v1 + v2*v2); │ │ │ │ │ - 400 } │ │ │ │ │ - 401 else if( n >= m ) │ │ │ │ │ - 402 { │ │ │ │ │ - 403 // General case │ │ │ │ │ - 404 FieldMatrix< ctype, m, m > aat; │ │ │ │ │ - 405 AAT_L( A, aat ); │ │ │ │ │ - 406 return spdDetA( aat ); │ │ │ │ │ - 407 } │ │ │ │ │ - 408 else │ │ │ │ │ - 409 return ctype( 0 ); │ │ │ │ │ - 410 } │ │ │ │ │ - 411 │ │ │ │ │ - 412 // A^{-1}_L = (A^T A)^{-1} A^T │ │ │ │ │ - 413 // => A^{-1}_L A = I │ │ │ │ │ - 414 template< int m, int n > │ │ │ │ │ - 415 static ctype leftInvA ( const FieldMatrix< ctype, m, n > &A, FieldMatrix< │ │ │ │ │ -ctype, n, m > &ret ) │ │ │ │ │ - 416 { │ │ │ │ │ - 417 static_assert((m >= n), "Matrix has no left inverse."); │ │ │ │ │ - 418 FieldMatrix< ctype, n, n > ata; │ │ │ │ │ - 419 ATA_L( A, ata ); │ │ │ │ │ - 420 const ctype det = spdInvA( ata ); │ │ │ │ │ - 421 ATBT( ata, A, ret ); │ │ │ │ │ - 422 return det; │ │ │ │ │ - 423 } │ │ │ │ │ - 424 │ │ │ │ │ - 425 template< int m, int n > │ │ │ │ │ - 426 static void leftInvAx ( const FieldMatrix< ctype, m, n > &A, const │ │ │ │ │ -FieldVector< ctype, m > &x, FieldVector< ctype, n > &y ) │ │ │ │ │ - 427 { │ │ │ │ │ - 428 static_assert((m >= n), "Matrix has no left inverse."); │ │ │ │ │ - 429 FieldMatrix< ctype, n, n > ata; │ │ │ │ │ - 430 ATx( A, x, y ); │ │ │ │ │ - 431 ATA_L( A, ata ); │ │ │ │ │ - 432 spdInvAx( ata, y ); │ │ │ │ │ - 433 } │ │ │ │ │ - 434 │ │ │ │ │ - 436 template< int m, int n > │ │ │ │ │ - 437 static ctype rightInvA ( const FieldMatrix< ctype, m, n > &A, FieldMatrix< │ │ │ │ │ -ctype, n, m > &ret ) │ │ │ │ │ - 438 { │ │ │ │ │ - 439 static_assert((n >= m), "Matrix has no right inverse."); │ │ │ │ │ - 440 using std::abs; │ │ │ │ │ - 441 if( (n == 2) && (m == 2) ) │ │ │ │ │ - 442 { │ │ │ │ │ - 443 const ctype det = (A[ 0 ][ 0 ]*A[ 1 ][ 1 ] - A[ 1 ][ 0 ]*A[ 0 ][ 1 ]); │ │ │ │ │ - 444 const ctype detInv = ctype( 1 ) / det; │ │ │ │ │ - 445 ret[ 0 ][ 0 ] = A[ 1 ][ 1 ] * detInv; │ │ │ │ │ - 446 ret[ 1 ][ 1 ] = A[ 0 ][ 0 ] * detInv; │ │ │ │ │ - 447 ret[ 1 ][ 0 ] = -A[ 1 ][ 0 ] * detInv; │ │ │ │ │ - 448 ret[ 0 ][ 1 ] = -A[ 0 ][ 1 ] * detInv; │ │ │ │ │ - 449 return abs( det ); │ │ │ │ │ - 450 } │ │ │ │ │ - 451 else │ │ │ │ │ - 452 { │ │ │ │ │ - 453 FieldMatrix< ctype, m , m > aat; │ │ │ │ │ - 454 AAT_L( A, aat ); │ │ │ │ │ - 455 const ctype det = spdInvA( aat ); │ │ │ │ │ - 456 ATBT( A , aat , ret ); │ │ │ │ │ - 457 return det; │ │ │ │ │ - 458 } │ │ │ │ │ - 459 } │ │ │ │ │ - 460 │ │ │ │ │ - 461 template< int m, int n > │ │ │ │ │ - 462 static bool xTRightInvA ( const FieldMatrix< ctype, m, n > &A, const │ │ │ │ │ -FieldVector< ctype, n > &x, FieldVector< ctype, m > &y ) │ │ │ │ │ - 463 { │ │ │ │ │ - 464 static_assert((n >= m), "Matrix has no right inverse."); │ │ │ │ │ - 465 FieldMatrix< ctype, m, m > aat; │ │ │ │ │ - 466 Ax( A, x, y ); │ │ │ │ │ - 467 AAT_L( A, aat ); │ │ │ │ │ - 468 // check whether aat is singular and return true if non-singular │ │ │ │ │ - 469 return spdInvAx( aat, y, true ); │ │ │ │ │ - 470 } │ │ │ │ │ - 471 }; │ │ │ │ │ - 472 │ │ │ │ │ - 473 } // namespace Impl │ │ │ │ │ - 474 │ │ │ │ │ - 475 │ │ │ │ │ - 476 │ │ │ │ │ - 482 template< class ct, int mydim, int cdim> │ │ │ │ │ -483 class AffineGeometry │ │ │ │ │ - 484 { │ │ │ │ │ - 485 public: │ │ │ │ │ - 486 │ │ │ │ │ -488 typedef ct ctype; │ │ │ │ │ - 489 │ │ │ │ │ -491 static const int mydimension= mydim; │ │ │ │ │ - 492 │ │ │ │ │ -494 static const int coorddimension = cdim; │ │ │ │ │ - 495 │ │ │ │ │ -497 typedef FieldVector< ctype, mydimension > LocalCoordinate; │ │ │ │ │ - 498 │ │ │ │ │ -500 typedef FieldVector< ctype, coorddimension > GlobalCoordinate; │ │ │ │ │ - 501 │ │ │ │ │ -503 typedef ctype Volume; │ │ │ │ │ - 504 │ │ │ │ │ -506 typedef FieldMatrix< ctype, mydimension, coorddimension > │ │ │ │ │ -JacobianTransposed; │ │ │ │ │ - 507 │ │ │ │ │ -509 typedef FieldMatrix< ctype, coorddimension, mydimension > │ │ │ │ │ -JacobianInverseTransposed; │ │ │ │ │ - 510 │ │ │ │ │ -512 typedef FieldMatrix< ctype, coorddimension, mydimension > Jacobian; │ │ │ │ │ - 513 │ │ │ │ │ -515 typedef FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse; │ │ │ │ │ - 516 │ │ │ │ │ - 517 private: │ │ │ │ │ - 519 typedef Geo::ReferenceElement<_Geo::ReferenceElementImplementation<_ctype, │ │ │ │ │ -mydimension_> > ReferenceElement; │ │ │ │ │ - 520 │ │ │ │ │ - 521 typedef Geo::ReferenceElements<_ctype,_mydimension_> ReferenceElements; │ │ │ │ │ - 522 │ │ │ │ │ - 523 // Helper class to compute a matrix pseudo inverse │ │ │ │ │ - 524 typedef Impl::FieldMatrixHelper< ct > MatrixHelper; │ │ │ │ │ - 525 │ │ │ │ │ - 526 public: │ │ │ │ │ -528 AffineGeometry ( const ReferenceElement &refElement, const GlobalCoordinate │ │ │ │ │ -&origin, │ │ │ │ │ - 529 const JacobianTransposed &jt ) │ │ │ │ │ - 530 : refElement_(refElement), origin_(origin), jacobianTransposed_(jt) │ │ │ │ │ - 531 { │ │ │ │ │ - 532 integrationElement_ = MatrixHelper::template rightInvA< mydimension, │ │ │ │ │ -coorddimension >( jacobianTransposed_, jacobianInverseTransposed_ ); │ │ │ │ │ - 533 } │ │ │ │ │ - 534 │ │ │ │ │ -536 AffineGeometry ( Dune::GeometryType gt, const GlobalCoordinate &origin, │ │ │ │ │ - 537 const JacobianTransposed &jt ) │ │ │ │ │ - 538 : AffineGeometry(ReferenceElements::general( gt ), origin, jt) │ │ │ │ │ - 539 { } │ │ │ │ │ - 540 │ │ │ │ │ - 542 template< class CoordVector > │ │ │ │ │ -543 AffineGeometry ( const ReferenceElement &refElement, const CoordVector │ │ │ │ │ -&coordVector ) │ │ │ │ │ - 544 : refElement_(refElement), origin_(coordVector[0]) │ │ │ │ │ - 545 { │ │ │ │ │ - 546 for( int i = 0; i < mydimension; ++i ) │ │ │ │ │ - 547 jacobianTransposed_[ i ] = coordVector[ i+1 ] - origin_; │ │ │ │ │ - 548 integrationElement_ = MatrixHelper::template rightInvA< mydimension, │ │ │ │ │ -coorddimension >( jacobianTransposed_, jacobianInverseTransposed_ ); │ │ │ │ │ - 549 } │ │ │ │ │ - 550 │ │ │ │ │ - 552 template< class CoordVector > │ │ │ │ │ -553 AffineGeometry ( Dune::GeometryType gt, const CoordVector &coordVector ) │ │ │ │ │ - 554 : AffineGeometry(ReferenceElements::general( gt ), coordVector) │ │ │ │ │ - 555 { } │ │ │ │ │ - 556 │ │ │ │ │ -558 bool affine () const { return true; } │ │ │ │ │ - 559 │ │ │ │ │ -561 Dune::GeometryType type () const { return refElement_.type(); } │ │ │ │ │ - 562 │ │ │ │ │ -564 int corners () const { return refElement_.size( mydimension ); } │ │ │ │ │ - 565 │ │ │ │ │ -567 GlobalCoordinate corner ( int i ) const │ │ │ │ │ - 568 { │ │ │ │ │ - 569 return global( refElement_.position( i, mydimension ) ); │ │ │ │ │ - 570 } │ │ │ │ │ - 571 │ │ │ │ │ -573 GlobalCoordinate center () const { return global( refElement_.position( 0, │ │ │ │ │ -0 ) ); } │ │ │ │ │ - 574 │ │ │ │ │ -581 GlobalCoordinate global ( const LocalCoordinate &local ) const │ │ │ │ │ - 582 { │ │ │ │ │ - 583 GlobalCoordinate global( origin_ ); │ │ │ │ │ - 584 jacobianTransposed_.umtv( local, global ); │ │ │ │ │ - 585 return global; │ │ │ │ │ - 586 } │ │ │ │ │ - 587 │ │ │ │ │ -601 LocalCoordinate local ( const GlobalCoordinate &global ) const │ │ │ │ │ - 602 { │ │ │ │ │ - 603 LocalCoordinate local; │ │ │ │ │ - 604 jacobianInverseTransposed_.mtv( global - origin_, local ); │ │ │ │ │ - 605 return local; │ │ │ │ │ - 606 } │ │ │ │ │ - 607 │ │ │ │ │ -618 ctype integrationElement ([[maybe_unused]] const LocalCoordinate &local) │ │ │ │ │ -const │ │ │ │ │ - 619 { │ │ │ │ │ - 620 return integrationElement_; │ │ │ │ │ - 621 } │ │ │ │ │ - 622 │ │ │ │ │ -624 Volume volume () const │ │ │ │ │ - 625 { │ │ │ │ │ - 626 return integrationElement_ * refElement_.volume(); │ │ │ │ │ - 627 } │ │ │ │ │ - 628 │ │ │ │ │ -635 const JacobianTransposed &jacobianTransposed ([[maybe_unused]] const │ │ │ │ │ -LocalCoordinate &local) const │ │ │ │ │ - 636 { │ │ │ │ │ - 637 return jacobianTransposed_; │ │ │ │ │ - 638 } │ │ │ │ │ - 639 │ │ │ │ │ -646 const JacobianInverseTransposed &jacobianInverseTransposed ([ │ │ │ │ │ -[maybe_unused]] const LocalCoordinate &local) const │ │ │ │ │ - 647 { │ │ │ │ │ - 648 return jacobianInverseTransposed_; │ │ │ │ │ - 649 } │ │ │ │ │ - 650 │ │ │ │ │ -657 Jacobian jacobian ([[maybe_unused]] const LocalCoordinate &local) const │ │ │ │ │ - 658 { │ │ │ │ │ - 659 return jacobianTransposed_.transposed(); │ │ │ │ │ - 660 } │ │ │ │ │ - 661 │ │ │ │ │ -668 JacobianInverse jacobianInverse ([[maybe_unused]] const LocalCoordinate │ │ │ │ │ -&local) const │ │ │ │ │ - 669 { │ │ │ │ │ - 670 return jacobianInverseTransposed_.transposed(); │ │ │ │ │ - 671 } │ │ │ │ │ - 672 │ │ │ │ │ -673 friend ReferenceElement referenceElement ( const AffineGeometry &geometry ) │ │ │ │ │ - 674 { │ │ │ │ │ - 675 return geometry.refElement_; │ │ │ │ │ - 676 } │ │ │ │ │ - 677 │ │ │ │ │ - 678 private: │ │ │ │ │ - 679 ReferenceElement refElement_; │ │ │ │ │ - 680 GlobalCoordinate origin_; │ │ │ │ │ - 681 JacobianTransposed jacobianTransposed_; │ │ │ │ │ - 682 JacobianInverseTransposed jacobianInverseTransposed_; │ │ │ │ │ - 683 ctype integrationElement_; │ │ │ │ │ - 684 }; │ │ │ │ │ - 685 │ │ │ │ │ - 686} // namespace Dune │ │ │ │ │ - 687 │ │ │ │ │ - 688#endif // #ifndef DUNE_GEOMETRY_AFFINEGEOMETRY_HH │ │ │ │ │ -type.hh │ │ │ │ │ -A unique label for each type of element that can occur in a grid. │ │ │ │ │ -Dune::ReferenceElement │ │ │ │ │ -unspecified-type ReferenceElement │ │ │ │ │ -Returns the type of reference element for the argument type T. │ │ │ │ │ -Definition: referenceelements.hh:497 │ │ │ │ │ -Dune │ │ │ │ │ -Definition: affinegeometry.hh:21 │ │ │ │ │ -Dune::Geo::ReferenceElement │ │ │ │ │ -This class provides access to geometric and topological properties of a │ │ │ │ │ -reference element. │ │ │ │ │ -Definition: referenceelement.hh:52 │ │ │ │ │ -Dune::Geo::ReferenceElement::volume │ │ │ │ │ -CoordinateField volume() const │ │ │ │ │ -obtain the volume of the reference element │ │ │ │ │ -Definition: referenceelement.hh:241 │ │ │ │ │ -Dune::Geo::ReferenceElement::type │ │ │ │ │ -decltype(auto) type(int i, int c) const │ │ │ │ │ -obtain the type of subentity (i,c) │ │ │ │ │ -Definition: referenceelement.hh:171 │ │ │ │ │ -Dune::Geo::ReferenceElement::size │ │ │ │ │ -int size(int c) const │ │ │ │ │ -number of subentities of codimension c │ │ │ │ │ -Definition: referenceelement.hh:94 │ │ │ │ │ -Dune::Geo::ReferenceElement::position │ │ │ │ │ -decltype(auto) position(int i, int c) const │ │ │ │ │ -position of the barycenter of entity (i,c) │ │ │ │ │ -Definition: referenceelement.hh:203 │ │ │ │ │ -Dune::Geo::ReferenceElementImplementation │ │ │ │ │ -Definition: affinegeometry.hh:33 │ │ │ │ │ -Dune::Geo::ReferenceElements │ │ │ │ │ -Class providing access to the singletons of the reference elements. │ │ │ │ │ -Definition: referenceelements.hh:170 │ │ │ │ │ -Dune::AffineGeometry │ │ │ │ │ -Implementation of the Geometry interface for affine geometries. │ │ │ │ │ -Definition: affinegeometry.hh:484 │ │ │ │ │ -Dune::AffineGeometry::AffineGeometry │ │ │ │ │ -AffineGeometry(const ReferenceElement &refElement, const CoordVector │ │ │ │ │ -&coordVector) │ │ │ │ │ -Create affine geometry from reference element and a vector of vertex │ │ │ │ │ -coordinates. │ │ │ │ │ -Definition: affinegeometry.hh:543 │ │ │ │ │ -Dune::AffineGeometry::AffineGeometry │ │ │ │ │ -AffineGeometry(Dune::GeometryType gt, const GlobalCoordinate &origin, const │ │ │ │ │ -JacobianTransposed &jt) │ │ │ │ │ -Create affine geometry from GeometryType, one vertex, and the Jacobian matrix. │ │ │ │ │ -Definition: affinegeometry.hh:536 │ │ │ │ │ -Dune::AffineGeometry::LocalCoordinate │ │ │ │ │ -FieldVector< ctype, mydimension > LocalCoordinate │ │ │ │ │ -Type for local coordinate vector. │ │ │ │ │ -Definition: affinegeometry.hh:497 │ │ │ │ │ -Dune::AffineGeometry::type │ │ │ │ │ -Dune::GeometryType type() const │ │ │ │ │ -Obtain the type of the reference element. │ │ │ │ │ -Definition: affinegeometry.hh:561 │ │ │ │ │ -Dune::AffineGeometry::mydimension │ │ │ │ │ -static const int mydimension │ │ │ │ │ -Dimension of the geometry. │ │ │ │ │ -Definition: affinegeometry.hh:491 │ │ │ │ │ -Dune::AffineGeometry::AffineGeometry │ │ │ │ │ -AffineGeometry(const ReferenceElement &refElement, const GlobalCoordinate │ │ │ │ │ -&origin, const JacobianTransposed &jt) │ │ │ │ │ -Create affine geometry from reference element, one vertex, and the Jacobian │ │ │ │ │ -matrix. │ │ │ │ │ -Definition: affinegeometry.hh:528 │ │ │ │ │ -Dune::AffineGeometry::Volume │ │ │ │ │ -ctype Volume │ │ │ │ │ -Type used for volume. │ │ │ │ │ -Definition: affinegeometry.hh:503 │ │ │ │ │ -Dune::AffineGeometry::jacobianInverse │ │ │ │ │ -JacobianInverse jacobianInverse(const LocalCoordinate &local) const │ │ │ │ │ -Obtain the Jacobian's inverse. │ │ │ │ │ -Definition: affinegeometry.hh:668 │ │ │ │ │ -Dune::AffineGeometry::referenceElement │ │ │ │ │ -friend ReferenceElement referenceElement(const AffineGeometry &geometry) │ │ │ │ │ -Definition: affinegeometry.hh:673 │ │ │ │ │ -Dune::AffineGeometry::AffineGeometry │ │ │ │ │ -AffineGeometry(Dune::GeometryType gt, const CoordVector &coordVector) │ │ │ │ │ -Create affine geometry from GeometryType and a vector of vertex coordinates. │ │ │ │ │ -Definition: affinegeometry.hh:553 │ │ │ │ │ -Dune::AffineGeometry::integrationElement │ │ │ │ │ -ctype integrationElement(const LocalCoordinate &local) const │ │ │ │ │ -Obtain the integration element. │ │ │ │ │ -Definition: affinegeometry.hh:618 │ │ │ │ │ -Dune::AffineGeometry::JacobianInverse │ │ │ │ │ -FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse │ │ │ │ │ -Type for the inverse Jacobian matrix. │ │ │ │ │ -Definition: affinegeometry.hh:515 │ │ │ │ │ -Dune::AffineGeometry::Jacobian │ │ │ │ │ -FieldMatrix< ctype, coorddimension, mydimension > Jacobian │ │ │ │ │ -Type for the Jacobian matrix. │ │ │ │ │ -Definition: affinegeometry.hh:512 │ │ │ │ │ -Dune::AffineGeometry::jacobianInverseTransposed │ │ │ │ │ -const JacobianInverseTransposed & jacobianInverseTransposed(const │ │ │ │ │ -LocalCoordinate &local) const │ │ │ │ │ -Obtain the transposed of the Jacobian's inverse. │ │ │ │ │ -Definition: affinegeometry.hh:646 │ │ │ │ │ -Dune::AffineGeometry::JacobianTransposed │ │ │ │ │ -FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed │ │ │ │ │ -Type for the transposed Jacobian matrix. │ │ │ │ │ -Definition: affinegeometry.hh:506 │ │ │ │ │ -Dune::AffineGeometry::corner │ │ │ │ │ -GlobalCoordinate corner(int i) const │ │ │ │ │ -Obtain coordinates of the i-th corner. │ │ │ │ │ -Definition: affinegeometry.hh:567 │ │ │ │ │ -Dune::AffineGeometry::corners │ │ │ │ │ -int corners() const │ │ │ │ │ -Obtain number of corners of the corresponding reference element. │ │ │ │ │ -Definition: affinegeometry.hh:564 │ │ │ │ │ -Dune::AffineGeometry::JacobianInverseTransposed │ │ │ │ │ -FieldMatrix< ctype, coorddimension, mydimension > JacobianInverseTransposed │ │ │ │ │ -Type for the transposed inverse Jacobian matrix. │ │ │ │ │ -Definition: affinegeometry.hh:509 │ │ │ │ │ -Dune::AffineGeometry::coorddimension │ │ │ │ │ -static const int coorddimension │ │ │ │ │ -Dimension of the world space. │ │ │ │ │ -Definition: affinegeometry.hh:494 │ │ │ │ │ -Dune::AffineGeometry::global │ │ │ │ │ -GlobalCoordinate global(const LocalCoordinate &local) const │ │ │ │ │ -Evaluate the mapping. │ │ │ │ │ -Definition: affinegeometry.hh:581 │ │ │ │ │ -Dune::AffineGeometry::center │ │ │ │ │ -GlobalCoordinate center() const │ │ │ │ │ -Obtain the centroid of the mapping's image. │ │ │ │ │ -Definition: affinegeometry.hh:573 │ │ │ │ │ -Dune::AffineGeometry::jacobian │ │ │ │ │ -Jacobian jacobian(const LocalCoordinate &local) const │ │ │ │ │ -Obtain the Jacobian. │ │ │ │ │ -Definition: affinegeometry.hh:657 │ │ │ │ │ -Dune::AffineGeometry::ctype │ │ │ │ │ -ct ctype │ │ │ │ │ -Type used for coordinates. │ │ │ │ │ -Definition: affinegeometry.hh:488 │ │ │ │ │ -Dune::AffineGeometry::GlobalCoordinate │ │ │ │ │ -FieldVector< ctype, coorddimension > GlobalCoordinate │ │ │ │ │ -Type for coordinate vector in world space. │ │ │ │ │ -Definition: affinegeometry.hh:500 │ │ │ │ │ -Dune::AffineGeometry::affine │ │ │ │ │ -bool affine() const │ │ │ │ │ -Always true: this is an affine geometry. │ │ │ │ │ -Definition: affinegeometry.hh:558 │ │ │ │ │ -Dune::AffineGeometry::jacobianTransposed │ │ │ │ │ -const JacobianTransposed & jacobianTransposed(const LocalCoordinate &local) │ │ │ │ │ -const │ │ │ │ │ -Obtain the transposed of the Jacobian. │ │ │ │ │ -Definition: affinegeometry.hh:635 │ │ │ │ │ -Dune::AffineGeometry::volume │ │ │ │ │ -Volume volume() const │ │ │ │ │ -Obtain the volume of the element. │ │ │ │ │ -Definition: affinegeometry.hh:624 │ │ │ │ │ -Dune::GeometryType │ │ │ │ │ -Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ -Definition: type.hh:125 │ │ │ │ │ + 255#include "refinement/hcube.cc" │ │ │ │ │ + 256#include "refinement/simplex.cc" │ │ │ │ │ + 257#include "refinement/hcubetriangulation.cc" │ │ │ │ │ + 258#include "refinement/prismtriangulation.cc" │ │ │ │ │ + 259#include "refinement/pyramidtriangulation.cc" │ │ │ │ │ + 260 │ │ │ │ │ + 261#endif // DUNE_GEOMETRY_REFINEMENT_HH │ │ │ │ │ +simplex.cc │ │ │ │ │ +This file contains the Refinement implementation for simplices (triangles, │ │ │ │ │ +tetrahedrons.... │ │ │ │ │ +base.cc │ │ │ │ │ +This file contains the parts independent of a particular Refinement │ │ │ │ │ +implementation. │ │ │ │ │ +pyramidtriangulation.cc │ │ │ │ │ +hcube.cc │ │ │ │ │ +This file contains the Refinement implementation for hypercubes │ │ │ │ │ +(quadrilaterals, hexahedrons,... │ │ │ │ │ +prismtriangulation.cc │ │ │ │ │ +hcubetriangulation.cc │ │ │ │ │ +This file contains the Refinement implementation for triangulating hypercubes │ │ │ │ │ +(quadrilateral -> trian... │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00173.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: type.hh File Reference │ │ │ │ +dune-geometry: topologyfactory.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -64,100 +64,43 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions | │ │ │ │ -Variables
│ │ │ │ -
type.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
topologyfactory.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ -

A unique label for each type of element that can occur in a grid. │ │ │ │ -More...

│ │ │ │
#include <cassert>
│ │ │ │ -#include <string>
│ │ │ │ +#include <array>
│ │ │ │ +#include <map>
│ │ │ │ +#include <memory>
│ │ │ │ #include <type_traits>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/common/keywords.hh>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ -#include <dune/common/unused.hh>
│ │ │ │ -#include <dune/geometry/deprecated_topology.hh>
│ │ │ │ +#include <vector>
│ │ │ │ +#include <dune/geometry/type.hh>
│ │ │ │ +#include <dune/geometry/typeindex.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Classes

class  Dune::GeometryType
 Unique label for each type of entities that can occur in DUNE grids. More...
struct  Dune::TopologyFactory< Traits >
 Provide a factory over the generic topologies. More...
 
struct  Dune::TopologySingletonFactory< Factory >
 A wrapper for a TopologyFactory providing singleton storage. Same usage as TopologyFactory but with empty release method an internal storage. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::GeometryTypes
 Predefined GeometryTypes for common geometries.
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Functions

std::ostream & Dune::operator<< (std::ostream &s, const GeometryType &a)
 Prints the type to an output stream. More...
 
constexpr GeometryType Dune::GeometryTypes::simplex (unsigned int dim)
 Returns a GeometryType representing a simplex of dimension dim. More...
 
constexpr GeometryType Dune::GeometryTypes::cube (unsigned int dim)
 Returns a GeometryType representing a hypercube of dimension dim. More...
 
constexpr GeometryType Dune::GeometryTypes::none (unsigned int dim)
 Returns a GeometryType representing a singular of dimension dim. More...
 
constexpr GeometryType Dune::GeometryTypes::conicalExtension (const GeometryType &gt)
 Return GeometryType of a conical construction with gt as base
│ │ │ │ - More...
 
constexpr GeometryType Dune::GeometryTypes::prismaticExtension (const GeometryType &gt)
 Return GeometryType of a prismatic construction with gt as base
│ │ │ │ - More...
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Variables

constexpr GeometryType Dune::GeometryTypes::vertex = GeometryType(0,0,false)
 GeometryType representing a vertex. More...
 
constexpr GeometryType Dune::GeometryTypes::line = GeometryType(0,1,false)
 GeometryType representing a line. More...
 
constexpr GeometryType Dune::GeometryTypes::triangle = simplex(2)
 GeometryType representing a triangle. More...
 
constexpr GeometryType Dune::GeometryTypes::quadrilateral = cube(2)
 GeometryType representing a quadrilateral (a square). More...
 
constexpr GeometryType Dune::GeometryTypes::tetrahedron = simplex(3)
 GeometryType representing a tetrahedron. More...
 
constexpr GeometryType Dune::GeometryTypes::pyramid = GeometryType(0b0011,3,false)
 GeometryType representing a 3D pyramid. More...
 
constexpr GeometryType Dune::GeometryTypes::prism = GeometryType(0b0101,3,false)
 GeometryType representing a 3D prism. More...
 
constexpr GeometryType Dune::GeometryTypes::hexahedron = cube(3)
 GeometryType representing a hexahedron. More...
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

A unique label for each type of element that can occur in a grid.

│ │ │ │ -
│ │ │ │ + │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,92 +4,33 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ -Classes | Namespaces | Functions | Variables │ │ │ │ │ -type.hh File Reference │ │ │ │ │ -A unique label for each type of element that can occur in a grid. More... │ │ │ │ │ +Classes | Namespaces │ │ │ │ │ +topologyfactory.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::GeometryType │ │ │ │ │ -  Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ - More... │ │ │ │ │ +struct  Dune::TopologyFactory<_Traits_> │ │ │ │ │ +  Provide a factory over the generic topologies. More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::TopologySingletonFactory<_Factory_> │ │ │ │ │ + A wrapper for a TopologyFactory providing singleton storage. Same │ │ │ │ │ +  usage as TopologyFactory but with empty release method an internal │ │ │ │ │ + storage. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ -namespace  Dune::GeometryTypes │ │ │ │ │ -  Predefined GeometryTypes for common geometries. │ │ │ │ │ -  │ │ │ │ │ - Functions │ │ │ │ │ - std::ostream & Dune::operator<< (std::ostream &s, const GeometryType │ │ │ │ │ - &a) │ │ │ │ │ -  Prints the type to an output stream. More... │ │ │ │ │ -  │ │ │ │ │ -constexpr GeometryType Dune::GeometryTypes::simplex (unsigned int dim) │ │ │ │ │ -  Returns a GeometryType representing a simplex of │ │ │ │ │ - dimension dim. More... │ │ │ │ │ -  │ │ │ │ │ -constexpr GeometryType Dune::GeometryTypes::cube (unsigned int dim) │ │ │ │ │ -  Returns a GeometryType representing a hypercube of │ │ │ │ │ - dimension dim. More... │ │ │ │ │ -  │ │ │ │ │ -constexpr GeometryType Dune::GeometryTypes::none (unsigned int dim) │ │ │ │ │ -  Returns a GeometryType representing a singular of │ │ │ │ │ - dimension dim. More... │ │ │ │ │ -  │ │ │ │ │ -constexpr GeometryType Dune::GeometryTypes::conicalExtension (const │ │ │ │ │ - GeometryType >) │ │ │ │ │ - Return GeometryType of a conical construction with gt │ │ │ │ │ -  as base │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ -constexpr GeometryType Dune::GeometryTypes::prismaticExtension (const │ │ │ │ │ - GeometryType >) │ │ │ │ │ - Return GeometryType of a prismatic construction with gt │ │ │ │ │ -  as base │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ - Variables │ │ │ │ │ -constexpr GeometryType Dune::GeometryTypes::vertex = GeometryType(0,0,false) │ │ │ │ │ -  GeometryType representing a vertex. More... │ │ │ │ │ -  │ │ │ │ │ -constexpr GeometryType Dune::GeometryTypes::line = GeometryType(0,1,false) │ │ │ │ │ -  GeometryType representing a line. More... │ │ │ │ │ -  │ │ │ │ │ -constexpr GeometryType Dune::GeometryTypes::triangle = simplex(2) │ │ │ │ │ -  GeometryType representing a triangle. More... │ │ │ │ │ -  │ │ │ │ │ -constexpr GeometryType Dune::GeometryTypes::quadrilateral = cube(2) │ │ │ │ │ -  GeometryType representing a quadrilateral (a square). │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ -constexpr GeometryType Dune::GeometryTypes::tetrahedron = simplex(3) │ │ │ │ │ -  GeometryType representing a tetrahedron. More... │ │ │ │ │ -  │ │ │ │ │ -constexpr GeometryType Dune::GeometryTypes::pyramid = GeometryType │ │ │ │ │ - (0b0011,3,false) │ │ │ │ │ -  GeometryType representing a 3D pyramid. More... │ │ │ │ │ -  │ │ │ │ │ -constexpr GeometryType Dune::GeometryTypes::prism = GeometryType │ │ │ │ │ - (0b0101,3,false) │ │ │ │ │ -  GeometryType representing a 3D prism. More... │ │ │ │ │ -  │ │ │ │ │ -constexpr GeometryType Dune::GeometryTypes::hexahedron = cube(3) │ │ │ │ │ -  GeometryType representing a hexahedron. More... │ │ │ │ │ -  │ │ │ │ │ -***** Detailed Description ***** │ │ │ │ │ -A unique label for each type of element that can occur in a grid. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00173_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: type.hh Source File │ │ │ │ +dune-geometry: topologyfactory.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,446 +62,176 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
type.hh
│ │ │ │ +
topologyfactory.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
2// vi: set et ts=4 sw=2 sts=2:
│ │ │ │
3// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
5#ifndef DUNE_GEOMETRY_TYPE_HH
│ │ │ │ -
6#define DUNE_GEOMETRY_TYPE_HH
│ │ │ │ +
5#ifndef DUNE_GEOMETRY_TOPOLOGYFACTORY_HH
│ │ │ │ +
6#define DUNE_GEOMETRY_TOPOLOGYFACTORY_HH
│ │ │ │
7
│ │ │ │ -
12#include <cassert>
│ │ │ │ -
13
│ │ │ │ -
14#include <string>
│ │ │ │ -
15#include <type_traits>
│ │ │ │ -
16
│ │ │ │ -
17#include <dune/common/exceptions.hh>
│ │ │ │ -
18#include <dune/common/keywords.hh>
│ │ │ │ -
19#include <dune/common/typetraits.hh>
│ │ │ │ -
20#include <dune/common/unused.hh>
│ │ │ │ +
8#include <cassert>
│ │ │ │ +
9
│ │ │ │ +
10#include <array>
│ │ │ │ +
11#include <map>
│ │ │ │ +
12#include <memory>
│ │ │ │ +
13#include <type_traits>
│ │ │ │ +
14#include <vector>
│ │ │ │ +
15
│ │ │ │ +
16#include <dune/geometry/type.hh>
│ │ │ │ + │ │ │ │ +
18
│ │ │ │ +
19namespace Dune
│ │ │ │ +
20{
│ │ │ │
21
│ │ │ │ -
22namespace Dune
│ │ │ │ -
23{
│ │ │ │ -
24
│ │ │ │ -
25 namespace Impl
│ │ │ │ -
26 {
│ │ │ │ -
27
│ │ │ │ -
28 enum TopologyConstruction { pyramidConstruction = 0, prismConstruction = 1 };
│ │ │ │ -
29
│ │ │ │ -
30 // Dynamic Topology Properties
│ │ │ │ -
31 // ---------------------------
│ │ │ │ -
32
│ │ │ │ -
41 inline static unsigned int numTopologies ( int dim ) noexcept
│ │ │ │ -
42 {
│ │ │ │ -
43 return (1u << dim);
│ │ │ │ -
44 }
│ │ │ │ -
45
│ │ │ │ -
57 inline bool static isPyramid ( unsigned int topologyId, int dim, int codim = 0 ) noexcept
│ │ │ │ -
58 {
│ │ │ │ -
59 assert( (dim > 0) && (topologyId < numTopologies( dim )) );
│ │ │ │ -
60 assert( (0 <= codim) && (codim < dim) );
│ │ │ │ -
61 return (((topologyId & ~1) & (1u << (dim-codim-1))) == 0);
│ │ │ │ -
62 }
│ │ │ │ -
63
│ │ │ │ -
75 inline static bool isPrism ( unsigned int topologyId, int dim, int codim = 0 ) noexcept
│ │ │ │ -
76 {
│ │ │ │ -
77 assert( (dim > 0) && (topologyId < numTopologies( dim )) );
│ │ │ │ -
78 assert( (0 <= codim) && (codim < dim) );
│ │ │ │ -
79 return (( (topologyId | 1) & (1u << (dim-codim-1))) != 0);
│ │ │ │ -
80 }
│ │ │ │ -
81
│ │ │ │ -
89 inline static unsigned int baseTopologyId ( unsigned int topologyId, int dim, int codim = 1 ) noexcept
│ │ │ │ -
90 {
│ │ │ │ -
91 assert( (dim >= 0) && (topologyId < numTopologies( dim )) );
│ │ │ │ -
92 assert( (0 <= codim) && (codim <= dim) );
│ │ │ │ -
93 return topologyId & ((1u << (dim-codim)) - 1);
│ │ │ │ -
94 }
│ │ │ │ -
95
│ │ │ │ -
96 } // namespace Impl
│ │ │ │ -
97
│ │ │ │ -
98// the Topology classes are deprecated and will be removed for the 2.8.
│ │ │ │ -
99// Temporarily a header 'deprecated_topology.hh' is provided which will be removed after the 2.9 release.
│ │ │ │ -
100#if __GNUC__ >= 7
│ │ │ │ -
101# pragma GCC diagnostic push
│ │ │ │ -
102# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
│ │ │ │ -
103#endif
│ │ │ │ - │ │ │ │ -
105#if __GNUC__ >= 7
│ │ │ │ -
106# pragma GCC diagnostic pop
│ │ │ │ -
107#endif
│ │ │ │ +
40 template <class Traits>
│ │ │ │ + │ │ │ │ +
42 {
│ │ │ │ +
43 // extract types from Traits class
│ │ │ │ +
44 static const unsigned int dimension = Traits::dimension;
│ │ │ │ +
45 typedef typename Traits::Key Key;
│ │ │ │ +
46 typedef typename Traits::Object Object;
│ │ │ │ +
47 typedef typename Traits::Factory Factory;
│ │ │ │ +
48
│ │ │ │ +
50 static Object *create ( const Dune::GeometryType &gt, const Key &key )
│ │ │ │ +
51 {
│ │ │ │ +
52 return Impl::toGeometryTypeIdConstant<dimension>(gt, [&](auto id) {
│ │ │ │ +
53 return create<decltype(id)::value>(key);
│ │ │ │ +
54 });
│ │ │ │ +
55 }
│ │ │ │ +
57 template< GeometryType::Id geometryId >
│ │ │ │ +
58 static Object *create ( const Key &key )
│ │ │ │ +
59 {
│ │ │ │ +
60 return Factory::template createObject< geometryId >( key );
│ │ │ │ +
61 }
│ │ │ │ +
62
│ │ │ │ +
64 template< class Topology >
│ │ │ │ +
65 static Object *create ( const Key &key )
│ │ │ │ +
66 {
│ │ │ │ +
67 return Factory::template createObject< Topology >( key );
│ │ │ │ +
68 }
│ │ │ │ +
69
│ │ │ │ +
71 static void release( Object *object ) { delete object; }
│ │ │ │ +
72 };
│ │ │ │ +
73
│ │ │ │ +
74
│ │ │ │ +
75
│ │ │ │ +
80 template <class Factory>
│ │ │ │ + │ │ │ │ +
82 {
│ │ │ │ +
83 static const unsigned int dimension = Factory::dimension;
│ │ │ │ +
84 typedef typename Factory::Key Key;
│ │ │ │ +
85 typedef const typename Factory::Object Object;
│ │ │ │ +
86
│ │ │ │ +
88 static Object *create ( const Dune::GeometryType &gt, const Key &key )
│ │ │ │ +
89 {
│ │ │ │ +
90 assert( gt.id() < numTopologies );
│ │ │ │ +
91 return instance().getObject( gt, key );
│ │ │ │ +
92 }
│ │ │ │ +
94 template< GeometryType::Id geometryId >
│ │ │ │ +
95 static auto create ( const Key &key )
│ │ │ │ +
96 -> std::enable_if_t< static_cast<GeometryType>(geometryId).dim() == dimension, Object * >
│ │ │ │ +
97 {
│ │ │ │ +
98 return instance().template getObject< geometryId >( key );
│ │ │ │ +
99 }
│ │ │ │ +
100
│ │ │ │ +
102 template< class Topology >
│ │ │ │ +
103 static auto create ( const Key &key )
│ │ │ │ +
104 -> std::enable_if_t< Topology::dimension == dimension, Object * >
│ │ │ │ +
105 {
│ │ │ │ +
106 return instance().template getObject< Topology >( key );
│ │ │ │ +
107 }
│ │ │ │
108
│ │ │ │ -
109 // GeometryType
│ │ │ │ -
110 // -------------
│ │ │ │ -
111
│ │ │ │ - │ │ │ │ -
125 {
│ │ │ │ -
126 public:
│ │ │ │ -
127
│ │ │ │ -
130 enum
│ │ │ │ -
131 BasicType {
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
137 none
│ │ │ │ -
138 };
│ │ │ │ -
139
│ │ │ │ -
140 private:
│ │ │ │ -
141
│ │ │ │ -
143 unsigned char dim_;
│ │ │ │ -
144
│ │ │ │ -
146 bool none_;
│ │ │ │ -
147
│ │ │ │ -
149 unsigned int topologyId_;
│ │ │ │ -
150
│ │ │ │ -
151 // Internal type used for the Id. The exact nature of this type is kept
│ │ │ │ -
152 // as an implementation detail on purpose. We use a scoped enum here because scoped enums
│ │ │ │ -
153 // can be used as template parameters, but are not implicitly converted to other integral
│ │ │ │ -
154 // types by the compiler. That way, we avoid unfortunate implicit conversion chains, e.g.
│ │ │ │ -
155 // people trying to work with GlobalGeometryTypeIndex, but forgetting to actually call
│ │ │ │ -
156 // GlobalGeometryTypeIndex::index(gt) and just using gt directly.
│ │ │ │ -
157 enum class IdType : std::uint64_t
│ │ │ │ -
158 {};
│ │ │ │ -
159
│ │ │ │ -
160 public:
│ │ │ │ -
161
│ │ │ │ -
192 using Id = IdType;
│ │ │ │ -
193
│ │ │ │ -
201 constexpr operator Id() const
│ │ │ │ -
202 {
│ │ │ │ -
203 // recreate the exact storage layout that this class is using, making conversion
│ │ │ │ -
204 // extremely cheap
│ │ │ │ -
205 std::uint64_t id = dim_ | (std::uint64_t(none_) << 8) | (std::uint64_t(topologyId_) << 32);
│ │ │ │ -
206 return static_cast<Id>(id);
│ │ │ │ -
207 }
│ │ │ │ -
208
│ │ │ │ -
221 constexpr Id toId() const
│ │ │ │ -
222 {
│ │ │ │ -
223 return static_cast<Id>(*this);
│ │ │ │ -
224 }
│ │ │ │ -
225
│ │ │ │ -
233 constexpr GeometryType(Id id)
│ │ │ │ -
234 : dim_(static_cast<std::uint64_t>(id) & 0xFF)
│ │ │ │ -
235 , none_(static_cast<std::uint64_t>(id) & 0x100)
│ │ │ │ -
236 , topologyId_(static_cast<std::uint64_t>(id) >> 32)
│ │ │ │ -
237 {}
│ │ │ │ -
238
│ │ │ │ -
241
│ │ │ │ -
243 constexpr GeometryType ()
│ │ │ │ -
244 : dim_(0), none_(true), topologyId_(0)
│ │ │ │ -
245 {}
│ │ │ │ -
246
│ │ │ │ -
253 constexpr GeometryType(unsigned int topologyId, unsigned int dim, bool isNone)
│ │ │ │ -
254 : dim_(dim), none_(isNone), topologyId_(topologyId)
│ │ │ │ -
255 {}
│ │ │ │ -
256
│ │ │ │ -
262 constexpr GeometryType(unsigned int topologyId, unsigned int dim)
│ │ │ │ -
263 : dim_(dim), none_(false), topologyId_(topologyId)
│ │ │ │ -
264 {}
│ │ │ │ -
265
│ │ │ │ -
276 template<class TopologyType,
│ │ │ │ -
277 class = std::void_t<decltype(TopologyType::dimension), decltype(TopologyType::id)>>
│ │ │ │ -
278 explicit GeometryType(TopologyType t)
│ │ │ │ -
279 : dim_(TopologyType::dimension), none_(false), topologyId_(TopologyType::id)
│ │ │ │ -
280 {
│ │ │ │ -
281 DUNE_UNUSED_PARAMETER(t);
│ │ │ │ -
282 }
│ │ │ │ -
283
│ │ │ │ -
290 constexpr bool isVertex() const {
│ │ │ │ -
291 return dim_==0;
│ │ │ │ -
292 }
│ │ │ │ -
293
│ │ │ │ -
295 constexpr bool isLine() const {
│ │ │ │ -
296 return dim_==1;
│ │ │ │ -
297 }
│ │ │ │ -
298
│ │ │ │ -
300 constexpr bool isTriangle() const {
│ │ │ │ -
301 return ! none_ && dim_==2 && (topologyId_ | 1) == 0b0001;
│ │ │ │ -
302 }
│ │ │ │ -
303
│ │ │ │ -
305 constexpr bool isQuadrilateral() const {
│ │ │ │ -
306 return ! none_ && dim_==2 && (topologyId_ | 1) == 0b0011;
│ │ │ │ -
307 }
│ │ │ │ -
308
│ │ │ │ -
310 constexpr bool isTetrahedron() const {
│ │ │ │ -
311 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0001;
│ │ │ │ -
312 }
│ │ │ │ -
313
│ │ │ │ -
315 constexpr bool isPyramid() const {
│ │ │ │ -
316 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0011;
│ │ │ │ -
317 }
│ │ │ │ -
318
│ │ │ │ -
320 constexpr bool isPrism() const {
│ │ │ │ -
321 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0101;
│ │ │ │ -
322 }
│ │ │ │ -
323
│ │ │ │ -
325 constexpr bool isHexahedron() const {
│ │ │ │ -
326 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0111;
│ │ │ │ -
327 }
│ │ │ │ -
328
│ │ │ │ -
330 constexpr bool isSimplex() const {
│ │ │ │ -
331 return ! none_ && (topologyId_ | 1) == 1;
│ │ │ │ -
332 }
│ │ │ │ -
333
│ │ │ │ -
335 constexpr bool isCube() const {
│ │ │ │ -
336 return ! none_ && ((topologyId_ ^ ((1 << dim_)-1)) >> 1 == 0);
│ │ │ │ -
337 }
│ │ │ │ -
338
│ │ │ │ -
340 constexpr bool isConical() const {
│ │ │ │ -
341 return ! none_ && (((topologyId_ & ~1) & (1u << (dim_-1))) == 0);
│ │ │ │ -
342 }
│ │ │ │ -
343
│ │ │ │ -
348 constexpr bool isConical(const int& step) const {
│ │ │ │ -
349 return ! none_ && (((topologyId_ & ~1) & (1u << step)) == 0);
│ │ │ │ -
350 }
│ │ │ │ -
351
│ │ │ │ -
353 constexpr bool isPrismatic() const {
│ │ │ │ -
354 return ! none_ && (( (topologyId_ | 1) & (1u << (dim_-1))) != 0);
│ │ │ │ -
355 }
│ │ │ │ -
356
│ │ │ │ -
361 constexpr bool isPrismatic(const int& step) const {
│ │ │ │ -
362 return ! none_ && (( (topologyId_ | 1) & (1u << step)) != 0);
│ │ │ │ -
363 }
│ │ │ │ -
364
│ │ │ │ -
366 constexpr bool isNone() const {
│ │ │ │ -
367 return none_;
│ │ │ │ -
368 }
│ │ │ │ -
369
│ │ │ │ -
371 constexpr unsigned int dim() const {
│ │ │ │ -
372 return dim_;
│ │ │ │ -
373 }
│ │ │ │ -
374
│ │ │ │ -
376 constexpr unsigned int id() const {
│ │ │ │ -
377 return topologyId_;
│ │ │ │ -
378 }
│ │ │ │ -
379
│ │ │ │ -
387 constexpr bool operator==(const GeometryType& other) const {
│ │ │ │ -
388 return ( ( none_ == other.none_ )
│ │ │ │ -
389 && ( ( none_ == true )
│ │ │ │ -
390 || ( ( dim_ == other.dim_ )
│ │ │ │ -
391 && ( (topologyId_ >> 1) == (other.topologyId_ >> 1) )
│ │ │ │ -
392 )
│ │ │ │ -
393 )
│ │ │ │ -
394 );
│ │ │ │ -
395 }
│ │ │ │ -
396
│ │ │ │ -
398 constexpr bool operator!=(const GeometryType& other) const {
│ │ │ │ -
399 return ! ((*this)==other);
│ │ │ │ -
400 }
│ │ │ │ -
401
│ │ │ │ -
403 constexpr bool operator < (const GeometryType& other) const {
│ │ │ │ -
404 return ( ( none_ < other.none_ )
│ │ │ │ -
405 || ( !( other.none_ < none_ )
│ │ │ │ -
406 && ( ( dim_ < other.dim_ )
│ │ │ │ -
407 || ( (other.dim_ == dim_)
│ │ │ │ -
408 && ((topologyId_ >> 1) < (other.topologyId_ >> 1) )
│ │ │ │ -
409 )
│ │ │ │ -
410 )
│ │ │ │ -
411 )
│ │ │ │ -
412 );
│ │ │ │ -
413 }
│ │ │ │ -
414
│ │ │ │ -
417 };
│ │ │ │ -
418
│ │ │ │ -
420 inline std::ostream& operator<< (std::ostream& s, const GeometryType& a)
│ │ │ │ -
421 {
│ │ │ │ -
422 if (a.isSimplex())
│ │ │ │ -
423 {
│ │ │ │ -
424 s << "(simplex, " << a.dim() << ")";
│ │ │ │ -
425 return s;
│ │ │ │ -
426 }
│ │ │ │ -
427 if (a.isCube())
│ │ │ │ -
428 {
│ │ │ │ -
429 s << "(cube, " << a.dim() << ")";
│ │ │ │ -
430 return s;
│ │ │ │ -
431 }
│ │ │ │ -
432 if (a.isPyramid())
│ │ │ │ -
433 {
│ │ │ │ -
434 s << "(pyramid, 3)";
│ │ │ │ -
435 return s;
│ │ │ │ -
436 }
│ │ │ │ -
437 if (a.isPrism())
│ │ │ │ -
438 {
│ │ │ │ -
439 s << "(prism, 3)";
│ │ │ │ -
440 return s;
│ │ │ │ -
441 }
│ │ │ │ -
442 if (a.isNone())
│ │ │ │ -
443 {
│ │ │ │ -
444 s << "(none, " << a.dim() << ")";
│ │ │ │ -
445 return s;
│ │ │ │ -
446 }
│ │ │ │ -
447 s << "(other [" << a.id() << "], " << a.dim() << ")";
│ │ │ │ -
448 return s;
│ │ │ │ -
449 }
│ │ │ │ -
450
│ │ │ │ -
451
│ │ │ │ -
453
│ │ │ │ -
457 namespace GeometryTypes {
│ │ │ │ -
458
│ │ │ │ -
460
│ │ │ │ -
463 inline constexpr GeometryType simplex(unsigned int dim)
│ │ │ │ -
464 {
│ │ │ │ -
465 return GeometryType(0,dim,false);
│ │ │ │ -
466 }
│ │ │ │ -
467
│ │ │ │ -
469
│ │ │ │ -
472 inline constexpr GeometryType cube(unsigned int dim)
│ │ │ │ -
473 {
│ │ │ │ -
474 return GeometryType(((dim>1) ? ((1 << dim) - 1) : 0),dim,false);
│ │ │ │ -
475 }
│ │ │ │ -
476
│ │ │ │ -
478
│ │ │ │ -
481 inline constexpr GeometryType none(unsigned int dim)
│ │ │ │ -
482 {
│ │ │ │ -
483 return GeometryType(0,dim,true);
│ │ │ │ -
484 }
│ │ │ │ -
485
│ │ │ │ -
487 inline constexpr GeometryType conicalExtension(const GeometryType& gt)
│ │ │ │ -
488 {
│ │ │ │ -
489 return GeometryType(gt.id(), gt.dim()+1, gt.isNone());
│ │ │ │ -
490 }
│ │ │ │ -
491
│ │ │ │ -
493 inline constexpr GeometryType prismaticExtension(const GeometryType& gt)
│ │ │ │ -
494 {
│ │ │ │ -
495 return GeometryType(gt.id() | ((1 << gt.dim())), gt.dim()+1, gt.isNone());
│ │ │ │ -
496 }
│ │ │ │ -
497
│ │ │ │ -
498#ifndef __cpp_inline_variables
│ │ │ │ -
499 namespace {
│ │ │ │ -
500#endif
│ │ │ │ -
501
│ │ │ │ -
503
│ │ │ │ -
506 DUNE_INLINE_VARIABLE constexpr GeometryType vertex = GeometryType(0,0,false);
│ │ │ │ -
507
│ │ │ │ -
509
│ │ │ │ -
512 DUNE_INLINE_VARIABLE constexpr GeometryType line = GeometryType(0,1,false);
│ │ │ │ -
513
│ │ │ │ -
515
│ │ │ │ -
518 DUNE_INLINE_VARIABLE constexpr GeometryType triangle = simplex(2);
│ │ │ │ -
519
│ │ │ │ -
521
│ │ │ │ -
524 DUNE_INLINE_VARIABLE constexpr GeometryType quadrilateral = cube(2);
│ │ │ │ -
525
│ │ │ │ -
527
│ │ │ │ -
530 DUNE_INLINE_VARIABLE constexpr GeometryType tetrahedron = simplex(3);
│ │ │ │ -
531
│ │ │ │ -
533
│ │ │ │ -
536 DUNE_INLINE_VARIABLE constexpr GeometryType pyramid = GeometryType(0b0011,3,false);
│ │ │ │ -
537
│ │ │ │ -
539
│ │ │ │ -
542 DUNE_INLINE_VARIABLE constexpr GeometryType prism = GeometryType(0b0101,3,false);
│ │ │ │ -
543
│ │ │ │ -
545
│ │ │ │ -
548 DUNE_INLINE_VARIABLE constexpr GeometryType hexahedron = cube(3);
│ │ │ │ -
549
│ │ │ │ -
550#ifndef __cpp_inline_variables
│ │ │ │ -
551 }
│ │ │ │ -
552#endif
│ │ │ │ -
553
│ │ │ │ -
554 }
│ │ │ │ -
555
│ │ │ │ -
556 namespace Impl
│ │ │ │ -
557 {
│ │ │ │ -
558
│ │ │ │ -
560 inline constexpr GeometryType getBase(const GeometryType& gt) {
│ │ │ │ -
561 return GeometryType(gt.id() & ((1 << (gt.dim()-1))-1), gt.dim()-1, gt.isNone());
│ │ │ │ -
562 }
│ │ │ │ -
563
│ │ │ │ -
564
│ │ │ │ -
565 // IfGeometryType
│ │ │ │ -
566 // ----------
│ │ │ │ -
567
│ │ │ │ -
568 template< template< GeometryType::Id > class Operation, int dim, GeometryType::Id geometryId = GeometryTypes::vertex >
│ │ │ │ -
569 struct IfGeometryType
│ │ │ │ -
570 {
│ │ │ │ -
571 static constexpr GeometryType geometry = geometryId;
│ │ │ │ -
572 template< class... Args >
│ │ │ │ -
573 static auto apply ( GeometryType gt, Args &&... args )
│ │ │ │ -
574 {
│ │ │ │ -
575 GeometryType lowerGeometry(gt.id() >>1 , gt.dim()-1, gt.isNone());
│ │ │ │ -
576
│ │ │ │ -
577 if( gt.id() & 1 )
│ │ │ │ -
578 return IfGeometryType< Operation, dim-1, GeometryTypes::prismaticExtension(geometry).toId() >::apply( lowerGeometry, std::forward< Args >( args )... );
│ │ │ │ -
579 else
│ │ │ │ -
580 return IfGeometryType< Operation, dim-1, GeometryTypes::conicalExtension(geometry).toId() >::apply( lowerGeometry, std::forward< Args >( args )... );
│ │ │ │ -
581 }
│ │ │ │ -
582 };
│ │ │ │ -
583
│ │ │ │ -
584 template< template< GeometryType::Id > class Operation, GeometryType::Id geometryId >
│ │ │ │ -
585 struct IfGeometryType< Operation, 0, geometryId>
│ │ │ │ -
586 {
│ │ │ │ -
587 template< class... Args >
│ │ │ │ -
588 static auto apply ([[maybe_unused]] GeometryType gt, Args &&... args )
│ │ │ │ -
589 {
│ │ │ │ -
590 return Operation< geometryId >::apply( std::forward< Args >( args )... );
│ │ │ │ -
591 }
│ │ │ │ -
592 };
│ │ │ │ -
593 } // namespace Impl
│ │ │ │ -
594} // namespace Dune
│ │ │ │ -
595
│ │ │ │ -
596#endif // DUNE_GEOMETRY_TYPE_HH
│ │ │ │ - │ │ │ │ -
constexpr GeometryType line
GeometryType representing a line.
Definition: type.hh:512
│ │ │ │ -
constexpr GeometryType cube(unsigned int dim)
Returns a GeometryType representing a hypercube of dimension dim.
Definition: type.hh:472
│ │ │ │ -
constexpr GeometryType prism
GeometryType representing a 3D prism.
Definition: type.hh:542
│ │ │ │ -
constexpr GeometryType triangle
GeometryType representing a triangle.
Definition: type.hh:518
│ │ │ │ -
constexpr GeometryType quadrilateral
GeometryType representing a quadrilateral (a square).
Definition: type.hh:524
│ │ │ │ -
constexpr GeometryType hexahedron
GeometryType representing a hexahedron.
Definition: type.hh:548
│ │ │ │ -
constexpr GeometryType pyramid
GeometryType representing a 3D pyramid.
Definition: type.hh:536
│ │ │ │ -
constexpr GeometryType tetrahedron
GeometryType representing a tetrahedron.
Definition: type.hh:530
│ │ │ │ -
constexpr GeometryType none(unsigned int dim)
Returns a GeometryType representing a singular of dimension dim.
Definition: type.hh:481
│ │ │ │ -
constexpr GeometryType simplex(unsigned int dim)
Returns a GeometryType representing a simplex of dimension dim.
Definition: type.hh:463
│ │ │ │ -
constexpr GeometryType vertex
GeometryType representing a vertex.
Definition: type.hh:506
│ │ │ │ +
110 static void release ( Object *object )
│ │ │ │ +
111 {}
│ │ │ │ +
112
│ │ │ │ +
113 private:
│ │ │ │ +
114 struct ObjectDeleter
│ │ │ │ +
115 {
│ │ │ │ +
116 void operator() ( Object *ptr ) const { Factory::release( ptr ); }
│ │ │ │ +
117 };
│ │ │ │ +
118
│ │ │ │ +
119 static TopologySingletonFactory &instance ()
│ │ │ │ +
120 {
│ │ │ │ +
121 static TopologySingletonFactory instance;
│ │ │ │ +
122 return instance;
│ │ │ │ +
123 }
│ │ │ │ +
124
│ │ │ │ +
125 static const unsigned int numTopologies = (1 << dimension);
│ │ │ │ +
126 typedef std::array< std::unique_ptr< Object, ObjectDeleter >, numTopologies > Array;
│ │ │ │ +
127 typedef std::map< Key, Array > Storage;
│ │ │ │ +
128
│ │ │ │ +
129 TopologySingletonFactory () = default;
│ │ │ │ +
130
│ │ │ │ +
131 std::unique_ptr< Object, ObjectDeleter > &find ( const unsigned int topologyId, const Key &key )
│ │ │ │ +
132 {
│ │ │ │ +
133 return storage_[ key ][ topologyId ];
│ │ │ │ +
134 }
│ │ │ │ +
135
│ │ │ │ +
136 Object *getObject ( const Dune::GeometryType &gt, const Key &key )
│ │ │ │ +
137 {
│ │ │ │ +
138 auto &object = find( gt.id(), key );
│ │ │ │ +
139 if( !object )
│ │ │ │ +
140 object.reset( Factory::create( gt, key ) );
│ │ │ │ +
141 return object.get();
│ │ │ │ +
142 }
│ │ │ │ +
143
│ │ │ │ +
144 template< GeometryType::Id geometryId >
│ │ │ │ +
145 Object *getObject ( const Key &key )
│ │ │ │ +
146 {
│ │ │ │ +
147 static constexpr GeometryType geometry = geometryId;
│ │ │ │ +
148 auto &object = find( geometry.id(), key );
│ │ │ │ +
149 if( !object )
│ │ │ │ +
150 object.reset( Factory::template create< geometry >( key ) );
│ │ │ │ +
151 return object.get();
│ │ │ │ +
152 }
│ │ │ │ +
153
│ │ │ │ +
154 template< class Topology >
│ │ │ │ +
155 Object *getObject ( const Key &key )
│ │ │ │ +
156 {
│ │ │ │ +
157 auto &object = find( Topology::id, key );
│ │ │ │ +
158 if( !object )
│ │ │ │ +
159 object.reset( Factory::template create< Topology >( key ) );
│ │ │ │ +
160 return object.get();
│ │ │ │ +
161 }
│ │ │ │ +
162
│ │ │ │ +
163 Storage storage_;
│ │ │ │ +
164 };
│ │ │ │ +
165
│ │ │ │ +
166}
│ │ │ │ +
167
│ │ │ │ +
168#endif // #ifndef DUNE_GEOMETRY_TOPOLOGYFACTORY_HH
│ │ │ │ +
Helper classes to provide indices for geometrytypes for use in a vector.
│ │ │ │ +
A unique label for each type of element that can occur in a grid.
│ │ │ │
Definition: affinegeometry.hh:21
│ │ │ │ -
std::ostream & operator<<(std::ostream &s, const GeometryType &a)
Prints the type to an output stream.
Definition: type.hh:420
│ │ │ │ -
constexpr GeometryType prismaticExtension(const GeometryType &gt)
Return GeometryType of a prismatic construction with gt as base
Definition: type.hh:493
│ │ │ │ -
constexpr GeometryType conicalExtension(const GeometryType &gt)
Return GeometryType of a conical construction with gt as base
Definition: type.hh:487
│ │ │ │ +
Provide a factory over the generic topologies.
Definition: topologyfactory.hh:42
│ │ │ │ +
Traits::Factory Factory
Definition: topologyfactory.hh:47
│ │ │ │ +
static Object * create(const Dune::GeometryType &gt, const Key &key)
dynamically create objects
Definition: topologyfactory.hh:50
│ │ │ │ +
static const unsigned int dimension
Definition: topologyfactory.hh:44
│ │ │ │ +
static Object * create(const Key &key)
statically create objects
Definition: topologyfactory.hh:58
│ │ │ │ +
static void release(Object *object)
release the object returned by the create methods
Definition: topologyfactory.hh:71
│ │ │ │ +
Traits::Key Key
Definition: topologyfactory.hh:45
│ │ │ │ +
Traits::Object Object
Definition: topologyfactory.hh:46
│ │ │ │ +
A wrapper for a TopologyFactory providing singleton storage. Same usage as TopologyFactory but with e...
Definition: topologyfactory.hh:82
│ │ │ │ +
static auto create(const Key &key) -> std::enable_if_t< Topology::dimension==dimension, Object * >
statically create objects
Definition: topologyfactory.hh:103
│ │ │ │ +
static Object * create(const Dune::GeometryType &gt, const Key &key)
dynamically create objects
Definition: topologyfactory.hh:88
│ │ │ │ +
static void release(Object *object)
release the object returned by the create methods
Definition: topologyfactory.hh:110
│ │ │ │ +
const Factory::Object Object
Definition: topologyfactory.hh:85
│ │ │ │ +
Factory::Key Key
Definition: topologyfactory.hh:84
│ │ │ │ +
static auto create(const Key &key) -> std::enable_if_t< static_cast< GeometryType >(geometryId).dim()==dimension, Object * >
statically create objects
Definition: topologyfactory.hh:95
│ │ │ │ +
static const unsigned int dimension
Definition: topologyfactory.hh:83
│ │ │ │
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:125
│ │ │ │ -
constexpr GeometryType(unsigned int topologyId, unsigned int dim)
Constructor, using the topologyId (integer) and the dimension.
Definition: type.hh:262
│ │ │ │ -
constexpr bool operator<(const GeometryType &other) const
less-than operation for use with maps
Definition: type.hh:403
│ │ │ │ -
constexpr bool operator!=(const GeometryType &other) const
Check for inequality.
Definition: type.hh:398
│ │ │ │ -
constexpr bool isPyramid() const
Return true if entity is a pyramid.
Definition: type.hh:315
│ │ │ │ -
constexpr bool isTetrahedron() const
Return true if entity is a tetrahedron.
Definition: type.hh:310
│ │ │ │ -
constexpr bool isPrism() const
Return true if entity is a prism.
Definition: type.hh:320
│ │ │ │ -
constexpr bool isVertex() const
Return true if entity is a vertex.
Definition: type.hh:290
│ │ │ │ -
constexpr bool operator==(const GeometryType &other) const
Check for equality. This method knows that in dimension 0 and 1 all BasicTypes are equal.
Definition: type.hh:387
│ │ │ │ -
constexpr Id toId() const
Create an Id representation of this GeometryType.
Definition: type.hh:221
│ │ │ │ -
constexpr bool isConical(const int &step) const
Return true if entity was constructed with a conical product in the chosen step.
Definition: type.hh:348
│ │ │ │ -
constexpr unsigned int dim() const
Return dimension of the type.
Definition: type.hh:371
│ │ │ │ -
constexpr bool isPrismatic(const int &step) const
Return true if entity was constructed with a prismatic product in the chosen step.
Definition: type.hh:361
│ │ │ │ -
constexpr bool isTriangle() const
Return true if entity is a triangle.
Definition: type.hh:300
│ │ │ │ -
GeometryType(TopologyType t)
Constructor from static TopologyType class.
Definition: type.hh:278
│ │ │ │ -
constexpr GeometryType(unsigned int topologyId, unsigned int dim, bool isNone)
Constructor, using the topologyId (integer), the dimension and a flag for type none.
Definition: type.hh:253
│ │ │ │ -
BasicType
Each entity can be tagged by one of these basic types plus its space dimension.
Definition: type.hh:131
│ │ │ │ -
@ cube
Cube element in any nonnegative dimension.
Definition: type.hh:133
│ │ │ │ -
@ simplex
Simplicial element in any nonnegative dimension.
Definition: type.hh:132
│ │ │ │ -
@ pyramid
Four sided pyramid in three dimensions.
Definition: type.hh:134
│ │ │ │ -
@ extended
Other, more general topology, representable as topologyId.
Definition: type.hh:136
│ │ │ │ -
@ none
Even more general topology, cannot be specified by a topologyId. Two GeometryTypes with 'none' type a...
Definition: type.hh:137
│ │ │ │ -
@ prism
Prism element in three dimensions.
Definition: type.hh:135
│ │ │ │ -
constexpr GeometryType(Id id)
Reconstruct a Geometry type from a GeometryType::Id.
Definition: type.hh:233
│ │ │ │ -
constexpr bool isCube() const
Return true if entity is a cube of any dimension.
Definition: type.hh:335
│ │ │ │ -
constexpr GeometryType()
Default constructor, not initializing anything.
Definition: type.hh:243
│ │ │ │ -
constexpr bool isConical() const
Return true if entity was constructed with a conical product in the last step.
Definition: type.hh:340
│ │ │ │ -
constexpr bool isLine() const
Return true if entity is a line segment.
Definition: type.hh:295
│ │ │ │ -
constexpr bool isQuadrilateral() const
Return true if entity is a quadrilateral.
Definition: type.hh:305
│ │ │ │ -
constexpr bool isPrismatic() const
Return true if entity was constructed with a prismatic product in the last step.
Definition: type.hh:353
│ │ │ │
constexpr unsigned int id() const
Return the topology id of the type.
Definition: type.hh:376
│ │ │ │ -
constexpr bool isNone() const
Return true if entity is a singular of any dimension.
Definition: type.hh:366
│ │ │ │ -
constexpr bool isHexahedron() const
Return true if entity is a hexahedron.
Definition: type.hh:325
│ │ │ │ -
constexpr bool isSimplex() const
Return true if entity is a simplex of any dimension.
Definition: type.hh:330
│ │ │ │ -
IdType Id
An integral id representing a GeometryType.
Definition: type.hh:192
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,617 +4,225 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ -type.hh │ │ │ │ │ +topologyfactory.hh │ │ │ │ │ Go_to_the_documentation_of_this_file. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ - 5#ifndef DUNE_GEOMETRY_TYPE_HH │ │ │ │ │ - 6#define DUNE_GEOMETRY_TYPE_HH │ │ │ │ │ + 5#ifndef DUNE_GEOMETRY_TOPOLOGYFACTORY_HH │ │ │ │ │ + 6#define DUNE_GEOMETRY_TOPOLOGYFACTORY_HH │ │ │ │ │ 7 │ │ │ │ │ - 12#include │ │ │ │ │ - 13 │ │ │ │ │ - 14#include │ │ │ │ │ - 15#include │ │ │ │ │ - 16 │ │ │ │ │ - 17#include │ │ │ │ │ - 18#include │ │ │ │ │ - 19#include │ │ │ │ │ - 20#include │ │ │ │ │ + 8#include │ │ │ │ │ + 9 │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12#include │ │ │ │ │ + 13#include │ │ │ │ │ + 14#include │ │ │ │ │ + 15 │ │ │ │ │ + 16#include │ │ │ │ │ + 17#include │ │ │ │ │ + 18 │ │ │ │ │ + 19namespace Dune │ │ │ │ │ + 20{ │ │ │ │ │ 21 │ │ │ │ │ - 22namespace Dune │ │ │ │ │ - 23{ │ │ │ │ │ - 24 │ │ │ │ │ - 25 namespace Impl │ │ │ │ │ - 26 { │ │ │ │ │ - 27 │ │ │ │ │ - 28 enum TopologyConstruction { pyramidConstruction = 0, prismConstruction = 1 │ │ │ │ │ -}; │ │ │ │ │ - 29 │ │ │ │ │ - 30 // Dynamic Topology Properties │ │ │ │ │ - 31 // --------------------------- │ │ │ │ │ - 32 │ │ │ │ │ - 41 inline static unsigned int numTopologies ( int dim ) noexcept │ │ │ │ │ + 40 template │ │ │ │ │ +41 struct TopologyFactory │ │ │ │ │ 42 { │ │ │ │ │ - 43 return (1u << dim); │ │ │ │ │ - 44 } │ │ │ │ │ - 45 │ │ │ │ │ - 57 inline bool static isPyramid ( unsigned int topologyId, int dim, int codim │ │ │ │ │ -= 0 ) noexcept │ │ │ │ │ - 58 { │ │ │ │ │ - 59 assert( (dim > 0) && (topologyId < numTopologies( dim )) ); │ │ │ │ │ - 60 assert( (0 <= codim) && (codim < dim) ); │ │ │ │ │ - 61 return (((topologyId & ~1) & (1u << (dim-codim-1))) == 0); │ │ │ │ │ - 62 } │ │ │ │ │ - 63 │ │ │ │ │ - 75 inline static bool isPrism ( unsigned int topologyId, int dim, int codim = │ │ │ │ │ -0 ) noexcept │ │ │ │ │ - 76 { │ │ │ │ │ - 77 assert( (dim > 0) && (topologyId < numTopologies( dim )) ); │ │ │ │ │ - 78 assert( (0 <= codim) && (codim < dim) ); │ │ │ │ │ - 79 return (( (topologyId | 1) & (1u << (dim-codim-1))) != 0); │ │ │ │ │ - 80 } │ │ │ │ │ - 81 │ │ │ │ │ - 89 inline static unsigned int baseTopologyId ( unsigned int topologyId, int │ │ │ │ │ -dim, int codim = 1 ) noexcept │ │ │ │ │ - 90 { │ │ │ │ │ - 91 assert( (dim >= 0) && (topologyId < numTopologies( dim )) ); │ │ │ │ │ - 92 assert( (0 <= codim) && (codim <= dim) ); │ │ │ │ │ - 93 return topologyId & ((1u << (dim-codim)) - 1); │ │ │ │ │ - 94 } │ │ │ │ │ - 95 │ │ │ │ │ - 96 } // namespace Impl │ │ │ │ │ - 97 │ │ │ │ │ - 98// the Topology classes are deprecated and will be removed for the 2.8. │ │ │ │ │ - 99// Temporarily a header 'deprecated_topology.hh' is provided which will be │ │ │ │ │ -removed after the 2.9 release. │ │ │ │ │ - 100#if __GNUC__ >= 7 │ │ │ │ │ - 101# pragma GCC diagnostic push │ │ │ │ │ - 102# pragma GCC diagnostic ignored "-Wdeprecated-declarations" │ │ │ │ │ - 103#endif │ │ │ │ │ - 104#include │ │ │ │ │ - 105#if __GNUC__ >= 7 │ │ │ │ │ - 106# pragma GCC diagnostic pop │ │ │ │ │ - 107#endif │ │ │ │ │ + 43 // extract types from Traits class │ │ │ │ │ +44 static const unsigned int dimension = Traits::dimension; │ │ │ │ │ +45 typedef typename Traits::Key Key; │ │ │ │ │ +46 typedef typename Traits::Object Object; │ │ │ │ │ +47 typedef typename Traits::Factory Factory; │ │ │ │ │ + 48 │ │ │ │ │ +50 static Object *create ( const Dune::GeometryType >, const Key &key ) │ │ │ │ │ + 51 { │ │ │ │ │ + 52 return Impl::toGeometryTypeIdConstant(gt, [&](auto id) { │ │ │ │ │ + 53 return create(key); │ │ │ │ │ + 54 }); │ │ │ │ │ + 55 } │ │ │ │ │ + 57 template< GeometryType::Id geometryId > │ │ │ │ │ +58 static Object *create ( const Key &key ) │ │ │ │ │ + 59 { │ │ │ │ │ + 60 return Factory::template createObject< geometryId >( key ); │ │ │ │ │ + 61 } │ │ │ │ │ + 62 │ │ │ │ │ + 64 template< class Topology > │ │ │ │ │ +65 static Object *create ( const Key &key ) │ │ │ │ │ + 66 { │ │ │ │ │ + 67 return Factory::template createObject< Topology >( key ); │ │ │ │ │ + 68 } │ │ │ │ │ + 69 │ │ │ │ │ +71 static void release( Object *object ) { delete object; } │ │ │ │ │ + 72 }; │ │ │ │ │ + 73 │ │ │ │ │ + 74 │ │ │ │ │ + 75 │ │ │ │ │ + 80 template │ │ │ │ │ +81 struct TopologySingletonFactory │ │ │ │ │ + 82 { │ │ │ │ │ +83 static const unsigned int dimension = Factory::dimension; │ │ │ │ │ +84 typedef typename Factory::Key Key; │ │ │ │ │ +85 typedef const typename Factory::Object Object; │ │ │ │ │ + 86 │ │ │ │ │ +88 static Object *create ( const Dune::GeometryType >, const Key &key ) │ │ │ │ │ + 89 { │ │ │ │ │ + 90 assert( gt.id() < numTopologies ); │ │ │ │ │ + 91 return instance().getObject( gt, key ); │ │ │ │ │ + 92 } │ │ │ │ │ + 94 template< GeometryType::Id geometryId > │ │ │ │ │ +95 static auto create ( const Key &key ) │ │ │ │ │ + 96 -> std::enable_if_t< static_cast(geometryId).dim() == │ │ │ │ │ +dimension, Object * > │ │ │ │ │ + 97 { │ │ │ │ │ + 98 return instance().template getObject< geometryId >( key ); │ │ │ │ │ + 99 } │ │ │ │ │ + 100 │ │ │ │ │ + 102 template< class Topology > │ │ │ │ │ +103 static auto create ( const Key &key ) │ │ │ │ │ + 104 -> std::enable_if_t< Topology::dimension == dimension, Object * > │ │ │ │ │ + 105 { │ │ │ │ │ + 106 return instance().template getObject< Topology >( key ); │ │ │ │ │ + 107 } │ │ │ │ │ 108 │ │ │ │ │ - 109 // GeometryType │ │ │ │ │ - 110 // ------------- │ │ │ │ │ - 111 │ │ │ │ │ -124 class GeometryType │ │ │ │ │ - 125 { │ │ │ │ │ - 126 public: │ │ │ │ │ - 127 │ │ │ │ │ -130 enum │ │ │ │ │ - 131 BasicType { │ │ │ │ │ -132 simplex, │ │ │ │ │ -133 cube, │ │ │ │ │ -134 pyramid, │ │ │ │ │ -135 prism, │ │ │ │ │ -136 extended, │ │ │ │ │ - 137 none │ │ │ │ │ -138 }; │ │ │ │ │ - 139 │ │ │ │ │ - 140 private: │ │ │ │ │ - 141 │ │ │ │ │ - 143 unsigned char dim_; │ │ │ │ │ - 144 │ │ │ │ │ - 146 bool none_; │ │ │ │ │ - 147 │ │ │ │ │ - 149 unsigned int topologyId_; │ │ │ │ │ - 150 │ │ │ │ │ - 151 // Internal type used for the Id. The exact nature of this type is kept │ │ │ │ │ - 152 // as an implementation detail on purpose. We use a scoped enum here │ │ │ │ │ -because scoped enums │ │ │ │ │ - 153 // can be used as template parameters, but are not implicitly converted to │ │ │ │ │ -other integral │ │ │ │ │ - 154 // types by the compiler. That way, we avoid unfortunate implicit │ │ │ │ │ -conversion chains, e.g. │ │ │ │ │ - 155 // people trying to work with GlobalGeometryTypeIndex, but forgetting to │ │ │ │ │ -actually call │ │ │ │ │ - 156 // GlobalGeometryTypeIndex::index(gt) and just using gt directly. │ │ │ │ │ - 157 enum class IdType : std::uint64_t │ │ │ │ │ - 158 {}; │ │ │ │ │ - 159 │ │ │ │ │ - 160 public: │ │ │ │ │ - 161 │ │ │ │ │ -192 using Id = IdType; │ │ │ │ │ - 193 │ │ │ │ │ -201 constexpr operator Id() const │ │ │ │ │ - 202 { │ │ │ │ │ - 203 // recreate the exact storage layout that this class is using, making │ │ │ │ │ -conversion │ │ │ │ │ - 204 // extremely cheap │ │ │ │ │ - 205 std::uint64_t id = dim_ | (std::uint64_t(none_) << 8) | (std::uint64_t │ │ │ │ │ -(topologyId_) << 32); │ │ │ │ │ - 206 return static_cast(id); │ │ │ │ │ - 207 } │ │ │ │ │ - 208 │ │ │ │ │ -221 constexpr Id toId() const │ │ │ │ │ - 222 { │ │ │ │ │ - 223 return static_cast(*this); │ │ │ │ │ - 224 } │ │ │ │ │ - 225 │ │ │ │ │ -233 constexpr GeometryType(Id id) │ │ │ │ │ - 234 : dim_(static_cast(id) & 0xFF) │ │ │ │ │ - 235 , none_(static_cast(id) & 0x100) │ │ │ │ │ - 236 , topologyId_(static_cast(id) >> 32) │ │ │ │ │ - 237 {} │ │ │ │ │ - 238 │ │ │ │ │ - 241 │ │ │ │ │ -243 constexpr GeometryType () │ │ │ │ │ - 244 : dim_(0), none_(true), topologyId_(0) │ │ │ │ │ - 245 {} │ │ │ │ │ - 246 │ │ │ │ │ -253 constexpr GeometryType(unsigned int topologyId, unsigned int dim, bool │ │ │ │ │ -isNone) │ │ │ │ │ - 254 : dim_(dim), none_(isNone), topologyId_(topologyId) │ │ │ │ │ - 255 {} │ │ │ │ │ - 256 │ │ │ │ │ -262 constexpr GeometryType(unsigned int topologyId, unsigned int dim) │ │ │ │ │ - 263 : dim_(dim), none_(false), topologyId_(topologyId) │ │ │ │ │ - 264 {} │ │ │ │ │ - 265 │ │ │ │ │ - 276 template> │ │ │ │ │ -278 explicit GeometryType(TopologyType t) │ │ │ │ │ - 279 : dim_(TopologyType::dimension), none_(false), topologyId_(TopologyType:: │ │ │ │ │ -id) │ │ │ │ │ - 280 { │ │ │ │ │ - 281 DUNE_UNUSED_PARAMETER(t); │ │ │ │ │ - 282 } │ │ │ │ │ - 283 │ │ │ │ │ -290 constexpr bool isVertex() const { │ │ │ │ │ - 291 return dim_==0; │ │ │ │ │ - 292 } │ │ │ │ │ - 293 │ │ │ │ │ -295 constexpr bool isLine() const { │ │ │ │ │ - 296 return dim_==1; │ │ │ │ │ - 297 } │ │ │ │ │ - 298 │ │ │ │ │ -300 constexpr bool isTriangle() const { │ │ │ │ │ - 301 return ! none_ && dim_==2 && (topologyId_ | 1) == 0b0001; │ │ │ │ │ - 302 } │ │ │ │ │ - 303 │ │ │ │ │ -305 constexpr bool isQuadrilateral() const { │ │ │ │ │ - 306 return ! none_ && dim_==2 && (topologyId_ | 1) == 0b0011; │ │ │ │ │ - 307 } │ │ │ │ │ - 308 │ │ │ │ │ -310 constexpr bool isTetrahedron() const { │ │ │ │ │ - 311 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0001; │ │ │ │ │ - 312 } │ │ │ │ │ - 313 │ │ │ │ │ -315 constexpr bool isPyramid() const { │ │ │ │ │ - 316 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0011; │ │ │ │ │ - 317 } │ │ │ │ │ - 318 │ │ │ │ │ -320 constexpr bool isPrism() const { │ │ │ │ │ - 321 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0101; │ │ │ │ │ - 322 } │ │ │ │ │ - 323 │ │ │ │ │ -325 constexpr bool isHexahedron() const { │ │ │ │ │ - 326 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0111; │ │ │ │ │ - 327 } │ │ │ │ │ - 328 │ │ │ │ │ -330 constexpr bool isSimplex() const { │ │ │ │ │ - 331 return ! none_ && (topologyId_ | 1) == 1; │ │ │ │ │ - 332 } │ │ │ │ │ - 333 │ │ │ │ │ -335 constexpr bool isCube() const { │ │ │ │ │ - 336 return ! none_ && ((topologyId_ ^ ((1 << dim_)-1)) >> 1 == 0); │ │ │ │ │ - 337 } │ │ │ │ │ - 338 │ │ │ │ │ -340 constexpr bool isConical() const { │ │ │ │ │ - 341 return ! none_ && (((topologyId_ & ~1) & (1u << (dim_-1))) == 0); │ │ │ │ │ - 342 } │ │ │ │ │ - 343 │ │ │ │ │ -348 constexpr bool isConical(const int& step) const { │ │ │ │ │ - 349 return ! none_ && (((topologyId_ & ~1) & (1u << step)) == 0); │ │ │ │ │ - 350 } │ │ │ │ │ - 351 │ │ │ │ │ -353 constexpr bool isPrismatic() const { │ │ │ │ │ - 354 return ! none_ && (( (topologyId_ | 1) & (1u << (dim_-1))) != 0); │ │ │ │ │ - 355 } │ │ │ │ │ - 356 │ │ │ │ │ -361 constexpr bool isPrismatic(const int& step) const { │ │ │ │ │ - 362 return ! none_ && (( (topologyId_ | 1) & (1u << step)) != 0); │ │ │ │ │ - 363 } │ │ │ │ │ - 364 │ │ │ │ │ -366 constexpr bool isNone() const { │ │ │ │ │ - 367 return none_; │ │ │ │ │ - 368 } │ │ │ │ │ - 369 │ │ │ │ │ -371 constexpr unsigned int dim() const { │ │ │ │ │ - 372 return dim_; │ │ │ │ │ - 373 } │ │ │ │ │ - 374 │ │ │ │ │ -376 constexpr unsigned int id() const { │ │ │ │ │ - 377 return topologyId_; │ │ │ │ │ - 378 } │ │ │ │ │ - 379 │ │ │ │ │ -387 constexpr bool operator==(const GeometryType& other) const { │ │ │ │ │ - 388 return ( ( none_ == other.none_ ) │ │ │ │ │ - 389 && ( ( none_ == true ) │ │ │ │ │ - 390 || ( ( dim_ == other.dim_ ) │ │ │ │ │ - 391 && ( (topologyId_ >> 1) == (other.topologyId_ >> 1) ) │ │ │ │ │ - 392 ) │ │ │ │ │ - 393 ) │ │ │ │ │ - 394 ); │ │ │ │ │ - 395 } │ │ │ │ │ - 396 │ │ │ │ │ -398 constexpr bool operator!=(const GeometryType& other) const { │ │ │ │ │ - 399 return ! ((*this)==other); │ │ │ │ │ - 400 } │ │ │ │ │ - 401 │ │ │ │ │ -403 constexpr bool operator_<(const GeometryType& other) const { │ │ │ │ │ - 404 return ( ( none_ < other.none_ ) │ │ │ │ │ - 405 || ( !( other.none_ < none_ ) │ │ │ │ │ - 406 && ( ( dim_ < other.dim_ ) │ │ │ │ │ - 407 || ( (other.dim_ == dim_) │ │ │ │ │ - 408 && ((topologyId_ >> 1) < (other.topologyId_ >> 1) ) │ │ │ │ │ - 409 ) │ │ │ │ │ - 410 ) │ │ │ │ │ - 411 ) │ │ │ │ │ - 412 ); │ │ │ │ │ - 413 } │ │ │ │ │ - 414 │ │ │ │ │ - 417 }; │ │ │ │ │ - 418 │ │ │ │ │ -420 inline std::ostream& operator<<(std::ostream& s, const GeometryType& a) │ │ │ │ │ - 421 { │ │ │ │ │ - 422 if (a.isSimplex()) │ │ │ │ │ - 423 { │ │ │ │ │ - 424 s << "(simplex, " << a.dim() << ")"; │ │ │ │ │ - 425 return s; │ │ │ │ │ - 426 } │ │ │ │ │ - 427 if (a.isCube()) │ │ │ │ │ - 428 { │ │ │ │ │ - 429 s << "(cube, " << a.dim() << ")"; │ │ │ │ │ - 430 return s; │ │ │ │ │ - 431 } │ │ │ │ │ - 432 if (a.isPyramid()) │ │ │ │ │ - 433 { │ │ │ │ │ - 434 s << "(pyramid, 3)"; │ │ │ │ │ - 435 return s; │ │ │ │ │ - 436 } │ │ │ │ │ - 437 if (a.isPrism()) │ │ │ │ │ - 438 { │ │ │ │ │ - 439 s << "(prism, 3)"; │ │ │ │ │ - 440 return s; │ │ │ │ │ - 441 } │ │ │ │ │ - 442 if (a.isNone()) │ │ │ │ │ - 443 { │ │ │ │ │ - 444 s << "(none, " << a.dim() << ")"; │ │ │ │ │ - 445 return s; │ │ │ │ │ - 446 } │ │ │ │ │ - 447 s << "(other [" << a.id() << "], " << a.dim() << ")"; │ │ │ │ │ - 448 return s; │ │ │ │ │ - 449 } │ │ │ │ │ - 450 │ │ │ │ │ - 451 │ │ │ │ │ - 453 │ │ │ │ │ -457 namespace GeometryTypes { │ │ │ │ │ - 458 │ │ │ │ │ - 460 │ │ │ │ │ -463 inline constexpr GeometryType simplex(unsigned int dim) │ │ │ │ │ - 464 { │ │ │ │ │ - 465 return GeometryType(0,dim,false); │ │ │ │ │ - 466 } │ │ │ │ │ - 467 │ │ │ │ │ - 469 │ │ │ │ │ -472 inline constexpr GeometryType cube(unsigned int dim) │ │ │ │ │ - 473 { │ │ │ │ │ - 474 return GeometryType(((dim>1) ? ((1 << dim) - 1) : 0),dim,false); │ │ │ │ │ - 475 } │ │ │ │ │ - 476 │ │ │ │ │ - 478 │ │ │ │ │ -481 inline constexpr GeometryType none(unsigned int dim) │ │ │ │ │ - 482 { │ │ │ │ │ - 483 return GeometryType(0,dim,true); │ │ │ │ │ - 484 } │ │ │ │ │ - 485 │ │ │ │ │ -487 inline constexpr GeometryType conicalExtension(const GeometryType& gt) │ │ │ │ │ - 488 { │ │ │ │ │ - 489 return GeometryType(gt.id(), gt.dim()+1, gt.isNone()); │ │ │ │ │ - 490 } │ │ │ │ │ - 491 │ │ │ │ │ -493 inline constexpr GeometryType prismaticExtension(const GeometryType& gt) │ │ │ │ │ - 494 { │ │ │ │ │ - 495 return GeometryType(gt.id() | ((1 << gt.dim())), gt.dim()+1, gt.isNone()); │ │ │ │ │ - 496 } │ │ │ │ │ - 497 │ │ │ │ │ - 498#ifndef __cpp_inline_variables │ │ │ │ │ - 499 namespace { │ │ │ │ │ - 500#endif │ │ │ │ │ - 501 │ │ │ │ │ - 503 │ │ │ │ │ -506 DUNE_INLINE_VARIABLE constexpr GeometryType vertex = GeometryType │ │ │ │ │ -(0,0,false); │ │ │ │ │ - 507 │ │ │ │ │ - 509 │ │ │ │ │ -512 DUNE_INLINE_VARIABLE constexpr GeometryType line = GeometryType(0,1,false); │ │ │ │ │ - 513 │ │ │ │ │ - 515 │ │ │ │ │ -518 DUNE_INLINE_VARIABLE constexpr GeometryType triangle = simplex(2); │ │ │ │ │ - 519 │ │ │ │ │ - 521 │ │ │ │ │ -524 DUNE_INLINE_VARIABLE constexpr GeometryType quadrilateral = cube(2); │ │ │ │ │ - 525 │ │ │ │ │ - 527 │ │ │ │ │ -530 DUNE_INLINE_VARIABLE constexpr GeometryType tetrahedron = simplex(3); │ │ │ │ │ - 531 │ │ │ │ │ - 533 │ │ │ │ │ -536 DUNE_INLINE_VARIABLE constexpr GeometryType pyramid = GeometryType │ │ │ │ │ -(0b0011,3,false); │ │ │ │ │ - 537 │ │ │ │ │ - 539 │ │ │ │ │ -542 DUNE_INLINE_VARIABLE constexpr GeometryType prism = GeometryType │ │ │ │ │ -(0b0101,3,false); │ │ │ │ │ - 543 │ │ │ │ │ - 545 │ │ │ │ │ -548 DUNE_INLINE_VARIABLE constexpr GeometryType hexahedron = cube(3); │ │ │ │ │ - 549 │ │ │ │ │ - 550#ifndef __cpp_inline_variables │ │ │ │ │ - 551 } │ │ │ │ │ - 552#endif │ │ │ │ │ - 553 │ │ │ │ │ - 554 } │ │ │ │ │ - 555 │ │ │ │ │ - 556 namespace Impl │ │ │ │ │ - 557 { │ │ │ │ │ - 558 │ │ │ │ │ - 560 inline constexpr GeometryType getBase(const GeometryType& gt) { │ │ │ │ │ - 561 return GeometryType(gt.id() & ((1 << (gt.dim()-1))-1), gt.dim()-1, │ │ │ │ │ -gt.isNone()); │ │ │ │ │ - 562 } │ │ │ │ │ - 563 │ │ │ │ │ - 564 │ │ │ │ │ - 565 // IfGeometryType │ │ │ │ │ - 566 // ---------- │ │ │ │ │ - 567 │ │ │ │ │ - 568 template< template< GeometryType::Id > class Operation, int dim, │ │ │ │ │ -GeometryType::Id geometryId = GeometryTypes::vertex > │ │ │ │ │ - 569 struct IfGeometryType │ │ │ │ │ - 570 { │ │ │ │ │ - 571 static constexpr GeometryType geometry = geometryId; │ │ │ │ │ - 572 template< class... Args > │ │ │ │ │ - 573 static auto apply ( GeometryType gt, Args &&... args ) │ │ │ │ │ - 574 { │ │ │ │ │ - 575 GeometryType lowerGeometry(gt.id() >>1 , gt.dim()-1, gt.isNone()); │ │ │ │ │ - 576 │ │ │ │ │ - 577 if( gt.id() & 1 ) │ │ │ │ │ - 578 return IfGeometryType< Operation, dim-1, GeometryTypes::prismaticExtension │ │ │ │ │ -(geometry).toId() >::apply( lowerGeometry, std::forward< Args >( args )... ); │ │ │ │ │ - 579 else │ │ │ │ │ - 580 return IfGeometryType< Operation, dim-1, GeometryTypes::conicalExtension │ │ │ │ │ -(geometry).toId() >::apply( lowerGeometry, std::forward< Args >( args )... ); │ │ │ │ │ - 581 } │ │ │ │ │ - 582 }; │ │ │ │ │ - 583 │ │ │ │ │ - 584 template< template< GeometryType::Id > class Operation, GeometryType::Id │ │ │ │ │ -geometryId > │ │ │ │ │ - 585 struct IfGeometryType< Operation, 0, geometryId> │ │ │ │ │ - 586 { │ │ │ │ │ - 587 template< class... Args > │ │ │ │ │ - 588 static auto apply ([[maybe_unused]] GeometryType gt, Args &&... args ) │ │ │ │ │ - 589 { │ │ │ │ │ - 590 return Operation< geometryId >::apply( std::forward< Args >( args )... ); │ │ │ │ │ - 591 } │ │ │ │ │ - 592 }; │ │ │ │ │ - 593 } // namespace Impl │ │ │ │ │ - 594} // namespace Dune │ │ │ │ │ - 595 │ │ │ │ │ - 596#endif // DUNE_GEOMETRY_TYPE_HH │ │ │ │ │ -deprecated_topology.hh │ │ │ │ │ -Dune::GeometryTypes::line │ │ │ │ │ -constexpr GeometryType line │ │ │ │ │ -GeometryType representing a line. │ │ │ │ │ -Definition: type.hh:512 │ │ │ │ │ -Dune::GeometryTypes::cube │ │ │ │ │ -constexpr GeometryType cube(unsigned int dim) │ │ │ │ │ -Returns a GeometryType representing a hypercube of dimension dim. │ │ │ │ │ -Definition: type.hh:472 │ │ │ │ │ -Dune::GeometryTypes::prism │ │ │ │ │ -constexpr GeometryType prism │ │ │ │ │ -GeometryType representing a 3D prism. │ │ │ │ │ -Definition: type.hh:542 │ │ │ │ │ -Dune::GeometryTypes::triangle │ │ │ │ │ -constexpr GeometryType triangle │ │ │ │ │ -GeometryType representing a triangle. │ │ │ │ │ -Definition: type.hh:518 │ │ │ │ │ -Dune::GeometryTypes::quadrilateral │ │ │ │ │ -constexpr GeometryType quadrilateral │ │ │ │ │ -GeometryType representing a quadrilateral (a square). │ │ │ │ │ -Definition: type.hh:524 │ │ │ │ │ -Dune::GeometryTypes::hexahedron │ │ │ │ │ -constexpr GeometryType hexahedron │ │ │ │ │ -GeometryType representing a hexahedron. │ │ │ │ │ -Definition: type.hh:548 │ │ │ │ │ -Dune::GeometryTypes::pyramid │ │ │ │ │ -constexpr GeometryType pyramid │ │ │ │ │ -GeometryType representing a 3D pyramid. │ │ │ │ │ -Definition: type.hh:536 │ │ │ │ │ -Dune::GeometryTypes::tetrahedron │ │ │ │ │ -constexpr GeometryType tetrahedron │ │ │ │ │ -GeometryType representing a tetrahedron. │ │ │ │ │ -Definition: type.hh:530 │ │ │ │ │ -Dune::GeometryTypes::none │ │ │ │ │ -constexpr GeometryType none(unsigned int dim) │ │ │ │ │ -Returns a GeometryType representing a singular of dimension dim. │ │ │ │ │ -Definition: type.hh:481 │ │ │ │ │ -Dune::GeometryTypes::simplex │ │ │ │ │ -constexpr GeometryType simplex(unsigned int dim) │ │ │ │ │ -Returns a GeometryType representing a simplex of dimension dim. │ │ │ │ │ -Definition: type.hh:463 │ │ │ │ │ -Dune::GeometryTypes::vertex │ │ │ │ │ -constexpr GeometryType vertex │ │ │ │ │ -GeometryType representing a vertex. │ │ │ │ │ -Definition: type.hh:506 │ │ │ │ │ +110 static void release ( Object *object ) │ │ │ │ │ + 111 {} │ │ │ │ │ + 112 │ │ │ │ │ + 113 private: │ │ │ │ │ + 114 struct ObjectDeleter │ │ │ │ │ + 115 { │ │ │ │ │ + 116 void operator() ( Object *ptr ) const { Factory::release( ptr ); } │ │ │ │ │ + 117 }; │ │ │ │ │ + 118 │ │ │ │ │ + 119 static TopologySingletonFactory &instance () │ │ │ │ │ + 120 { │ │ │ │ │ + 121 static TopologySingletonFactory instance; │ │ │ │ │ + 122 return instance; │ │ │ │ │ + 123 } │ │ │ │ │ + 124 │ │ │ │ │ + 125 static const unsigned int numTopologies = (1 << dimension); │ │ │ │ │ + 126 typedef std::array< std::unique_ptr< Object, ObjectDeleter >, │ │ │ │ │ +numTopologies > Array; │ │ │ │ │ + 127 typedef std::map< Key, Array > Storage; │ │ │ │ │ + 128 │ │ │ │ │ + 129 TopologySingletonFactory () = default; │ │ │ │ │ + 130 │ │ │ │ │ + 131 std::unique_ptr< Object, ObjectDeleter > &find ( const unsigned int │ │ │ │ │ +topologyId, const Key &key ) │ │ │ │ │ + 132 { │ │ │ │ │ + 133 return storage_[ key ][ topologyId ]; │ │ │ │ │ + 134 } │ │ │ │ │ + 135 │ │ │ │ │ + 136 Object *getObject ( const Dune::GeometryType >, const Key &key ) │ │ │ │ │ + 137 { │ │ │ │ │ + 138 auto &object = find( gt.id(), key ); │ │ │ │ │ + 139 if( !object ) │ │ │ │ │ + 140 object.reset( Factory::create( gt, key ) ); │ │ │ │ │ + 141 return object.get(); │ │ │ │ │ + 142 } │ │ │ │ │ + 143 │ │ │ │ │ + 144 template< GeometryType::Id geometryId > │ │ │ │ │ + 145 Object *getObject ( const Key &key ) │ │ │ │ │ + 146 { │ │ │ │ │ + 147 static constexpr GeometryType geometry = geometryId; │ │ │ │ │ + 148 auto &object = find( geometry.id(), key ); │ │ │ │ │ + 149 if( !object ) │ │ │ │ │ + 150 object.reset( Factory::template create< geometry >( key ) ); │ │ │ │ │ + 151 return object.get(); │ │ │ │ │ + 152 } │ │ │ │ │ + 153 │ │ │ │ │ + 154 template< class Topology > │ │ │ │ │ + 155 Object *getObject ( const Key &key ) │ │ │ │ │ + 156 { │ │ │ │ │ + 157 auto &object = find( Topology::id, key ); │ │ │ │ │ + 158 if( !object ) │ │ │ │ │ + 159 object.reset( Factory::template create< Topology >( key ) ); │ │ │ │ │ + 160 return object.get(); │ │ │ │ │ + 161 } │ │ │ │ │ + 162 │ │ │ │ │ + 163 Storage storage_; │ │ │ │ │ + 164 }; │ │ │ │ │ + 165 │ │ │ │ │ + 166} │ │ │ │ │ + 167 │ │ │ │ │ + 168#endif // #ifndef DUNE_GEOMETRY_TOPOLOGYFACTORY_HH │ │ │ │ │ +typeindex.hh │ │ │ │ │ +Helper classes to provide indices for geometrytypes for use in a vector. │ │ │ │ │ +type.hh │ │ │ │ │ +A unique label for each type of element that can occur in a grid. │ │ │ │ │ Dune │ │ │ │ │ Definition: affinegeometry.hh:21 │ │ │ │ │ -Dune::operator<< │ │ │ │ │ -std::ostream & operator<<(std::ostream &s, const GeometryType &a) │ │ │ │ │ -Prints the type to an output stream. │ │ │ │ │ -Definition: type.hh:420 │ │ │ │ │ -Dune::GeometryTypes::prismaticExtension │ │ │ │ │ -constexpr GeometryType prismaticExtension(const GeometryType >) │ │ │ │ │ -Return GeometryType of a prismatic construction with gt as base │ │ │ │ │ -Definition: type.hh:493 │ │ │ │ │ -Dune::GeometryTypes::conicalExtension │ │ │ │ │ -constexpr GeometryType conicalExtension(const GeometryType >) │ │ │ │ │ -Return GeometryType of a conical construction with gt as base │ │ │ │ │ -Definition: type.hh:487 │ │ │ │ │ +Dune::TopologyFactory │ │ │ │ │ +Provide a factory over the generic topologies. │ │ │ │ │ +Definition: topologyfactory.hh:42 │ │ │ │ │ +Dune::TopologyFactory::Factory │ │ │ │ │ +Traits::Factory Factory │ │ │ │ │ +Definition: topologyfactory.hh:47 │ │ │ │ │ +Dune::TopologyFactory::create │ │ │ │ │ +static Object * create(const Dune::GeometryType >, const Key &key) │ │ │ │ │ +dynamically create objects │ │ │ │ │ +Definition: topologyfactory.hh:50 │ │ │ │ │ +Dune::TopologyFactory::dimension │ │ │ │ │ +static const unsigned int dimension │ │ │ │ │ +Definition: topologyfactory.hh:44 │ │ │ │ │ +Dune::TopologyFactory::create │ │ │ │ │ +static Object * create(const Key &key) │ │ │ │ │ +statically create objects │ │ │ │ │ +Definition: topologyfactory.hh:58 │ │ │ │ │ +Dune::TopologyFactory::release │ │ │ │ │ +static void release(Object *object) │ │ │ │ │ +release the object returned by the create methods │ │ │ │ │ +Definition: topologyfactory.hh:71 │ │ │ │ │ +Dune::TopologyFactory::Key │ │ │ │ │ +Traits::Key Key │ │ │ │ │ +Definition: topologyfactory.hh:45 │ │ │ │ │ +Dune::TopologyFactory::Object │ │ │ │ │ +Traits::Object Object │ │ │ │ │ +Definition: topologyfactory.hh:46 │ │ │ │ │ +Dune::TopologySingletonFactory │ │ │ │ │ +A wrapper for a TopologyFactory providing singleton storage. Same usage as │ │ │ │ │ +TopologyFactory but with e... │ │ │ │ │ +Definition: topologyfactory.hh:82 │ │ │ │ │ +Dune::TopologySingletonFactory::create │ │ │ │ │ +static auto create(const Key &key) -> std::enable_if_t< Topology:: │ │ │ │ │ +dimension==dimension, Object * > │ │ │ │ │ +statically create objects │ │ │ │ │ +Definition: topologyfactory.hh:103 │ │ │ │ │ +Dune::TopologySingletonFactory::create │ │ │ │ │ +static Object * create(const Dune::GeometryType >, const Key &key) │ │ │ │ │ +dynamically create objects │ │ │ │ │ +Definition: topologyfactory.hh:88 │ │ │ │ │ +Dune::TopologySingletonFactory::release │ │ │ │ │ +static void release(Object *object) │ │ │ │ │ +release the object returned by the create methods │ │ │ │ │ +Definition: topologyfactory.hh:110 │ │ │ │ │ +Dune::TopologySingletonFactory::Object │ │ │ │ │ +const Factory::Object Object │ │ │ │ │ +Definition: topologyfactory.hh:85 │ │ │ │ │ +Dune::TopologySingletonFactory::Key │ │ │ │ │ +Factory::Key Key │ │ │ │ │ +Definition: topologyfactory.hh:84 │ │ │ │ │ +Dune::TopologySingletonFactory::create │ │ │ │ │ +static auto create(const Key &key) -> std::enable_if_t< static_cast< │ │ │ │ │ +GeometryType >(geometryId).dim()==dimension, Object * > │ │ │ │ │ +statically create objects │ │ │ │ │ +Definition: topologyfactory.hh:95 │ │ │ │ │ +Dune::TopologySingletonFactory::dimension │ │ │ │ │ +static const unsigned int dimension │ │ │ │ │ +Definition: topologyfactory.hh:83 │ │ │ │ │ Dune::GeometryType │ │ │ │ │ Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ Definition: type.hh:125 │ │ │ │ │ -Dune::GeometryType::GeometryType │ │ │ │ │ -constexpr GeometryType(unsigned int topologyId, unsigned int dim) │ │ │ │ │ -Constructor, using the topologyId (integer) and the dimension. │ │ │ │ │ -Definition: type.hh:262 │ │ │ │ │ -Dune::GeometryType::operator< │ │ │ │ │ -constexpr bool operator<(const GeometryType &other) const │ │ │ │ │ -less-than operation for use with maps │ │ │ │ │ -Definition: type.hh:403 │ │ │ │ │ -Dune::GeometryType::operator!= │ │ │ │ │ -constexpr bool operator!=(const GeometryType &other) const │ │ │ │ │ -Check for inequality. │ │ │ │ │ -Definition: type.hh:398 │ │ │ │ │ -Dune::GeometryType::isPyramid │ │ │ │ │ -constexpr bool isPyramid() const │ │ │ │ │ -Return true if entity is a pyramid. │ │ │ │ │ -Definition: type.hh:315 │ │ │ │ │ -Dune::GeometryType::isTetrahedron │ │ │ │ │ -constexpr bool isTetrahedron() const │ │ │ │ │ -Return true if entity is a tetrahedron. │ │ │ │ │ -Definition: type.hh:310 │ │ │ │ │ -Dune::GeometryType::isPrism │ │ │ │ │ -constexpr bool isPrism() const │ │ │ │ │ -Return true if entity is a prism. │ │ │ │ │ -Definition: type.hh:320 │ │ │ │ │ -Dune::GeometryType::isVertex │ │ │ │ │ -constexpr bool isVertex() const │ │ │ │ │ -Return true if entity is a vertex. │ │ │ │ │ -Definition: type.hh:290 │ │ │ │ │ -Dune::GeometryType::operator== │ │ │ │ │ -constexpr bool operator==(const GeometryType &other) const │ │ │ │ │ -Check for equality. This method knows that in dimension 0 and 1 all BasicTypes │ │ │ │ │ -are equal. │ │ │ │ │ -Definition: type.hh:387 │ │ │ │ │ -Dune::GeometryType::toId │ │ │ │ │ -constexpr Id toId() const │ │ │ │ │ -Create an Id representation of this GeometryType. │ │ │ │ │ -Definition: type.hh:221 │ │ │ │ │ -Dune::GeometryType::isConical │ │ │ │ │ -constexpr bool isConical(const int &step) const │ │ │ │ │ -Return true if entity was constructed with a conical product in the chosen │ │ │ │ │ -step. │ │ │ │ │ -Definition: type.hh:348 │ │ │ │ │ -Dune::GeometryType::dim │ │ │ │ │ -constexpr unsigned int dim() const │ │ │ │ │ -Return dimension of the type. │ │ │ │ │ -Definition: type.hh:371 │ │ │ │ │ -Dune::GeometryType::isPrismatic │ │ │ │ │ -constexpr bool isPrismatic(const int &step) const │ │ │ │ │ -Return true if entity was constructed with a prismatic product in the chosen │ │ │ │ │ -step. │ │ │ │ │ -Definition: type.hh:361 │ │ │ │ │ -Dune::GeometryType::isTriangle │ │ │ │ │ -constexpr bool isTriangle() const │ │ │ │ │ -Return true if entity is a triangle. │ │ │ │ │ -Definition: type.hh:300 │ │ │ │ │ -Dune::GeometryType::GeometryType │ │ │ │ │ -GeometryType(TopologyType t) │ │ │ │ │ -Constructor from static TopologyType class. │ │ │ │ │ -Definition: type.hh:278 │ │ │ │ │ -Dune::GeometryType::GeometryType │ │ │ │ │ -constexpr GeometryType(unsigned int topologyId, unsigned int dim, bool isNone) │ │ │ │ │ -Constructor, using the topologyId (integer), the dimension and a flag for type │ │ │ │ │ -none. │ │ │ │ │ -Definition: type.hh:253 │ │ │ │ │ -Dune::GeometryType::BasicType │ │ │ │ │ -BasicType │ │ │ │ │ -Each entity can be tagged by one of these basic types plus its space dimension. │ │ │ │ │ -Definition: type.hh:131 │ │ │ │ │ -Dune::GeometryType::cube │ │ │ │ │ -@ cube │ │ │ │ │ -Cube element in any nonnegative dimension. │ │ │ │ │ -Definition: type.hh:133 │ │ │ │ │ -Dune::GeometryType::simplex │ │ │ │ │ -@ simplex │ │ │ │ │ -Simplicial element in any nonnegative dimension. │ │ │ │ │ -Definition: type.hh:132 │ │ │ │ │ -Dune::GeometryType::pyramid │ │ │ │ │ -@ pyramid │ │ │ │ │ -Four sided pyramid in three dimensions. │ │ │ │ │ -Definition: type.hh:134 │ │ │ │ │ -Dune::GeometryType::extended │ │ │ │ │ -@ extended │ │ │ │ │ -Other, more general topology, representable as topologyId. │ │ │ │ │ -Definition: type.hh:136 │ │ │ │ │ -Dune::GeometryType::none │ │ │ │ │ -@ none │ │ │ │ │ -Even more general topology, cannot be specified by a topologyId. Two │ │ │ │ │ -GeometryTypes with 'none' type a... │ │ │ │ │ -Definition: type.hh:137 │ │ │ │ │ -Dune::GeometryType::prism │ │ │ │ │ -@ prism │ │ │ │ │ -Prism element in three dimensions. │ │ │ │ │ -Definition: type.hh:135 │ │ │ │ │ -Dune::GeometryType::GeometryType │ │ │ │ │ -constexpr GeometryType(Id id) │ │ │ │ │ -Reconstruct a Geometry type from a GeometryType::Id. │ │ │ │ │ -Definition: type.hh:233 │ │ │ │ │ -Dune::GeometryType::isCube │ │ │ │ │ -constexpr bool isCube() const │ │ │ │ │ -Return true if entity is a cube of any dimension. │ │ │ │ │ -Definition: type.hh:335 │ │ │ │ │ -Dune::GeometryType::GeometryType │ │ │ │ │ -constexpr GeometryType() │ │ │ │ │ -Default constructor, not initializing anything. │ │ │ │ │ -Definition: type.hh:243 │ │ │ │ │ -Dune::GeometryType::isConical │ │ │ │ │ -constexpr bool isConical() const │ │ │ │ │ -Return true if entity was constructed with a conical product in the last step. │ │ │ │ │ -Definition: type.hh:340 │ │ │ │ │ -Dune::GeometryType::isLine │ │ │ │ │ -constexpr bool isLine() const │ │ │ │ │ -Return true if entity is a line segment. │ │ │ │ │ -Definition: type.hh:295 │ │ │ │ │ -Dune::GeometryType::isQuadrilateral │ │ │ │ │ -constexpr bool isQuadrilateral() const │ │ │ │ │ -Return true if entity is a quadrilateral. │ │ │ │ │ -Definition: type.hh:305 │ │ │ │ │ -Dune::GeometryType::isPrismatic │ │ │ │ │ -constexpr bool isPrismatic() const │ │ │ │ │ -Return true if entity was constructed with a prismatic product in the last │ │ │ │ │ -step. │ │ │ │ │ -Definition: type.hh:353 │ │ │ │ │ Dune::GeometryType::id │ │ │ │ │ constexpr unsigned int id() const │ │ │ │ │ Return the topology id of the type. │ │ │ │ │ Definition: type.hh:376 │ │ │ │ │ -Dune::GeometryType::isNone │ │ │ │ │ -constexpr bool isNone() const │ │ │ │ │ -Return true if entity is a singular of any dimension. │ │ │ │ │ -Definition: type.hh:366 │ │ │ │ │ -Dune::GeometryType::isHexahedron │ │ │ │ │ -constexpr bool isHexahedron() const │ │ │ │ │ -Return true if entity is a hexahedron. │ │ │ │ │ -Definition: type.hh:325 │ │ │ │ │ -Dune::GeometryType::isSimplex │ │ │ │ │ -constexpr bool isSimplex() const │ │ │ │ │ -Return true if entity is a simplex of any dimension. │ │ │ │ │ -Definition: type.hh:330 │ │ │ │ │ -Dune::GeometryType::Id │ │ │ │ │ -IdType Id │ │ │ │ │ -An integral id representing a GeometryType. │ │ │ │ │ -Definition: type.hh:192 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00176.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: refinement.hh File Reference │ │ │ │ +dune-geometry: referenceelements.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,30 +62,80 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
refinement.hh File Reference
│ │ │ │ +
│ │ │ │ +Classes | │ │ │ │ +Namespaces | │ │ │ │ +Typedefs | │ │ │ │ +Functions
│ │ │ │ +
referenceelements.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ - │ │ │ │ -

This file simply includes all Refinement implementations so you don't have to do them separately. │ │ │ │ -More...

│ │ │ │ -
#include "refinement/base.cc"
│ │ │ │ -#include "refinement/hcube.cc"
│ │ │ │ -#include "refinement/simplex.cc"
│ │ │ │ -#include "refinement/hcubetriangulation.cc"
│ │ │ │ -#include "refinement/prismtriangulation.cc"
│ │ │ │ -#include "refinement/pyramidtriangulation.cc"
│ │ │ │ +
#include <cassert>
│ │ │ │ +#include <algorithm>
│ │ │ │ +#include <limits>
│ │ │ │ +#include <tuple>
│ │ │ │ +#include <utility>
│ │ │ │ +#include <vector>
│ │ │ │ +#include <array>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │ +#include <dune/common/std/type_traits.hh>
│ │ │ │ +#include <dune/common/visibility.hh>
│ │ │ │ +#include <dune/geometry/dimension.hh>
│ │ │ │ +#include <dune/geometry/type.hh>
│ │ │ │ +#include <dune/geometry/referenceelement.hh>
│ │ │ │ +#include <dune/geometry/referenceelementimplementation.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │ -

Detailed Description

│ │ │ │ -

This file simply includes all Refinement implementations so you don't have to do them separately.

│ │ │ │ -
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Classes

struct  Dune::Geo::ReferenceElements< ctype_, dim >
 Class providing access to the singletons of the reference elements. More...
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Namespaces

namespace  Dune
 
namespace  Dune::Geo
 
namespace  Dune::Transitional
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Typedefs

template<typename... T>
using Dune::Transitional::ReferenceElement = unspecified-type
 Returns the type of reference element for the argument types T... More...
 
template<typename T , int dim>
using Dune::ReferenceElement = unspecified-type
 Returns the type of reference element for the argument type T. More...
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Functions

template<typename... T>
unspecified value type Dune::referenceElement (T &&... t)
 Returns a reference element for the objects t.... More...
 
template<typename T , int dim>
auto Dune::referenceElement (const Dune::GeometryType &gt, Dune::Dim< dim >={})
 Returns a reference element of dimension dim for the given geometry type and coordinate field type. More...
 
template<typename T , int dim, std::enable_if_t< IsNumber< std::decay_t< T > >::value, int > = 0>
auto Dune::referenceElement (const T &, const Dune::GeometryType &gt, Dune::Dim< dim >)
 Returns a reference element of dimension dim for the given geometry type and coordinate field type. More...
 
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,23 +4,68 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ -refinement.hh File Reference │ │ │ │ │ -This file simply includes all Refinement implementations so you don't have to │ │ │ │ │ -do them separately. More... │ │ │ │ │ -#include "refinement/base.cc" │ │ │ │ │ -#include "refinement/hcube.cc" │ │ │ │ │ -#include "refinement/simplex.cc" │ │ │ │ │ -#include "refinement/hcubetriangulation.cc" │ │ │ │ │ -#include "refinement/prismtriangulation.cc" │ │ │ │ │ -#include "refinement/pyramidtriangulation.cc" │ │ │ │ │ +Classes | Namespaces | Typedefs | Functions │ │ │ │ │ +referenceelements.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ -***** Detailed Description ***** │ │ │ │ │ -This file simply includes all Refinement implementations so you don't have to │ │ │ │ │ -do them separately. │ │ │ │ │ + Classes │ │ │ │ │ +struct  Dune::Geo::ReferenceElements<_ctype_,_dim_> │ │ │ │ │ +  Class providing access to the singletons of the reference elements. │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ + Namespaces │ │ │ │ │ +namespace  Dune │ │ │ │ │ +  │ │ │ │ │ +namespace  Dune::Geo │ │ │ │ │ +  │ │ │ │ │ +namespace  Dune::Transitional │ │ │ │ │ +  │ │ │ │ │ + Typedefs │ │ │ │ │ +template │ │ │ │ │ +using Dune::Transitional::ReferenceElement = unspecified-type │ │ │ │ │ +  Returns the type of reference element for the argument types T... │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +using Dune::ReferenceElement = unspecified-type │ │ │ │ │ +  Returns the type of reference element for the argument type T. More... │ │ │ │ │ +  │ │ │ │ │ + Functions │ │ │ │ │ +template │ │ │ │ │ +unspecified value type Dune::referenceElement (T &&... t) │ │ │ │ │ +  Returns a reference element for the objects t.... │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto Dune::referenceElement (const Dune::GeometryType >, │ │ │ │ │ + Dune::Dim< dim >={}) │ │ │ │ │ +  Returns a reference element of dimension dim for the │ │ │ │ │ + given geometry type and coordinate field type. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +>::value, int > = 0> │ │ │ │ │ + auto Dune::referenceElement (const T &, const Dune:: │ │ │ │ │ + GeometryType >, Dune::Dim< dim >) │ │ │ │ │ +  Returns a reference element of dimension dim for the │ │ │ │ │ + given geometry type and coordinate field type. More... │ │ │ │ │ +  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00176_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: refinement.hh Source File │ │ │ │ +dune-geometry: referenceelements.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,42 +62,408 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
refinement.hh
│ │ │ │ +
referenceelements.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
2// vi: set et ts=4 sw=2 sts=2:
│ │ │ │
3// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
5#ifndef DUNE_GEOMETRY_REFINEMENT_HH
│ │ │ │ -
6#define DUNE_GEOMETRY_REFINEMENT_HH
│ │ │ │ +
5#ifndef DUNE_GEOMETRY_REFERENCEELEMENTS_HH
│ │ │ │ +
6#define DUNE_GEOMETRY_REFERENCEELEMENTS_HH
│ │ │ │
7
│ │ │ │ -
250// The interface (template<...> class StaticRefinement) is not included here
│ │ │ │ -
251// since it derives from parts which I consider implementation. Look
│ │ │ │ -
252// into refinement/base.cc if the documentation is above is not enough.
│ │ │ │ -
253#include "refinement/base.cc"
│ │ │ │ -
254
│ │ │ │ -
255#include "refinement/hcube.cc"
│ │ │ │ -
256#include "refinement/simplex.cc"
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
260
│ │ │ │ -
261#endif // DUNE_GEOMETRY_REFINEMENT_HH
│ │ │ │ -
This file contains the Refinement implementation for triangulating hypercubes (quadrilateral -> trian...
│ │ │ │ - │ │ │ │ -
This file contains the Refinement implementation for simplices (triangles, tetrahedrons....
│ │ │ │ - │ │ │ │ -
This file contains the parts independent of a particular Refinement implementation.
│ │ │ │ -
This file contains the Refinement implementation for hypercubes (quadrilaterals, hexahedrons,...
│ │ │ │ +
8#include <cassert>
│ │ │ │ +
9
│ │ │ │ +
10#include <algorithm>
│ │ │ │ +
11#include <limits>
│ │ │ │ +
12#include <tuple>
│ │ │ │ +
13#include <utility>
│ │ │ │ +
14#include <vector>
│ │ │ │ +
15#include <array>
│ │ │ │ +
16
│ │ │ │ +
17#include <dune/common/typetraits.hh>
│ │ │ │ +
18#include <dune/common/std/type_traits.hh>
│ │ │ │ +
19#include <dune/common/visibility.hh>
│ │ │ │ +
20
│ │ │ │ + │ │ │ │ +
22#include <dune/geometry/type.hh>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
25
│ │ │ │ +
26namespace Dune
│ │ │ │ +
27{
│ │ │ │ +
28
│ │ │ │ +
29 namespace Geo
│ │ │ │ +
30 {
│ │ │ │ +
31
│ │ │ │ +
32#ifndef DOXYGEN
│ │ │ │ +
33
│ │ │ │ +
34
│ │ │ │ +
35 template<typename ctype, int dim>
│ │ │ │ +
36 class DeprecatedReferenceElement
│ │ │ │ +
37 : public ReferenceElement<ReferenceElementImplementation<ctype,dim>>
│ │ │ │ +
38 {
│ │ │ │ +
39
│ │ │ │ +
40 protected:
│ │ │ │ +
41
│ │ │ │ +
42 DeprecatedReferenceElement() = default;
│ │ │ │ +
43
│ │ │ │ +
44 public:
│ │ │ │ +
45
│ │ │ │ +
46 DeprecatedReferenceElement(const DeprecatedReferenceElement&) = delete;
│ │ │ │ +
47 DeprecatedReferenceElement& operator=(const DeprecatedReferenceElement&) = delete;
│ │ │ │ +
48
│ │ │ │ +
49 DeprecatedReferenceElement(const ReferenceElementImplementation<ctype,dim>& impl)
│ │ │ │ +
50 : ReferenceElement<ReferenceElementImplementation<ctype,dim>>(impl)
│ │ │ │ +
51 {}
│ │ │ │ +
52
│ │ │ │ +
53 };
│ │ │ │ +
54
│ │ │ │ +
55
│ │ │ │ +
56 template<typename ctype, int dim>
│ │ │ │ +
57 class ConstructibleDeprecatedReferenceElement
│ │ │ │ +
58 : public DeprecatedReferenceElement<ctype,dim>
│ │ │ │ +
59 {
│ │ │ │ +
60 public:
│ │ │ │ +
61 ConstructibleDeprecatedReferenceElement() = default;
│ │ │ │ +
62 };
│ │ │ │ +
63
│ │ │ │ +
64
│ │ │ │ +
65 namespace Impl
│ │ │ │ +
66 {
│ │ │ │ +
67
│ │ │ │ +
68 // ReferenceElementContainer
│ │ │ │ +
69 // -------------------------
│ │ │ │ +
70
│ │ │ │ +
71 template< class ctype, int dim >
│ │ │ │ +
72 class ReferenceElementContainer
│ │ │ │ +
73 {
│ │ │ │ +
74 static const unsigned int numTopologies = dim >= 0 ? (1u << dim) : 0;
│ │ │ │ +
75
│ │ │ │ +
76 using Implementation = ReferenceElementImplementation< ctype, dim >;
│ │ │ │ +
77 using ConstructibleDeprecatedReferenceElement = Dune::Geo::ConstructibleDeprecatedReferenceElement<ctype,dim>;
│ │ │ │ +
78
│ │ │ │ +
79 public:
│ │ │ │ +
80
│ │ │ │ +
81 using DeprecatedReferenceElement = Dune::Geo::DeprecatedReferenceElement<ctype,dim>;
│ │ │ │ +
82
│ │ │ │ + │ │ │ │ +
84 using value_type = ReferenceElement;
│ │ │ │ +
85 using const_iterator = const value_type*;
│ │ │ │ +
86
│ │ │ │ +
87 ReferenceElementContainer ()
│ │ │ │ +
88 {
│ │ │ │ +
89 for( unsigned int topologyId = 0; topologyId < numTopologies; ++topologyId )
│ │ │ │ +
90 {
│ │ │ │ +
91 implementations_[ topologyId ].initialize( topologyId );
│ │ │ │ +
92 reference_elements_[ topologyId ].setImplementation( implementations_[ topologyId ] );
│ │ │ │ +
93 }
│ │ │ │ +
94 }
│ │ │ │ +
95
│ │ │ │ +
96 const ReferenceElement& operator() ( const GeometryType &type ) const
│ │ │ │ +
97 {
│ │ │ │ +
98 assert( type.dim() == dim );
│ │ │ │ +
99 return reference_elements_[ type.id() ];
│ │ │ │ +
100 }
│ │ │ │ +
101
│ │ │ │ +
102 const ReferenceElement& simplex () const
│ │ │ │ +
103 {
│ │ │ │ +
104 return reference_elements_[ Dune::GeometryTypes::simplex(dim).id() ];
│ │ │ │ +
105 }
│ │ │ │ +
106
│ │ │ │ +
107 const ReferenceElement& cube () const
│ │ │ │ +
108 {
│ │ │ │ +
109 return reference_elements_[ Dune::GeometryTypes::cube(dim).id() ];
│ │ │ │ +
110 }
│ │ │ │ +
111
│ │ │ │ +
112 const ReferenceElement& pyramid () const
│ │ │ │ +
113 {
│ │ │ │ +
114 return reference_elements_[ Dune::GeometryTypes::pyramid.id() ];
│ │ │ │ +
115 }
│ │ │ │ +
116
│ │ │ │ +
117 const ReferenceElement& prism () const
│ │ │ │ +
118 {
│ │ │ │ +
119 return reference_elements_[ Dune::GeometryTypes::prism.id() ];
│ │ │ │ +
120 }
│ │ │ │ +
121
│ │ │ │ +
122 const_iterator begin () const
│ │ │ │ +
123 {
│ │ │ │ +
124 return reference_elements_.data();
│ │ │ │ +
125 }
│ │ │ │ +
126
│ │ │ │ +
127 const_iterator end () const
│ │ │ │ +
128 {
│ │ │ │ +
129 return reference_elements_.data() + numTopologies;
│ │ │ │ +
130 }
│ │ │ │ +
131
│ │ │ │ +
132 // here, we make sure to actually return a const reference to something
│ │ │ │ +
133 // that is guaranteed not to become invalid, as otherwise, we might run
│ │ │ │ +
134 // straight into debugging hell when a user binds the return value to a
│ │ │ │ +
135 // const ref and the temporary goes out of scope.
│ │ │ │ +
136 const DeprecatedReferenceElement& deprecated(const ReferenceElement& v) const
│ │ │ │ +
137 {
│ │ │ │ +
138 return reference_elements_[v.impl().type(0,0).id()];
│ │ │ │ +
139 }
│ │ │ │ +
140
│ │ │ │ +
141 private:
│ │ │ │ +
142
│ │ │ │ +
143 std::array<Implementation,numTopologies> implementations_;
│ │ │ │ +
144 std::array<ConstructibleDeprecatedReferenceElement,numTopologies> reference_elements_;
│ │ │ │ +
145
│ │ │ │ +
146 };
│ │ │ │ +
147
│ │ │ │ +
148
│ │ │ │ +
149 } // namespace Impl
│ │ │ │ +
150
│ │ │ │ +
151
│ │ │ │ +
152#endif // DOXYGEN
│ │ │ │ +
153
│ │ │ │ +
154
│ │ │ │ +
155 // ReferenceElements
│ │ │ │ +
156 // ------------------------
│ │ │ │ +
157
│ │ │ │ +
168 template< class ctype_, int dim >
│ │ │ │ + │ │ │ │ +
170 {
│ │ │ │ +
171
│ │ │ │ +
173 using ctype = ctype_;
│ │ │ │ +
174
│ │ │ │ + │ │ │ │ +
177
│ │ │ │ +
179 static constexpr int dimension = dim;
│ │ │ │ +
180
│ │ │ │ +
181 private:
│ │ │ │ +
182
│ │ │ │ +
183 using Container = Impl::ReferenceElementContainer< ctype, dim >;
│ │ │ │ +
184
│ │ │ │ +
185 public:
│ │ │ │ +
186
│ │ │ │ + │ │ │ │ +
189
│ │ │ │ +
191 using Iterator = typename Container::const_iterator;
│ │ │ │ +
192
│ │ │ │ + │ │ │ │ +
195
│ │ │ │ +
197 static const ReferenceElement&
│ │ │ │ +
198 general ( const GeometryType& type )
│ │ │ │ +
199 {
│ │ │ │ +
200 return container() ( type );
│ │ │ │ +
201 }
│ │ │ │ +
202
│ │ │ │ +
204 static const ReferenceElement& simplex ()
│ │ │ │ +
205 {
│ │ │ │ +
206 return container().simplex();
│ │ │ │ +
207 }
│ │ │ │ +
208
│ │ │ │ +
210 static const ReferenceElement& cube ()
│ │ │ │ +
211 {
│ │ │ │ +
212 return container().cube();
│ │ │ │ +
213 }
│ │ │ │ +
214
│ │ │ │ +
215 static Iterator begin ()
│ │ │ │ +
216 {
│ │ │ │ +
217 return container().begin();
│ │ │ │ +
218 }
│ │ │ │ +
219
│ │ │ │ +
220 static Iterator end ()
│ │ │ │ +
221 {
│ │ │ │ +
222 return container().end();
│ │ │ │ +
223 }
│ │ │ │ +
224
│ │ │ │ +
225#ifndef DOXYGEN
│ │ │ │ +
226 static const typename Container::DeprecatedReferenceElement&
│ │ │ │ +
227 deprecated(const ReferenceElement& v)
│ │ │ │ +
228 {
│ │ │ │ +
229 return container().deprecated(v);
│ │ │ │ +
230 }
│ │ │ │ +
231#endif // DOXYGEN
│ │ │ │ +
232
│ │ │ │ +
233 private:
│ │ │ │ +
234
│ │ │ │ +
235 DUNE_EXPORT static const Container& container ()
│ │ │ │ +
236 {
│ │ │ │ +
237 static Container container;
│ │ │ │ +
238 return container;
│ │ │ │ +
239 }
│ │ │ │ +
240 };
│ │ │ │ +
241
│ │ │ │ +
242 } // namespace Geo
│ │ │ │ +
243
│ │ │ │ +
245 using Geo::ReferenceElements;
│ │ │ │ +
246
│ │ │ │ +
247
│ │ │ │ +
248#ifdef DOXYGEN
│ │ │ │ +
249
│ │ │ │ +
251
│ │ │ │ +
294 template<typename... T>
│ │ │ │ +
295 unspecified-value-type referenceElement(T&&... t);
│ │ │ │ +
296
│ │ │ │ +
297#endif
│ │ │ │ +
298
│ │ │ │ +
299
│ │ │ │ +
301
│ │ │ │ +
314 template<typename T, int dim>
│ │ │ │ + │ │ │ │ +
316 {
│ │ │ │ + │ │ │ │ +
318 }
│ │ │ │ +
319
│ │ │ │ +
320
│ │ │ │ +
322
│ │ │ │ +
334 template<typename T, int dim, std::enable_if_t<IsNumber<std::decay_t<T>>::value, int> = 0>
│ │ │ │ + │ │ │ │ +
336 {
│ │ │ │ + │ │ │ │ +
338 }
│ │ │ │ +
339
│ │ │ │ +
340
│ │ │ │ +
341#ifndef DOXYGEN
│ │ │ │ +
342
│ │ │ │ +
343 // helpers for the ReferenceElement<> meta function
│ │ │ │ +
344
│ │ │ │ +
345 namespace Impl {
│ │ │ │ +
346
│ │ │ │ +
347 // Evaluates to the correct reference element iff <T...> matches the pattern <number_type,Dim<int>>
│ │ │ │ +
348 // otherwise, it's ill-formed. Should be used with detected_or and friends.
│ │ │ │ +
349
│ │ │ │ +
350 template<typename... T>
│ │ │ │ +
351 struct DefaultReferenceElementExtractor;
│ │ │ │ +
352
│ │ │ │ +
353 template<typename T, typename std::enable_if<IsNumber<T>::value,int>::type dim>
│ │ │ │ +
354 struct DefaultReferenceElementExtractor<T,Dim<dim>>
│ │ │ │ +
355 {
│ │ │ │ + │ │ │ │ +
357 };
│ │ │ │ +
358
│ │ │ │ +
359 template<typename... T>
│ │ │ │ +
360 using DefaultReferenceElement = typename DefaultReferenceElementExtractor<T...>::type;
│ │ │ │ +
361
│ │ │ │ +
362 }
│ │ │ │ +
363
│ │ │ │ +
364 // looks up the type of a reference element by trying to instantiate the correct overload
│ │ │ │ +
365 // of referenceElement() for the given arguments. This will fail if there is no valid
│ │ │ │ +
366 // overload and should be used with detected_or or some other utility that places the
│ │ │ │ +
367 // instantiation in SFINAE context.
│ │ │ │ +
368 //
│ │ │ │ +
369 // this is placed directly in namespace Dune to avoid any weird surprises
│ │ │ │ +
370
│ │ │ │ +
371 template<typename... T>
│ │ │ │ +
372 using LookupReferenceElement = decltype(referenceElement(std::declval<T>()...));
│ │ │ │ +
373
│ │ │ │ +
374#endif // DOXYGEN
│ │ │ │ +
375
│ │ │ │ +
376 namespace Transitional {
│ │ │ │ +
377
│ │ │ │ +
378#ifndef DOXYGEN
│ │ │ │ +
379
│ │ │ │ +
380 // this abomination checks whether the template signature matches the special case
│ │ │ │ +
381 // ReferenceElement<number_type,Dune::Dim<int>> and otherwise defers the type lookup
│ │ │ │ +
382 // to a decltype on a call to referenceElement(std::declval<T>())
│ │ │ │ +
383
│ │ │ │ +
384 template<typename... T>
│ │ │ │ +
385 using ReferenceElement = Std::detected_or_t<
│ │ │ │ +
386 Std::detected_t<LookupReferenceElement,T...>,
│ │ │ │ +
387 Impl::DefaultReferenceElement,
│ │ │ │ +
388 T...
│ │ │ │ +
389 >;
│ │ │ │ +
390
│ │ │ │ +
391#else // DOXYGEN
│ │ │ │ +
392
│ │ │ │ +
394
│ │ │ │ +
416 template<typename... T>
│ │ │ │ +
417 using ReferenceElement = unspecified-type;
│ │ │ │ +
418
│ │ │ │ +
419#endif //DOXYGEN
│ │ │ │ +
420
│ │ │ │ +
421 }
│ │ │ │ +
422
│ │ │ │ +
423#ifndef DOXYGEN
│ │ │ │ +
424
│ │ │ │ +
425 namespace Impl {
│ │ │ │ +
426
│ │ │ │ +
427 // helpers for triggering a deprecation warning for occurrences of the old
│ │ │ │ +
428 // ReferenceElement syntax (Dune::ReferenceElement<T,int>)
│ │ │ │ +
429
│ │ │ │ +
430 // this looks a little weird, encoding the type in the return type of a nested function,
│ │ │ │ +
431 // but it was the only reliable way to trigger the warning iff the compiler encounters
│ │ │ │ +
432 // an invalid use. Other solutions either miss some (or all) uses or trigger false alarms.
│ │ │ │ +
433
│ │ │ │ +
434 template<typename T>
│ │ │ │ +
435 struct ValidReferenceElementTypeSignature
│ │ │ │ +
436 {
│ │ │ │ + │ │ │ │ +
438 };
│ │ │ │ +
439
│ │ │ │ +
440 template<typename T>
│ │ │ │ +
441 struct DeprecatedReferenceElementTypeSignature
│ │ │ │ +
442 {
│ │ │ │ +
443 [[deprecated("Dune::ReferenceElement<T,int> is deprecated, please use Dune::ReferenceElement<Geometry> (if you have a geometry), Dune::ReferenceElements<T,int>::ReferenceElement or Dune::Transitional::ReferenceElement<T,Dune::Dim<int>> instead. After Dune 2.6, you will be able to use Dune::ReferenceElement<T,Dune::Dim<int>>.")]] T check();
│ │ │ │ +
444 };
│ │ │ │ +
445
│ │ │ │ +
446 } // namespace Impl
│ │ │ │ +
447
│ │ │ │ +
448 // This just makes sure the user doesn't use invalid syntax (by checking against the -1 default for
│ │ │ │ +
449 // the dimension, and then either hands back the old-style type along with a deprecation warning or
│ │ │ │ +
450 // forwards to the transitional version
│ │ │ │ +
451 template<typename T, int dim = -1>
│ │ │ │ +
452 using ReferenceElement = decltype(
│ │ │ │ +
453 std::declval<
│ │ │ │ +
454 typename std::conditional<
│ │ │ │ +
455 dim == -1,
│ │ │ │ +
456 Impl::ValidReferenceElementTypeSignature<T>,
│ │ │ │ +
457 Impl::DeprecatedReferenceElementTypeSignature<Geo::DeprecatedReferenceElement<T,dim>>
│ │ │ │ +
458 >::type
│ │ │ │ +
459 >().check());
│ │ │ │ +
460
│ │ │ │ +
461#else // DOXYGEN
│ │ │ │ +
462
│ │ │ │ +
464
│ │ │ │ +
496 template<typename T, int dim>
│ │ │ │ +
497 using ReferenceElement = unspecified-type;
│ │ │ │ +
498
│ │ │ │ +
499#endif // DOXYGEN
│ │ │ │ +
500
│ │ │ │ +
501
│ │ │ │ +
502
│ │ │ │ +
503} // namespace Dune
│ │ │ │ +
504
│ │ │ │ +
505#endif // #ifndef DUNE_GEOMETRY_REFERENCEELEMENTS_HH
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
A unique label for each type of element that can occur in a grid.
│ │ │ │ +
constexpr GeometryType cube(unsigned int dim)
Returns a GeometryType representing a hypercube of dimension dim.
Definition: type.hh:472
│ │ │ │ +
constexpr GeometryType prism
GeometryType representing a 3D prism.
Definition: type.hh:542
│ │ │ │ +
constexpr GeometryType pyramid
GeometryType representing a 3D pyramid.
Definition: type.hh:536
│ │ │ │ +
constexpr GeometryType simplex(unsigned int dim)
Returns a GeometryType representing a simplex of dimension dim.
Definition: type.hh:463
│ │ │ │ +
unspecified-type ReferenceElement
Returns the type of reference element for the argument types T...
Definition: referenceelements.hh:417
│ │ │ │ +
unspecified value type referenceElement(T &&... t)
Returns a reference element for the objects t....
│ │ │ │ +
unspecified-type ReferenceElement
Returns the type of reference element for the argument type T.
Definition: referenceelements.hh:497
│ │ │ │ +
Definition: affinegeometry.hh:21
│ │ │ │ +
This class provides access to geometric and topological properties of a reference element.
Definition: referenceelement.hh:52
│ │ │ │ +
Class providing access to the singletons of the reference elements.
Definition: referenceelements.hh:170
│ │ │ │ +
static Iterator begin()
Definition: referenceelements.hh:215
│ │ │ │ +
Iterator iterator
Iterator over available reference elements.
Definition: referenceelements.hh:194
│ │ │ │ +
typename Container::ReferenceElement ReferenceElement
The reference element type.
Definition: referenceelements.hh:188
│ │ │ │ +
static const ReferenceElement & cube()
get hypercube reference elements
Definition: referenceelements.hh:210
│ │ │ │ +
static Iterator end()
Definition: referenceelements.hh:220
│ │ │ │ +
ctype_ ctype
The coordinate field type of the contained reference elements.
Definition: referenceelements.hh:173
│ │ │ │ +
static const ReferenceElement & general(const GeometryType &type)
get general reference elements
Definition: referenceelements.hh:198
│ │ │ │ +
static const ReferenceElement & simplex()
get simplex reference elements
Definition: referenceelements.hh:204
│ │ │ │ +
typename Container::const_iterator Iterator
Iterator over available reference elements.
Definition: referenceelements.hh:191
│ │ │ │ +
static constexpr int dimension
The dimension of the contained reference elements.
Definition: referenceelements.hh:179
│ │ │ │ +
ctype CoordinateField
The coordinate field type of the contained reference elements.
Definition: referenceelements.hh:176
│ │ │ │ +
Static tag representing a dimension.
Definition: dimension.hh:16
│ │ │ │ +
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:125
│ │ │ │ +
constexpr unsigned int id() const
Return the topology id of the type.
Definition: type.hh:376
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,47 +4,500 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ -refinement.hh │ │ │ │ │ +referenceelements.hh │ │ │ │ │ Go_to_the_documentation_of_this_file. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ - 5#ifndef DUNE_GEOMETRY_REFINEMENT_HH │ │ │ │ │ - 6#define DUNE_GEOMETRY_REFINEMENT_HH │ │ │ │ │ + 5#ifndef DUNE_GEOMETRY_REFERENCEELEMENTS_HH │ │ │ │ │ + 6#define DUNE_GEOMETRY_REFERENCEELEMENTS_HH │ │ │ │ │ 7 │ │ │ │ │ - 250// The interface (template<...> class StaticRefinement) is not included │ │ │ │ │ -here │ │ │ │ │ - 251// since it derives from parts which I consider implementation. Look │ │ │ │ │ - 252// into refinement/base.cc if the documentation is above is not enough. │ │ │ │ │ - 253#include "refinement/base.cc" │ │ │ │ │ - 254 │ │ │ │ │ - 255#include "refinement/hcube.cc" │ │ │ │ │ - 256#include "refinement/simplex.cc" │ │ │ │ │ - 257#include "refinement/hcubetriangulation.cc" │ │ │ │ │ - 258#include "refinement/prismtriangulation.cc" │ │ │ │ │ - 259#include "refinement/pyramidtriangulation.cc" │ │ │ │ │ - 260 │ │ │ │ │ - 261#endif // DUNE_GEOMETRY_REFINEMENT_HH │ │ │ │ │ -hcubetriangulation.cc │ │ │ │ │ -This file contains the Refinement implementation for triangulating hypercubes │ │ │ │ │ -(quadrilateral -> trian... │ │ │ │ │ -pyramidtriangulation.cc │ │ │ │ │ -simplex.cc │ │ │ │ │ -This file contains the Refinement implementation for simplices (triangles, │ │ │ │ │ -tetrahedrons.... │ │ │ │ │ -prismtriangulation.cc │ │ │ │ │ -base.cc │ │ │ │ │ -This file contains the parts independent of a particular Refinement │ │ │ │ │ -implementation. │ │ │ │ │ -hcube.cc │ │ │ │ │ -This file contains the Refinement implementation for hypercubes │ │ │ │ │ -(quadrilaterals, hexahedrons,... │ │ │ │ │ + 8#include │ │ │ │ │ + 9 │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12#include │ │ │ │ │ + 13#include │ │ │ │ │ + 14#include │ │ │ │ │ + 15#include │ │ │ │ │ + 16 │ │ │ │ │ + 17#include │ │ │ │ │ + 18#include │ │ │ │ │ + 19#include │ │ │ │ │ + 20 │ │ │ │ │ + 21#include │ │ │ │ │ + 22#include │ │ │ │ │ + 23#include │ │ │ │ │ + 24#include │ │ │ │ │ + 25 │ │ │ │ │ + 26namespace Dune │ │ │ │ │ + 27{ │ │ │ │ │ + 28 │ │ │ │ │ + 29 namespace Geo │ │ │ │ │ + 30 { │ │ │ │ │ + 31 │ │ │ │ │ + 32#ifndef DOXYGEN │ │ │ │ │ + 33 │ │ │ │ │ + 34 │ │ │ │ │ + 35 template │ │ │ │ │ + 36 class DeprecatedReferenceElement │ │ │ │ │ + 37 : public ReferenceElement> │ │ │ │ │ + 38 { │ │ │ │ │ + 39 │ │ │ │ │ + 40 protected: │ │ │ │ │ + 41 │ │ │ │ │ + 42 DeprecatedReferenceElement() = default; │ │ │ │ │ + 43 │ │ │ │ │ + 44 public: │ │ │ │ │ + 45 │ │ │ │ │ + 46 DeprecatedReferenceElement(const DeprecatedReferenceElement&) = delete; │ │ │ │ │ + 47 DeprecatedReferenceElement& operator=(const DeprecatedReferenceElement&) = │ │ │ │ │ +delete; │ │ │ │ │ + 48 │ │ │ │ │ + 49 DeprecatedReferenceElement(const ReferenceElementImplementation& │ │ │ │ │ +impl) │ │ │ │ │ + 50 : ReferenceElement>(impl) │ │ │ │ │ + 51 {} │ │ │ │ │ + 52 │ │ │ │ │ + 53 }; │ │ │ │ │ + 54 │ │ │ │ │ + 55 │ │ │ │ │ + 56 template │ │ │ │ │ + 57 class ConstructibleDeprecatedReferenceElement │ │ │ │ │ + 58 : public DeprecatedReferenceElement │ │ │ │ │ + 59 { │ │ │ │ │ + 60 public: │ │ │ │ │ + 61 ConstructibleDeprecatedReferenceElement() = default; │ │ │ │ │ + 62 }; │ │ │ │ │ + 63 │ │ │ │ │ + 64 │ │ │ │ │ + 65 namespace Impl │ │ │ │ │ + 66 { │ │ │ │ │ + 67 │ │ │ │ │ + 68 // ReferenceElementContainer │ │ │ │ │ + 69 // ------------------------- │ │ │ │ │ + 70 │ │ │ │ │ + 71 template< class ctype, int dim > │ │ │ │ │ + 72 class ReferenceElementContainer │ │ │ │ │ + 73 { │ │ │ │ │ + 74 static const unsigned int numTopologies = dim >= 0 ? (1u << dim) : 0; │ │ │ │ │ + 75 │ │ │ │ │ + 76 using Implementation = ReferenceElementImplementation< ctype, dim >; │ │ │ │ │ + 77 using ConstructibleDeprecatedReferenceElement = Dune::Geo:: │ │ │ │ │ +ConstructibleDeprecatedReferenceElement; │ │ │ │ │ + 78 │ │ │ │ │ + 79 public: │ │ │ │ │ + 80 │ │ │ │ │ + 81 using DeprecatedReferenceElement = Dune::Geo:: │ │ │ │ │ +DeprecatedReferenceElement; │ │ │ │ │ + 82 │ │ │ │ │ + 83 using ReferenceElement = Dune::Geo::ReferenceElement<_Implementation_>; │ │ │ │ │ + 84 using value_type = ReferenceElement; │ │ │ │ │ + 85 using const_iterator = const value_type*; │ │ │ │ │ + 86 │ │ │ │ │ + 87 ReferenceElementContainer () │ │ │ │ │ + 88 { │ │ │ │ │ + 89 for( unsigned int topologyId = 0; topologyId < numTopologies; ++topologyId │ │ │ │ │ +) │ │ │ │ │ + 90 { │ │ │ │ │ + 91 implementations_[ topologyId ].initialize( topologyId ); │ │ │ │ │ + 92 reference_elements_[ topologyId ].setImplementation( implementations_ │ │ │ │ │ +[ topologyId ] ); │ │ │ │ │ + 93 } │ │ │ │ │ + 94 } │ │ │ │ │ + 95 │ │ │ │ │ + 96 const ReferenceElement& operator() ( const GeometryType &type ) const │ │ │ │ │ + 97 { │ │ │ │ │ + 98 assert( type.dim() == dim ); │ │ │ │ │ + 99 return reference_elements_[ type.id() ]; │ │ │ │ │ + 100 } │ │ │ │ │ + 101 │ │ │ │ │ + 102 const ReferenceElement& simplex () const │ │ │ │ │ + 103 { │ │ │ │ │ + 104 return reference_elements_[ Dune::GeometryTypes::simplex(dim).id() ]; │ │ │ │ │ + 105 } │ │ │ │ │ + 106 │ │ │ │ │ + 107 const ReferenceElement& cube () const │ │ │ │ │ + 108 { │ │ │ │ │ + 109 return reference_elements_[ Dune::GeometryTypes::cube(dim).id() ]; │ │ │ │ │ + 110 } │ │ │ │ │ + 111 │ │ │ │ │ + 112 const ReferenceElement& pyramid () const │ │ │ │ │ + 113 { │ │ │ │ │ + 114 return reference_elements_[ Dune::GeometryTypes::pyramid.id() ]; │ │ │ │ │ + 115 } │ │ │ │ │ + 116 │ │ │ │ │ + 117 const ReferenceElement& prism () const │ │ │ │ │ + 118 { │ │ │ │ │ + 119 return reference_elements_[ Dune::GeometryTypes::prism.id() ]; │ │ │ │ │ + 120 } │ │ │ │ │ + 121 │ │ │ │ │ + 122 const_iterator begin () const │ │ │ │ │ + 123 { │ │ │ │ │ + 124 return reference_elements_.data(); │ │ │ │ │ + 125 } │ │ │ │ │ + 126 │ │ │ │ │ + 127 const_iterator end () const │ │ │ │ │ + 128 { │ │ │ │ │ + 129 return reference_elements_.data() + numTopologies; │ │ │ │ │ + 130 } │ │ │ │ │ + 131 │ │ │ │ │ + 132 // here, we make sure to actually return a const reference to something │ │ │ │ │ + 133 // that is guaranteed not to become invalid, as otherwise, we might run │ │ │ │ │ + 134 // straight into debugging hell when a user binds the return value to a │ │ │ │ │ + 135 // const ref and the temporary goes out of scope. │ │ │ │ │ + 136 const DeprecatedReferenceElement& deprecated(const ReferenceElement& v) │ │ │ │ │ +const │ │ │ │ │ + 137 { │ │ │ │ │ + 138 return reference_elements_[v.impl().type(0,0).id()]; │ │ │ │ │ + 139 } │ │ │ │ │ + 140 │ │ │ │ │ + 141 private: │ │ │ │ │ + 142 │ │ │ │ │ + 143 std::array implementations_; │ │ │ │ │ + 144 std::array │ │ │ │ │ +reference_elements_; │ │ │ │ │ + 145 │ │ │ │ │ + 146 }; │ │ │ │ │ + 147 │ │ │ │ │ + 148 │ │ │ │ │ + 149 } // namespace Impl │ │ │ │ │ + 150 │ │ │ │ │ + 151 │ │ │ │ │ + 152#endif // DOXYGEN │ │ │ │ │ + 153 │ │ │ │ │ + 154 │ │ │ │ │ + 155 // ReferenceElements │ │ │ │ │ + 156 // ------------------------ │ │ │ │ │ + 157 │ │ │ │ │ + 168 template< class ctype_, int dim > │ │ │ │ │ +169 struct ReferenceElements │ │ │ │ │ + 170 { │ │ │ │ │ + 171 │ │ │ │ │ +173 using ctype = ctype_; │ │ │ │ │ + 174 │ │ │ │ │ +176 using CoordinateField = ctype; │ │ │ │ │ + 177 │ │ │ │ │ +179 static constexpr int dimension = dim; │ │ │ │ │ + 180 │ │ │ │ │ + 181 private: │ │ │ │ │ + 182 │ │ │ │ │ + 183 using Container = Impl::ReferenceElementContainer< ctype, dim >; │ │ │ │ │ + 184 │ │ │ │ │ + 185 public: │ │ │ │ │ + 186 │ │ │ │ │ +188 using ReferenceElement = typename Container::ReferenceElement; │ │ │ │ │ + 189 │ │ │ │ │ +191 using Iterator = typename Container::const_iterator; │ │ │ │ │ + 192 │ │ │ │ │ +194 using iterator = Iterator; │ │ │ │ │ + 195 │ │ │ │ │ + 197 static const ReferenceElement& │ │ │ │ │ +198 general ( const GeometryType& type ) │ │ │ │ │ + 199 { │ │ │ │ │ + 200 return container() ( type ); │ │ │ │ │ + 201 } │ │ │ │ │ + 202 │ │ │ │ │ +204 static const ReferenceElement& simplex () │ │ │ │ │ + 205 { │ │ │ │ │ + 206 return container().simplex(); │ │ │ │ │ + 207 } │ │ │ │ │ + 208 │ │ │ │ │ +210 static const ReferenceElement& cube () │ │ │ │ │ + 211 { │ │ │ │ │ + 212 return container().cube(); │ │ │ │ │ + 213 } │ │ │ │ │ + 214 │ │ │ │ │ +215 static Iterator begin () │ │ │ │ │ + 216 { │ │ │ │ │ + 217 return container().begin(); │ │ │ │ │ + 218 } │ │ │ │ │ + 219 │ │ │ │ │ +220 static Iterator end () │ │ │ │ │ + 221 { │ │ │ │ │ + 222 return container().end(); │ │ │ │ │ + 223 } │ │ │ │ │ + 224 │ │ │ │ │ + 225#ifndef DOXYGEN │ │ │ │ │ + 226 static const typename Container::DeprecatedReferenceElement& │ │ │ │ │ + 227 deprecated(const ReferenceElement& v) │ │ │ │ │ + 228 { │ │ │ │ │ + 229 return container().deprecated(v); │ │ │ │ │ + 230 } │ │ │ │ │ + 231#endif // DOXYGEN │ │ │ │ │ + 232 │ │ │ │ │ + 233 private: │ │ │ │ │ + 234 │ │ │ │ │ + 235 DUNE_EXPORT static const Container& container () │ │ │ │ │ + 236 { │ │ │ │ │ + 237 static Container container; │ │ │ │ │ + 238 return container; │ │ │ │ │ + 239 } │ │ │ │ │ + 240 }; │ │ │ │ │ + 241 │ │ │ │ │ + 242 } // namespace Geo │ │ │ │ │ + 243 │ │ │ │ │ + 245 using Geo::ReferenceElements; │ │ │ │ │ + 246 │ │ │ │ │ + 247 │ │ │ │ │ + 248#ifdef DOXYGEN │ │ │ │ │ + 249 │ │ │ │ │ + 251 │ │ │ │ │ + 294 template │ │ │ │ │ +295 unspecified-value-type referenceElement(T&&... t); │ │ │ │ │ + 296 │ │ │ │ │ + 297#endif │ │ │ │ │ + 298 │ │ │ │ │ + 299 │ │ │ │ │ + 301 │ │ │ │ │ + 314 template │ │ │ │ │ +315 auto referenceElement(const Dune::GeometryType& gt, Dune::Dim = {}) │ │ │ │ │ + 316 { │ │ │ │ │ + 317 return ReferenceElements::general(gt); │ │ │ │ │ + 318 } │ │ │ │ │ + 319 │ │ │ │ │ + 320 │ │ │ │ │ + 322 │ │ │ │ │ + 334 template>:: │ │ │ │ │ +value, int> = 0> │ │ │ │ │ +335 auto referenceElement(const T&, const Dune::GeometryType& gt, Dune:: │ │ │ │ │ +Dim) │ │ │ │ │ + 336 { │ │ │ │ │ + 337 return ReferenceElements::general(gt); │ │ │ │ │ + 338 } │ │ │ │ │ + 339 │ │ │ │ │ + 340 │ │ │ │ │ + 341#ifndef DOXYGEN │ │ │ │ │ + 342 │ │ │ │ │ + 343 // helpers for the ReferenceElement<> meta function │ │ │ │ │ + 344 │ │ │ │ │ + 345 namespace Impl { │ │ │ │ │ + 346 │ │ │ │ │ + 347 // Evaluates to the correct reference element iff matches the │ │ │ │ │ +pattern > │ │ │ │ │ + 348 // otherwise, it's ill-formed. Should be used with detected_or and │ │ │ │ │ +friends. │ │ │ │ │ + 349 │ │ │ │ │ + 350 template │ │ │ │ │ + 351 struct DefaultReferenceElementExtractor; │ │ │ │ │ + 352 │ │ │ │ │ + 353 template::value,int>::type │ │ │ │ │ +dim> │ │ │ │ │ + 354 struct DefaultReferenceElementExtractor> │ │ │ │ │ + 355 { │ │ │ │ │ + 356 using type = typename Dune::Geo::ReferenceElements:: │ │ │ │ │ +ReferenceElement; │ │ │ │ │ + 357 }; │ │ │ │ │ + 358 │ │ │ │ │ + 359 template │ │ │ │ │ + 360 using DefaultReferenceElement = typename │ │ │ │ │ +DefaultReferenceElementExtractor::type; │ │ │ │ │ + 361 │ │ │ │ │ + 362 } │ │ │ │ │ + 363 │ │ │ │ │ + 364 // looks up the type of a reference element by trying to instantiate the │ │ │ │ │ +correct overload │ │ │ │ │ + 365 // of referenceElement() for the given arguments. This will fail if there │ │ │ │ │ +is no valid │ │ │ │ │ + 366 // overload and should be used with detected_or or some other utility that │ │ │ │ │ +places the │ │ │ │ │ + 367 // instantiation in SFINAE context. │ │ │ │ │ + 368 // │ │ │ │ │ + 369 // this is placed directly in namespace Dune to avoid any weird surprises │ │ │ │ │ + 370 │ │ │ │ │ + 371 template │ │ │ │ │ + 372 using LookupReferenceElement = decltype(referenceElement(std::declval │ │ │ │ │ +()...)); │ │ │ │ │ + 373 │ │ │ │ │ + 374#endif // DOXYGEN │ │ │ │ │ + 375 │ │ │ │ │ +376 namespace Transitional { │ │ │ │ │ + 377 │ │ │ │ │ + 378#ifndef DOXYGEN │ │ │ │ │ + 379 │ │ │ │ │ + 380 // this abomination checks whether the template signature matches the │ │ │ │ │ +special case │ │ │ │ │ + 381 // ReferenceElement> and otherwise defers the │ │ │ │ │ +type lookup │ │ │ │ │ + 382 // to a decltype on a call to referenceElement(std::declval()) │ │ │ │ │ + 383 │ │ │ │ │ + 384 template │ │ │ │ │ + 385 using ReferenceElement = Std::detected_or_t< │ │ │ │ │ + 386 Std::detected_t, │ │ │ │ │ + 387 Impl::DefaultReferenceElement, │ │ │ │ │ + 388 T... │ │ │ │ │ + 389 >; │ │ │ │ │ + 390 │ │ │ │ │ + 391#else // DOXYGEN │ │ │ │ │ + 392 │ │ │ │ │ + 394 │ │ │ │ │ + 416 template │ │ │ │ │ +417 using ReferenceElement = unspecified-type; │ │ │ │ │ + 418 │ │ │ │ │ + 419#endif //DOXYGEN │ │ │ │ │ + 420 │ │ │ │ │ + 421 } │ │ │ │ │ + 422 │ │ │ │ │ + 423#ifndef DOXYGEN │ │ │ │ │ + 424 │ │ │ │ │ + 425 namespace Impl { │ │ │ │ │ + 426 │ │ │ │ │ + 427 // helpers for triggering a deprecation warning for occurrences of the old │ │ │ │ │ + 428 // ReferenceElement syntax (Dune::ReferenceElement) │ │ │ │ │ + 429 │ │ │ │ │ + 430 // this looks a little weird, encoding the type in the return type of a │ │ │ │ │ +nested function, │ │ │ │ │ + 431 // but it was the only reliable way to trigger the warning iff the │ │ │ │ │ +compiler encounters │ │ │ │ │ + 432 // an invalid use. Other solutions either miss some (or all) uses or │ │ │ │ │ +trigger false alarms. │ │ │ │ │ + 433 │ │ │ │ │ + 434 template │ │ │ │ │ + 435 struct ValidReferenceElementTypeSignature │ │ │ │ │ + 436 { │ │ │ │ │ + 437 Transitional::ReferenceElement check(); │ │ │ │ │ + 438 }; │ │ │ │ │ + 439 │ │ │ │ │ + 440 template │ │ │ │ │ + 441 struct DeprecatedReferenceElementTypeSignature │ │ │ │ │ + 442 { │ │ │ │ │ + 443 [[deprecated("Dune::ReferenceElement is deprecated, please use │ │ │ │ │ +Dune::ReferenceElement (if you have a geometry), Dune:: │ │ │ │ │ +ReferenceElements::ReferenceElement or Dune::Transitional:: │ │ │ │ │ +ReferenceElement> instead. After Dune 2.6, you will be able to │ │ │ │ │ +use Dune::ReferenceElement>.")]] T check(); │ │ │ │ │ + 444 }; │ │ │ │ │ + 445 │ │ │ │ │ + 446 } // namespace Impl │ │ │ │ │ + 447 │ │ │ │ │ + 448 // This just makes sure the user doesn't use invalid syntax (by checking │ │ │ │ │ +against the -1 default for │ │ │ │ │ + 449 // the dimension, and then either hands back the old-style type along with │ │ │ │ │ +a deprecation warning or │ │ │ │ │ + 450 // forwards to the transitional version │ │ │ │ │ + 451 template │ │ │ │ │ + 452 using ReferenceElement = decltype( │ │ │ │ │ + 453 std::declval< │ │ │ │ │ + 454 typename std::conditional< │ │ │ │ │ + 455 dim == -1, │ │ │ │ │ + 456 Impl::ValidReferenceElementTypeSignature, │ │ │ │ │ + 457 Impl::DeprecatedReferenceElementTypeSignature> │ │ │ │ │ + 458 >::type │ │ │ │ │ + 459 >().check()); │ │ │ │ │ + 460 │ │ │ │ │ + 461#else // DOXYGEN │ │ │ │ │ + 462 │ │ │ │ │ + 464 │ │ │ │ │ + 496 template │ │ │ │ │ +497 using ReferenceElement = unspecified-type; │ │ │ │ │ + 498 │ │ │ │ │ + 499#endif // DOXYGEN │ │ │ │ │ + 500 │ │ │ │ │ + 501 │ │ │ │ │ + 502 │ │ │ │ │ + 503} // namespace Dune │ │ │ │ │ + 504 │ │ │ │ │ + 505#endif // #ifndef DUNE_GEOMETRY_REFERENCEELEMENTS_HH │ │ │ │ │ +referenceelement.hh │ │ │ │ │ +dimension.hh │ │ │ │ │ +referenceelementimplementation.hh │ │ │ │ │ +type.hh │ │ │ │ │ +A unique label for each type of element that can occur in a grid. │ │ │ │ │ +Dune::GeometryTypes::cube │ │ │ │ │ +constexpr GeometryType cube(unsigned int dim) │ │ │ │ │ +Returns a GeometryType representing a hypercube of dimension dim. │ │ │ │ │ +Definition: type.hh:472 │ │ │ │ │ +Dune::GeometryTypes::prism │ │ │ │ │ +constexpr GeometryType prism │ │ │ │ │ +GeometryType representing a 3D prism. │ │ │ │ │ +Definition: type.hh:542 │ │ │ │ │ +Dune::GeometryTypes::pyramid │ │ │ │ │ +constexpr GeometryType pyramid │ │ │ │ │ +GeometryType representing a 3D pyramid. │ │ │ │ │ +Definition: type.hh:536 │ │ │ │ │ +Dune::GeometryTypes::simplex │ │ │ │ │ +constexpr GeometryType simplex(unsigned int dim) │ │ │ │ │ +Returns a GeometryType representing a simplex of dimension dim. │ │ │ │ │ +Definition: type.hh:463 │ │ │ │ │ +Dune::Transitional::ReferenceElement │ │ │ │ │ +unspecified-type ReferenceElement │ │ │ │ │ +Returns the type of reference element for the argument types T... │ │ │ │ │ +Definition: referenceelements.hh:417 │ │ │ │ │ +Dune::referenceElement │ │ │ │ │ +unspecified value type referenceElement(T &&... t) │ │ │ │ │ +Returns a reference element for the objects t.... │ │ │ │ │ +Dune::ReferenceElement │ │ │ │ │ +unspecified-type ReferenceElement │ │ │ │ │ +Returns the type of reference element for the argument type T. │ │ │ │ │ +Definition: referenceelements.hh:497 │ │ │ │ │ +Dune │ │ │ │ │ +Definition: affinegeometry.hh:21 │ │ │ │ │ +Dune::Geo::ReferenceElement │ │ │ │ │ +This class provides access to geometric and topological properties of a │ │ │ │ │ +reference element. │ │ │ │ │ +Definition: referenceelement.hh:52 │ │ │ │ │ +Dune::Geo::ReferenceElements │ │ │ │ │ +Class providing access to the singletons of the reference elements. │ │ │ │ │ +Definition: referenceelements.hh:170 │ │ │ │ │ +Dune::Geo::ReferenceElements::begin │ │ │ │ │ +static Iterator begin() │ │ │ │ │ +Definition: referenceelements.hh:215 │ │ │ │ │ +Dune::Geo::ReferenceElements::iterator │ │ │ │ │ +Iterator iterator │ │ │ │ │ +Iterator over available reference elements. │ │ │ │ │ +Definition: referenceelements.hh:194 │ │ │ │ │ +Dune::Geo::ReferenceElements::ReferenceElement │ │ │ │ │ +typename Container::ReferenceElement ReferenceElement │ │ │ │ │ +The reference element type. │ │ │ │ │ +Definition: referenceelements.hh:188 │ │ │ │ │ +Dune::Geo::ReferenceElements::cube │ │ │ │ │ +static const ReferenceElement & cube() │ │ │ │ │ +get hypercube reference elements │ │ │ │ │ +Definition: referenceelements.hh:210 │ │ │ │ │ +Dune::Geo::ReferenceElements::end │ │ │ │ │ +static Iterator end() │ │ │ │ │ +Definition: referenceelements.hh:220 │ │ │ │ │ +Dune::Geo::ReferenceElements::ctype │ │ │ │ │ +ctype_ ctype │ │ │ │ │ +The coordinate field type of the contained reference elements. │ │ │ │ │ +Definition: referenceelements.hh:173 │ │ │ │ │ +Dune::Geo::ReferenceElements::general │ │ │ │ │ +static const ReferenceElement & general(const GeometryType &type) │ │ │ │ │ +get general reference elements │ │ │ │ │ +Definition: referenceelements.hh:198 │ │ │ │ │ +Dune::Geo::ReferenceElements::simplex │ │ │ │ │ +static const ReferenceElement & simplex() │ │ │ │ │ +get simplex reference elements │ │ │ │ │ +Definition: referenceelements.hh:204 │ │ │ │ │ +Dune::Geo::ReferenceElements::Iterator │ │ │ │ │ +typename Container::const_iterator Iterator │ │ │ │ │ +Iterator over available reference elements. │ │ │ │ │ +Definition: referenceelements.hh:191 │ │ │ │ │ +Dune::Geo::ReferenceElements::dimension │ │ │ │ │ +static constexpr int dimension │ │ │ │ │ +The dimension of the contained reference elements. │ │ │ │ │ +Definition: referenceelements.hh:179 │ │ │ │ │ +Dune::Geo::ReferenceElements::CoordinateField │ │ │ │ │ +ctype CoordinateField │ │ │ │ │ +The coordinate field type of the contained reference elements. │ │ │ │ │ +Definition: referenceelements.hh:176 │ │ │ │ │ +Dune::Dim │ │ │ │ │ +Static tag representing a dimension. │ │ │ │ │ +Definition: dimension.hh:16 │ │ │ │ │ +Dune::GeometryType │ │ │ │ │ +Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ +Definition: type.hh:125 │ │ │ │ │ +Dune::GeometryType::id │ │ │ │ │ +constexpr unsigned int id() const │ │ │ │ │ +Return the topology id of the type. │ │ │ │ │ +Definition: type.hh:376 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00179.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: generalvertexorder.hh File Reference │ │ │ │ +dune-geometry: referenceelementimplementation.cc File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -63,51 +63,27 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
generalvertexorder.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
referenceelementimplementation.cc File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <algorithm>
│ │ │ │ -#include <cassert>
│ │ │ │ -#include <cstddef>
│ │ │ │ -#include <iterator>
│ │ │ │ -#include <vector>
│ │ │ │ -#include <dune/common/iteratorfacades.hh>
│ │ │ │ -#include "type.hh"
│ │ │ │ -#include <dune/geometry/referenceelements.hh>
│ │ │ │ -
│ │ │ │ -

Go to the source code of this file.

│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Classes

class  Dune::GeneralVertexOrder< dim, Index_ >
 Class providing information on the ordering of vertices. More...
 
class  Dune::GeneralVertexOrder< dim, Index_ >::iterator
 Iterate over the vertex indices of some sub-entity. More...
 
│ │ │ │ +
#include <config.h>
│ │ │ │ +#include <dune/geometry/referenceelementimplementation.hh>
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Functions

template<class InIterator , class OutIterator >
void Dune::reduceOrder (const InIterator &inBegin, const InIterator &inEnd, OutIterator outIt)
 Algorithm to reduce vertex order information. More...
 
namespace  Dune::Geo
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,37 +4,19 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ -Classes | Namespaces | Functions │ │ │ │ │ -generalvertexorder.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "type.hh" │ │ │ │ │ -#include │ │ │ │ │ -Go_to_the_source_code_of_this_file. │ │ │ │ │ - Classes │ │ │ │ │ -class  Dune::GeneralVertexOrder<_dim,_Index__> │ │ │ │ │ -  Class providing information on the ordering of vertices. More... │ │ │ │ │ -  │ │ │ │ │ -class  Dune::GeneralVertexOrder<_dim,_Index__>::iterator │ │ │ │ │ -  Iterate over the vertex indices of some sub-entity. More... │ │ │ │ │ -  │ │ │ │ │ +Namespaces │ │ │ │ │ +referenceelementimplementation.cc File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ - Functions │ │ │ │ │ -template │ │ │ │ │ -void Dune::reduceOrder (const InIterator &inBegin, const InIterator &inEnd, │ │ │ │ │ - OutIterator outIt) │ │ │ │ │ -  Algorithm to reduce vertex order information. More... │ │ │ │ │ +namespace  Dune::Geo │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00182.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: referenceelements.hh File Reference │ │ │ │ +dune-geometry: quadraturerules.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,77 +65,118 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ -Typedefs | │ │ │ │ -Functions
│ │ │ │ -
referenceelements.hh File Reference
│ │ │ │ +Macros | │ │ │ │ +Enumerations
│ │ │ │ +
quadraturerules.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <cassert>
│ │ │ │ -#include <algorithm>
│ │ │ │ +
#include <algorithm>
│ │ │ │ +#include <iostream>
│ │ │ │ #include <limits>
│ │ │ │ -#include <tuple>
│ │ │ │ +#include <mutex>
│ │ │ │ #include <utility>
│ │ │ │ #include <vector>
│ │ │ │ -#include <array>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ -#include <dune/common/std/type_traits.hh>
│ │ │ │ +#include <dune/common/fvector.hh>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/common/stdstreams.hh>
│ │ │ │ +#include <dune/common/stdthread.hh>
│ │ │ │ #include <dune/common/visibility.hh>
│ │ │ │ -#include <dune/geometry/dimension.hh>
│ │ │ │ -#include <dune/geometry/type.hh>
│ │ │ │ -#include <dune/geometry/referenceelement.hh>
│ │ │ │ -#include <dune/geometry/referenceelementimplementation.hh>
│ │ │ │ +#include <dune/geometry/type.hh>
│ │ │ │ +#include <dune/geometry/typeindex.hh>
│ │ │ │ +#include "quadraturerules/pointquadrature.hh"
│ │ │ │ +#include "quadraturerules/gausslobattoquadrature.hh"
│ │ │ │ +#include "quadraturerules/gaussquadrature.hh"
│ │ │ │ +#include "quadraturerules/gaussradauleftquadrature.hh"
│ │ │ │ +#include "quadraturerules/gaussradaurightquadrature.hh"
│ │ │ │ +#include "quadraturerules/jacobi1quadrature.hh"
│ │ │ │ +#include "quadraturerules/jacobi2quadrature.hh"
│ │ │ │ +#include "quadraturerules/jacobiNquadrature.hh"
│ │ │ │ +#include "quadraturerules/prismquadrature.hh"
│ │ │ │ +#include "quadraturerules/simplexquadrature.hh"
│ │ │ │ +#include "quadraturerules/tensorproductquadrature.hh"
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Classes

struct  Dune::Geo::ReferenceElements< ctype_, dim >
 Class providing access to the singletons of the reference elements. More...
class  Dune::QuadratureOrderOutOfRange
 Exception thrown if a desired QuadratureRule is not available, because the requested order is to high. More...
 
class  Dune::QuadraturePoint< ct, dim >
 Single evaluation point in a quadrature rule. More...
 
class  Dune::QuadratureRule< ct, dim >
 Abstract base class for quadrature rules. More...
 
class  Dune::QuadratureRules< ctype, dim >
 A container for all quadrature rules of dimension dim More...
 
class  Dune::QuadratureRuleFactory< ctype, dim >
 Factory class for creation of quadrature rules, depending on GeometryType, order and QuadratureType. More...
 
class  Dune::QuadratureRuleFactory< ctype, 0 >
 
class  Dune::QuadratureRuleFactory< ctype, 1 >
 
class  Dune::QuadratureRuleFactory< ctype, 2 >
 
class  Dune::QuadratureRuleFactory< ctype, 3 >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Geo
 
namespace  Dune::Transitional
namespace  Dune::QuadratureType
 Defines an enum for currently available quadrature rules.
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Typedefs

template<typename... T>
using Dune::Transitional::ReferenceElement = unspecified-type
 Returns the type of reference element for the argument types T... More...
 
template<typename T , int dim>
using Dune::ReferenceElement = unspecified-type
 Returns the type of reference element for the argument type T. More...
 

│ │ │ │ +Macros

#define DUNE_INCLUDING_IMPLEMENTATION
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Functions

template<typename... T>
unspecified value type Dune::referenceElement (T &&... t)
 Returns a reference element for the objects t.... More...
 
template<typename T , int dim>
auto Dune::referenceElement (const Dune::GeometryType &gt, Dune::Dim< dim >={})
 Returns a reference element of dimension dim for the given geometry type and coordinate field type. More...
 
template<typename T , int dim, std::enable_if_t< IsNumber< std::decay_t< T > >::value, int > = 0>
auto Dune::referenceElement (const T &, const Dune::GeometryType &gt, Dune::Dim< dim >)
 Returns a reference element of dimension dim for the given geometry type and coordinate field type. More...
 

│ │ │ │ +Enumerations

enum  Dune::QuadratureType::Enum {
│ │ │ │ +  Dune::QuadratureType::GaussLegendre = 0 │ │ │ │ +, Dune::QuadratureType::GaussJacobi_1_0 = 1 │ │ │ │ +, Dune::QuadratureType::GaussJacobi_2_0 = 2 │ │ │ │ +, Dune::QuadratureType::GaussJacobi_n_0 = 3 │ │ │ │ +,
│ │ │ │ +  Dune::QuadratureType::GaussLobatto = 4 │ │ │ │ +, Dune::QuadratureType::GaussRadauLeft = 5 │ │ │ │ +, Dune::QuadratureType::GaussRadauRight = 6 │ │ │ │ +, Dune::QuadratureType::size │ │ │ │ +
│ │ │ │ + }
 
│ │ │ │ +

Detailed Description

│ │ │ │ +

Interface for quadrature points and rules

│ │ │ │ +

Macro Definition Documentation

│ │ │ │ + │ │ │ │ +

◆ DUNE_INCLUDING_IMPLEMENTATION

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_INCLUDING_IMPLEMENTATION
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,68 +4,87 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ -Classes | Namespaces | Typedefs | Functions │ │ │ │ │ -referenceelements.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces | Macros | Enumerations │ │ │ │ │ +quadraturerules.hh File Reference │ │ │ │ │ #include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include "quadraturerules/pointquadrature.hh" │ │ │ │ │ +#include "quadraturerules/gausslobattoquadrature.hh" │ │ │ │ │ +#include "quadraturerules/gaussquadrature.hh" │ │ │ │ │ +#include "quadraturerules/gaussradauleftquadrature.hh" │ │ │ │ │ +#include "quadraturerules/gaussradaurightquadrature.hh" │ │ │ │ │ +#include "quadraturerules/jacobi1quadrature.hh" │ │ │ │ │ +#include "quadraturerules/jacobi2quadrature.hh" │ │ │ │ │ +#include "quadraturerules/jacobiNquadrature.hh" │ │ │ │ │ +#include "quadraturerules/prismquadrature.hh" │ │ │ │ │ +#include "quadraturerules/simplexquadrature.hh" │ │ │ │ │ +#include "quadraturerules/tensorproductquadrature.hh" │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -struct  Dune::Geo::ReferenceElements<_ctype_,_dim_> │ │ │ │ │ -  Class providing access to the singletons of the reference elements. │ │ │ │ │ - More... │ │ │ │ │ +class  Dune::QuadratureOrderOutOfRange │ │ │ │ │ +  Exception thrown if a desired QuadratureRule is not available, because │ │ │ │ │ + the requested order is to high. More... │ │ │ │ │ +  │ │ │ │ │ +class  Dune::QuadraturePoint<_ct,_dim_> │ │ │ │ │ +  Single evaluation point in a quadrature rule. More... │ │ │ │ │ +  │ │ │ │ │ +class  Dune::QuadratureRule<_ct,_dim_> │ │ │ │ │ +  Abstract base class for quadrature rules. More... │ │ │ │ │ +  │ │ │ │ │ +class  Dune::QuadratureRules<_ctype,_dim_> │ │ │ │ │ +  A container for all quadrature rules of dimension dim More... │ │ │ │ │ +  │ │ │ │ │ +class  Dune::QuadratureRuleFactory<_ctype,_dim_> │ │ │ │ │ +  Factory class for creation of quadrature rules, depending on │ │ │ │ │ + GeometryType, order and QuadratureType. More... │ │ │ │ │ +  │ │ │ │ │ +class  Dune::QuadratureRuleFactory<_ctype,_0_> │ │ │ │ │ +  │ │ │ │ │ +class  Dune::QuadratureRuleFactory<_ctype,_1_> │ │ │ │ │ +  │ │ │ │ │ +class  Dune::QuadratureRuleFactory<_ctype,_2_> │ │ │ │ │ +  │ │ │ │ │ +class  Dune::QuadratureRuleFactory<_ctype,_3_> │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ -namespace  Dune::Geo │ │ │ │ │ -  │ │ │ │ │ -namespace  Dune::Transitional │ │ │ │ │ +namespace  Dune::QuadratureType │ │ │ │ │ +  Defines an enum for currently available quadrature rules. │ │ │ │ │   │ │ │ │ │ - Typedefs │ │ │ │ │ -template │ │ │ │ │ -using Dune::Transitional::ReferenceElement = unspecified-type │ │ │ │ │ -  Returns the type of reference element for the argument types T... │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -using Dune::ReferenceElement = unspecified-type │ │ │ │ │ -  Returns the type of reference element for the argument type T. More... │ │ │ │ │ -  │ │ │ │ │ - Functions │ │ │ │ │ -template │ │ │ │ │ -unspecified value type Dune::referenceElement (T &&... t) │ │ │ │ │ -  Returns a reference element for the objects t.... │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - auto Dune::referenceElement (const Dune::GeometryType >, │ │ │ │ │ - Dune::Dim< dim >={}) │ │ │ │ │ -  Returns a reference element of dimension dim for the │ │ │ │ │ - given geometry type and coordinate field type. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ ->::value, int > = 0> │ │ │ │ │ - auto Dune::referenceElement (const T &, const Dune:: │ │ │ │ │ - GeometryType >, Dune::Dim< dim >) │ │ │ │ │ -  Returns a reference element of dimension dim for the │ │ │ │ │ - given geometry type and coordinate field type. More... │ │ │ │ │ + Macros │ │ │ │ │ +#define DUNE_INCLUDING_IMPLEMENTATION │ │ │ │ │   │ │ │ │ │ + Enumerations │ │ │ │ │ +enum  Dune::QuadratureType::Enum { │ │ │ │ │ +   Dune::QuadratureType::GaussLegendre = 0 , Dune::QuadratureType:: │ │ │ │ │ + GaussJacobi_1_0 = 1 , Dune::QuadratureType::GaussJacobi_2_0 = 2 , Dune:: │ │ │ │ │ + QuadratureType::GaussJacobi_n_0 = 3 , │ │ │ │ │ +   Dune::QuadratureType::GaussLobatto = 4 , Dune::QuadratureType:: │ │ │ │ │ + GaussRadauLeft = 5 , Dune::QuadratureType::GaussRadauRight = 6 , Dune:: │ │ │ │ │ + QuadratureType::size │ │ │ │ │ + } │ │ │ │ │ +  │ │ │ │ │ +***** Detailed Description ***** │ │ │ │ │ +Interface for quadrature points and rules │ │ │ │ │ +***** Macro Definition Documentation ***** │ │ │ │ │ +***** ◆ DUNE_INCLUDING_IMPLEMENTATION ***** │ │ │ │ │ +#define DUNE_INCLUDING_IMPLEMENTATION │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00182_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: referenceelements.hh Source File │ │ │ │ +dune-geometry: quadraturerules.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,408 +62,442 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
referenceelements.hh
│ │ │ │ +
quadraturerules.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
2// vi: set et ts=4 sw=2 sts=2:
│ │ │ │
3// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
5#ifndef DUNE_GEOMETRY_REFERENCEELEMENTS_HH
│ │ │ │ -
6#define DUNE_GEOMETRY_REFERENCEELEMENTS_HH
│ │ │ │ -
7
│ │ │ │ -
8#include <cassert>
│ │ │ │ -
9
│ │ │ │ -
10#include <algorithm>
│ │ │ │ +
5
│ │ │ │ +
6#ifndef DUNE_GEOMETRY_QUADRATURERULES_HH
│ │ │ │ +
7#define DUNE_GEOMETRY_QUADRATURERULES_HH
│ │ │ │ +
8
│ │ │ │ +
9#include <algorithm>
│ │ │ │ +
10#include <iostream>
│ │ │ │
11#include <limits>
│ │ │ │ -
12#include <tuple>
│ │ │ │ +
12#include <mutex>
│ │ │ │
13#include <utility>
│ │ │ │
14#include <vector>
│ │ │ │ -
15#include <array>
│ │ │ │ -
16
│ │ │ │ -
17#include <dune/common/typetraits.hh>
│ │ │ │ -
18#include <dune/common/std/type_traits.hh>
│ │ │ │ -
19#include <dune/common/visibility.hh>
│ │ │ │ -
20
│ │ │ │ - │ │ │ │ -
22#include <dune/geometry/type.hh>
│ │ │ │ - │ │ │ │ - │ │ │ │ -
25
│ │ │ │ -
26namespace Dune
│ │ │ │ -
27{
│ │ │ │ -
28
│ │ │ │ -
29 namespace Geo
│ │ │ │ -
30 {
│ │ │ │ +
15
│ │ │ │ +
16#include <dune/common/fvector.hh>
│ │ │ │ +
17#include <dune/common/exceptions.hh>
│ │ │ │ +
18#include <dune/common/stdstreams.hh>
│ │ │ │ +
19#include <dune/common/stdthread.hh>
│ │ │ │ +
20#include <dune/common/visibility.hh>
│ │ │ │ +
21
│ │ │ │ +
22#include <dune/geometry/type.hh>
│ │ │ │ + │ │ │ │ +
24
│ │ │ │ +
30namespace Dune {
│ │ │ │
31
│ │ │ │ -
32#ifndef DOXYGEN
│ │ │ │ -
33
│ │ │ │ -
34
│ │ │ │ -
35 template<typename ctype, int dim>
│ │ │ │ -
36 class DeprecatedReferenceElement
│ │ │ │ -
37 : public ReferenceElement<ReferenceElementImplementation<ctype,dim>>
│ │ │ │ -
38 {
│ │ │ │ -
39
│ │ │ │ -
40 protected:
│ │ │ │ -
41
│ │ │ │ -
42 DeprecatedReferenceElement() = default;
│ │ │ │ -
43
│ │ │ │ -
44 public:
│ │ │ │ -
45
│ │ │ │ -
46 DeprecatedReferenceElement(const DeprecatedReferenceElement&) = delete;
│ │ │ │ -
47 DeprecatedReferenceElement& operator=(const DeprecatedReferenceElement&) = delete;
│ │ │ │ +
36 class QuadratureOrderOutOfRange : public NotImplemented {};
│ │ │ │ +
37
│ │ │ │ +
43 template<typename ct, int dim>
│ │ │ │ + │ │ │ │ +
45 public:
│ │ │ │ +
47 constexpr static int dimension = dim;
│ │ │ │
48
│ │ │ │ -
49 DeprecatedReferenceElement(const ReferenceElementImplementation<ctype,dim>& impl)
│ │ │ │ -
50 : ReferenceElement<ReferenceElementImplementation<ctype,dim>>(impl)
│ │ │ │ -
51 {}
│ │ │ │ -
52
│ │ │ │ -
53 };
│ │ │ │ +
50 typedef ct Field;
│ │ │ │ +
51
│ │ │ │ +
53 typedef Dune::FieldVector<ct,dim> Vector;
│ │ │ │
54
│ │ │ │ -
55
│ │ │ │ -
56 template<typename ctype, int dim>
│ │ │ │ -
57 class ConstructibleDeprecatedReferenceElement
│ │ │ │ -
58 : public DeprecatedReferenceElement<ctype,dim>
│ │ │ │ -
59 {
│ │ │ │ -
60 public:
│ │ │ │ -
61 ConstructibleDeprecatedReferenceElement() = default;
│ │ │ │ -
62 };
│ │ │ │ -
63
│ │ │ │ -
64
│ │ │ │ -
65 namespace Impl
│ │ │ │ -
66 {
│ │ │ │ -
67
│ │ │ │ -
68 // ReferenceElementContainer
│ │ │ │ -
69 // -------------------------
│ │ │ │ -
70
│ │ │ │ -
71 template< class ctype, int dim >
│ │ │ │ -
72 class ReferenceElementContainer
│ │ │ │ -
73 {
│ │ │ │ -
74 static const unsigned int numTopologies = dim >= 0 ? (1u << dim) : 0;
│ │ │ │ -
75
│ │ │ │ -
76 using Implementation = ReferenceElementImplementation< ctype, dim >;
│ │ │ │ -
77 using ConstructibleDeprecatedReferenceElement = Dune::Geo::ConstructibleDeprecatedReferenceElement<ctype,dim>;
│ │ │ │ -
78
│ │ │ │ -
79 public:
│ │ │ │ -
80
│ │ │ │ -
81 using DeprecatedReferenceElement = Dune::Geo::DeprecatedReferenceElement<ctype,dim>;
│ │ │ │ -
82
│ │ │ │ - │ │ │ │ -
84 using value_type = ReferenceElement;
│ │ │ │ -
85 using const_iterator = const value_type*;
│ │ │ │ -
86
│ │ │ │ -
87 ReferenceElementContainer ()
│ │ │ │ -
88 {
│ │ │ │ -
89 for( unsigned int topologyId = 0; topologyId < numTopologies; ++topologyId )
│ │ │ │ -
90 {
│ │ │ │ -
91 implementations_[ topologyId ].initialize( topologyId );
│ │ │ │ -
92 reference_elements_[ topologyId ].setImplementation( implementations_[ topologyId ] );
│ │ │ │ -
93 }
│ │ │ │ -
94 }
│ │ │ │ -
95
│ │ │ │ -
96 const ReferenceElement& operator() ( const GeometryType &type ) const
│ │ │ │ -
97 {
│ │ │ │ -
98 assert( type.dim() == dim );
│ │ │ │ -
99 return reference_elements_[ type.id() ];
│ │ │ │ -
100 }
│ │ │ │ -
101
│ │ │ │ -
102 const ReferenceElement& simplex () const
│ │ │ │ -
103 {
│ │ │ │ -
104 return reference_elements_[ Dune::GeometryTypes::simplex(dim).id() ];
│ │ │ │ -
105 }
│ │ │ │ -
106
│ │ │ │ -
107 const ReferenceElement& cube () const
│ │ │ │ -
108 {
│ │ │ │ -
109 return reference_elements_[ Dune::GeometryTypes::cube(dim).id() ];
│ │ │ │ -
110 }
│ │ │ │ -
111
│ │ │ │ -
112 const ReferenceElement& pyramid () const
│ │ │ │ -
113 {
│ │ │ │ -
114 return reference_elements_[ Dune::GeometryTypes::pyramid.id() ];
│ │ │ │ -
115 }
│ │ │ │ -
116
│ │ │ │ -
117 const ReferenceElement& prism () const
│ │ │ │ -
118 {
│ │ │ │ -
119 return reference_elements_[ Dune::GeometryTypes::prism.id() ];
│ │ │ │ -
120 }
│ │ │ │ -
121
│ │ │ │ -
122 const_iterator begin () const
│ │ │ │ -
123 {
│ │ │ │ -
124 return reference_elements_.data();
│ │ │ │ -
125 }
│ │ │ │ -
126
│ │ │ │ -
127 const_iterator end () const
│ │ │ │ -
128 {
│ │ │ │ -
129 return reference_elements_.data() + numTopologies;
│ │ │ │ -
130 }
│ │ │ │ -
131
│ │ │ │ -
132 // here, we make sure to actually return a const reference to something
│ │ │ │ -
133 // that is guaranteed not to become invalid, as otherwise, we might run
│ │ │ │ -
134 // straight into debugging hell when a user binds the return value to a
│ │ │ │ -
135 // const ref and the temporary goes out of scope.
│ │ │ │ -
136 const DeprecatedReferenceElement& deprecated(const ReferenceElement& v) const
│ │ │ │ -
137 {
│ │ │ │ -
138 return reference_elements_[v.impl().type(0,0).id()];
│ │ │ │ -
139 }
│ │ │ │ -
140
│ │ │ │ -
141 private:
│ │ │ │ -
142
│ │ │ │ -
143 std::array<Implementation,numTopologies> implementations_;
│ │ │ │ -
144 std::array<ConstructibleDeprecatedReferenceElement,numTopologies> reference_elements_;
│ │ │ │ -
145
│ │ │ │ -
146 };
│ │ │ │ -
147
│ │ │ │ +
56 QuadraturePoint (const Vector& x, ct w) : local(x)
│ │ │ │ +
57 {
│ │ │ │ +
58 weight_ = w;
│ │ │ │ +
59 }
│ │ │ │ +
60
│ │ │ │ +
62 const Vector& position () const
│ │ │ │ +
63 {
│ │ │ │ +
64 return local;
│ │ │ │ +
65 }
│ │ │ │ +
66
│ │ │ │ +
68 const ct &weight () const
│ │ │ │ +
69 {
│ │ │ │ +
70 return weight_;
│ │ │ │ +
71 }
│ │ │ │ +
72
│ │ │ │ +
73 protected:
│ │ │ │ +
74 FieldVector<ct, dim> local;
│ │ │ │ + │ │ │ │ +
76 };
│ │ │ │ +
77
│ │ │ │ +
81 namespace QuadratureType {
│ │ │ │ +
82 enum Enum {
│ │ │ │ + │ │ │ │ +
93
│ │ │ │ + │ │ │ │ +
100
│ │ │ │ + │ │ │ │ +
107
│ │ │ │ + │ │ │ │ +
120
│ │ │ │ + │ │ │ │ +
128
│ │ │ │ + │ │ │ │ +
136
│ │ │ │ + │ │ │ │ +
145 size
│ │ │ │ +
146 };
│ │ │ │ +
147 }
│ │ │ │
148
│ │ │ │ -
149 } // namespace Impl
│ │ │ │ -
150
│ │ │ │ -
151
│ │ │ │ -
152#endif // DOXYGEN
│ │ │ │ -
153
│ │ │ │ -
154
│ │ │ │ -
155 // ReferenceElements
│ │ │ │ -
156 // ------------------------
│ │ │ │ -
157
│ │ │ │ -
168 template< class ctype_, int dim >
│ │ │ │ - │ │ │ │ -
170 {
│ │ │ │ -
171
│ │ │ │ -
173 using ctype = ctype_;
│ │ │ │ -
174
│ │ │ │ - │ │ │ │ -
177
│ │ │ │ -
179 static constexpr int dimension = dim;
│ │ │ │ -
180
│ │ │ │ -
181 private:
│ │ │ │ +
152 template<typename ct, int dim>
│ │ │ │ +
153 class QuadratureRule : public std::vector<QuadraturePoint<ct,dim> >
│ │ │ │ +
154 {
│ │ │ │ +
155 public:
│ │ │ │ + │ │ │ │ +
162
│ │ │ │ +
163 protected:
│ │ │ │ + │ │ │ │ +
166
│ │ │ │ + │ │ │ │ +
169 public:
│ │ │ │ +
171 constexpr static int d = dim;
│ │ │ │ +
172
│ │ │ │ +
174 typedef ct CoordType;
│ │ │ │ +
175
│ │ │ │ +
177 virtual int order () const { return delivered_order; }
│ │ │ │ +
178
│ │ │ │ +
180 virtual GeometryType type () const { return geometry_type; }
│ │ │ │ +
181 virtual ~QuadratureRule(){}
│ │ │ │
182
│ │ │ │ -
183 using Container = Impl::ReferenceElementContainer< ctype, dim >;
│ │ │ │ -
184
│ │ │ │ -
185 public:
│ │ │ │ +
185 typedef typename std::vector<QuadraturePoint<ct,dim> >::const_iterator iterator;
│ │ │ │
186
│ │ │ │ - │ │ │ │ -
189
│ │ │ │ -
191 using Iterator = typename Container::const_iterator;
│ │ │ │ -
192
│ │ │ │ - │ │ │ │ +
187 protected:
│ │ │ │ + │ │ │ │ + │ │ │ │ +
190 };
│ │ │ │ +
191
│ │ │ │ +
192 // Forward declaration of the factory class,
│ │ │ │ +
193 // needed internally by the QuadratureRules container class.
│ │ │ │ +
194 template<typename ctype, int dim> class QuadratureRuleFactory;
│ │ │ │
195
│ │ │ │ -
197 static const ReferenceElement&
│ │ │ │ -
198 general ( const GeometryType& type )
│ │ │ │ -
199 {
│ │ │ │ -
200 return container() ( type );
│ │ │ │ -
201 }
│ │ │ │ -
202
│ │ │ │ -
204 static const ReferenceElement& simplex ()
│ │ │ │ -
205 {
│ │ │ │ -
206 return container().simplex();
│ │ │ │ -
207 }
│ │ │ │ -
208
│ │ │ │ -
210 static const ReferenceElement& cube ()
│ │ │ │ -
211 {
│ │ │ │ -
212 return container().cube();
│ │ │ │ -
213 }
│ │ │ │ -
214
│ │ │ │ -
215 static Iterator begin ()
│ │ │ │ -
216 {
│ │ │ │ -
217 return container().begin();
│ │ │ │ -
218 }
│ │ │ │ -
219
│ │ │ │ -
220 static Iterator end ()
│ │ │ │ -
221 {
│ │ │ │ -
222 return container().end();
│ │ │ │ -
223 }
│ │ │ │ -
224
│ │ │ │ -
225#ifndef DOXYGEN
│ │ │ │ -
226 static const typename Container::DeprecatedReferenceElement&
│ │ │ │ -
227 deprecated(const ReferenceElement& v)
│ │ │ │ -
228 {
│ │ │ │ -
229 return container().deprecated(v);
│ │ │ │ -
230 }
│ │ │ │ -
231#endif // DOXYGEN
│ │ │ │ -
232
│ │ │ │ -
233 private:
│ │ │ │ -
234
│ │ │ │ -
235 DUNE_EXPORT static const Container& container ()
│ │ │ │ -
236 {
│ │ │ │ -
237 static Container container;
│ │ │ │ -
238 return container;
│ │ │ │ -
239 }
│ │ │ │ -
240 };
│ │ │ │ -
241
│ │ │ │ -
242 } // namespace Geo
│ │ │ │ +
199 template<typename ctype, int dim>
│ │ │ │ + │ │ │ │ +
201
│ │ │ │ + │ │ │ │ +
204
│ │ │ │ +
205 // indexed by quadrature order
│ │ │ │ +
206 using QuadratureOrderVector = std::vector<std::pair<std::once_flag, QuadratureRule> >;
│ │ │ │ +
207
│ │ │ │ +
208 // indexed by geometry type
│ │ │ │ +
209 using GeometryTypeVector = std::vector<std::pair<std::once_flag, QuadratureOrderVector> >;
│ │ │ │ +
210
│ │ │ │ +
211 // indexed by quadrature type enum
│ │ │ │ +
212 using QuadratureCacheVector = std::vector<std::pair<std::once_flag, GeometryTypeVector> >;
│ │ │ │ +
213
│ │ │ │ +
215 DUNE_EXPORT const QuadratureRule& _rule(const GeometryType& t, int p, QuadratureType::Enum qt=QuadratureType::GaussLegendre) const
│ │ │ │ +
216 {
│ │ │ │ +
217 assert(t.dim()==dim);
│ │ │ │ +
218
│ │ │ │ +
219 DUNE_ASSERT_CALL_ONCE();
│ │ │ │ +
220
│ │ │ │ +
221 static QuadratureCacheVector quadratureCache(QuadratureType::size);
│ │ │ │ +
222
│ │ │ │ +
223 auto& [ onceFlagQuadratureType, geometryTypes ] = quadratureCache[qt];
│ │ │ │ +
224 // initialize geometry types for this quadrature type once
│ │ │ │ +
225 std::call_once(onceFlagQuadratureType, [&types = geometryTypes]{
│ │ │ │ +
226 types = GeometryTypeVector(LocalGeometryTypeIndex::size(dim));
│ │ │ │ +
227 });
│ │ │ │ +
228
│ │ │ │ +
229 auto& [ onceFlagGeometryType, quadratureOrders ] = geometryTypes[LocalGeometryTypeIndex::index(t)];
│ │ │ │ +
230 // initialize quadrature orders for this geometry type and quadrature type once
│ │ │ │ +
231 std::call_once(onceFlagGeometryType, [&, &orders = quadratureOrders]{
│ │ │ │ +
232 // we only need one quadrature rule for points, not maxint
│ │ │ │ +
233 const auto numRules = dim == 0 ? 1 : QuadratureRuleFactory<ctype,dim>::maxOrder(t, qt)+1;
│ │ │ │ +
234 orders = QuadratureOrderVector(numRules);
│ │ │ │ +
235 });
│ │ │ │ +
236
│ │ │ │ +
237 // we only have one quadrature rule for points
│ │ │ │ +
238 auto& [ onceFlagQuadratureOrder, quadratureRule ] = quadratureOrders[dim == 0 ? 0 : p];
│ │ │ │ +
239 // initialize quadrature rule once
│ │ │ │ +
240 std::call_once(onceFlagQuadratureOrder, [&, &rule = quadratureRule]{
│ │ │ │ + │ │ │ │ +
242 });
│ │ │ │
243
│ │ │ │ -
245 using Geo::ReferenceElements;
│ │ │ │ +
244 return quadratureRule;
│ │ │ │ +
245 }
│ │ │ │
246
│ │ │ │ -
247
│ │ │ │ -
248#ifdef DOXYGEN
│ │ │ │ -
249
│ │ │ │ -
251
│ │ │ │ -
294 template<typename... T>
│ │ │ │ -
295 unspecified-value-type referenceElement(T&&... t);
│ │ │ │ -
296
│ │ │ │ -
297#endif
│ │ │ │ +
248 DUNE_EXPORT static QuadratureRules& instance()
│ │ │ │ +
249 {
│ │ │ │ +
250 static QuadratureRules instance;
│ │ │ │ +
251 return instance;
│ │ │ │ +
252 }
│ │ │ │ +
253
│ │ │ │ +
255 QuadratureRules () = default;
│ │ │ │ +
256 public:
│ │ │ │ +
258 static unsigned
│ │ │ │ + │ │ │ │ + │ │ │ │ +
261 {
│ │ │ │ + │ │ │ │ +
263 }
│ │ │ │ +
264
│ │ │ │ + │ │ │ │ +
267 {
│ │ │ │ +
268 return instance()._rule(t,p,qt);
│ │ │ │ +
269 }
│ │ │ │ +
270
│ │ │ │ + │ │ │ │ +
273 {
│ │ │ │ +
274 GeometryType gt(t,dim);
│ │ │ │ +
275 return instance()._rule(gt,p,qt);
│ │ │ │ +
276 }
│ │ │ │ +
277 };
│ │ │ │ +
278
│ │ │ │ +
279} // end namespace Dune
│ │ │ │ +
280
│ │ │ │ +
281#define DUNE_INCLUDING_IMPLEMENTATION
│ │ │ │ +
282
│ │ │ │ +
283// 0d rules
│ │ │ │ +
284#include "quadraturerules/pointquadrature.hh"
│ │ │ │ +
285// 1d rules
│ │ │ │ +
286#include "quadraturerules/gausslobattoquadrature.hh"
│ │ │ │ +
287#include "quadraturerules/gaussquadrature.hh"
│ │ │ │ +
288#include "quadraturerules/gaussradauleftquadrature.hh"
│ │ │ │ +
289#include "quadraturerules/gaussradaurightquadrature.hh"
│ │ │ │ +
290#include "quadraturerules/jacobi1quadrature.hh"
│ │ │ │ +
291#include "quadraturerules/jacobi2quadrature.hh"
│ │ │ │ +
292#include "quadraturerules/jacobiNquadrature.hh"
│ │ │ │ +
293// 3d rules
│ │ │ │ +
294#include "quadraturerules/prismquadrature.hh"
│ │ │ │ +
295// general rules
│ │ │ │ +
296#include "quadraturerules/simplexquadrature.hh"
│ │ │ │ +
297#include "quadraturerules/tensorproductquadrature.hh"
│ │ │ │
298
│ │ │ │ -
299
│ │ │ │ -
301
│ │ │ │ -
314 template<typename T, int dim>
│ │ │ │ - │ │ │ │ -
316 {
│ │ │ │ - │ │ │ │ -
318 }
│ │ │ │ -
319
│ │ │ │ -
320
│ │ │ │ +
299#undef DUNE_INCLUDING_IMPLEMENTATION
│ │ │ │ +
300
│ │ │ │ +
301namespace Dune {
│ │ │ │ +
302
│ │ │ │ +
309 template<typename ctype, int dim>
│ │ │ │ + │ │ │ │ +
311 private:
│ │ │ │ +
312 friend class QuadratureRules<ctype, dim>;
│ │ │ │ +
313 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt)
│ │ │ │ +
314 {
│ │ │ │ +
315 return TensorProductQuadratureRule<ctype,dim>::maxOrder(t.id(), qt);
│ │ │ │ +
316 }
│ │ │ │ +
317 static QuadratureRule<ctype, dim> rule(const GeometryType& t, int p, QuadratureType::Enum qt)
│ │ │ │ +
318 {
│ │ │ │ +
319 return TensorProductQuadratureRule<ctype,dim>(t.id(), p, qt);
│ │ │ │ +
320 }
│ │ │ │ +
321 };
│ │ │ │
322
│ │ │ │ -
334 template<typename T, int dim, std::enable_if_t<IsNumber<std::decay_t<T>>::value, int> = 0>
│ │ │ │ - │ │ │ │ -
336 {
│ │ │ │ - │ │ │ │ -
338 }
│ │ │ │ -
339
│ │ │ │ -
340
│ │ │ │ -
341#ifndef DOXYGEN
│ │ │ │ -
342
│ │ │ │ -
343 // helpers for the ReferenceElement<> meta function
│ │ │ │ -
344
│ │ │ │ -
345 namespace Impl {
│ │ │ │ -
346
│ │ │ │ -
347 // Evaluates to the correct reference element iff <T...> matches the pattern <number_type,Dim<int>>
│ │ │ │ -
348 // otherwise, it's ill-formed. Should be used with detected_or and friends.
│ │ │ │ -
349
│ │ │ │ -
350 template<typename... T>
│ │ │ │ -
351 struct DefaultReferenceElementExtractor;
│ │ │ │ -
352
│ │ │ │ -
353 template<typename T, typename std::enable_if<IsNumber<T>::value,int>::type dim>
│ │ │ │ -
354 struct DefaultReferenceElementExtractor<T,Dim<dim>>
│ │ │ │ -
355 {
│ │ │ │ - │ │ │ │ -
357 };
│ │ │ │ -
358
│ │ │ │ -
359 template<typename... T>
│ │ │ │ -
360 using DefaultReferenceElement = typename DefaultReferenceElementExtractor<T...>::type;
│ │ │ │ -
361
│ │ │ │ -
362 }
│ │ │ │ -
363
│ │ │ │ -
364 // looks up the type of a reference element by trying to instantiate the correct overload
│ │ │ │ -
365 // of referenceElement() for the given arguments. This will fail if there is no valid
│ │ │ │ -
366 // overload and should be used with detected_or or some other utility that places the
│ │ │ │ -
367 // instantiation in SFINAE context.
│ │ │ │ -
368 //
│ │ │ │ -
369 // this is placed directly in namespace Dune to avoid any weird surprises
│ │ │ │ -
370
│ │ │ │ -
371 template<typename... T>
│ │ │ │ -
372 using LookupReferenceElement = decltype(referenceElement(std::declval<T>()...));
│ │ │ │ -
373
│ │ │ │ -
374#endif // DOXYGEN
│ │ │ │ -
375
│ │ │ │ -
376 namespace Transitional {
│ │ │ │ -
377
│ │ │ │ -
378#ifndef DOXYGEN
│ │ │ │ -
379
│ │ │ │ -
380 // this abomination checks whether the template signature matches the special case
│ │ │ │ -
381 // ReferenceElement<number_type,Dune::Dim<int>> and otherwise defers the type lookup
│ │ │ │ -
382 // to a decltype on a call to referenceElement(std::declval<T>())
│ │ │ │ -
383
│ │ │ │ -
384 template<typename... T>
│ │ │ │ -
385 using ReferenceElement = Std::detected_or_t<
│ │ │ │ -
386 Std::detected_t<LookupReferenceElement,T...>,
│ │ │ │ -
387 Impl::DefaultReferenceElement,
│ │ │ │ -
388 T...
│ │ │ │ -
389 >;
│ │ │ │ -
390
│ │ │ │ -
391#else // DOXYGEN
│ │ │ │ -
392
│ │ │ │ -
394
│ │ │ │ -
416 template<typename... T>
│ │ │ │ -
417 using ReferenceElement = unspecified-type;
│ │ │ │ -
418
│ │ │ │ -
419#endif //DOXYGEN
│ │ │ │ -
420
│ │ │ │ -
421 }
│ │ │ │ -
422
│ │ │ │ -
423#ifndef DOXYGEN
│ │ │ │ -
424
│ │ │ │ -
425 namespace Impl {
│ │ │ │ -
426
│ │ │ │ -
427 // helpers for triggering a deprecation warning for occurrences of the old
│ │ │ │ -
428 // ReferenceElement syntax (Dune::ReferenceElement<T,int>)
│ │ │ │ -
429
│ │ │ │ -
430 // this looks a little weird, encoding the type in the return type of a nested function,
│ │ │ │ -
431 // but it was the only reliable way to trigger the warning iff the compiler encounters
│ │ │ │ -
432 // an invalid use. Other solutions either miss some (or all) uses or trigger false alarms.
│ │ │ │ -
433
│ │ │ │ -
434 template<typename T>
│ │ │ │ -
435 struct ValidReferenceElementTypeSignature
│ │ │ │ -
436 {
│ │ │ │ - │ │ │ │ -
438 };
│ │ │ │ -
439
│ │ │ │ -
440 template<typename T>
│ │ │ │ -
441 struct DeprecatedReferenceElementTypeSignature
│ │ │ │ -
442 {
│ │ │ │ -
443 [[deprecated("Dune::ReferenceElement<T,int> is deprecated, please use Dune::ReferenceElement<Geometry> (if you have a geometry), Dune::ReferenceElements<T,int>::ReferenceElement or Dune::Transitional::ReferenceElement<T,Dune::Dim<int>> instead. After Dune 2.6, you will be able to use Dune::ReferenceElement<T,Dune::Dim<int>>.")]] T check();
│ │ │ │ -
444 };
│ │ │ │ -
445
│ │ │ │ -
446 } // namespace Impl
│ │ │ │ -
447
│ │ │ │ -
448 // This just makes sure the user doesn't use invalid syntax (by checking against the -1 default for
│ │ │ │ -
449 // the dimension, and then either hands back the old-style type along with a deprecation warning or
│ │ │ │ -
450 // forwards to the transitional version
│ │ │ │ -
451 template<typename T, int dim = -1>
│ │ │ │ -
452 using ReferenceElement = decltype(
│ │ │ │ -
453 std::declval<
│ │ │ │ -
454 typename std::conditional<
│ │ │ │ -
455 dim == -1,
│ │ │ │ -
456 Impl::ValidReferenceElementTypeSignature<T>,
│ │ │ │ -
457 Impl::DeprecatedReferenceElementTypeSignature<Geo::DeprecatedReferenceElement<T,dim>>
│ │ │ │ -
458 >::type
│ │ │ │ -
459 >().check());
│ │ │ │ -
460
│ │ │ │ -
461#else // DOXYGEN
│ │ │ │ -
462
│ │ │ │ +
323 template<typename ctype>
│ │ │ │ +
324 class QuadratureRuleFactory<ctype, 0> {
│ │ │ │ +
325 private:
│ │ │ │ +
326 constexpr static int dim = 0;
│ │ │ │ +
327 friend class QuadratureRules<ctype, dim>;
│ │ │ │ +
328 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum)
│ │ │ │ +
329 {
│ │ │ │ +
330 if (t.isVertex())
│ │ │ │ +
331 {
│ │ │ │ +
332 return std::numeric_limits<int>::max();
│ │ │ │ +
333 }
│ │ │ │ +
334 DUNE_THROW(Exception, "Unknown GeometryType");
│ │ │ │ +
335 }
│ │ │ │ +
336 static QuadratureRule<ctype, dim> rule(const GeometryType& t, int , QuadratureType::Enum)
│ │ │ │ +
337 {
│ │ │ │ +
338 if (t.isVertex())
│ │ │ │ +
339 {
│ │ │ │ +
340 return PointQuadratureRule<ctype>();
│ │ │ │ +
341 }
│ │ │ │ +
342 DUNE_THROW(Exception, "Unknown GeometryType");
│ │ │ │ +
343 }
│ │ │ │ +
344 };
│ │ │ │ +
345
│ │ │ │ +
346 template<typename ctype>
│ │ │ │ +
347 class QuadratureRuleFactory<ctype, 1> {
│ │ │ │ +
348 private:
│ │ │ │ +
349 constexpr static int dim = 1;
│ │ │ │ +
350 friend class QuadratureRules<ctype, dim>;
│ │ │ │ +
351 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt)
│ │ │ │ +
352 {
│ │ │ │ +
353 if (t.isLine())
│ │ │ │ +
354 {
│ │ │ │ +
355 switch (qt) {
│ │ │ │ + │ │ │ │ +
357 return GaussQuadratureRule1D<ctype>::highest_order;
│ │ │ │ + │ │ │ │ +
359 return Jacobi1QuadratureRule1D<ctype>::highest_order;
│ │ │ │ + │ │ │ │ +
361 return Jacobi2QuadratureRule1D<ctype>::highest_order;
│ │ │ │ + │ │ │ │ +
363 return GaussLobattoQuadratureRule1D<ctype>::highest_order;
│ │ │ │ + │ │ │ │ +
365 return JacobiNQuadratureRule1D<ctype>::maxOrder();
│ │ │ │ + │ │ │ │ +
367 return GaussRadauLeftQuadratureRule1D<ctype>::highest_order;
│ │ │ │ + │ │ │ │ +
369 return GaussRadauRightQuadratureRule1D<ctype>::highest_order;
│ │ │ │ +
370 default :
│ │ │ │ +
371 DUNE_THROW(Exception, "Unknown QuadratureType");
│ │ │ │ +
372 }
│ │ │ │ +
373 }
│ │ │ │ +
374 DUNE_THROW(Exception, "Unknown GeometryType");
│ │ │ │ +
375 }
│ │ │ │ +
376 static QuadratureRule<ctype, dim> rule(const GeometryType& t, int p, QuadratureType::Enum qt)
│ │ │ │ +
377 {
│ │ │ │ +
378 if (t.isLine())
│ │ │ │ +
379 {
│ │ │ │ +
380 switch (qt) {
│ │ │ │ + │ │ │ │ +
382 return GaussQuadratureRule1D<ctype>(p);
│ │ │ │ + │ │ │ │ +
384 return Jacobi1QuadratureRule1D<ctype>(p);
│ │ │ │ + │ │ │ │ +
386 return Jacobi2QuadratureRule1D<ctype>(p);
│ │ │ │ + │ │ │ │ +
388 return GaussLobattoQuadratureRule1D<ctype>(p);
│ │ │ │ + │ │ │ │ +
390 return JacobiNQuadratureRule1D<ctype>(p);
│ │ │ │ + │ │ │ │ +
392 return GaussRadauLeftQuadratureRule1D<ctype>(p);
│ │ │ │ + │ │ │ │ +
394 return GaussRadauRightQuadratureRule1D<ctype>(p);
│ │ │ │ +
395 default :
│ │ │ │ +
396 DUNE_THROW(Exception, "Unknown QuadratureType");
│ │ │ │ +
397 }
│ │ │ │ +
398 }
│ │ │ │ +
399 DUNE_THROW(Exception, "Unknown GeometryType");
│ │ │ │ +
400 }
│ │ │ │ +
401 };
│ │ │ │ +
402
│ │ │ │ +
403 template<typename ctype>
│ │ │ │ +
404 class QuadratureRuleFactory<ctype, 2> {
│ │ │ │ +
405 private:
│ │ │ │ +
406 constexpr static int dim = 2;
│ │ │ │ +
407 friend class QuadratureRules<ctype, dim>;
│ │ │ │ +
408 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt)
│ │ │ │ +
409 {
│ │ │ │ +
410 unsigned order =
│ │ │ │ +
411 TensorProductQuadratureRule<ctype,dim>::maxOrder(t.id(), qt);
│ │ │ │ +
412 if (t.isSimplex())
│ │ │ │ +
413 order = std::max
│ │ │ │ +
414 (order, unsigned(SimplexQuadratureRule<ctype,dim>::highest_order));
│ │ │ │ +
415 return order;
│ │ │ │ +
416 }
│ │ │ │ +
417 static QuadratureRule<ctype, dim> rule(const GeometryType& t, int p, QuadratureType::Enum qt)
│ │ │ │ +
418 {
│ │ │ │ +
419 if (t.isSimplex()
│ │ │ │ + │ │ │ │ +
421 && p <= SimplexQuadratureRule<ctype,dim>::highest_order)
│ │ │ │ +
422 {
│ │ │ │ +
423 return SimplexQuadratureRule<ctype,dim>(p);
│ │ │ │ +
424 }
│ │ │ │ +
425 return TensorProductQuadratureRule<ctype,dim>(t.id(), p, qt);
│ │ │ │ +
426 }
│ │ │ │ +
427 };
│ │ │ │ +
428
│ │ │ │ +
429 template<typename ctype>
│ │ │ │ +
430 class QuadratureRuleFactory<ctype, 3> {
│ │ │ │ +
431 private:
│ │ │ │ +
432 constexpr static int dim = 3;
│ │ │ │ +
433 friend class QuadratureRules<ctype, dim>;
│ │ │ │ +
434 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt)
│ │ │ │ +
435 {
│ │ │ │ +
436 unsigned order =
│ │ │ │ +
437 TensorProductQuadratureRule<ctype,dim>::maxOrder(t.id(), qt);
│ │ │ │ +
438 if (t.isSimplex())
│ │ │ │ +
439 order = std::max
│ │ │ │ +
440 (order, unsigned(SimplexQuadratureRule<ctype,dim>::highest_order));
│ │ │ │ +
441 if (t.isPrism())
│ │ │ │ +
442 order = std::max
│ │ │ │ +
443 (order, unsigned(PrismQuadratureRule<ctype,dim>::highest_order));
│ │ │ │ +
444 return order;
│ │ │ │ +
445 }
│ │ │ │ +
446 static QuadratureRule<ctype, dim> rule(const GeometryType& t, int p, QuadratureType::Enum qt)
│ │ │ │ +
447 {
│ │ │ │ +
448
│ │ │ │ +
449 if (t.isSimplex()
│ │ │ │ + │ │ │ │ +
451 && p <= SimplexQuadratureRule<ctype,dim>::highest_order)
│ │ │ │ +
452 {
│ │ │ │ +
453 return SimplexQuadratureRule<ctype,dim>(p);
│ │ │ │ +
454 }
│ │ │ │ +
455 if (t.isPrism()
│ │ │ │ + │ │ │ │ +
457 && p <= PrismQuadratureRule<ctype,dim>::highest_order)
│ │ │ │ +
458 {
│ │ │ │ +
459 return PrismQuadratureRule<ctype,dim>(p);
│ │ │ │ +
460 }
│ │ │ │ +
461 return TensorProductQuadratureRule<ctype,dim>(t.id(), p, qt);
│ │ │ │ +
462 }
│ │ │ │ +
463 };
│ │ │ │
464
│ │ │ │ -
496 template<typename T, int dim>
│ │ │ │ -
497 using ReferenceElement = unspecified-type;
│ │ │ │ -
498
│ │ │ │ -
499#endif // DOXYGEN
│ │ │ │ -
500
│ │ │ │ -
501
│ │ │ │ -
502
│ │ │ │ -
503} // namespace Dune
│ │ │ │ -
504
│ │ │ │ -
505#endif // #ifndef DUNE_GEOMETRY_REFERENCEELEMENTS_HH
│ │ │ │ -
A unique label for each type of element that can occur in a grid.
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
constexpr GeometryType cube(unsigned int dim)
Returns a GeometryType representing a hypercube of dimension dim.
Definition: type.hh:472
│ │ │ │ -
constexpr GeometryType prism
GeometryType representing a 3D prism.
Definition: type.hh:542
│ │ │ │ -
constexpr GeometryType pyramid
GeometryType representing a 3D pyramid.
Definition: type.hh:536
│ │ │ │ -
constexpr GeometryType simplex(unsigned int dim)
Returns a GeometryType representing a simplex of dimension dim.
Definition: type.hh:463
│ │ │ │ -
unspecified-type ReferenceElement
Returns the type of reference element for the argument types T...
Definition: referenceelements.hh:417
│ │ │ │ -
unspecified value type referenceElement(T &&... t)
Returns a reference element for the objects t....
│ │ │ │ -
unspecified-type ReferenceElement
Returns the type of reference element for the argument type T.
Definition: referenceelements.hh:497
│ │ │ │ +
465#ifndef DUNE_NO_EXTERN_QUADRATURERULES
│ │ │ │ +
466 extern template class GaussLobattoQuadratureRule<double, 1>;
│ │ │ │ +
467 extern template class GaussQuadratureRule<double, 1>;
│ │ │ │ +
468 extern template class GaussRadauLeftQuadratureRule<double, 1>;
│ │ │ │ +
469 extern template class GaussRadauRightQuadratureRule<double, 1>;
│ │ │ │ +
470 extern template class Jacobi1QuadratureRule<double, 1>;
│ │ │ │ +
471 extern template class Jacobi2QuadratureRule<double, 1>;
│ │ │ │ +
472 extern template class JacobiNQuadratureRule<double, 1>;
│ │ │ │ +
473 extern template class PrismQuadratureRule<double, 3>;
│ │ │ │ +
474 extern template class SimplexQuadratureRule<double, 2>;
│ │ │ │ +
475 extern template class SimplexQuadratureRule<double, 3>;
│ │ │ │ +
476#endif // !DUNE_NO_EXTERN_QUADRATURERULES
│ │ │ │ +
477
│ │ │ │ +
478} // end namespace
│ │ │ │ +
479
│ │ │ │ +
480#endif // DUNE_GEOMETRY_QUADRATURERULES_HH
│ │ │ │ +
Helper classes to provide indices for geometrytypes for use in a vector.
│ │ │ │ +
A unique label for each type of element that can occur in a grid.
│ │ │ │
Definition: affinegeometry.hh:21
│ │ │ │ -
This class provides access to geometric and topological properties of a reference element.
Definition: referenceelement.hh:52
│ │ │ │ -
Class providing access to the singletons of the reference elements.
Definition: referenceelements.hh:170
│ │ │ │ -
static Iterator begin()
Definition: referenceelements.hh:215
│ │ │ │ -
Iterator iterator
Iterator over available reference elements.
Definition: referenceelements.hh:194
│ │ │ │ -
typename Container::ReferenceElement ReferenceElement
The reference element type.
Definition: referenceelements.hh:188
│ │ │ │ -
static const ReferenceElement & cube()
get hypercube reference elements
Definition: referenceelements.hh:210
│ │ │ │ -
static Iterator end()
Definition: referenceelements.hh:220
│ │ │ │ -
ctype_ ctype
The coordinate field type of the contained reference elements.
Definition: referenceelements.hh:173
│ │ │ │ -
static const ReferenceElement & general(const GeometryType &type)
get general reference elements
Definition: referenceelements.hh:198
│ │ │ │ -
static const ReferenceElement & simplex()
get simplex reference elements
Definition: referenceelements.hh:204
│ │ │ │ -
typename Container::const_iterator Iterator
Iterator over available reference elements.
Definition: referenceelements.hh:191
│ │ │ │ -
static constexpr int dimension
The dimension of the contained reference elements.
Definition: referenceelements.hh:179
│ │ │ │ -
ctype CoordinateField
The coordinate field type of the contained reference elements.
Definition: referenceelements.hh:176
│ │ │ │ -
Static tag representing a dimension.
Definition: dimension.hh:16
│ │ │ │ +
Enum
Definition: quadraturerules.hh:82
│ │ │ │ +
@ GaussJacobi_n_0
Gauss-Legendre rules with .
Definition: quadraturerules.hh:119
│ │ │ │ +
@ GaussJacobi_2_0
Gauss-Legendre rules with .
Definition: quadraturerules.hh:106
│ │ │ │ +
@ GaussRadauRight
Gauss-Radau rules including the right endpoint.
Definition: quadraturerules.hh:144
│ │ │ │ +
@ GaussJacobi_1_0
Gauss-Jacobi rules with .
Definition: quadraturerules.hh:99
│ │ │ │ +
@ size
Definition: quadraturerules.hh:145
│ │ │ │ +
@ GaussLobatto
Gauss-Lobatto rules.
Definition: quadraturerules.hh:127
│ │ │ │ +
@ GaussRadauLeft
Gauss-Radau rules including the left endpoint.
Definition: quadraturerules.hh:135
│ │ │ │ +
@ GaussLegendre
Gauss-Legendre rules (default)
Definition: quadraturerules.hh:92
│ │ │ │ +
Exception thrown if a desired QuadratureRule is not available, because the requested order is to high...
Definition: quadraturerules.hh:36
│ │ │ │ +
Single evaluation point in a quadrature rule.
Definition: quadraturerules.hh:44
│ │ │ │ +
const Vector & position() const
return local coordinates of integration point i
Definition: quadraturerules.hh:62
│ │ │ │ +
Dune::FieldVector< ct, dim > Vector
Type used for the position of a quadrature point.
Definition: quadraturerules.hh:53
│ │ │ │ +
ct Field
Number type used for coordinates and quadrature weights.
Definition: quadraturerules.hh:50
│ │ │ │ +
const ct & weight() const
return weight associated with integration point i
Definition: quadraturerules.hh:68
│ │ │ │ +
ct weight_
Definition: quadraturerules.hh:75
│ │ │ │ +
static constexpr int dimension
Dimension of the integration domain.
Definition: quadraturerules.hh:47
│ │ │ │ +
QuadraturePoint(const Vector &x, ct w)
set up quadrature of given order in d dimensions
Definition: quadraturerules.hh:56
│ │ │ │ +
FieldVector< ct, dim > local
Definition: quadraturerules.hh:74
│ │ │ │ +
Abstract base class for quadrature rules.
Definition: quadraturerules.hh:154
│ │ │ │ +
virtual ~QuadratureRule()
Definition: quadraturerules.hh:181
│ │ │ │ +
static constexpr int d
The space dimension.
Definition: quadraturerules.hh:171
│ │ │ │ +
virtual GeometryType type() const
return type of element
Definition: quadraturerules.hh:180
│ │ │ │ +
int delivered_order
Definition: quadraturerules.hh:189
│ │ │ │ +
QuadratureRule(GeometryType t, int order)
Constructor for a given geometry type and a given quadrature order.
Definition: quadraturerules.hh:168
│ │ │ │ +
GeometryType geometry_type
Definition: quadraturerules.hh:188
│ │ │ │ +
ct CoordType
The type used for coordinates.
Definition: quadraturerules.hh:174
│ │ │ │ +
QuadratureRule()
Default constructor.
Definition: quadraturerules.hh:161
│ │ │ │ +
virtual int order() const
return order
Definition: quadraturerules.hh:177
│ │ │ │ +
QuadratureRule(GeometryType t)
Constructor for a given geometry type. Leaves the quadrature order invalid
Definition: quadraturerules.hh:165
│ │ │ │ +
std::vector< QuadraturePoint< ct, dim > >::const_iterator iterator
Definition: quadraturerules.hh:185
│ │ │ │ +
Factory class for creation of quadrature rules, depending on GeometryType, order and QuadratureType.
Definition: quadraturerules.hh:310
│ │ │ │ +
A container for all quadrature rules of dimension dim
Definition: quadraturerules.hh:200
│ │ │ │ +
static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt=QuadratureType::GaussLegendre)
maximum quadrature order for given geometry type and quadrature type
Definition: quadraturerules.hh:259
│ │ │ │ +
static const QuadratureRule & rule(const GeometryType::BasicType t, int p, QuadratureType::Enum qt=QuadratureType::GaussLegendre)
select the appropriate QuadratureRule for GeometryType t and order p
Definition: quadraturerules.hh:272
│ │ │ │ +
static const QuadratureRule & rule(const GeometryType &t, int p, QuadratureType::Enum qt=QuadratureType::GaussLegendre)
select the appropriate QuadratureRule for GeometryType t and order p
Definition: quadraturerules.hh:266
│ │ │ │
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:125
│ │ │ │ +
constexpr bool isPrism() const
Return true if entity is a prism.
Definition: type.hh:320
│ │ │ │ +
constexpr bool isVertex() const
Return true if entity is a vertex.
Definition: type.hh:290
│ │ │ │ +
constexpr unsigned int dim() const
Return dimension of the type.
Definition: type.hh:371
│ │ │ │ +
BasicType
Each entity can be tagged by one of these basic types plus its space dimension.
Definition: type.hh:131
│ │ │ │ +
constexpr bool isLine() const
Return true if entity is a line segment.
Definition: type.hh:295
│ │ │ │
constexpr unsigned int id() const
Return the topology id of the type.
Definition: type.hh:376
│ │ │ │ +
constexpr bool isSimplex() const
Return true if entity is a simplex of any dimension.
Definition: type.hh:330
│ │ │ │ +
static constexpr std::size_t size(std::size_t dim)
Compute total number of geometry types for the given dimension.
Definition: typeindex.hh:61
│ │ │ │ +
static constexpr std::size_t index(const GeometryType &gt)
Compute the index for the given geometry type within its dimension.
Definition: typeindex.hh:73
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,500 +4,589 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ -referenceelements.hh │ │ │ │ │ +quadraturerules.hh │ │ │ │ │ Go_to_the_documentation_of_this_file. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ - 5#ifndef DUNE_GEOMETRY_REFERENCEELEMENTS_HH │ │ │ │ │ - 6#define DUNE_GEOMETRY_REFERENCEELEMENTS_HH │ │ │ │ │ - 7 │ │ │ │ │ - 8#include │ │ │ │ │ - 9 │ │ │ │ │ - 10#include │ │ │ │ │ + 5 │ │ │ │ │ + 6#ifndef DUNE_GEOMETRY_QUADRATURERULES_HH │ │ │ │ │ + 7#define DUNE_GEOMETRY_QUADRATURERULES_HH │ │ │ │ │ + 8 │ │ │ │ │ + 9#include │ │ │ │ │ + 10#include │ │ │ │ │ 11#include │ │ │ │ │ - 12#include │ │ │ │ │ + 12#include │ │ │ │ │ 13#include │ │ │ │ │ 14#include │ │ │ │ │ - 15#include │ │ │ │ │ - 16 │ │ │ │ │ - 17#include │ │ │ │ │ - 18#include │ │ │ │ │ - 19#include │ │ │ │ │ - 20 │ │ │ │ │ - 21#include │ │ │ │ │ + 15 │ │ │ │ │ + 16#include │ │ │ │ │ + 17#include │ │ │ │ │ + 18#include │ │ │ │ │ + 19#include │ │ │ │ │ + 20#include │ │ │ │ │ + 21 │ │ │ │ │ 22#include │ │ │ │ │ - 23#include │ │ │ │ │ - 24#include │ │ │ │ │ - 25 │ │ │ │ │ - 26namespace Dune │ │ │ │ │ - 27{ │ │ │ │ │ - 28 │ │ │ │ │ - 29 namespace Geo │ │ │ │ │ - 30 { │ │ │ │ │ + 23#include │ │ │ │ │ + 24 │ │ │ │ │ + 30namespace Dune { │ │ │ │ │ 31 │ │ │ │ │ - 32#ifndef DOXYGEN │ │ │ │ │ - 33 │ │ │ │ │ - 34 │ │ │ │ │ - 35 template │ │ │ │ │ - 36 class DeprecatedReferenceElement │ │ │ │ │ - 37 : public ReferenceElement> │ │ │ │ │ - 38 { │ │ │ │ │ - 39 │ │ │ │ │ - 40 protected: │ │ │ │ │ - 41 │ │ │ │ │ - 42 DeprecatedReferenceElement() = default; │ │ │ │ │ - 43 │ │ │ │ │ - 44 public: │ │ │ │ │ - 45 │ │ │ │ │ - 46 DeprecatedReferenceElement(const DeprecatedReferenceElement&) = delete; │ │ │ │ │ - 47 DeprecatedReferenceElement& operator=(const DeprecatedReferenceElement&) = │ │ │ │ │ -delete; │ │ │ │ │ +36 class QuadratureOrderOutOfRange : public NotImplemented {}; │ │ │ │ │ + 37 │ │ │ │ │ + 43 template │ │ │ │ │ +44 class QuadraturePoint { │ │ │ │ │ + 45 public: │ │ │ │ │ +47 constexpr static int dimension = dim; │ │ │ │ │ 48 │ │ │ │ │ - 49 DeprecatedReferenceElement(const ReferenceElementImplementation& │ │ │ │ │ -impl) │ │ │ │ │ - 50 : ReferenceElement>(impl) │ │ │ │ │ - 51 {} │ │ │ │ │ - 52 │ │ │ │ │ - 53 }; │ │ │ │ │ +50 typedef ct Field; │ │ │ │ │ + 51 │ │ │ │ │ +53 typedef Dune::FieldVector Vector; │ │ │ │ │ 54 │ │ │ │ │ - 55 │ │ │ │ │ - 56 template │ │ │ │ │ - 57 class ConstructibleDeprecatedReferenceElement │ │ │ │ │ - 58 : public DeprecatedReferenceElement │ │ │ │ │ - 59 { │ │ │ │ │ - 60 public: │ │ │ │ │ - 61 ConstructibleDeprecatedReferenceElement() = default; │ │ │ │ │ - 62 }; │ │ │ │ │ - 63 │ │ │ │ │ - 64 │ │ │ │ │ - 65 namespace Impl │ │ │ │ │ - 66 { │ │ │ │ │ - 67 │ │ │ │ │ - 68 // ReferenceElementContainer │ │ │ │ │ - 69 // ------------------------- │ │ │ │ │ - 70 │ │ │ │ │ - 71 template< class ctype, int dim > │ │ │ │ │ - 72 class ReferenceElementContainer │ │ │ │ │ - 73 { │ │ │ │ │ - 74 static const unsigned int numTopologies = dim >= 0 ? (1u << dim) : 0; │ │ │ │ │ - 75 │ │ │ │ │ - 76 using Implementation = ReferenceElementImplementation< ctype, dim >; │ │ │ │ │ - 77 using ConstructibleDeprecatedReferenceElement = Dune::Geo:: │ │ │ │ │ -ConstructibleDeprecatedReferenceElement; │ │ │ │ │ - 78 │ │ │ │ │ - 79 public: │ │ │ │ │ - 80 │ │ │ │ │ - 81 using DeprecatedReferenceElement = Dune::Geo:: │ │ │ │ │ -DeprecatedReferenceElement; │ │ │ │ │ - 82 │ │ │ │ │ - 83 using ReferenceElement = Dune::Geo::ReferenceElement<_Implementation_>; │ │ │ │ │ - 84 using value_type = ReferenceElement; │ │ │ │ │ - 85 using const_iterator = const value_type*; │ │ │ │ │ - 86 │ │ │ │ │ - 87 ReferenceElementContainer () │ │ │ │ │ - 88 { │ │ │ │ │ - 89 for( unsigned int topologyId = 0; topologyId < numTopologies; ++topologyId │ │ │ │ │ -) │ │ │ │ │ - 90 { │ │ │ │ │ - 91 implementations_[ topologyId ].initialize( topologyId ); │ │ │ │ │ - 92 reference_elements_[ topologyId ].setImplementation( implementations_ │ │ │ │ │ -[ topologyId ] ); │ │ │ │ │ - 93 } │ │ │ │ │ - 94 } │ │ │ │ │ - 95 │ │ │ │ │ - 96 const ReferenceElement& operator() ( const GeometryType &type ) const │ │ │ │ │ - 97 { │ │ │ │ │ - 98 assert( type.dim() == dim ); │ │ │ │ │ - 99 return reference_elements_[ type.id() ]; │ │ │ │ │ - 100 } │ │ │ │ │ - 101 │ │ │ │ │ - 102 const ReferenceElement& simplex () const │ │ │ │ │ - 103 { │ │ │ │ │ - 104 return reference_elements_[ Dune::GeometryTypes::simplex(dim).id() ]; │ │ │ │ │ - 105 } │ │ │ │ │ - 106 │ │ │ │ │ - 107 const ReferenceElement& cube () const │ │ │ │ │ - 108 { │ │ │ │ │ - 109 return reference_elements_[ Dune::GeometryTypes::cube(dim).id() ]; │ │ │ │ │ - 110 } │ │ │ │ │ - 111 │ │ │ │ │ - 112 const ReferenceElement& pyramid () const │ │ │ │ │ - 113 { │ │ │ │ │ - 114 return reference_elements_[ Dune::GeometryTypes::pyramid.id() ]; │ │ │ │ │ - 115 } │ │ │ │ │ - 116 │ │ │ │ │ - 117 const ReferenceElement& prism () const │ │ │ │ │ - 118 { │ │ │ │ │ - 119 return reference_elements_[ Dune::GeometryTypes::prism.id() ]; │ │ │ │ │ - 120 } │ │ │ │ │ - 121 │ │ │ │ │ - 122 const_iterator begin () const │ │ │ │ │ - 123 { │ │ │ │ │ - 124 return reference_elements_.data(); │ │ │ │ │ - 125 } │ │ │ │ │ - 126 │ │ │ │ │ - 127 const_iterator end () const │ │ │ │ │ - 128 { │ │ │ │ │ - 129 return reference_elements_.data() + numTopologies; │ │ │ │ │ - 130 } │ │ │ │ │ - 131 │ │ │ │ │ - 132 // here, we make sure to actually return a const reference to something │ │ │ │ │ - 133 // that is guaranteed not to become invalid, as otherwise, we might run │ │ │ │ │ - 134 // straight into debugging hell when a user binds the return value to a │ │ │ │ │ - 135 // const ref and the temporary goes out of scope. │ │ │ │ │ - 136 const DeprecatedReferenceElement& deprecated(const ReferenceElement& v) │ │ │ │ │ -const │ │ │ │ │ - 137 { │ │ │ │ │ - 138 return reference_elements_[v.impl().type(0,0).id()]; │ │ │ │ │ - 139 } │ │ │ │ │ - 140 │ │ │ │ │ - 141 private: │ │ │ │ │ - 142 │ │ │ │ │ - 143 std::array implementations_; │ │ │ │ │ - 144 std::array │ │ │ │ │ -reference_elements_; │ │ │ │ │ - 145 │ │ │ │ │ - 146 }; │ │ │ │ │ - 147 │ │ │ │ │ +56 QuadraturePoint (const Vector& x, ct w) : local(x) │ │ │ │ │ + 57 { │ │ │ │ │ + 58 weight_ = w; │ │ │ │ │ + 59 } │ │ │ │ │ + 60 │ │ │ │ │ +62 const Vector& position () const │ │ │ │ │ + 63 { │ │ │ │ │ + 64 return local; │ │ │ │ │ + 65 } │ │ │ │ │ + 66 │ │ │ │ │ +68 const ct &weight () const │ │ │ │ │ + 69 { │ │ │ │ │ + 70 return weight_; │ │ │ │ │ + 71 } │ │ │ │ │ + 72 │ │ │ │ │ + 73 protected: │ │ │ │ │ +74 FieldVector local; │ │ │ │ │ +75 ct weight_; │ │ │ │ │ + 76 }; │ │ │ │ │ + 77 │ │ │ │ │ +81 namespace QuadratureType { │ │ │ │ │ +82 enum Enum { │ │ │ │ │ +92 GaussLegendre = 0, │ │ │ │ │ + 93 │ │ │ │ │ +99 GaussJacobi_1_0 = 1, │ │ │ │ │ + 100 │ │ │ │ │ +106 GaussJacobi_2_0 = 2, │ │ │ │ │ + 107 │ │ │ │ │ +119 GaussJacobi_n_0 = 3, │ │ │ │ │ + 120 │ │ │ │ │ +127 GaussLobatto = 4, │ │ │ │ │ + 128 │ │ │ │ │ +135 GaussRadauLeft = 5, │ │ │ │ │ + 136 │ │ │ │ │ +144 GaussRadauRight = 6, │ │ │ │ │ + 145 size │ │ │ │ │ +146 }; │ │ │ │ │ + 147 } │ │ │ │ │ 148 │ │ │ │ │ - 149 } // namespace Impl │ │ │ │ │ - 150 │ │ │ │ │ - 151 │ │ │ │ │ - 152#endif // DOXYGEN │ │ │ │ │ - 153 │ │ │ │ │ - 154 │ │ │ │ │ - 155 // ReferenceElements │ │ │ │ │ - 156 // ------------------------ │ │ │ │ │ - 157 │ │ │ │ │ - 168 template< class ctype_, int dim > │ │ │ │ │ -169 struct ReferenceElements │ │ │ │ │ - 170 { │ │ │ │ │ - 171 │ │ │ │ │ -173 using ctype = ctype_; │ │ │ │ │ - 174 │ │ │ │ │ -176 using CoordinateField = ctype; │ │ │ │ │ - 177 │ │ │ │ │ -179 static constexpr int dimension = dim; │ │ │ │ │ - 180 │ │ │ │ │ - 181 private: │ │ │ │ │ + 152 template │ │ │ │ │ +153 class QuadratureRule : public std::vector > │ │ │ │ │ + 154 { │ │ │ │ │ + 155 public: │ │ │ │ │ +161 QuadratureRule() : delivered_order(-1) {} │ │ │ │ │ + 162 │ │ │ │ │ + 163 protected: │ │ │ │ │ +165 QuadratureRule(GeometryType t) : geometry_type(t), delivered_order(-1) {} │ │ │ │ │ + 166 │ │ │ │ │ +168 QuadratureRule(GeometryType t, int order) : geometry_type(t), │ │ │ │ │ +delivered_order(order) {} │ │ │ │ │ + 169 public: │ │ │ │ │ +171 constexpr static int d = dim; │ │ │ │ │ + 172 │ │ │ │ │ +174 typedef ct CoordType; │ │ │ │ │ + 175 │ │ │ │ │ +177 virtual int order () const { return delivered_order; } │ │ │ │ │ + 178 │ │ │ │ │ +180 virtual GeometryType type () const { return geometry_type; } │ │ │ │ │ +181 virtual ~QuadratureRule(){} │ │ │ │ │ 182 │ │ │ │ │ - 183 using Container = Impl::ReferenceElementContainer< ctype, dim >; │ │ │ │ │ - 184 │ │ │ │ │ - 185 public: │ │ │ │ │ +185 typedef typename std::vector >::const_iterator │ │ │ │ │ +iterator; │ │ │ │ │ 186 │ │ │ │ │ -188 using ReferenceElement = typename Container::ReferenceElement; │ │ │ │ │ - 189 │ │ │ │ │ -191 using Iterator = typename Container::const_iterator; │ │ │ │ │ - 192 │ │ │ │ │ -194 using iterator = Iterator; │ │ │ │ │ + 187 protected: │ │ │ │ │ +188 GeometryType geometry_type; │ │ │ │ │ +189 int delivered_order; │ │ │ │ │ + 190 }; │ │ │ │ │ + 191 │ │ │ │ │ + 192 // Forward declaration of the factory class, │ │ │ │ │ + 193 // needed internally by the QuadratureRules container class. │ │ │ │ │ + 194 template class QuadratureRuleFactory; │ │ │ │ │ 195 │ │ │ │ │ - 197 static const ReferenceElement& │ │ │ │ │ -198 general ( const GeometryType& type ) │ │ │ │ │ - 199 { │ │ │ │ │ - 200 return container() ( type ); │ │ │ │ │ - 201 } │ │ │ │ │ - 202 │ │ │ │ │ -204 static const ReferenceElement& simplex () │ │ │ │ │ - 205 { │ │ │ │ │ - 206 return container().simplex(); │ │ │ │ │ - 207 } │ │ │ │ │ - 208 │ │ │ │ │ -210 static const ReferenceElement& cube () │ │ │ │ │ - 211 { │ │ │ │ │ - 212 return container().cube(); │ │ │ │ │ - 213 } │ │ │ │ │ - 214 │ │ │ │ │ -215 static Iterator begin () │ │ │ │ │ + 199 template │ │ │ │ │ +200 class QuadratureRules { │ │ │ │ │ + 201 │ │ │ │ │ + 203 using QuadratureRule = Dune::QuadratureRule; │ │ │ │ │ + 204 │ │ │ │ │ + 205 // indexed by quadrature order │ │ │ │ │ + 206 using QuadratureOrderVector = std::vector >; │ │ │ │ │ + 207 │ │ │ │ │ + 208 // indexed by geometry type │ │ │ │ │ + 209 using GeometryTypeVector = std::vector >; │ │ │ │ │ + 210 │ │ │ │ │ + 211 // indexed by quadrature type enum │ │ │ │ │ + 212 using QuadratureCacheVector = std::vector >; │ │ │ │ │ + 213 │ │ │ │ │ + 215 DUNE_EXPORT const QuadratureRule& _rule(const GeometryType& t, int p, │ │ │ │ │ +QuadratureType::Enum qt=QuadratureType::GaussLegendre) const │ │ │ │ │ 216 { │ │ │ │ │ - 217 return container().begin(); │ │ │ │ │ - 218 } │ │ │ │ │ - 219 │ │ │ │ │ -220 static Iterator end () │ │ │ │ │ - 221 { │ │ │ │ │ - 222 return container().end(); │ │ │ │ │ - 223 } │ │ │ │ │ - 224 │ │ │ │ │ - 225#ifndef DOXYGEN │ │ │ │ │ - 226 static const typename Container::DeprecatedReferenceElement& │ │ │ │ │ - 227 deprecated(const ReferenceElement& v) │ │ │ │ │ - 228 { │ │ │ │ │ - 229 return container().deprecated(v); │ │ │ │ │ - 230 } │ │ │ │ │ - 231#endif // DOXYGEN │ │ │ │ │ - 232 │ │ │ │ │ - 233 private: │ │ │ │ │ - 234 │ │ │ │ │ - 235 DUNE_EXPORT static const Container& container () │ │ │ │ │ - 236 { │ │ │ │ │ - 237 static Container container; │ │ │ │ │ - 238 return container; │ │ │ │ │ - 239 } │ │ │ │ │ - 240 }; │ │ │ │ │ - 241 │ │ │ │ │ - 242 } // namespace Geo │ │ │ │ │ + 217 assert(t.dim()==dim); │ │ │ │ │ + 218 │ │ │ │ │ + 219 DUNE_ASSERT_CALL_ONCE(); │ │ │ │ │ + 220 │ │ │ │ │ + 221 static QuadratureCacheVector quadratureCache(QuadratureType::size); │ │ │ │ │ + 222 │ │ │ │ │ + 223 auto& [ onceFlagQuadratureType, geometryTypes ] = quadratureCache[qt]; │ │ │ │ │ + 224 // initialize geometry types for this quadrature type once │ │ │ │ │ + 225 std::call_once(onceFlagQuadratureType, [&types = geometryTypes]{ │ │ │ │ │ + 226 types = GeometryTypeVector(LocalGeometryTypeIndex::size(dim)); │ │ │ │ │ + 227 }); │ │ │ │ │ + 228 │ │ │ │ │ + 229 auto& [ onceFlagGeometryType, quadratureOrders ] = geometryTypes │ │ │ │ │ +[LocalGeometryTypeIndex::index(t)]; │ │ │ │ │ + 230 // initialize quadrature orders for this geometry type and quadrature type │ │ │ │ │ +once │ │ │ │ │ + 231 std::call_once(onceFlagGeometryType, [&, &orders = quadratureOrders]{ │ │ │ │ │ + 232 // we only need one quadrature rule for points, not maxint │ │ │ │ │ + 233 const auto numRules = dim == 0 ? 1 : QuadratureRuleFactory:: │ │ │ │ │ +maxOrder(t, qt)+1; │ │ │ │ │ + 234 orders = QuadratureOrderVector(numRules); │ │ │ │ │ + 235 }); │ │ │ │ │ + 236 │ │ │ │ │ + 237 // we only have one quadrature rule for points │ │ │ │ │ + 238 auto& [ onceFlagQuadratureOrder, quadratureRule ] = quadratureOrders[dim │ │ │ │ │ +== 0 ? 0 : p]; │ │ │ │ │ + 239 // initialize quadrature rule once │ │ │ │ │ + 240 std::call_once(onceFlagQuadratureOrder, [&, &rule = quadratureRule]{ │ │ │ │ │ + 241 rule = QuadratureRuleFactory::rule(t, p, qt); │ │ │ │ │ + 242 }); │ │ │ │ │ 243 │ │ │ │ │ - 245 using Geo::ReferenceElements; │ │ │ │ │ + 244 return quadratureRule; │ │ │ │ │ + 245 } │ │ │ │ │ 246 │ │ │ │ │ - 247 │ │ │ │ │ - 248#ifdef DOXYGEN │ │ │ │ │ - 249 │ │ │ │ │ - 251 │ │ │ │ │ - 294 template │ │ │ │ │ -295 unspecified-value-type referenceElement(T&&... t); │ │ │ │ │ - 296 │ │ │ │ │ - 297#endif │ │ │ │ │ + 248 DUNE_EXPORT static QuadratureRules& instance() │ │ │ │ │ + 249 { │ │ │ │ │ + 250 static QuadratureRules instance; │ │ │ │ │ + 251 return instance; │ │ │ │ │ + 252 } │ │ │ │ │ + 253 │ │ │ │ │ + 255 QuadratureRules () = default; │ │ │ │ │ + 256 public: │ │ │ │ │ + 258 static unsigned │ │ │ │ │ +259 maxOrder(const GeometryType& t, │ │ │ │ │ + 260 QuadratureType::Enum qt=QuadratureType::GaussLegendre) │ │ │ │ │ + 261 { │ │ │ │ │ + 262 return QuadratureRuleFactory::maxOrder(t,qt); │ │ │ │ │ + 263 } │ │ │ │ │ + 264 │ │ │ │ │ +266 static const QuadratureRule& rule(const GeometryType& t, int p, │ │ │ │ │ +QuadratureType::Enum qt=QuadratureType::GaussLegendre) │ │ │ │ │ + 267 { │ │ │ │ │ + 268 return instance()._rule(t,p,qt); │ │ │ │ │ + 269 } │ │ │ │ │ + 270 │ │ │ │ │ +272 static const QuadratureRule& rule(const GeometryType::BasicType t, int p, │ │ │ │ │ +QuadratureType::Enum qt=QuadratureType::GaussLegendre) │ │ │ │ │ + 273 { │ │ │ │ │ + 274 GeometryType gt(t,dim); │ │ │ │ │ + 275 return instance()._rule(gt,p,qt); │ │ │ │ │ + 276 } │ │ │ │ │ + 277 }; │ │ │ │ │ + 278 │ │ │ │ │ + 279} // end namespace Dune │ │ │ │ │ + 280 │ │ │ │ │ +281#define DUNE_INCLUDING_IMPLEMENTATION │ │ │ │ │ + 282 │ │ │ │ │ + 283// 0d rules │ │ │ │ │ + 284#include "quadraturerules/pointquadrature.hh" │ │ │ │ │ + 285// 1d rules │ │ │ │ │ + 286#include "quadraturerules/gausslobattoquadrature.hh" │ │ │ │ │ + 287#include "quadraturerules/gaussquadrature.hh" │ │ │ │ │ + 288#include "quadraturerules/gaussradauleftquadrature.hh" │ │ │ │ │ + 289#include "quadraturerules/gaussradaurightquadrature.hh" │ │ │ │ │ + 290#include "quadraturerules/jacobi1quadrature.hh" │ │ │ │ │ + 291#include "quadraturerules/jacobi2quadrature.hh" │ │ │ │ │ + 292#include "quadraturerules/jacobiNquadrature.hh" │ │ │ │ │ + 293// 3d rules │ │ │ │ │ + 294#include "quadraturerules/prismquadrature.hh" │ │ │ │ │ + 295// general rules │ │ │ │ │ + 296#include "quadraturerules/simplexquadrature.hh" │ │ │ │ │ + 297#include "quadraturerules/tensorproductquadrature.hh" │ │ │ │ │ 298 │ │ │ │ │ - 299 │ │ │ │ │ - 301 │ │ │ │ │ - 314 template │ │ │ │ │ -315 auto referenceElement(const Dune::GeometryType& gt, Dune::Dim = {}) │ │ │ │ │ - 316 { │ │ │ │ │ - 317 return ReferenceElements::general(gt); │ │ │ │ │ - 318 } │ │ │ │ │ - 319 │ │ │ │ │ - 320 │ │ │ │ │ + 299#undef DUNE_INCLUDING_IMPLEMENTATION │ │ │ │ │ + 300 │ │ │ │ │ + 301namespace Dune { │ │ │ │ │ + 302 │ │ │ │ │ + 309 template │ │ │ │ │ +310 class QuadratureRuleFactory { │ │ │ │ │ + 311 private: │ │ │ │ │ + 312 friend class QuadratureRules; │ │ │ │ │ + 313 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt) │ │ │ │ │ + 314 { │ │ │ │ │ + 315 return TensorProductQuadratureRule::maxOrder(t.id(), qt); │ │ │ │ │ + 316 } │ │ │ │ │ + 317 static QuadratureRule rule(const GeometryType& t, int p, │ │ │ │ │ +QuadratureType::Enum qt) │ │ │ │ │ + 318 { │ │ │ │ │ + 319 return TensorProductQuadratureRule(t.id(), p, qt); │ │ │ │ │ + 320 } │ │ │ │ │ + 321 }; │ │ │ │ │ 322 │ │ │ │ │ - 334 template>:: │ │ │ │ │ -value, int> = 0> │ │ │ │ │ -335 auto referenceElement(const T&, const Dune::GeometryType& gt, Dune:: │ │ │ │ │ -Dim) │ │ │ │ │ - 336 { │ │ │ │ │ - 337 return ReferenceElements::general(gt); │ │ │ │ │ - 338 } │ │ │ │ │ - 339 │ │ │ │ │ - 340 │ │ │ │ │ - 341#ifndef DOXYGEN │ │ │ │ │ - 342 │ │ │ │ │ - 343 // helpers for the ReferenceElement<> meta function │ │ │ │ │ - 344 │ │ │ │ │ - 345 namespace Impl { │ │ │ │ │ - 346 │ │ │ │ │ - 347 // Evaluates to the correct reference element iff matches the │ │ │ │ │ -pattern > │ │ │ │ │ - 348 // otherwise, it's ill-formed. Should be used with detected_or and │ │ │ │ │ -friends. │ │ │ │ │ - 349 │ │ │ │ │ - 350 template │ │ │ │ │ - 351 struct DefaultReferenceElementExtractor; │ │ │ │ │ - 352 │ │ │ │ │ - 353 template::value,int>::type │ │ │ │ │ -dim> │ │ │ │ │ - 354 struct DefaultReferenceElementExtractor> │ │ │ │ │ - 355 { │ │ │ │ │ - 356 using type = typename Dune::Geo::ReferenceElements:: │ │ │ │ │ -ReferenceElement; │ │ │ │ │ - 357 }; │ │ │ │ │ - 358 │ │ │ │ │ - 359 template │ │ │ │ │ - 360 using DefaultReferenceElement = typename │ │ │ │ │ -DefaultReferenceElementExtractor::type; │ │ │ │ │ - 361 │ │ │ │ │ - 362 } │ │ │ │ │ - 363 │ │ │ │ │ - 364 // looks up the type of a reference element by trying to instantiate the │ │ │ │ │ -correct overload │ │ │ │ │ - 365 // of referenceElement() for the given arguments. This will fail if there │ │ │ │ │ -is no valid │ │ │ │ │ - 366 // overload and should be used with detected_or or some other utility that │ │ │ │ │ -places the │ │ │ │ │ - 367 // instantiation in SFINAE context. │ │ │ │ │ - 368 // │ │ │ │ │ - 369 // this is placed directly in namespace Dune to avoid any weird surprises │ │ │ │ │ - 370 │ │ │ │ │ - 371 template │ │ │ │ │ - 372 using LookupReferenceElement = decltype(referenceElement(std::declval │ │ │ │ │ -()...)); │ │ │ │ │ - 373 │ │ │ │ │ - 374#endif // DOXYGEN │ │ │ │ │ - 375 │ │ │ │ │ -376 namespace Transitional { │ │ │ │ │ - 377 │ │ │ │ │ - 378#ifndef DOXYGEN │ │ │ │ │ - 379 │ │ │ │ │ - 380 // this abomination checks whether the template signature matches the │ │ │ │ │ -special case │ │ │ │ │ - 381 // ReferenceElement> and otherwise defers the │ │ │ │ │ -type lookup │ │ │ │ │ - 382 // to a decltype on a call to referenceElement(std::declval()) │ │ │ │ │ - 383 │ │ │ │ │ - 384 template │ │ │ │ │ - 385 using ReferenceElement = Std::detected_or_t< │ │ │ │ │ - 386 Std::detected_t, │ │ │ │ │ - 387 Impl::DefaultReferenceElement, │ │ │ │ │ - 388 T... │ │ │ │ │ - 389 >; │ │ │ │ │ - 390 │ │ │ │ │ - 391#else // DOXYGEN │ │ │ │ │ - 392 │ │ │ │ │ - 394 │ │ │ │ │ - 416 template │ │ │ │ │ -417 using ReferenceElement = unspecified-type; │ │ │ │ │ - 418 │ │ │ │ │ - 419#endif //DOXYGEN │ │ │ │ │ - 420 │ │ │ │ │ - 421 } │ │ │ │ │ - 422 │ │ │ │ │ - 423#ifndef DOXYGEN │ │ │ │ │ - 424 │ │ │ │ │ - 425 namespace Impl { │ │ │ │ │ - 426 │ │ │ │ │ - 427 // helpers for triggering a deprecation warning for occurrences of the old │ │ │ │ │ - 428 // ReferenceElement syntax (Dune::ReferenceElement) │ │ │ │ │ - 429 │ │ │ │ │ - 430 // this looks a little weird, encoding the type in the return type of a │ │ │ │ │ -nested function, │ │ │ │ │ - 431 // but it was the only reliable way to trigger the warning iff the │ │ │ │ │ -compiler encounters │ │ │ │ │ - 432 // an invalid use. Other solutions either miss some (or all) uses or │ │ │ │ │ -trigger false alarms. │ │ │ │ │ - 433 │ │ │ │ │ - 434 template │ │ │ │ │ - 435 struct ValidReferenceElementTypeSignature │ │ │ │ │ - 436 { │ │ │ │ │ - 437 Transitional::ReferenceElement check(); │ │ │ │ │ - 438 }; │ │ │ │ │ - 439 │ │ │ │ │ - 440 template │ │ │ │ │ - 441 struct DeprecatedReferenceElementTypeSignature │ │ │ │ │ - 442 { │ │ │ │ │ - 443 [[deprecated("Dune::ReferenceElement is deprecated, please use │ │ │ │ │ -Dune::ReferenceElement (if you have a geometry), Dune:: │ │ │ │ │ -ReferenceElements::ReferenceElement or Dune::Transitional:: │ │ │ │ │ -ReferenceElement> instead. After Dune 2.6, you will be able to │ │ │ │ │ -use Dune::ReferenceElement>.")]] T check(); │ │ │ │ │ - 444 }; │ │ │ │ │ - 445 │ │ │ │ │ - 446 } // namespace Impl │ │ │ │ │ - 447 │ │ │ │ │ - 448 // This just makes sure the user doesn't use invalid syntax (by checking │ │ │ │ │ -against the -1 default for │ │ │ │ │ - 449 // the dimension, and then either hands back the old-style type along with │ │ │ │ │ -a deprecation warning or │ │ │ │ │ - 450 // forwards to the transitional version │ │ │ │ │ - 451 template │ │ │ │ │ - 452 using ReferenceElement = decltype( │ │ │ │ │ - 453 std::declval< │ │ │ │ │ - 454 typename std::conditional< │ │ │ │ │ - 455 dim == -1, │ │ │ │ │ - 456 Impl::ValidReferenceElementTypeSignature, │ │ │ │ │ - 457 Impl::DeprecatedReferenceElementTypeSignature> │ │ │ │ │ - 458 >::type │ │ │ │ │ - 459 >().check()); │ │ │ │ │ - 460 │ │ │ │ │ - 461#else // DOXYGEN │ │ │ │ │ - 462 │ │ │ │ │ + 323 template │ │ │ │ │ +324 class QuadratureRuleFactory { │ │ │ │ │ + 325 private: │ │ │ │ │ +326 constexpr static int dim = 0; │ │ │ │ │ + 327 friend class QuadratureRules; │ │ │ │ │ + 328 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum) │ │ │ │ │ + 329 { │ │ │ │ │ + 330 if (t.isVertex()) │ │ │ │ │ + 331 { │ │ │ │ │ + 332 return std::numeric_limits::max(); │ │ │ │ │ + 333 } │ │ │ │ │ + 334 DUNE_THROW(Exception, "Unknown GeometryType"); │ │ │ │ │ + 335 } │ │ │ │ │ + 336 static QuadratureRule rule(const GeometryType& t, int , │ │ │ │ │ +QuadratureType::Enum) │ │ │ │ │ + 337 { │ │ │ │ │ + 338 if (t.isVertex()) │ │ │ │ │ + 339 { │ │ │ │ │ + 340 return PointQuadratureRule(); │ │ │ │ │ + 341 } │ │ │ │ │ + 342 DUNE_THROW(Exception, "Unknown GeometryType"); │ │ │ │ │ + 343 } │ │ │ │ │ + 344 }; │ │ │ │ │ + 345 │ │ │ │ │ + 346 template │ │ │ │ │ +347 class QuadratureRuleFactory { │ │ │ │ │ + 348 private: │ │ │ │ │ +349 constexpr static int dim = 1; │ │ │ │ │ + 350 friend class QuadratureRules; │ │ │ │ │ + 351 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt) │ │ │ │ │ + 352 { │ │ │ │ │ + 353 if (t.isLine()) │ │ │ │ │ + 354 { │ │ │ │ │ + 355 switch (qt) { │ │ │ │ │ + 356 case QuadratureType::GaussLegendre : │ │ │ │ │ + 357 return GaussQuadratureRule1D::highest_order; │ │ │ │ │ + 358 case QuadratureType::GaussJacobi_1_0 : │ │ │ │ │ + 359 return Jacobi1QuadratureRule1D::highest_order; │ │ │ │ │ + 360 case QuadratureType::GaussJacobi_2_0 : │ │ │ │ │ + 361 return Jacobi2QuadratureRule1D::highest_order; │ │ │ │ │ + 362 case QuadratureType::GaussLobatto : │ │ │ │ │ + 363 return GaussLobattoQuadratureRule1D::highest_order; │ │ │ │ │ + 364 case QuadratureType::GaussJacobi_n_0 : │ │ │ │ │ + 365 return JacobiNQuadratureRule1D::maxOrder(); │ │ │ │ │ + 366 case QuadratureType::GaussRadauLeft : │ │ │ │ │ + 367 return GaussRadauLeftQuadratureRule1D::highest_order; │ │ │ │ │ + 368 case QuadratureType::GaussRadauRight : │ │ │ │ │ + 369 return GaussRadauRightQuadratureRule1D::highest_order; │ │ │ │ │ + 370 default : │ │ │ │ │ + 371 DUNE_THROW(Exception, "Unknown QuadratureType"); │ │ │ │ │ + 372 } │ │ │ │ │ + 373 } │ │ │ │ │ + 374 DUNE_THROW(Exception, "Unknown GeometryType"); │ │ │ │ │ + 375 } │ │ │ │ │ + 376 static QuadratureRule rule(const GeometryType& t, int p, │ │ │ │ │ +QuadratureType::Enum qt) │ │ │ │ │ + 377 { │ │ │ │ │ + 378 if (t.isLine()) │ │ │ │ │ + 379 { │ │ │ │ │ + 380 switch (qt) { │ │ │ │ │ + 381 case QuadratureType::GaussLegendre : │ │ │ │ │ + 382 return GaussQuadratureRule1D(p); │ │ │ │ │ + 383 case QuadratureType::GaussJacobi_1_0 : │ │ │ │ │ + 384 return Jacobi1QuadratureRule1D(p); │ │ │ │ │ + 385 case QuadratureType::GaussJacobi_2_0 : │ │ │ │ │ + 386 return Jacobi2QuadratureRule1D(p); │ │ │ │ │ + 387 case QuadratureType::GaussLobatto : │ │ │ │ │ + 388 return GaussLobattoQuadratureRule1D(p); │ │ │ │ │ + 389 case QuadratureType::GaussJacobi_n_0 : │ │ │ │ │ + 390 return JacobiNQuadratureRule1D(p); │ │ │ │ │ + 391 case QuadratureType::GaussRadauLeft : │ │ │ │ │ + 392 return GaussRadauLeftQuadratureRule1D(p); │ │ │ │ │ + 393 case QuadratureType::GaussRadauRight : │ │ │ │ │ + 394 return GaussRadauRightQuadratureRule1D(p); │ │ │ │ │ + 395 default : │ │ │ │ │ + 396 DUNE_THROW(Exception, "Unknown QuadratureType"); │ │ │ │ │ + 397 } │ │ │ │ │ + 398 } │ │ │ │ │ + 399 DUNE_THROW(Exception, "Unknown GeometryType"); │ │ │ │ │ + 400 } │ │ │ │ │ + 401 }; │ │ │ │ │ + 402 │ │ │ │ │ + 403 template │ │ │ │ │ +404 class QuadratureRuleFactory { │ │ │ │ │ + 405 private: │ │ │ │ │ +406 constexpr static int dim = 2; │ │ │ │ │ + 407 friend class QuadratureRules; │ │ │ │ │ + 408 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt) │ │ │ │ │ + 409 { │ │ │ │ │ + 410 unsigned order = │ │ │ │ │ + 411 TensorProductQuadratureRule::maxOrder(t.id(), qt); │ │ │ │ │ + 412 if (t.isSimplex()) │ │ │ │ │ + 413 order = std::max │ │ │ │ │ + 414 (order, unsigned(SimplexQuadratureRule::highest_order)); │ │ │ │ │ + 415 return order; │ │ │ │ │ + 416 } │ │ │ │ │ + 417 static QuadratureRule rule(const GeometryType& t, int p, │ │ │ │ │ +QuadratureType::Enum qt) │ │ │ │ │ + 418 { │ │ │ │ │ + 419 if (t.isSimplex() │ │ │ │ │ + 420 && ( qt == QuadratureType::GaussLegendre || qt == QuadratureType:: │ │ │ │ │ +GaussJacobi_n_0 ) │ │ │ │ │ + 421 && p <= SimplexQuadratureRule::highest_order) │ │ │ │ │ + 422 { │ │ │ │ │ + 423 return SimplexQuadratureRule(p); │ │ │ │ │ + 424 } │ │ │ │ │ + 425 return TensorProductQuadratureRule(t.id(), p, qt); │ │ │ │ │ + 426 } │ │ │ │ │ + 427 }; │ │ │ │ │ + 428 │ │ │ │ │ + 429 template │ │ │ │ │ +430 class QuadratureRuleFactory { │ │ │ │ │ + 431 private: │ │ │ │ │ +432 constexpr static int dim = 3; │ │ │ │ │ + 433 friend class QuadratureRules; │ │ │ │ │ + 434 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt) │ │ │ │ │ + 435 { │ │ │ │ │ + 436 unsigned order = │ │ │ │ │ + 437 TensorProductQuadratureRule::maxOrder(t.id(), qt); │ │ │ │ │ + 438 if (t.isSimplex()) │ │ │ │ │ + 439 order = std::max │ │ │ │ │ + 440 (order, unsigned(SimplexQuadratureRule::highest_order)); │ │ │ │ │ + 441 if (t.isPrism()) │ │ │ │ │ + 442 order = std::max │ │ │ │ │ + 443 (order, unsigned(PrismQuadratureRule::highest_order)); │ │ │ │ │ + 444 return order; │ │ │ │ │ + 445 } │ │ │ │ │ + 446 static QuadratureRule rule(const GeometryType& t, int p, │ │ │ │ │ +QuadratureType::Enum qt) │ │ │ │ │ + 447 { │ │ │ │ │ + 448 │ │ │ │ │ + 449 if (t.isSimplex() │ │ │ │ │ + 450 && ( qt == QuadratureType::GaussLegendre || qt == QuadratureType:: │ │ │ │ │ +GaussJacobi_n_0 ) │ │ │ │ │ + 451 && p <= SimplexQuadratureRule::highest_order) │ │ │ │ │ + 452 { │ │ │ │ │ + 453 return SimplexQuadratureRule(p); │ │ │ │ │ + 454 } │ │ │ │ │ + 455 if (t.isPrism() │ │ │ │ │ + 456 && qt == QuadratureType::GaussLegendre │ │ │ │ │ + 457 && p <= PrismQuadratureRule::highest_order) │ │ │ │ │ + 458 { │ │ │ │ │ + 459 return PrismQuadratureRule(p); │ │ │ │ │ + 460 } │ │ │ │ │ + 461 return TensorProductQuadratureRule(t.id(), p, qt); │ │ │ │ │ + 462 } │ │ │ │ │ + 463 }; │ │ │ │ │ 464 │ │ │ │ │ - 496 template │ │ │ │ │ -497 using ReferenceElement = unspecified-type; │ │ │ │ │ - 498 │ │ │ │ │ - 499#endif // DOXYGEN │ │ │ │ │ - 500 │ │ │ │ │ - 501 │ │ │ │ │ - 502 │ │ │ │ │ - 503} // namespace Dune │ │ │ │ │ - 504 │ │ │ │ │ - 505#endif // #ifndef DUNE_GEOMETRY_REFERENCEELEMENTS_HH │ │ │ │ │ + 465#ifndef DUNE_NO_EXTERN_QUADRATURERULES │ │ │ │ │ + 466 extern template class GaussLobattoQuadratureRule; │ │ │ │ │ + 467 extern template class GaussQuadratureRule; │ │ │ │ │ + 468 extern template class GaussRadauLeftQuadratureRule; │ │ │ │ │ + 469 extern template class GaussRadauRightQuadratureRule; │ │ │ │ │ + 470 extern template class Jacobi1QuadratureRule; │ │ │ │ │ + 471 extern template class Jacobi2QuadratureRule; │ │ │ │ │ + 472 extern template class JacobiNQuadratureRule; │ │ │ │ │ + 473 extern template class PrismQuadratureRule; │ │ │ │ │ + 474 extern template class SimplexQuadratureRule; │ │ │ │ │ +475 extern template class SimplexQuadratureRule; │ │ │ │ │ + 476#endif // !DUNE_NO_EXTERN_QUADRATURERULES │ │ │ │ │ + 477 │ │ │ │ │ + 478} // end namespace │ │ │ │ │ + 479 │ │ │ │ │ + 480#endif // DUNE_GEOMETRY_QUADRATURERULES_HH │ │ │ │ │ +typeindex.hh │ │ │ │ │ +Helper classes to provide indices for geometrytypes for use in a vector. │ │ │ │ │ type.hh │ │ │ │ │ A unique label for each type of element that can occur in a grid. │ │ │ │ │ -referenceelement.hh │ │ │ │ │ -referenceelementimplementation.hh │ │ │ │ │ -dimension.hh │ │ │ │ │ -Dune::GeometryTypes::cube │ │ │ │ │ -constexpr GeometryType cube(unsigned int dim) │ │ │ │ │ -Returns a GeometryType representing a hypercube of dimension dim. │ │ │ │ │ -Definition: type.hh:472 │ │ │ │ │ -Dune::GeometryTypes::prism │ │ │ │ │ -constexpr GeometryType prism │ │ │ │ │ -GeometryType representing a 3D prism. │ │ │ │ │ -Definition: type.hh:542 │ │ │ │ │ -Dune::GeometryTypes::pyramid │ │ │ │ │ -constexpr GeometryType pyramid │ │ │ │ │ -GeometryType representing a 3D pyramid. │ │ │ │ │ -Definition: type.hh:536 │ │ │ │ │ -Dune::GeometryTypes::simplex │ │ │ │ │ -constexpr GeometryType simplex(unsigned int dim) │ │ │ │ │ -Returns a GeometryType representing a simplex of dimension dim. │ │ │ │ │ -Definition: type.hh:463 │ │ │ │ │ -Dune::Transitional::ReferenceElement │ │ │ │ │ -unspecified-type ReferenceElement │ │ │ │ │ -Returns the type of reference element for the argument types T... │ │ │ │ │ -Definition: referenceelements.hh:417 │ │ │ │ │ -Dune::referenceElement │ │ │ │ │ -unspecified value type referenceElement(T &&... t) │ │ │ │ │ -Returns a reference element for the objects t.... │ │ │ │ │ -Dune::ReferenceElement │ │ │ │ │ -unspecified-type ReferenceElement │ │ │ │ │ -Returns the type of reference element for the argument type T. │ │ │ │ │ -Definition: referenceelements.hh:497 │ │ │ │ │ Dune │ │ │ │ │ Definition: affinegeometry.hh:21 │ │ │ │ │ -Dune::Geo::ReferenceElement │ │ │ │ │ -This class provides access to geometric and topological properties of a │ │ │ │ │ -reference element. │ │ │ │ │ -Definition: referenceelement.hh:52 │ │ │ │ │ -Dune::Geo::ReferenceElements │ │ │ │ │ -Class providing access to the singletons of the reference elements. │ │ │ │ │ -Definition: referenceelements.hh:170 │ │ │ │ │ -Dune::Geo::ReferenceElements::begin │ │ │ │ │ -static Iterator begin() │ │ │ │ │ -Definition: referenceelements.hh:215 │ │ │ │ │ -Dune::Geo::ReferenceElements::iterator │ │ │ │ │ -Iterator iterator │ │ │ │ │ -Iterator over available reference elements. │ │ │ │ │ -Definition: referenceelements.hh:194 │ │ │ │ │ -Dune::Geo::ReferenceElements::ReferenceElement │ │ │ │ │ -typename Container::ReferenceElement ReferenceElement │ │ │ │ │ -The reference element type. │ │ │ │ │ -Definition: referenceelements.hh:188 │ │ │ │ │ -Dune::Geo::ReferenceElements::cube │ │ │ │ │ -static const ReferenceElement & cube() │ │ │ │ │ -get hypercube reference elements │ │ │ │ │ -Definition: referenceelements.hh:210 │ │ │ │ │ -Dune::Geo::ReferenceElements::end │ │ │ │ │ -static Iterator end() │ │ │ │ │ -Definition: referenceelements.hh:220 │ │ │ │ │ -Dune::Geo::ReferenceElements::ctype │ │ │ │ │ -ctype_ ctype │ │ │ │ │ -The coordinate field type of the contained reference elements. │ │ │ │ │ -Definition: referenceelements.hh:173 │ │ │ │ │ -Dune::Geo::ReferenceElements::general │ │ │ │ │ -static const ReferenceElement & general(const GeometryType &type) │ │ │ │ │ -get general reference elements │ │ │ │ │ -Definition: referenceelements.hh:198 │ │ │ │ │ -Dune::Geo::ReferenceElements::simplex │ │ │ │ │ -static const ReferenceElement & simplex() │ │ │ │ │ -get simplex reference elements │ │ │ │ │ -Definition: referenceelements.hh:204 │ │ │ │ │ -Dune::Geo::ReferenceElements::Iterator │ │ │ │ │ -typename Container::const_iterator Iterator │ │ │ │ │ -Iterator over available reference elements. │ │ │ │ │ -Definition: referenceelements.hh:191 │ │ │ │ │ -Dune::Geo::ReferenceElements::dimension │ │ │ │ │ +Dune::QuadratureType::Enum │ │ │ │ │ +Enum │ │ │ │ │ +Definition: quadraturerules.hh:82 │ │ │ │ │ +Dune::QuadratureType::GaussJacobi_n_0 │ │ │ │ │ +@ GaussJacobi_n_0 │ │ │ │ │ +Gauss-Legendre rules with . │ │ │ │ │ +Definition: quadraturerules.hh:119 │ │ │ │ │ +Dune::QuadratureType::GaussJacobi_2_0 │ │ │ │ │ +@ GaussJacobi_2_0 │ │ │ │ │ +Gauss-Legendre rules with . │ │ │ │ │ +Definition: quadraturerules.hh:106 │ │ │ │ │ +Dune::QuadratureType::GaussRadauRight │ │ │ │ │ +@ GaussRadauRight │ │ │ │ │ +Gauss-Radau rules including the right endpoint. │ │ │ │ │ +Definition: quadraturerules.hh:144 │ │ │ │ │ +Dune::QuadratureType::GaussJacobi_1_0 │ │ │ │ │ +@ GaussJacobi_1_0 │ │ │ │ │ +Gauss-Jacobi rules with . │ │ │ │ │ +Definition: quadraturerules.hh:99 │ │ │ │ │ +Dune::QuadratureType::size │ │ │ │ │ +@ size │ │ │ │ │ +Definition: quadraturerules.hh:145 │ │ │ │ │ +Dune::QuadratureType::GaussLobatto │ │ │ │ │ +@ GaussLobatto │ │ │ │ │ +Gauss-Lobatto rules. │ │ │ │ │ +Definition: quadraturerules.hh:127 │ │ │ │ │ +Dune::QuadratureType::GaussRadauLeft │ │ │ │ │ +@ GaussRadauLeft │ │ │ │ │ +Gauss-Radau rules including the left endpoint. │ │ │ │ │ +Definition: quadraturerules.hh:135 │ │ │ │ │ +Dune::QuadratureType::GaussLegendre │ │ │ │ │ +@ GaussLegendre │ │ │ │ │ +Gauss-Legendre rules (default) │ │ │ │ │ +Definition: quadraturerules.hh:92 │ │ │ │ │ +Dune::QuadratureOrderOutOfRange │ │ │ │ │ +Exception thrown if a desired QuadratureRule is not available, because the │ │ │ │ │ +requested order is to high... │ │ │ │ │ +Definition: quadraturerules.hh:36 │ │ │ │ │ +Dune::QuadraturePoint │ │ │ │ │ +Single evaluation point in a quadrature rule. │ │ │ │ │ +Definition: quadraturerules.hh:44 │ │ │ │ │ +Dune::QuadraturePoint::position │ │ │ │ │ +const Vector & position() const │ │ │ │ │ +return local coordinates of integration point i │ │ │ │ │ +Definition: quadraturerules.hh:62 │ │ │ │ │ +Dune::QuadraturePoint::Vector │ │ │ │ │ +Dune::FieldVector< ct, dim > Vector │ │ │ │ │ +Type used for the position of a quadrature point. │ │ │ │ │ +Definition: quadraturerules.hh:53 │ │ │ │ │ +Dune::QuadraturePoint::Field │ │ │ │ │ +ct Field │ │ │ │ │ +Number type used for coordinates and quadrature weights. │ │ │ │ │ +Definition: quadraturerules.hh:50 │ │ │ │ │ +Dune::QuadraturePoint::weight │ │ │ │ │ +const ct & weight() const │ │ │ │ │ +return weight associated with integration point i │ │ │ │ │ +Definition: quadraturerules.hh:68 │ │ │ │ │ +Dune::QuadraturePoint::weight_ │ │ │ │ │ +ct weight_ │ │ │ │ │ +Definition: quadraturerules.hh:75 │ │ │ │ │ +Dune::QuadraturePoint::dimension │ │ │ │ │ static constexpr int dimension │ │ │ │ │ -The dimension of the contained reference elements. │ │ │ │ │ -Definition: referenceelements.hh:179 │ │ │ │ │ -Dune::Geo::ReferenceElements::CoordinateField │ │ │ │ │ -ctype CoordinateField │ │ │ │ │ -The coordinate field type of the contained reference elements. │ │ │ │ │ -Definition: referenceelements.hh:176 │ │ │ │ │ -Dune::Dim │ │ │ │ │ -Static tag representing a dimension. │ │ │ │ │ -Definition: dimension.hh:16 │ │ │ │ │ +Dimension of the integration domain. │ │ │ │ │ +Definition: quadraturerules.hh:47 │ │ │ │ │ +Dune::QuadraturePoint::QuadraturePoint │ │ │ │ │ +QuadraturePoint(const Vector &x, ct w) │ │ │ │ │ +set up quadrature of given order in d dimensions │ │ │ │ │ +Definition: quadraturerules.hh:56 │ │ │ │ │ +Dune::QuadraturePoint::local │ │ │ │ │ +FieldVector< ct, dim > local │ │ │ │ │ +Definition: quadraturerules.hh:74 │ │ │ │ │ +Dune::QuadratureRule │ │ │ │ │ +Abstract base class for quadrature rules. │ │ │ │ │ +Definition: quadraturerules.hh:154 │ │ │ │ │ +Dune::QuadratureRule::~QuadratureRule │ │ │ │ │ +virtual ~QuadratureRule() │ │ │ │ │ +Definition: quadraturerules.hh:181 │ │ │ │ │ +Dune::QuadratureRule::d │ │ │ │ │ +static constexpr int d │ │ │ │ │ +The space dimension. │ │ │ │ │ +Definition: quadraturerules.hh:171 │ │ │ │ │ +Dune::QuadratureRule::type │ │ │ │ │ +virtual GeometryType type() const │ │ │ │ │ +return type of element │ │ │ │ │ +Definition: quadraturerules.hh:180 │ │ │ │ │ +Dune::QuadratureRule::delivered_order │ │ │ │ │ +int delivered_order │ │ │ │ │ +Definition: quadraturerules.hh:189 │ │ │ │ │ +Dune::QuadratureRule::QuadratureRule │ │ │ │ │ +QuadratureRule(GeometryType t, int order) │ │ │ │ │ +Constructor for a given geometry type and a given quadrature order. │ │ │ │ │ +Definition: quadraturerules.hh:168 │ │ │ │ │ +Dune::QuadratureRule::geometry_type │ │ │ │ │ +GeometryType geometry_type │ │ │ │ │ +Definition: quadraturerules.hh:188 │ │ │ │ │ +Dune::QuadratureRule::CoordType │ │ │ │ │ +ct CoordType │ │ │ │ │ +The type used for coordinates. │ │ │ │ │ +Definition: quadraturerules.hh:174 │ │ │ │ │ +Dune::QuadratureRule::QuadratureRule │ │ │ │ │ +QuadratureRule() │ │ │ │ │ +Default constructor. │ │ │ │ │ +Definition: quadraturerules.hh:161 │ │ │ │ │ +Dune::QuadratureRule::order │ │ │ │ │ +virtual int order() const │ │ │ │ │ +return order │ │ │ │ │ +Definition: quadraturerules.hh:177 │ │ │ │ │ +Dune::QuadratureRule::QuadratureRule │ │ │ │ │ +QuadratureRule(GeometryType t) │ │ │ │ │ +Constructor for a given geometry type. Leaves the quadrature order invalid │ │ │ │ │ +Definition: quadraturerules.hh:165 │ │ │ │ │ +Dune::QuadratureRule::iterator │ │ │ │ │ +std::vector< QuadraturePoint< ct, dim > >::const_iterator iterator │ │ │ │ │ +Definition: quadraturerules.hh:185 │ │ │ │ │ +Dune::QuadratureRuleFactory │ │ │ │ │ +Factory class for creation of quadrature rules, depending on GeometryType, │ │ │ │ │ +order and QuadratureType. │ │ │ │ │ +Definition: quadraturerules.hh:310 │ │ │ │ │ +Dune::QuadratureRules │ │ │ │ │ +A container for all quadrature rules of dimension dim │ │ │ │ │ +Definition: quadraturerules.hh:200 │ │ │ │ │ +Dune::QuadratureRules::maxOrder │ │ │ │ │ +static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum │ │ │ │ │ +qt=QuadratureType::GaussLegendre) │ │ │ │ │ +maximum quadrature order for given geometry type and quadrature type │ │ │ │ │ +Definition: quadraturerules.hh:259 │ │ │ │ │ +Dune::QuadratureRules::rule │ │ │ │ │ +static const QuadratureRule & rule(const GeometryType::BasicType t, int p, │ │ │ │ │ +QuadratureType::Enum qt=QuadratureType::GaussLegendre) │ │ │ │ │ +select the appropriate QuadratureRule for GeometryType t and order p │ │ │ │ │ +Definition: quadraturerules.hh:272 │ │ │ │ │ +Dune::QuadratureRules::rule │ │ │ │ │ +static const QuadratureRule & rule(const GeometryType &t, int p, │ │ │ │ │ +QuadratureType::Enum qt=QuadratureType::GaussLegendre) │ │ │ │ │ +select the appropriate QuadratureRule for GeometryType t and order p │ │ │ │ │ +Definition: quadraturerules.hh:266 │ │ │ │ │ Dune::GeometryType │ │ │ │ │ Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ Definition: type.hh:125 │ │ │ │ │ +Dune::GeometryType::isPrism │ │ │ │ │ +constexpr bool isPrism() const │ │ │ │ │ +Return true if entity is a prism. │ │ │ │ │ +Definition: type.hh:320 │ │ │ │ │ +Dune::GeometryType::isVertex │ │ │ │ │ +constexpr bool isVertex() const │ │ │ │ │ +Return true if entity is a vertex. │ │ │ │ │ +Definition: type.hh:290 │ │ │ │ │ +Dune::GeometryType::dim │ │ │ │ │ +constexpr unsigned int dim() const │ │ │ │ │ +Return dimension of the type. │ │ │ │ │ +Definition: type.hh:371 │ │ │ │ │ +Dune::GeometryType::BasicType │ │ │ │ │ +BasicType │ │ │ │ │ +Each entity can be tagged by one of these basic types plus its space dimension. │ │ │ │ │ +Definition: type.hh:131 │ │ │ │ │ +Dune::GeometryType::isLine │ │ │ │ │ +constexpr bool isLine() const │ │ │ │ │ +Return true if entity is a line segment. │ │ │ │ │ +Definition: type.hh:295 │ │ │ │ │ Dune::GeometryType::id │ │ │ │ │ constexpr unsigned int id() const │ │ │ │ │ Return the topology id of the type. │ │ │ │ │ Definition: type.hh:376 │ │ │ │ │ +Dune::GeometryType::isSimplex │ │ │ │ │ +constexpr bool isSimplex() const │ │ │ │ │ +Return true if entity is a simplex of any dimension. │ │ │ │ │ +Definition: type.hh:330 │ │ │ │ │ +Dune::LocalGeometryTypeIndex::size │ │ │ │ │ +static constexpr std::size_t size(std::size_t dim) │ │ │ │ │ +Compute total number of geometry types for the given dimension. │ │ │ │ │ +Definition: typeindex.hh:61 │ │ │ │ │ +Dune::LocalGeometryTypeIndex::index │ │ │ │ │ +static constexpr std::size_t index(const GeometryType >) │ │ │ │ │ +Compute the index for the given geometry type within its dimension. │ │ │ │ │ +Definition: typeindex.hh:73 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00185.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: referenceelement.hh File Reference │ │ │ │ +dune-geometry: affinegeometry.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,37 +65,43 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
referenceelement.hh File Reference
│ │ │ │ +
affinegeometry.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <dune/geometry/type.hh>
│ │ │ │ + │ │ │ │ +

An implementation of the Geometry interface for affine geometries. │ │ │ │ +More...

│ │ │ │ +
#include <cmath>
│ │ │ │ +#include <dune/common/fmatrix.hh>
│ │ │ │ +#include <dune/common/fvector.hh>
│ │ │ │ +#include <dune/geometry/type.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Classes

class  Dune::Geo::ReferenceElement< Implementation >
 This class provides access to geometric and topological properties of a reference element. More...
 
struct  Dune::Geo::ReferenceElement< Implementation >::Codim< codim >
 Collection of types depending on the codimension. More...
class  Dune::AffineGeometry< ct, mydim, cdim >
 Implementation of the Geometry interface for affine geometries. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Geo
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

An implementation of the Geometry interface for affine geometries.

│ │ │ │ +
Author
Martin Nolte
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,26 +5,30 @@ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ Classes | Namespaces │ │ │ │ │ -referenceelement.hh File Reference │ │ │ │ │ +affinegeometry.hh File Reference │ │ │ │ │ +An implementation of the Geometry interface for affine geometries. More... │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ - class  Dune::Geo::ReferenceElement<_Implementation_> │ │ │ │ │ -  This class provides access to geometric and topological properties of │ │ │ │ │ - a reference element. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Geo::ReferenceElement<_Implementation_>::Codim<_codim_> │ │ │ │ │ -  Collection of types depending on the codimension. More... │ │ │ │ │ +class  Dune::AffineGeometry<_ct,_mydim,_cdim_> │ │ │ │ │ +  Implementation of the Geometry interface for affine geometries. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ namespace  Dune::Geo │ │ │ │ │   │ │ │ │ │ +***** Detailed Description ***** │ │ │ │ │ +An implementation of the Geometry interface for affine geometries. │ │ │ │ │ + Author │ │ │ │ │ + Martin Nolte │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00185_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: referenceelement.hh Source File │ │ │ │ +dune-geometry: affinegeometry.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,224 +62,654 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
referenceelement.hh
│ │ │ │ +
affinegeometry.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
2// vi: set et ts=4 sw=2 sts=2:
│ │ │ │
3// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
5#ifndef DUNE_GEOMETRY_REFERENCEELEMENT_HH
│ │ │ │ -
6#define DUNE_GEOMETRY_REFERENCEELEMENT_HH
│ │ │ │ +
5#ifndef DUNE_GEOMETRY_AFFINEGEOMETRY_HH
│ │ │ │ +
6#define DUNE_GEOMETRY_AFFINEGEOMETRY_HH
│ │ │ │
7
│ │ │ │ - │ │ │ │ -
9
│ │ │ │ -
10namespace Dune {
│ │ │ │ -
11 namespace Geo {
│ │ │ │ -
12
│ │ │ │ -
13 namespace Impl {
│ │ │ │ +
13#include <cmath>
│ │ │ │
14
│ │ │ │ -
15 // forward declaration for friend declaration
│ │ │ │ -
16 template<typename ctype, int dim>
│ │ │ │ -
17 class ReferenceElementContainer;
│ │ │ │ -
18
│ │ │ │ -
19 }
│ │ │ │ -
20
│ │ │ │ -
21 // forward declaration for constructing default reference element type
│ │ │ │ -
22 template<typename ctype, int dim>
│ │ │ │ -
23 class ReferenceElementImplementation;
│ │ │ │ -
24
│ │ │ │ -
25 // forward declaration for backwards compatibility conversion
│ │ │ │ -
26 template<typename ctype, int dim>
│ │ │ │ -
27 struct ReferenceElements;
│ │ │ │ +
15#include <dune/common/fmatrix.hh>
│ │ │ │ +
16#include <dune/common/fvector.hh>
│ │ │ │ +
17
│ │ │ │ +
18#include <dune/geometry/type.hh>
│ │ │ │ +
19
│ │ │ │ +
20namespace Dune
│ │ │ │ +
21{
│ │ │ │ +
22
│ │ │ │ +
23 // External Forward Declarations
│ │ │ │ +
24 // -----------------------------
│ │ │ │ +
25
│ │ │ │ +
26 namespace Geo
│ │ │ │ +
27 {
│ │ │ │
28
│ │ │ │ -
29 // ReferenceElement
│ │ │ │ -
30 // ----------------
│ │ │ │ +
29 template< typename Implementation >
│ │ │ │ +
30 class ReferenceElement;
│ │ │ │
31
│ │ │ │ -
50 template<typename Implementation>
│ │ │ │ - │ │ │ │ -
52 {
│ │ │ │ -
53
│ │ │ │ -
54 public:
│ │ │ │ -
55
│ │ │ │ -
56#ifndef DOXYGEN
│ │ │ │ -
57
│ │ │ │ -
59 template<int codim>
│ │ │ │ -
60 using Codim = typename Implementation::template Codim<codim>;
│ │ │ │ -
61
│ │ │ │ -
62#else
│ │ │ │ -
63
│ │ │ │ -
65 template< int codim >
│ │ │ │ -
66 struct Codim
│ │ │ │ -
67 {
│ │ │ │ -
69 using Geometry = implementation-defined;
│ │ │ │ -
70 };
│ │ │ │ -
71
│ │ │ │ -
72#endif // DOXYGEN
│ │ │ │ +
32 template< class ctype, int dim >
│ │ │ │ + │ │ │ │ +
34
│ │ │ │ +
35 template< class ctype, int dim >
│ │ │ │ +
36 struct ReferenceElements;
│ │ │ │ +
37
│ │ │ │ +
38 }
│ │ │ │ +
39
│ │ │ │ +
40
│ │ │ │ +
41 namespace Impl
│ │ │ │ +
42 {
│ │ │ │ +
43
│ │ │ │ +
44 // FieldMatrixHelper
│ │ │ │ +
45 // -----------------
│ │ │ │ +
46
│ │ │ │ +
47 template< class ct >
│ │ │ │ +
48 struct FieldMatrixHelper
│ │ │ │ +
49 {
│ │ │ │ +
50 typedef ct ctype;
│ │ │ │ +
51
│ │ │ │ +
52 template< int m, int n >
│ │ │ │ +
53 static void Ax ( const FieldMatrix< ctype, m, n > &A, const FieldVector< ctype, n > &x, FieldVector< ctype, m > &ret )
│ │ │ │ +
54 {
│ │ │ │ +
55 for( int i = 0; i < m; ++i )
│ │ │ │ +
56 {
│ │ │ │ +
57 ret[ i ] = ctype( 0 );
│ │ │ │ +
58 for( int j = 0; j < n; ++j )
│ │ │ │ +
59 ret[ i ] += A[ i ][ j ] * x[ j ];
│ │ │ │ +
60 }
│ │ │ │ +
61 }
│ │ │ │ +
62
│ │ │ │ +
63 template< int m, int n >
│ │ │ │ +
64 static void ATx ( const FieldMatrix< ctype, m, n > &A, const FieldVector< ctype, m > &x, FieldVector< ctype, n > &ret )
│ │ │ │ +
65 {
│ │ │ │ +
66 for( int i = 0; i < n; ++i )
│ │ │ │ +
67 {
│ │ │ │ +
68 ret[ i ] = ctype( 0 );
│ │ │ │ +
69 for( int j = 0; j < m; ++j )
│ │ │ │ +
70 ret[ i ] += A[ j ][ i ] * x[ j ];
│ │ │ │ +
71 }
│ │ │ │ +
72 }
│ │ │ │
73
│ │ │ │ -
75 using ctype = typename Implementation::ctype;
│ │ │ │ -
76
│ │ │ │ - │ │ │ │ -
79
│ │ │ │ -
81 using Coordinate = typename Implementation::Coordinate;
│ │ │ │ -
82
│ │ │ │ -
84 typedef ctype Volume;
│ │ │ │ -
85
│ │ │ │ -
87 static constexpr int dimension = Implementation::dimension;
│ │ │ │ -
88
│ │ │ │ -
89
│ │ │ │ -
94 int size(int c) const
│ │ │ │ -
95 {
│ │ │ │ -
96 return _impl->size(c);
│ │ │ │ -
97 }
│ │ │ │ -
98
│ │ │ │ -
99
│ │ │ │ -
111 int size(int i, int c, int cc) const
│ │ │ │ -
112 {
│ │ │ │ -
113 return _impl->size(i,c,cc);
│ │ │ │ +
74 template< int m, int n, int p >
│ │ │ │ +
75 static void AB ( const FieldMatrix< ctype, m, n > &A, const FieldMatrix< ctype, n, p > &B, FieldMatrix< ctype, m, p > &ret )
│ │ │ │ +
76 {
│ │ │ │ +
77 for( int i = 0; i < m; ++i )
│ │ │ │ +
78 {
│ │ │ │ +
79 for( int j = 0; j < p; ++j )
│ │ │ │ +
80 {
│ │ │ │ +
81 ret[ i ][ j ] = ctype( 0 );
│ │ │ │ +
82 for( int k = 0; k < n; ++k )
│ │ │ │ +
83 ret[ i ][ j ] += A[ i ][ k ] * B[ k ][ j ];
│ │ │ │ +
84 }
│ │ │ │ +
85 }
│ │ │ │ +
86 }
│ │ │ │ +
87
│ │ │ │ +
88 template< int m, int n, int p >
│ │ │ │ +
89 static void ATBT ( const FieldMatrix< ctype, m, n > &A, const FieldMatrix< ctype, p, m > &B, FieldMatrix< ctype, n, p > &ret )
│ │ │ │ +
90 {
│ │ │ │ +
91 for( int i = 0; i < n; ++i )
│ │ │ │ +
92 {
│ │ │ │ +
93 for( int j = 0; j < p; ++j )
│ │ │ │ +
94 {
│ │ │ │ +
95 ret[ i ][ j ] = ctype( 0 );
│ │ │ │ +
96 for( int k = 0; k < m; ++k )
│ │ │ │ +
97 ret[ i ][ j ] += A[ k ][ i ] * B[ j ][ k ];
│ │ │ │ +
98 }
│ │ │ │ +
99 }
│ │ │ │ +
100 }
│ │ │ │ +
101
│ │ │ │ +
102 template< int m, int n >
│ │ │ │ +
103 static void ATA_L ( const FieldMatrix< ctype, m, n > &A, FieldMatrix< ctype, n, n > &ret )
│ │ │ │ +
104 {
│ │ │ │ +
105 for( int i = 0; i < n; ++i )
│ │ │ │ +
106 {
│ │ │ │ +
107 for( int j = 0; j <= i; ++j )
│ │ │ │ +
108 {
│ │ │ │ +
109 ret[ i ][ j ] = ctype( 0 );
│ │ │ │ +
110 for( int k = 0; k < m; ++k )
│ │ │ │ +
111 ret[ i ][ j ] += A[ k ][ i ] * A[ k ][ j ];
│ │ │ │ +
112 }
│ │ │ │ +
113 }
│ │ │ │
114 }
│ │ │ │
115
│ │ │ │ -
116
│ │ │ │ -
130 int subEntity(int i, int c, int ii, int cc) const
│ │ │ │ -
131 {
│ │ │ │ -
132 return _impl->subEntity(i,c,ii,cc);
│ │ │ │ +
116 template< int m, int n >
│ │ │ │ +
117 static void ATA ( const FieldMatrix< ctype, m, n > &A, FieldMatrix< ctype, n, n > &ret )
│ │ │ │ +
118 {
│ │ │ │ +
119 for( int i = 0; i < n; ++i )
│ │ │ │ +
120 {
│ │ │ │ +
121 for( int j = 0; j <= i; ++j )
│ │ │ │ +
122 {
│ │ │ │ +
123 ret[ i ][ j ] = ctype( 0 );
│ │ │ │ +
124 for( int k = 0; k < m; ++k )
│ │ │ │ +
125 ret[ i ][ j ] += A[ k ][ i ] * A[ k ][ j ];
│ │ │ │ +
126 ret[ j ][ i ] = ret[ i ][ j ];
│ │ │ │ +
127 }
│ │ │ │ +
128
│ │ │ │ +
129 ret[ i ][ i ] = ctype( 0 );
│ │ │ │ +
130 for( int k = 0; k < m; ++k )
│ │ │ │ +
131 ret[ i ][ i ] += A[ k ][ i ] * A[ k ][ i ];
│ │ │ │ +
132 }
│ │ │ │
133 }
│ │ │ │
134
│ │ │ │ -
153 auto subEntities ( int i, int c, int cc ) const
│ │ │ │ -
154 {
│ │ │ │ -
155 return _impl->subEntities(i,c,cc);
│ │ │ │ +
135 template< int m, int n >
│ │ │ │ +
136 static void AAT_L ( const FieldMatrix< ctype, m, n > &A, FieldMatrix< ctype, m, m > &ret )
│ │ │ │ +
137 {
│ │ │ │ +
138 /*
│ │ │ │ +
139 if (m==2) {
│ │ │ │ +
140 ret[0][0] = A[0]*A[0];
│ │ │ │ +
141 ret[1][1] = A[1]*A[1];
│ │ │ │ +
142 ret[1][0] = A[0]*A[1];
│ │ │ │ +
143 }
│ │ │ │ +
144 else
│ │ │ │ +
145 */
│ │ │ │ +
146 for( int i = 0; i < m; ++i )
│ │ │ │ +
147 {
│ │ │ │ +
148 for( int j = 0; j <= i; ++j )
│ │ │ │ +
149 {
│ │ │ │ +
150 ctype &retij = ret[ i ][ j ];
│ │ │ │ +
151 retij = A[ i ][ 0 ] * A[ j ][ 0 ];
│ │ │ │ +
152 for( int k = 1; k < n; ++k )
│ │ │ │ +
153 retij += A[ i ][ k ] * A[ j ][ k ];
│ │ │ │ +
154 }
│ │ │ │ +
155 }
│ │ │ │
156 }
│ │ │ │
157
│ │ │ │ -
158
│ │ │ │ -
171 decltype(auto) type(int i, int c) const
│ │ │ │ -
172 {
│ │ │ │ -
173 return _impl->type(i,c);
│ │ │ │ +
158 template< int m, int n >
│ │ │ │ +
159 static void AAT ( const FieldMatrix< ctype, m, n > &A, FieldMatrix< ctype, m, m > &ret )
│ │ │ │ +
160 {
│ │ │ │ +
161 for( int i = 0; i < m; ++i )
│ │ │ │ +
162 {
│ │ │ │ +
163 for( int j = 0; j < i; ++j )
│ │ │ │ +
164 {
│ │ │ │ +
165 ret[ i ][ j ] = ctype( 0 );
│ │ │ │ +
166 for( int k = 0; k < n; ++k )
│ │ │ │ +
167 ret[ i ][ j ] += A[ i ][ k ] * A[ j ][ k ];
│ │ │ │ +
168 ret[ j ][ i ] = ret[ i ][ j ];
│ │ │ │ +
169 }
│ │ │ │ +
170 ret[ i ][ i ] = ctype( 0 );
│ │ │ │ +
171 for( int k = 0; k < n; ++k )
│ │ │ │ +
172 ret[ i ][ i ] += A[ i ][ k ] * A[ i ][ k ];
│ │ │ │ +
173 }
│ │ │ │
174 }
│ │ │ │
175
│ │ │ │ -
176
│ │ │ │ -
184 decltype(auto) type() const
│ │ │ │ -
185 {
│ │ │ │ -
186 return _impl->type();
│ │ │ │ -
187 }
│ │ │ │ -
188
│ │ │ │ -
189
│ │ │ │ -
203 decltype(auto) position(int i, int c) const
│ │ │ │ -
204 {
│ │ │ │ -
205 return _impl->position(i,c);
│ │ │ │ -
206 }
│ │ │ │ -
207
│ │ │ │ -
208
│ │ │ │ -
216 bool checkInside(const Coordinate& local) const
│ │ │ │ -
217 {
│ │ │ │ -
218 return _impl->checkInside(local);
│ │ │ │ -
219 }
│ │ │ │ -
220
│ │ │ │ -
221
│ │ │ │ -
233 template<int codim>
│ │ │ │ -
234 typename Codim<codim>::Geometry geometry(int i) const
│ │ │ │ -
235 {
│ │ │ │ -
236 return _impl->template geometry<codim>(i);
│ │ │ │ -
237 }
│ │ │ │ -
238
│ │ │ │ -
239
│ │ │ │ - │ │ │ │ -
242 {
│ │ │ │ -
243 return _impl->volume();
│ │ │ │ -
244 }
│ │ │ │ +
176 template< int n >
│ │ │ │ +
177 static void Lx ( const FieldMatrix< ctype, n, n > &L, const FieldVector< ctype, n > &x, FieldVector< ctype, n > &ret )
│ │ │ │ +
178 {
│ │ │ │ +
179 for( int i = 0; i < n; ++i )
│ │ │ │ +
180 {
│ │ │ │ +
181 ret[ i ] = ctype( 0 );
│ │ │ │ +
182 for( int j = 0; j <= i; ++j )
│ │ │ │ +
183 ret[ i ] += L[ i ][ j ] * x[ j ];
│ │ │ │ +
184 }
│ │ │ │ +
185 }
│ │ │ │ +
186
│ │ │ │ +
187 template< int n >
│ │ │ │ +
188 static void LTx ( const FieldMatrix< ctype, n, n > &L, const FieldVector< ctype, n > &x, FieldVector< ctype, n > &ret )
│ │ │ │ +
189 {
│ │ │ │ +
190 for( int i = 0; i < n; ++i )
│ │ │ │ +
191 {
│ │ │ │ +
192 ret[ i ] = ctype( 0 );
│ │ │ │ +
193 for( int j = i; j < n; ++j )
│ │ │ │ +
194 ret[ i ] += L[ j ][ i ] * x[ j ];
│ │ │ │ +
195 }
│ │ │ │ +
196 }
│ │ │ │ +
197
│ │ │ │ +
198 template< int n >
│ │ │ │ +
199 static void LTL ( const FieldMatrix< ctype, n, n > &L, FieldMatrix< ctype, n, n > &ret )
│ │ │ │ +
200 {
│ │ │ │ +
201 for( int i = 0; i < n; ++i )
│ │ │ │ +
202 {
│ │ │ │ +
203 for( int j = 0; j < i; ++j )
│ │ │ │ +
204 {
│ │ │ │ +
205 ret[ i ][ j ] = ctype( 0 );
│ │ │ │ +
206 for( int k = i; k < n; ++k )
│ │ │ │ +
207 ret[ i ][ j ] += L[ k ][ i ] * L[ k ][ j ];
│ │ │ │ +
208 ret[ j ][ i ] = ret[ i ][ j ];
│ │ │ │ +
209 }
│ │ │ │ +
210 ret[ i ][ i ] = ctype( 0 );
│ │ │ │ +
211 for( int k = i; k < n; ++k )
│ │ │ │ +
212 ret[ i ][ i ] += L[ k ][ i ] * L[ k ][ i ];
│ │ │ │ +
213 }
│ │ │ │ +
214 }
│ │ │ │ +
215
│ │ │ │ +
216 template< int n >
│ │ │ │ +
217 static void LLT ( const FieldMatrix< ctype, n, n > &L, FieldMatrix< ctype, n, n > &ret )
│ │ │ │ +
218 {
│ │ │ │ +
219 for( int i = 0; i < n; ++i )
│ │ │ │ +
220 {
│ │ │ │ +
221 for( int j = 0; j < i; ++j )
│ │ │ │ +
222 {
│ │ │ │ +
223 ret[ i ][ j ] = ctype( 0 );
│ │ │ │ +
224 for( int k = 0; k <= j; ++k )
│ │ │ │ +
225 ret[ i ][ j ] += L[ i ][ k ] * L[ j ][ k ];
│ │ │ │ +
226 ret[ j ][ i ] = ret[ i ][ j ];
│ │ │ │ +
227 }
│ │ │ │ +
228 ret[ i ][ i ] = ctype( 0 );
│ │ │ │ +
229 for( int k = 0; k <= i; ++k )
│ │ │ │ +
230 ret[ i ][ i ] += L[ i ][ k ] * L[ i ][ k ];
│ │ │ │ +
231 }
│ │ │ │ +
232 }
│ │ │ │ +
233
│ │ │ │ +
234 template< int n >
│ │ │ │ +
235 static bool cholesky_L ( const FieldMatrix< ctype, n, n > &A, FieldMatrix< ctype, n, n > &ret, const bool checkSingular = false )
│ │ │ │ +
236 {
│ │ │ │ +
237 using std::sqrt;
│ │ │ │ +
238 for( int i = 0; i < n; ++i )
│ │ │ │ +
239 {
│ │ │ │ +
240 ctype &rii = ret[ i ][ i ];
│ │ │ │ +
241
│ │ │ │ +
242 ctype xDiag = A[ i ][ i ];
│ │ │ │ +
243 for( int j = 0; j < i; ++j )
│ │ │ │ +
244 xDiag -= ret[ i ][ j ] * ret[ i ][ j ];
│ │ │ │
245
│ │ │ │ -
246
│ │ │ │ -
258 decltype(auto) integrationOuterNormal(int face) const
│ │ │ │ -
259 {
│ │ │ │ -
260 return _impl->integrationOuterNormal(face);
│ │ │ │ -
261 }
│ │ │ │ -
262
│ │ │ │ -
263
│ │ │ │ - │ │ │ │ -
272 : _impl(nullptr)
│ │ │ │ -
273 {}
│ │ │ │ -
274
│ │ │ │ -
280 const Implementation& impl() const
│ │ │ │ -
281 {
│ │ │ │ -
282 return *_impl;
│ │ │ │ -
283 }
│ │ │ │ -
284
│ │ │ │ -
286 bool operator==(const ReferenceElement& r) const
│ │ │ │ -
287 {
│ │ │ │ -
288 return _impl == r._impl;
│ │ │ │ -
289 }
│ │ │ │ -
290
│ │ │ │ -
292 bool operator!=(const ReferenceElement& r) const
│ │ │ │ -
293 {
│ │ │ │ -
294 return not (*this == r);
│ │ │ │ -
295 }
│ │ │ │ -
296
│ │ │ │ -
298 friend std::size_t hash_value(const ReferenceElement& r)
│ │ │ │ -
299 {
│ │ │ │ -
300 return reinterpret_cast<std::size_t>(r._impl);
│ │ │ │ -
301 }
│ │ │ │ -
302
│ │ │ │ -
303 private:
│ │ │ │ -
304
│ │ │ │ -
305 // The implementation must be a friend to construct a wrapper around itself.
│ │ │ │ -
306 friend Implementation;
│ │ │ │ -
307
│ │ │ │ -
308 // The reference container is a friend to be able to call setImplementation.
│ │ │ │ -
309 friend class Impl::ReferenceElementContainer<ctype,dimension>;
│ │ │ │ +
246 // in some cases A can be singular, e.g. when checking local for
│ │ │ │ +
247 // outside points during checkInside
│ │ │ │ +
248 if( checkSingular && ! ( xDiag > ctype( 0 )) )
│ │ │ │ +
249 return false ;
│ │ │ │ +
250
│ │ │ │ +
251 // otherwise this should be true always
│ │ │ │ +
252 assert( xDiag > ctype( 0 ) );
│ │ │ │ +
253 rii = sqrt( xDiag );
│ │ │ │ +
254
│ │ │ │ +
255 ctype invrii = ctype( 1 ) / rii;
│ │ │ │ +
256 for( int k = i+1; k < n; ++k )
│ │ │ │ +
257 {
│ │ │ │ +
258 ctype x = A[ k ][ i ];
│ │ │ │ +
259 for( int j = 0; j < i; ++j )
│ │ │ │ +
260 x -= ret[ i ][ j ] * ret[ k ][ j ];
│ │ │ │ +
261 ret[ k ][ i ] = invrii * x;
│ │ │ │ +
262 }
│ │ │ │ +
263 }
│ │ │ │ +
264
│ │ │ │ +
265 // return true for meaning A is non-singular
│ │ │ │ +
266 return true;
│ │ │ │ +
267 }
│ │ │ │ +
268
│ │ │ │ +
269 template< int n >
│ │ │ │ +
270 static ctype detL ( const FieldMatrix< ctype, n, n > &L )
│ │ │ │ +
271 {
│ │ │ │ +
272 ctype det( 1 );
│ │ │ │ +
273 for( int i = 0; i < n; ++i )
│ │ │ │ +
274 det *= L[ i ][ i ];
│ │ │ │ +
275 return det;
│ │ │ │ +
276 }
│ │ │ │ +
277
│ │ │ │ +
278 template< int n >
│ │ │ │ +
279 static ctype invL ( FieldMatrix< ctype, n, n > &L )
│ │ │ │ +
280 {
│ │ │ │ +
281 ctype det( 1 );
│ │ │ │ +
282 for( int i = 0; i < n; ++i )
│ │ │ │ +
283 {
│ │ │ │ +
284 ctype &lii = L[ i ][ i ];
│ │ │ │ +
285 det *= lii;
│ │ │ │ +
286 lii = ctype( 1 ) / lii;
│ │ │ │ +
287 for( int j = 0; j < i; ++j )
│ │ │ │ +
288 {
│ │ │ │ +
289 ctype &lij = L[ i ][ j ];
│ │ │ │ +
290 ctype x = lij * L[ j ][ j ];
│ │ │ │ +
291 for( int k = j+1; k < i; ++k )
│ │ │ │ +
292 x += L[ i ][ k ] * L[ k ][ j ];
│ │ │ │ +
293 lij = (-lii) * x;
│ │ │ │ +
294 }
│ │ │ │ +
295 }
│ │ │ │ +
296 return det;
│ │ │ │ +
297 }
│ │ │ │ +
298
│ │ │ │ +
299 // calculates x := L^{-1} x
│ │ │ │ +
300 template< int n >
│ │ │ │ +
301 static void invLx ( FieldMatrix< ctype, n, n > &L, FieldVector< ctype, n > &x )
│ │ │ │ +
302 {
│ │ │ │ +
303 for( int i = 0; i < n; ++i )
│ │ │ │ +
304 {
│ │ │ │ +
305 for( int j = 0; j < i; ++j )
│ │ │ │ +
306 x[ i ] -= L[ i ][ j ] * x[ j ];
│ │ │ │ +
307 x[ i ] /= L[ i ][ i ];
│ │ │ │ +
308 }
│ │ │ │ +
309 }
│ │ │ │
310
│ │ │ │ -
311 // Constructor for wrapping an implementation reference (required internally by the default implementation)
│ │ │ │ -
312 ReferenceElement(const Implementation& impl)
│ │ │ │ -
313 : _impl(&impl)
│ │ │ │ -
314 {}
│ │ │ │ -
315
│ │ │ │ -
316 void setImplementation(const Implementation& impl)
│ │ │ │ -
317 {
│ │ │ │ -
318 _impl = &impl;
│ │ │ │ -
319 }
│ │ │ │ -
320
│ │ │ │ -
321 const Implementation* _impl;
│ │ │ │ +
311 // calculates x := L^{-T} x
│ │ │ │ +
312 template< int n >
│ │ │ │ +
313 static void invLTx ( FieldMatrix< ctype, n, n > &L, FieldVector< ctype, n > &x )
│ │ │ │ +
314 {
│ │ │ │ +
315 for( int i = n; i > 0; --i )
│ │ │ │ +
316 {
│ │ │ │ +
317 for( int j = i; j < n; ++j )
│ │ │ │ +
318 x[ i-1 ] -= L[ j ][ i-1 ] * x[ j ];
│ │ │ │ +
319 x[ i-1 ] /= L[ i-1 ][ i-1 ];
│ │ │ │ +
320 }
│ │ │ │ +
321 }
│ │ │ │
322
│ │ │ │ -
323 };
│ │ │ │ -
324
│ │ │ │ -
325 }
│ │ │ │ -
326
│ │ │ │ -
327}
│ │ │ │ -
328
│ │ │ │ -
329
│ │ │ │ -
330#endif // DUNE_GEOMETRY_REFERENCEELEMENT_HH
│ │ │ │ -
A unique label for each type of element that can occur in a grid.
│ │ │ │ +
323 template< int n >
│ │ │ │ +
324 static ctype spdDetA ( const FieldMatrix< ctype, n, n > &A )
│ │ │ │ +
325 {
│ │ │ │ +
326 // return A[0][0]*A[1][1]-A[1][0]*A[1][0];
│ │ │ │ +
327 FieldMatrix< ctype, n, n > L;
│ │ │ │ +
328 cholesky_L( A, L );
│ │ │ │ +
329 return detL( L );
│ │ │ │ +
330 }
│ │ │ │ +
331
│ │ │ │ +
332 template< int n >
│ │ │ │ +
333 static ctype spdInvA ( FieldMatrix< ctype, n, n > &A )
│ │ │ │ +
334 {
│ │ │ │ +
335 FieldMatrix< ctype, n, n > L;
│ │ │ │ +
336 cholesky_L( A, L );
│ │ │ │ +
337 const ctype det = invL( L );
│ │ │ │ +
338 LTL( L, A );
│ │ │ │ +
339 return det;
│ │ │ │ +
340 }
│ │ │ │ +
341
│ │ │ │ +
342 // calculate x := A^{-1} x
│ │ │ │ +
343 template< int n >
│ │ │ │ +
344 static bool spdInvAx ( FieldMatrix< ctype, n, n > &A, FieldVector< ctype, n > &x, const bool checkSingular = false )
│ │ │ │ +
345 {
│ │ │ │ +
346 FieldMatrix< ctype, n, n > L;
│ │ │ │ +
347 const bool invertible = cholesky_L( A, L, checkSingular );
│ │ │ │ +
348 if( ! invertible ) return invertible ;
│ │ │ │ +
349 invLx( L, x );
│ │ │ │ +
350 invLTx( L, x );
│ │ │ │ +
351 return invertible;
│ │ │ │ +
352 }
│ │ │ │ +
353
│ │ │ │ +
354 template< int m, int n >
│ │ │ │ +
355 static ctype detATA ( const FieldMatrix< ctype, m, n > &A )
│ │ │ │ +
356 {
│ │ │ │ +
357 if( m >= n )
│ │ │ │ +
358 {
│ │ │ │ +
359 FieldMatrix< ctype, n, n > ata;
│ │ │ │ +
360 ATA_L( A, ata );
│ │ │ │ +
361 return spdDetA( ata );
│ │ │ │ +
362 }
│ │ │ │ +
363 else
│ │ │ │ +
364 return ctype( 0 );
│ │ │ │ +
365 }
│ │ │ │ +
366
│ │ │ │ +
372 template< int m, int n >
│ │ │ │ +
373 static ctype sqrtDetAAT ( const FieldMatrix< ctype, m, n > &A )
│ │ │ │ +
374 {
│ │ │ │ +
375 using std::abs;
│ │ │ │ +
376 using std::sqrt;
│ │ │ │ +
377 // These special cases are here not only for speed reasons:
│ │ │ │ +
378 // The general implementation aborts if the matrix is almost singular,
│ │ │ │ +
379 // and the special implementation provide a stable way to handle that case.
│ │ │ │ +
380 if( (n == 2) && (m == 2) )
│ │ │ │ +
381 {
│ │ │ │ +
382 // Special implementation for 2x2 matrices: faster and more stable
│ │ │ │ +
383 return abs( A[ 0 ][ 0 ]*A[ 1 ][ 1 ] - A[ 1 ][ 0 ]*A[ 0 ][ 1 ] );
│ │ │ │ +
384 }
│ │ │ │ +
385 else if( (n == 3) && (m == 3) )
│ │ │ │ +
386 {
│ │ │ │ +
387 // Special implementation for 3x3 matrices
│ │ │ │ +
388 const ctype v0 = A[ 0 ][ 1 ] * A[ 1 ][ 2 ] - A[ 1 ][ 1 ] * A[ 0 ][ 2 ];
│ │ │ │ +
389 const ctype v1 = A[ 0 ][ 2 ] * A[ 1 ][ 0 ] - A[ 1 ][ 2 ] * A[ 0 ][ 0 ];
│ │ │ │ +
390 const ctype v2 = A[ 0 ][ 0 ] * A[ 1 ][ 1 ] - A[ 1 ][ 0 ] * A[ 0 ][ 1 ];
│ │ │ │ +
391 return abs( v0 * A[ 2 ][ 0 ] + v1 * A[ 2 ][ 1 ] + v2 * A[ 2 ][ 2 ] );
│ │ │ │ +
392 }
│ │ │ │ +
393 else if ( (n == 3) && (m == 2) )
│ │ │ │ +
394 {
│ │ │ │ +
395 // Special implementation for 2x3 matrices
│ │ │ │ +
396 const ctype v0 = A[ 0 ][ 0 ] * A[ 1 ][ 1 ] - A[ 0 ][ 1 ] * A[ 1 ][ 0 ];
│ │ │ │ +
397 const ctype v1 = A[ 0 ][ 0 ] * A[ 1 ][ 2 ] - A[ 1 ][ 0 ] * A[ 0 ][ 2 ];
│ │ │ │ +
398 const ctype v2 = A[ 0 ][ 1 ] * A[ 1 ][ 2 ] - A[ 0 ][ 2 ] * A[ 1 ][ 1 ];
│ │ │ │ +
399 return sqrt( v0*v0 + v1*v1 + v2*v2);
│ │ │ │ +
400 }
│ │ │ │ +
401 else if( n >= m )
│ │ │ │ +
402 {
│ │ │ │ +
403 // General case
│ │ │ │ +
404 FieldMatrix< ctype, m, m > aat;
│ │ │ │ +
405 AAT_L( A, aat );
│ │ │ │ +
406 return spdDetA( aat );
│ │ │ │ +
407 }
│ │ │ │ +
408 else
│ │ │ │ +
409 return ctype( 0 );
│ │ │ │ +
410 }
│ │ │ │ +
411
│ │ │ │ +
412 // A^{-1}_L = (A^T A)^{-1} A^T
│ │ │ │ +
413 // => A^{-1}_L A = I
│ │ │ │ +
414 template< int m, int n >
│ │ │ │ +
415 static ctype leftInvA ( const FieldMatrix< ctype, m, n > &A, FieldMatrix< ctype, n, m > &ret )
│ │ │ │ +
416 {
│ │ │ │ +
417 static_assert((m >= n), "Matrix has no left inverse.");
│ │ │ │ +
418 FieldMatrix< ctype, n, n > ata;
│ │ │ │ +
419 ATA_L( A, ata );
│ │ │ │ +
420 const ctype det = spdInvA( ata );
│ │ │ │ +
421 ATBT( ata, A, ret );
│ │ │ │ +
422 return det;
│ │ │ │ +
423 }
│ │ │ │ +
424
│ │ │ │ +
425 template< int m, int n >
│ │ │ │ +
426 static void leftInvAx ( const FieldMatrix< ctype, m, n > &A, const FieldVector< ctype, m > &x, FieldVector< ctype, n > &y )
│ │ │ │ +
427 {
│ │ │ │ +
428 static_assert((m >= n), "Matrix has no left inverse.");
│ │ │ │ +
429 FieldMatrix< ctype, n, n > ata;
│ │ │ │ +
430 ATx( A, x, y );
│ │ │ │ +
431 ATA_L( A, ata );
│ │ │ │ +
432 spdInvAx( ata, y );
│ │ │ │ +
433 }
│ │ │ │ +
434
│ │ │ │ +
436 template< int m, int n >
│ │ │ │ +
437 static ctype rightInvA ( const FieldMatrix< ctype, m, n > &A, FieldMatrix< ctype, n, m > &ret )
│ │ │ │ +
438 {
│ │ │ │ +
439 static_assert((n >= m), "Matrix has no right inverse.");
│ │ │ │ +
440 using std::abs;
│ │ │ │ +
441 if( (n == 2) && (m == 2) )
│ │ │ │ +
442 {
│ │ │ │ +
443 const ctype det = (A[ 0 ][ 0 ]*A[ 1 ][ 1 ] - A[ 1 ][ 0 ]*A[ 0 ][ 1 ]);
│ │ │ │ +
444 const ctype detInv = ctype( 1 ) / det;
│ │ │ │ +
445 ret[ 0 ][ 0 ] = A[ 1 ][ 1 ] * detInv;
│ │ │ │ +
446 ret[ 1 ][ 1 ] = A[ 0 ][ 0 ] * detInv;
│ │ │ │ +
447 ret[ 1 ][ 0 ] = -A[ 1 ][ 0 ] * detInv;
│ │ │ │ +
448 ret[ 0 ][ 1 ] = -A[ 0 ][ 1 ] * detInv;
│ │ │ │ +
449 return abs( det );
│ │ │ │ +
450 }
│ │ │ │ +
451 else
│ │ │ │ +
452 {
│ │ │ │ +
453 FieldMatrix< ctype, m , m > aat;
│ │ │ │ +
454 AAT_L( A, aat );
│ │ │ │ +
455 const ctype det = spdInvA( aat );
│ │ │ │ +
456 ATBT( A , aat , ret );
│ │ │ │ +
457 return det;
│ │ │ │ +
458 }
│ │ │ │ +
459 }
│ │ │ │ +
460
│ │ │ │ +
461 template< int m, int n >
│ │ │ │ +
462 static bool xTRightInvA ( const FieldMatrix< ctype, m, n > &A, const FieldVector< ctype, n > &x, FieldVector< ctype, m > &y )
│ │ │ │ +
463 {
│ │ │ │ +
464 static_assert((n >= m), "Matrix has no right inverse.");
│ │ │ │ +
465 FieldMatrix< ctype, m, m > aat;
│ │ │ │ +
466 Ax( A, x, y );
│ │ │ │ +
467 AAT_L( A, aat );
│ │ │ │ +
468 // check whether aat is singular and return true if non-singular
│ │ │ │ +
469 return spdInvAx( aat, y, true );
│ │ │ │ +
470 }
│ │ │ │ +
471 };
│ │ │ │ +
472
│ │ │ │ +
473 } // namespace Impl
│ │ │ │ +
474
│ │ │ │ +
475
│ │ │ │ +
476
│ │ │ │ +
482 template< class ct, int mydim, int cdim>
│ │ │ │ + │ │ │ │ +
484 {
│ │ │ │ +
485 public:
│ │ │ │ +
486
│ │ │ │ +
488 typedef ct ctype;
│ │ │ │ +
489
│ │ │ │ +
491 static const int mydimension= mydim;
│ │ │ │ +
492
│ │ │ │ +
494 static const int coorddimension = cdim;
│ │ │ │ +
495
│ │ │ │ +
497 typedef FieldVector< ctype, mydimension > LocalCoordinate;
│ │ │ │ +
498
│ │ │ │ +
500 typedef FieldVector< ctype, coorddimension > GlobalCoordinate;
│ │ │ │ +
501
│ │ │ │ +
503 typedef ctype Volume;
│ │ │ │ +
504
│ │ │ │ +
506 typedef FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed;
│ │ │ │ +
507
│ │ │ │ +
509 typedef FieldMatrix< ctype, coorddimension, mydimension > JacobianInverseTransposed;
│ │ │ │ +
510
│ │ │ │ +
512 typedef FieldMatrix< ctype, coorddimension, mydimension > Jacobian;
│ │ │ │ +
513
│ │ │ │ +
515 typedef FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse;
│ │ │ │ +
516
│ │ │ │ +
517 private:
│ │ │ │ + │ │ │ │ +
520
│ │ │ │ + │ │ │ │ +
522
│ │ │ │ +
523 // Helper class to compute a matrix pseudo inverse
│ │ │ │ +
524 typedef Impl::FieldMatrixHelper< ct > MatrixHelper;
│ │ │ │ +
525
│ │ │ │ +
526 public:
│ │ │ │ +
528 AffineGeometry ( const ReferenceElement &refElement, const GlobalCoordinate &origin,
│ │ │ │ +
529 const JacobianTransposed &jt )
│ │ │ │ +
530 : refElement_(refElement), origin_(origin), jacobianTransposed_(jt)
│ │ │ │ +
531 {
│ │ │ │ +
532 integrationElement_ = MatrixHelper::template rightInvA< mydimension, coorddimension >( jacobianTransposed_, jacobianInverseTransposed_ );
│ │ │ │ +
533 }
│ │ │ │ +
534
│ │ │ │ + │ │ │ │ +
537 const JacobianTransposed &jt )
│ │ │ │ +
538 : AffineGeometry(ReferenceElements::general( gt ), origin, jt)
│ │ │ │ +
539 { }
│ │ │ │ +
540
│ │ │ │ +
542 template< class CoordVector >
│ │ │ │ +
543 AffineGeometry ( const ReferenceElement &refElement, const CoordVector &coordVector )
│ │ │ │ +
544 : refElement_(refElement), origin_(coordVector[0])
│ │ │ │ +
545 {
│ │ │ │ +
546 for( int i = 0; i < mydimension; ++i )
│ │ │ │ +
547 jacobianTransposed_[ i ] = coordVector[ i+1 ] - origin_;
│ │ │ │ +
548 integrationElement_ = MatrixHelper::template rightInvA< mydimension, coorddimension >( jacobianTransposed_, jacobianInverseTransposed_ );
│ │ │ │ +
549 }
│ │ │ │ +
550
│ │ │ │ +
552 template< class CoordVector >
│ │ │ │ +
553 AffineGeometry ( Dune::GeometryType gt, const CoordVector &coordVector )
│ │ │ │ +
554 : AffineGeometry(ReferenceElements::general( gt ), coordVector)
│ │ │ │ +
555 { }
│ │ │ │ +
556
│ │ │ │ +
558 bool affine () const { return true; }
│ │ │ │ +
559
│ │ │ │ +
561 Dune::GeometryType type () const { return refElement_.type(); }
│ │ │ │ +
562
│ │ │ │ +
564 int corners () const { return refElement_.size( mydimension ); }
│ │ │ │ +
565
│ │ │ │ +
567 GlobalCoordinate corner ( int i ) const
│ │ │ │ +
568 {
│ │ │ │ +
569 return global( refElement_.position( i, mydimension ) );
│ │ │ │ +
570 }
│ │ │ │ +
571
│ │ │ │ +
573 GlobalCoordinate center () const { return global( refElement_.position( 0, 0 ) ); }
│ │ │ │ +
574
│ │ │ │ + │ │ │ │ +
582 {
│ │ │ │ +
583 GlobalCoordinate global( origin_ );
│ │ │ │ +
584 jacobianTransposed_.umtv( local, global );
│ │ │ │ +
585 return global;
│ │ │ │ +
586 }
│ │ │ │ +
587
│ │ │ │ + │ │ │ │ +
602 {
│ │ │ │ +
603 LocalCoordinate local;
│ │ │ │ +
604 jacobianInverseTransposed_.mtv( global - origin_, local );
│ │ │ │ +
605 return local;
│ │ │ │ +
606 }
│ │ │ │ +
607
│ │ │ │ +
618 ctype integrationElement ([[maybe_unused]] const LocalCoordinate &local) const
│ │ │ │ +
619 {
│ │ │ │ +
620 return integrationElement_;
│ │ │ │ +
621 }
│ │ │ │ +
622
│ │ │ │ +
624 Volume volume () const
│ │ │ │ +
625 {
│ │ │ │ +
626 return integrationElement_ * refElement_.volume();
│ │ │ │ +
627 }
│ │ │ │ +
628
│ │ │ │ +
635 const JacobianTransposed &jacobianTransposed ([[maybe_unused]] const LocalCoordinate &local) const
│ │ │ │ +
636 {
│ │ │ │ +
637 return jacobianTransposed_;
│ │ │ │ +
638 }
│ │ │ │ +
639
│ │ │ │ +
646 const JacobianInverseTransposed &jacobianInverseTransposed ([[maybe_unused]] const LocalCoordinate &local) const
│ │ │ │ +
647 {
│ │ │ │ +
648 return jacobianInverseTransposed_;
│ │ │ │ +
649 }
│ │ │ │ +
650
│ │ │ │ +
657 Jacobian jacobian ([[maybe_unused]] const LocalCoordinate &local) const
│ │ │ │ +
658 {
│ │ │ │ +
659 return jacobianTransposed_.transposed();
│ │ │ │ +
660 }
│ │ │ │ +
661
│ │ │ │ +
668 JacobianInverse jacobianInverse ([[maybe_unused]] const LocalCoordinate &local) const
│ │ │ │ +
669 {
│ │ │ │ +
670 return jacobianInverseTransposed_.transposed();
│ │ │ │ +
671 }
│ │ │ │ +
672
│ │ │ │ + │ │ │ │ +
674 {
│ │ │ │ +
675 return geometry.refElement_;
│ │ │ │ +
676 }
│ │ │ │ +
677
│ │ │ │ +
678 private:
│ │ │ │ +
679 ReferenceElement refElement_;
│ │ │ │ +
680 GlobalCoordinate origin_;
│ │ │ │ +
681 JacobianTransposed jacobianTransposed_;
│ │ │ │ +
682 JacobianInverseTransposed jacobianInverseTransposed_;
│ │ │ │ +
683 ctype integrationElement_;
│ │ │ │ +
684 };
│ │ │ │ +
685
│ │ │ │ +
686} // namespace Dune
│ │ │ │ +
687
│ │ │ │ +
688#endif // #ifndef DUNE_GEOMETRY_AFFINEGEOMETRY_HH
│ │ │ │ +
A unique label for each type of element that can occur in a grid.
│ │ │ │ +
unspecified-type ReferenceElement
Returns the type of reference element for the argument type T.
Definition: referenceelements.hh:497
│ │ │ │
Definition: affinegeometry.hh:21
│ │ │ │
This class provides access to geometric and topological properties of a reference element.
Definition: referenceelement.hh:52
│ │ │ │
CoordinateField volume() const
obtain the volume of the reference element
Definition: referenceelement.hh:241
│ │ │ │ -
ReferenceElement()
Constructs an empty reference element.
Definition: referenceelement.hh:271
│ │ │ │ -
bool operator!=(const ReferenceElement &r) const
Compares for inequality with another reference element.
Definition: referenceelement.hh:292
│ │ │ │
decltype(auto) type(int i, int c) const
obtain the type of subentity (i,c)
Definition: referenceelement.hh:171
│ │ │ │ -
typename Implementation::Coordinate Coordinate
The coordinate type.
Definition: referenceelement.hh:81
│ │ │ │ -
Codim< codim >::Geometry geometry(int i) const
obtain the embedding of subentity (i,codim) into the reference element
Definition: referenceelement.hh:234
│ │ │ │ -
static constexpr int dimension
The dimension of the reference element.
Definition: referenceelement.hh:87
│ │ │ │ -
int size(int i, int c, int cc) const
number of subentities of codimension cc of subentity (i,c)
Definition: referenceelement.hh:111
│ │ │ │ -
int subEntity(int i, int c, int ii, int cc) const
obtain number of ii-th subentity with codim cc of (i,c)
Definition: referenceelement.hh:130
│ │ │ │ -
typename Implementation::ctype ctype
The coordinate field type.
Definition: referenceelement.hh:75
│ │ │ │
int size(int c) const
number of subentities of codimension c
Definition: referenceelement.hh:94
│ │ │ │ -
decltype(auto) type() const
obtain the type of this reference element
Definition: referenceelement.hh:184
│ │ │ │ -
const Implementation & impl() const
Returns a reference to the internal implementation object.
Definition: referenceelement.hh:280
│ │ │ │ -
bool checkInside(const Coordinate &local) const
check if a coordinate is in the reference element
Definition: referenceelement.hh:216
│ │ │ │ -
ctype CoordinateField
The coordinate field type.
Definition: referenceelement.hh:78
│ │ │ │ -
bool operator==(const ReferenceElement &r) const
Compares for equality with another reference element.
Definition: referenceelement.hh:286
│ │ │ │
decltype(auto) position(int i, int c) const
position of the barycenter of entity (i,c)
Definition: referenceelement.hh:203
│ │ │ │ -
decltype(auto) integrationOuterNormal(int face) const
obtain the integration outer normal of the reference element
Definition: referenceelement.hh:258
│ │ │ │ -
friend std::size_t hash_value(const ReferenceElement &r)
Yields a hash value suitable for storing the reference element a in hash table.
Definition: referenceelement.hh:298
│ │ │ │ -
auto subEntities(int i, int c, int cc) const
Obtain the range of numbers of subentities with codim cc of (i,c)
Definition: referenceelement.hh:153
│ │ │ │ -
ctype Volume
Type used for volume.
Definition: referenceelement.hh:84
│ │ │ │ -
Collection of types depending on the codimension.
Definition: referenceelement.hh:67
│ │ │ │ -
implementation-defined Geometry
type of geometry embedding a subentity into the reference element
Definition: referenceelement.hh:69
│ │ │ │ +
Definition: affinegeometry.hh:33
│ │ │ │ +
Class providing access to the singletons of the reference elements.
Definition: referenceelements.hh:170
│ │ │ │ +
Implementation of the Geometry interface for affine geometries.
Definition: affinegeometry.hh:484
│ │ │ │ +
AffineGeometry(const ReferenceElement &refElement, const CoordVector &coordVector)
Create affine geometry from reference element and a vector of vertex coordinates.
Definition: affinegeometry.hh:543
│ │ │ │ +
AffineGeometry(Dune::GeometryType gt, const GlobalCoordinate &origin, const JacobianTransposed &jt)
Create affine geometry from GeometryType, one vertex, and the Jacobian matrix.
Definition: affinegeometry.hh:536
│ │ │ │ +
FieldVector< ctype, mydimension > LocalCoordinate
Type for local coordinate vector.
Definition: affinegeometry.hh:497
│ │ │ │ +
Dune::GeometryType type() const
Obtain the type of the reference element.
Definition: affinegeometry.hh:561
│ │ │ │ +
static const int mydimension
Dimension of the geometry.
Definition: affinegeometry.hh:491
│ │ │ │ +
AffineGeometry(const ReferenceElement &refElement, const GlobalCoordinate &origin, const JacobianTransposed &jt)
Create affine geometry from reference element, one vertex, and the Jacobian matrix.
Definition: affinegeometry.hh:528
│ │ │ │ +
ctype Volume
Type used for volume.
Definition: affinegeometry.hh:503
│ │ │ │ +
JacobianInverse jacobianInverse(const LocalCoordinate &local) const
Obtain the Jacobian's inverse.
Definition: affinegeometry.hh:668
│ │ │ │ +
friend ReferenceElement referenceElement(const AffineGeometry &geometry)
Definition: affinegeometry.hh:673
│ │ │ │ +
AffineGeometry(Dune::GeometryType gt, const CoordVector &coordVector)
Create affine geometry from GeometryType and a vector of vertex coordinates.
Definition: affinegeometry.hh:553
│ │ │ │ +
ctype integrationElement(const LocalCoordinate &local) const
Obtain the integration element.
Definition: affinegeometry.hh:618
│ │ │ │ +
FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse
Type for the inverse Jacobian matrix.
Definition: affinegeometry.hh:515
│ │ │ │ +
FieldMatrix< ctype, coorddimension, mydimension > Jacobian
Type for the Jacobian matrix.
Definition: affinegeometry.hh:512
│ │ │ │ +
const JacobianInverseTransposed & jacobianInverseTransposed(const LocalCoordinate &local) const
Obtain the transposed of the Jacobian's inverse.
Definition: affinegeometry.hh:646
│ │ │ │ +
FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed
Type for the transposed Jacobian matrix.
Definition: affinegeometry.hh:506
│ │ │ │ +
GlobalCoordinate corner(int i) const
Obtain coordinates of the i-th corner.
Definition: affinegeometry.hh:567
│ │ │ │ +
int corners() const
Obtain number of corners of the corresponding reference element.
Definition: affinegeometry.hh:564
│ │ │ │ +
FieldMatrix< ctype, coorddimension, mydimension > JacobianInverseTransposed
Type for the transposed inverse Jacobian matrix.
Definition: affinegeometry.hh:509
│ │ │ │ +
static const int coorddimension
Dimension of the world space.
Definition: affinegeometry.hh:494
│ │ │ │ +
GlobalCoordinate global(const LocalCoordinate &local) const
Evaluate the mapping.
Definition: affinegeometry.hh:581
│ │ │ │ +
GlobalCoordinate center() const
Obtain the centroid of the mapping's image.
Definition: affinegeometry.hh:573
│ │ │ │ +
Jacobian jacobian(const LocalCoordinate &local) const
Obtain the Jacobian.
Definition: affinegeometry.hh:657
│ │ │ │ +
ct ctype
Type used for coordinates.
Definition: affinegeometry.hh:488
│ │ │ │ +
FieldVector< ctype, coorddimension > GlobalCoordinate
Type for coordinate vector in world space.
Definition: affinegeometry.hh:500
│ │ │ │ +
bool affine() const
Always true: this is an affine geometry.
Definition: affinegeometry.hh:558
│ │ │ │ +
const JacobianTransposed & jacobianTransposed(const LocalCoordinate &local) const
Obtain the transposed of the Jacobian.
Definition: affinegeometry.hh:635
│ │ │ │ +
Volume volume() const
Obtain the volume of the element.
Definition: affinegeometry.hh:624
│ │ │ │ +
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:125
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,296 +4,797 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ -referenceelement.hh │ │ │ │ │ +affinegeometry.hh │ │ │ │ │ Go_to_the_documentation_of_this_file. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ - 5#ifndef DUNE_GEOMETRY_REFERENCEELEMENT_HH │ │ │ │ │ - 6#define DUNE_GEOMETRY_REFERENCEELEMENT_HH │ │ │ │ │ + 5#ifndef DUNE_GEOMETRY_AFFINEGEOMETRY_HH │ │ │ │ │ + 6#define DUNE_GEOMETRY_AFFINEGEOMETRY_HH │ │ │ │ │ 7 │ │ │ │ │ - 8#include │ │ │ │ │ - 9 │ │ │ │ │ - 10namespace Dune { │ │ │ │ │ - 11 namespace Geo { │ │ │ │ │ - 12 │ │ │ │ │ - 13 namespace Impl { │ │ │ │ │ + 13#include │ │ │ │ │ 14 │ │ │ │ │ - 15 // forward declaration for friend declaration │ │ │ │ │ - 16 template │ │ │ │ │ - 17 class ReferenceElementContainer; │ │ │ │ │ - 18 │ │ │ │ │ - 19 } │ │ │ │ │ - 20 │ │ │ │ │ - 21 // forward declaration for constructing default reference element type │ │ │ │ │ - 22 template │ │ │ │ │ - 23 class ReferenceElementImplementation; │ │ │ │ │ - 24 │ │ │ │ │ - 25 // forward declaration for backwards compatibility conversion │ │ │ │ │ - 26 template │ │ │ │ │ - 27 struct ReferenceElements; │ │ │ │ │ + 15#include │ │ │ │ │ + 16#include │ │ │ │ │ + 17 │ │ │ │ │ + 18#include │ │ │ │ │ + 19 │ │ │ │ │ +20namespace Dune │ │ │ │ │ + 21{ │ │ │ │ │ + 22 │ │ │ │ │ + 23 // External Forward Declarations │ │ │ │ │ + 24 // ----------------------------- │ │ │ │ │ + 25 │ │ │ │ │ +26 namespace Geo │ │ │ │ │ + 27 { │ │ │ │ │ 28 │ │ │ │ │ - 29 // ReferenceElement │ │ │ │ │ - 30 // ---------------- │ │ │ │ │ + 29 template< typename Implementation > │ │ │ │ │ + 30 class ReferenceElement; │ │ │ │ │ 31 │ │ │ │ │ - 50 template │ │ │ │ │ -51 class ReferenceElement │ │ │ │ │ - 52 { │ │ │ │ │ - 53 │ │ │ │ │ - 54 public: │ │ │ │ │ - 55 │ │ │ │ │ - 56#ifndef DOXYGEN │ │ │ │ │ - 57 │ │ │ │ │ - 59 template │ │ │ │ │ - 60 using Codim = typename Implementation::template Codim; │ │ │ │ │ - 61 │ │ │ │ │ - 62#else │ │ │ │ │ - 63 │ │ │ │ │ - 65 template< int codim > │ │ │ │ │ -66 struct Codim │ │ │ │ │ + 32 template< class ctype, int dim > │ │ │ │ │ +33 class ReferenceElementImplementation; │ │ │ │ │ + 34 │ │ │ │ │ + 35 template< class ctype, int dim > │ │ │ │ │ + 36 struct ReferenceElements; │ │ │ │ │ + 37 │ │ │ │ │ + 38 } │ │ │ │ │ + 39 │ │ │ │ │ + 40 │ │ │ │ │ + 41 namespace Impl │ │ │ │ │ + 42 { │ │ │ │ │ + 43 │ │ │ │ │ + 44 // FieldMatrixHelper │ │ │ │ │ + 45 // ----------------- │ │ │ │ │ + 46 │ │ │ │ │ + 47 template< class ct > │ │ │ │ │ + 48 struct FieldMatrixHelper │ │ │ │ │ + 49 { │ │ │ │ │ + 50 typedef ct ctype; │ │ │ │ │ + 51 │ │ │ │ │ + 52 template< int m, int n > │ │ │ │ │ + 53 static void Ax ( const FieldMatrix< ctype, m, n > &A, const FieldVector< │ │ │ │ │ +ctype, n > &x, FieldVector< ctype, m > &ret ) │ │ │ │ │ + 54 { │ │ │ │ │ + 55 for( int i = 0; i < m; ++i ) │ │ │ │ │ + 56 { │ │ │ │ │ + 57 ret[ i ] = ctype( 0 ); │ │ │ │ │ + 58 for( int j = 0; j < n; ++j ) │ │ │ │ │ + 59 ret[ i ] += A[ i ][ j ] * x[ j ]; │ │ │ │ │ + 60 } │ │ │ │ │ + 61 } │ │ │ │ │ + 62 │ │ │ │ │ + 63 template< int m, int n > │ │ │ │ │ + 64 static void ATx ( const FieldMatrix< ctype, m, n > &A, const FieldVector< │ │ │ │ │ +ctype, m > &x, FieldVector< ctype, n > &ret ) │ │ │ │ │ + 65 { │ │ │ │ │ + 66 for( int i = 0; i < n; ++i ) │ │ │ │ │ 67 { │ │ │ │ │ -69 using Geometry = implementation-defined; │ │ │ │ │ - 70 }; │ │ │ │ │ - 71 │ │ │ │ │ - 72#endif // DOXYGEN │ │ │ │ │ + 68 ret[ i ] = ctype( 0 ); │ │ │ │ │ + 69 for( int j = 0; j < m; ++j ) │ │ │ │ │ + 70 ret[ i ] += A[ j ][ i ] * x[ j ]; │ │ │ │ │ + 71 } │ │ │ │ │ + 72 } │ │ │ │ │ 73 │ │ │ │ │ -75 using ctype = typename Implementation::ctype; │ │ │ │ │ - 76 │ │ │ │ │ -78 using CoordinateField = ctype; │ │ │ │ │ - 79 │ │ │ │ │ -81 using Coordinate = typename Implementation::Coordinate; │ │ │ │ │ - 82 │ │ │ │ │ -84 typedef ctype Volume; │ │ │ │ │ - 85 │ │ │ │ │ -87 static constexpr int dimension = Implementation::dimension; │ │ │ │ │ - 88 │ │ │ │ │ - 89 │ │ │ │ │ -94 int size(int c) const │ │ │ │ │ - 95 { │ │ │ │ │ - 96 return _impl->size(c); │ │ │ │ │ - 97 } │ │ │ │ │ - 98 │ │ │ │ │ - 99 │ │ │ │ │ -111 int size(int i, int c, int cc) const │ │ │ │ │ - 112 { │ │ │ │ │ - 113 return _impl->size(i,c,cc); │ │ │ │ │ + 74 template< int m, int n, int p > │ │ │ │ │ + 75 static void AB ( const FieldMatrix< ctype, m, n > &A, const FieldMatrix< │ │ │ │ │ +ctype, n, p > &B, FieldMatrix< ctype, m, p > &ret ) │ │ │ │ │ + 76 { │ │ │ │ │ + 77 for( int i = 0; i < m; ++i ) │ │ │ │ │ + 78 { │ │ │ │ │ + 79 for( int j = 0; j < p; ++j ) │ │ │ │ │ + 80 { │ │ │ │ │ + 81 ret[ i ][ j ] = ctype( 0 ); │ │ │ │ │ + 82 for( int k = 0; k < n; ++k ) │ │ │ │ │ + 83 ret[ i ][ j ] += A[ i ][ k ] * B[ k ][ j ]; │ │ │ │ │ + 84 } │ │ │ │ │ + 85 } │ │ │ │ │ + 86 } │ │ │ │ │ + 87 │ │ │ │ │ + 88 template< int m, int n, int p > │ │ │ │ │ + 89 static void ATBT ( const FieldMatrix< ctype, m, n > &A, const FieldMatrix< │ │ │ │ │ +ctype, p, m > &B, FieldMatrix< ctype, n, p > &ret ) │ │ │ │ │ + 90 { │ │ │ │ │ + 91 for( int i = 0; i < n; ++i ) │ │ │ │ │ + 92 { │ │ │ │ │ + 93 for( int j = 0; j < p; ++j ) │ │ │ │ │ + 94 { │ │ │ │ │ + 95 ret[ i ][ j ] = ctype( 0 ); │ │ │ │ │ + 96 for( int k = 0; k < m; ++k ) │ │ │ │ │ + 97 ret[ i ][ j ] += A[ k ][ i ] * B[ j ][ k ]; │ │ │ │ │ + 98 } │ │ │ │ │ + 99 } │ │ │ │ │ + 100 } │ │ │ │ │ + 101 │ │ │ │ │ + 102 template< int m, int n > │ │ │ │ │ + 103 static void ATA_L ( const FieldMatrix< ctype, m, n > &A, FieldMatrix< │ │ │ │ │ +ctype, n, n > &ret ) │ │ │ │ │ + 104 { │ │ │ │ │ + 105 for( int i = 0; i < n; ++i ) │ │ │ │ │ + 106 { │ │ │ │ │ + 107 for( int j = 0; j <= i; ++j ) │ │ │ │ │ + 108 { │ │ │ │ │ + 109 ret[ i ][ j ] = ctype( 0 ); │ │ │ │ │ + 110 for( int k = 0; k < m; ++k ) │ │ │ │ │ + 111 ret[ i ][ j ] += A[ k ][ i ] * A[ k ][ j ]; │ │ │ │ │ + 112 } │ │ │ │ │ + 113 } │ │ │ │ │ 114 } │ │ │ │ │ 115 │ │ │ │ │ - 116 │ │ │ │ │ -130 int subEntity(int i, int c, int ii, int cc) const │ │ │ │ │ - 131 { │ │ │ │ │ - 132 return _impl->subEntity(i,c,ii,cc); │ │ │ │ │ + 116 template< int m, int n > │ │ │ │ │ + 117 static void ATA ( const FieldMatrix< ctype, m, n > &A, FieldMatrix< ctype, │ │ │ │ │ +n, n > &ret ) │ │ │ │ │ + 118 { │ │ │ │ │ + 119 for( int i = 0; i < n; ++i ) │ │ │ │ │ + 120 { │ │ │ │ │ + 121 for( int j = 0; j <= i; ++j ) │ │ │ │ │ + 122 { │ │ │ │ │ + 123 ret[ i ][ j ] = ctype( 0 ); │ │ │ │ │ + 124 for( int k = 0; k < m; ++k ) │ │ │ │ │ + 125 ret[ i ][ j ] += A[ k ][ i ] * A[ k ][ j ]; │ │ │ │ │ + 126 ret[ j ][ i ] = ret[ i ][ j ]; │ │ │ │ │ + 127 } │ │ │ │ │ + 128 │ │ │ │ │ + 129 ret[ i ][ i ] = ctype( 0 ); │ │ │ │ │ + 130 for( int k = 0; k < m; ++k ) │ │ │ │ │ + 131 ret[ i ][ i ] += A[ k ][ i ] * A[ k ][ i ]; │ │ │ │ │ + 132 } │ │ │ │ │ 133 } │ │ │ │ │ 134 │ │ │ │ │ -153 auto subEntities ( int i, int c, int cc ) const │ │ │ │ │ - 154 { │ │ │ │ │ - 155 return _impl->subEntities(i,c,cc); │ │ │ │ │ + 135 template< int m, int n > │ │ │ │ │ + 136 static void AAT_L ( const FieldMatrix< ctype, m, n > &A, FieldMatrix< │ │ │ │ │ +ctype, m, m > &ret ) │ │ │ │ │ + 137 { │ │ │ │ │ + 138 /* │ │ │ │ │ + 139 if (m==2) { │ │ │ │ │ + 140 ret[0][0] = A[0]*A[0]; │ │ │ │ │ + 141 ret[1][1] = A[1]*A[1]; │ │ │ │ │ + 142 ret[1][0] = A[0]*A[1]; │ │ │ │ │ + 143 } │ │ │ │ │ + 144 else │ │ │ │ │ + 145 */ │ │ │ │ │ + 146 for( int i = 0; i < m; ++i ) │ │ │ │ │ + 147 { │ │ │ │ │ + 148 for( int j = 0; j <= i; ++j ) │ │ │ │ │ + 149 { │ │ │ │ │ + 150 ctype &retij = ret[ i ][ j ]; │ │ │ │ │ + 151 retij = A[ i ][ 0 ] * A[ j ][ 0 ]; │ │ │ │ │ + 152 for( int k = 1; k < n; ++k ) │ │ │ │ │ + 153 retij += A[ i ][ k ] * A[ j ][ k ]; │ │ │ │ │ + 154 } │ │ │ │ │ + 155 } │ │ │ │ │ 156 } │ │ │ │ │ 157 │ │ │ │ │ - 158 │ │ │ │ │ -171 decltype(auto) type(int i, int c) const │ │ │ │ │ - 172 { │ │ │ │ │ - 173 return _impl->type(i,c); │ │ │ │ │ + 158 template< int m, int n > │ │ │ │ │ + 159 static void AAT ( const FieldMatrix< ctype, m, n > &A, FieldMatrix< ctype, │ │ │ │ │ +m, m > &ret ) │ │ │ │ │ + 160 { │ │ │ │ │ + 161 for( int i = 0; i < m; ++i ) │ │ │ │ │ + 162 { │ │ │ │ │ + 163 for( int j = 0; j < i; ++j ) │ │ │ │ │ + 164 { │ │ │ │ │ + 165 ret[ i ][ j ] = ctype( 0 ); │ │ │ │ │ + 166 for( int k = 0; k < n; ++k ) │ │ │ │ │ + 167 ret[ i ][ j ] += A[ i ][ k ] * A[ j ][ k ]; │ │ │ │ │ + 168 ret[ j ][ i ] = ret[ i ][ j ]; │ │ │ │ │ + 169 } │ │ │ │ │ + 170 ret[ i ][ i ] = ctype( 0 ); │ │ │ │ │ + 171 for( int k = 0; k < n; ++k ) │ │ │ │ │ + 172 ret[ i ][ i ] += A[ i ][ k ] * A[ i ][ k ]; │ │ │ │ │ + 173 } │ │ │ │ │ 174 } │ │ │ │ │ 175 │ │ │ │ │ - 176 │ │ │ │ │ -184 decltype(auto) type() const │ │ │ │ │ - 185 { │ │ │ │ │ - 186 return _impl->type(); │ │ │ │ │ - 187 } │ │ │ │ │ - 188 │ │ │ │ │ - 189 │ │ │ │ │ -203 decltype(auto) position(int i, int c) const │ │ │ │ │ + 176 template< int n > │ │ │ │ │ + 177 static void Lx ( const FieldMatrix< ctype, n, n > &L, const FieldVector< │ │ │ │ │ +ctype, n > &x, FieldVector< ctype, n > &ret ) │ │ │ │ │ + 178 { │ │ │ │ │ + 179 for( int i = 0; i < n; ++i ) │ │ │ │ │ + 180 { │ │ │ │ │ + 181 ret[ i ] = ctype( 0 ); │ │ │ │ │ + 182 for( int j = 0; j <= i; ++j ) │ │ │ │ │ + 183 ret[ i ] += L[ i ][ j ] * x[ j ]; │ │ │ │ │ + 184 } │ │ │ │ │ + 185 } │ │ │ │ │ + 186 │ │ │ │ │ + 187 template< int n > │ │ │ │ │ + 188 static void LTx ( const FieldMatrix< ctype, n, n > &L, const FieldVector< │ │ │ │ │ +ctype, n > &x, FieldVector< ctype, n > &ret ) │ │ │ │ │ + 189 { │ │ │ │ │ + 190 for( int i = 0; i < n; ++i ) │ │ │ │ │ + 191 { │ │ │ │ │ + 192 ret[ i ] = ctype( 0 ); │ │ │ │ │ + 193 for( int j = i; j < n; ++j ) │ │ │ │ │ + 194 ret[ i ] += L[ j ][ i ] * x[ j ]; │ │ │ │ │ + 195 } │ │ │ │ │ + 196 } │ │ │ │ │ + 197 │ │ │ │ │ + 198 template< int n > │ │ │ │ │ + 199 static void LTL ( const FieldMatrix< ctype, n, n > &L, FieldMatrix< ctype, │ │ │ │ │ +n, n > &ret ) │ │ │ │ │ + 200 { │ │ │ │ │ + 201 for( int i = 0; i < n; ++i ) │ │ │ │ │ + 202 { │ │ │ │ │ + 203 for( int j = 0; j < i; ++j ) │ │ │ │ │ 204 { │ │ │ │ │ - 205 return _impl->position(i,c); │ │ │ │ │ - 206 } │ │ │ │ │ - 207 │ │ │ │ │ - 208 │ │ │ │ │ -216 bool checkInside(const Coordinate& local) const │ │ │ │ │ - 217 { │ │ │ │ │ - 218 return _impl->checkInside(local); │ │ │ │ │ - 219 } │ │ │ │ │ - 220 │ │ │ │ │ - 221 │ │ │ │ │ - 233 template │ │ │ │ │ -234 typename Codim::Geometry geometry(int i) const │ │ │ │ │ - 235 { │ │ │ │ │ - 236 return _impl->template geometry(i); │ │ │ │ │ - 237 } │ │ │ │ │ - 238 │ │ │ │ │ - 239 │ │ │ │ │ -241 CoordinateField volume() const │ │ │ │ │ - 242 { │ │ │ │ │ - 243 return _impl->volume(); │ │ │ │ │ - 244 } │ │ │ │ │ + 205 ret[ i ][ j ] = ctype( 0 ); │ │ │ │ │ + 206 for( int k = i; k < n; ++k ) │ │ │ │ │ + 207 ret[ i ][ j ] += L[ k ][ i ] * L[ k ][ j ]; │ │ │ │ │ + 208 ret[ j ][ i ] = ret[ i ][ j ]; │ │ │ │ │ + 209 } │ │ │ │ │ + 210 ret[ i ][ i ] = ctype( 0 ); │ │ │ │ │ + 211 for( int k = i; k < n; ++k ) │ │ │ │ │ + 212 ret[ i ][ i ] += L[ k ][ i ] * L[ k ][ i ]; │ │ │ │ │ + 213 } │ │ │ │ │ + 214 } │ │ │ │ │ + 215 │ │ │ │ │ + 216 template< int n > │ │ │ │ │ + 217 static void LLT ( const FieldMatrix< ctype, n, n > &L, FieldMatrix< ctype, │ │ │ │ │ +n, n > &ret ) │ │ │ │ │ + 218 { │ │ │ │ │ + 219 for( int i = 0; i < n; ++i ) │ │ │ │ │ + 220 { │ │ │ │ │ + 221 for( int j = 0; j < i; ++j ) │ │ │ │ │ + 222 { │ │ │ │ │ + 223 ret[ i ][ j ] = ctype( 0 ); │ │ │ │ │ + 224 for( int k = 0; k <= j; ++k ) │ │ │ │ │ + 225 ret[ i ][ j ] += L[ i ][ k ] * L[ j ][ k ]; │ │ │ │ │ + 226 ret[ j ][ i ] = ret[ i ][ j ]; │ │ │ │ │ + 227 } │ │ │ │ │ + 228 ret[ i ][ i ] = ctype( 0 ); │ │ │ │ │ + 229 for( int k = 0; k <= i; ++k ) │ │ │ │ │ + 230 ret[ i ][ i ] += L[ i ][ k ] * L[ i ][ k ]; │ │ │ │ │ + 231 } │ │ │ │ │ + 232 } │ │ │ │ │ + 233 │ │ │ │ │ + 234 template< int n > │ │ │ │ │ + 235 static bool cholesky_L ( const FieldMatrix< ctype, n, n > &A, FieldMatrix< │ │ │ │ │ +ctype, n, n > &ret, const bool checkSingular = false ) │ │ │ │ │ + 236 { │ │ │ │ │ + 237 using std::sqrt; │ │ │ │ │ + 238 for( int i = 0; i < n; ++i ) │ │ │ │ │ + 239 { │ │ │ │ │ + 240 ctype &rii = ret[ i ][ i ]; │ │ │ │ │ + 241 │ │ │ │ │ + 242 ctype xDiag = A[ i ][ i ]; │ │ │ │ │ + 243 for( int j = 0; j < i; ++j ) │ │ │ │ │ + 244 xDiag -= ret[ i ][ j ] * ret[ i ][ j ]; │ │ │ │ │ 245 │ │ │ │ │ - 246 │ │ │ │ │ -258 decltype(auto) integrationOuterNormal(int face) const │ │ │ │ │ - 259 { │ │ │ │ │ - 260 return _impl->integrationOuterNormal(face); │ │ │ │ │ - 261 } │ │ │ │ │ - 262 │ │ │ │ │ - 263 │ │ │ │ │ -271 ReferenceElement() │ │ │ │ │ - 272 : _impl(nullptr) │ │ │ │ │ - 273 {} │ │ │ │ │ - 274 │ │ │ │ │ -280 const Implementation& impl() const │ │ │ │ │ - 281 { │ │ │ │ │ - 282 return *_impl; │ │ │ │ │ - 283 } │ │ │ │ │ - 284 │ │ │ │ │ -286 bool operator==(const ReferenceElement& r) const │ │ │ │ │ - 287 { │ │ │ │ │ - 288 return _impl == r._impl; │ │ │ │ │ - 289 } │ │ │ │ │ - 290 │ │ │ │ │ -292 bool operator!=(const ReferenceElement& r) const │ │ │ │ │ - 293 { │ │ │ │ │ - 294 return not (*this == r); │ │ │ │ │ + 246 // in some cases A can be singular, e.g. when checking local for │ │ │ │ │ + 247 // outside points during checkInside │ │ │ │ │ + 248 if( checkSingular && ! ( xDiag > ctype( 0 )) ) │ │ │ │ │ + 249 return false ; │ │ │ │ │ + 250 │ │ │ │ │ + 251 // otherwise this should be true always │ │ │ │ │ + 252 assert( xDiag > ctype( 0 ) ); │ │ │ │ │ + 253 rii = sqrt( xDiag ); │ │ │ │ │ + 254 │ │ │ │ │ + 255 ctype invrii = ctype( 1 ) / rii; │ │ │ │ │ + 256 for( int k = i+1; k < n; ++k ) │ │ │ │ │ + 257 { │ │ │ │ │ + 258 ctype x = A[ k ][ i ]; │ │ │ │ │ + 259 for( int j = 0; j < i; ++j ) │ │ │ │ │ + 260 x -= ret[ i ][ j ] * ret[ k ][ j ]; │ │ │ │ │ + 261 ret[ k ][ i ] = invrii * x; │ │ │ │ │ + 262 } │ │ │ │ │ + 263 } │ │ │ │ │ + 264 │ │ │ │ │ + 265 // return true for meaning A is non-singular │ │ │ │ │ + 266 return true; │ │ │ │ │ + 267 } │ │ │ │ │ + 268 │ │ │ │ │ + 269 template< int n > │ │ │ │ │ + 270 static ctype detL ( const FieldMatrix< ctype, n, n > &L ) │ │ │ │ │ + 271 { │ │ │ │ │ + 272 ctype det( 1 ); │ │ │ │ │ + 273 for( int i = 0; i < n; ++i ) │ │ │ │ │ + 274 det *= L[ i ][ i ]; │ │ │ │ │ + 275 return det; │ │ │ │ │ + 276 } │ │ │ │ │ + 277 │ │ │ │ │ + 278 template< int n > │ │ │ │ │ + 279 static ctype invL ( FieldMatrix< ctype, n, n > &L ) │ │ │ │ │ + 280 { │ │ │ │ │ + 281 ctype det( 1 ); │ │ │ │ │ + 282 for( int i = 0; i < n; ++i ) │ │ │ │ │ + 283 { │ │ │ │ │ + 284 ctype &lii = L[ i ][ i ]; │ │ │ │ │ + 285 det *= lii; │ │ │ │ │ + 286 lii = ctype( 1 ) / lii; │ │ │ │ │ + 287 for( int j = 0; j < i; ++j ) │ │ │ │ │ + 288 { │ │ │ │ │ + 289 ctype &lij = L[ i ][ j ]; │ │ │ │ │ + 290 ctype x = lij * L[ j ][ j ]; │ │ │ │ │ + 291 for( int k = j+1; k < i; ++k ) │ │ │ │ │ + 292 x += L[ i ][ k ] * L[ k ][ j ]; │ │ │ │ │ + 293 lij = (-lii) * x; │ │ │ │ │ + 294 } │ │ │ │ │ 295 } │ │ │ │ │ - 296 │ │ │ │ │ -298 friend std::size_t hash_value(const ReferenceElement& r) │ │ │ │ │ - 299 { │ │ │ │ │ - 300 return reinterpret_cast(r._impl); │ │ │ │ │ - 301 } │ │ │ │ │ - 302 │ │ │ │ │ - 303 private: │ │ │ │ │ - 304 │ │ │ │ │ - 305 // The implementation must be a friend to construct a wrapper around │ │ │ │ │ -itself. │ │ │ │ │ - 306 friend Implementation; │ │ │ │ │ - 307 │ │ │ │ │ - 308 // The reference container is a friend to be able to call │ │ │ │ │ -setImplementation. │ │ │ │ │ - 309 friend class Impl::ReferenceElementContainer; │ │ │ │ │ + 296 return det; │ │ │ │ │ + 297 } │ │ │ │ │ + 298 │ │ │ │ │ + 299 // calculates x := L^{-1} x │ │ │ │ │ + 300 template< int n > │ │ │ │ │ + 301 static void invLx ( FieldMatrix< ctype, n, n > &L, FieldVector< ctype, n > │ │ │ │ │ +&x ) │ │ │ │ │ + 302 { │ │ │ │ │ + 303 for( int i = 0; i < n; ++i ) │ │ │ │ │ + 304 { │ │ │ │ │ + 305 for( int j = 0; j < i; ++j ) │ │ │ │ │ + 306 x[ i ] -= L[ i ][ j ] * x[ j ]; │ │ │ │ │ + 307 x[ i ] /= L[ i ][ i ]; │ │ │ │ │ + 308 } │ │ │ │ │ + 309 } │ │ │ │ │ 310 │ │ │ │ │ - 311 // Constructor for wrapping an implementation reference (required │ │ │ │ │ -internally by the default implementation) │ │ │ │ │ - 312 ReferenceElement(const Implementation& impl) │ │ │ │ │ - 313 : _impl(&impl) │ │ │ │ │ - 314 {} │ │ │ │ │ - 315 │ │ │ │ │ - 316 void setImplementation(const Implementation& impl) │ │ │ │ │ - 317 { │ │ │ │ │ - 318 _impl = &impl; │ │ │ │ │ - 319 } │ │ │ │ │ - 320 │ │ │ │ │ - 321 const Implementation* _impl; │ │ │ │ │ + 311 // calculates x := L^{-T} x │ │ │ │ │ + 312 template< int n > │ │ │ │ │ + 313 static void invLTx ( FieldMatrix< ctype, n, n > &L, FieldVector< ctype, n │ │ │ │ │ +> &x ) │ │ │ │ │ + 314 { │ │ │ │ │ + 315 for( int i = n; i > 0; --i ) │ │ │ │ │ + 316 { │ │ │ │ │ + 317 for( int j = i; j < n; ++j ) │ │ │ │ │ + 318 x[ i-1 ] -= L[ j ][ i-1 ] * x[ j ]; │ │ │ │ │ + 319 x[ i-1 ] /= L[ i-1 ][ i-1 ]; │ │ │ │ │ + 320 } │ │ │ │ │ + 321 } │ │ │ │ │ 322 │ │ │ │ │ - 323 }; │ │ │ │ │ - 324 │ │ │ │ │ - 325 } │ │ │ │ │ - 326 │ │ │ │ │ - 327} │ │ │ │ │ - 328 │ │ │ │ │ - 329 │ │ │ │ │ - 330#endif // DUNE_GEOMETRY_REFERENCEELEMENT_HH │ │ │ │ │ + 323 template< int n > │ │ │ │ │ + 324 static ctype spdDetA ( const FieldMatrix< ctype, n, n > &A ) │ │ │ │ │ + 325 { │ │ │ │ │ + 326 // return A[0][0]*A[1][1]-A[1][0]*A[1][0]; │ │ │ │ │ + 327 FieldMatrix< ctype, n, n > L; │ │ │ │ │ + 328 cholesky_L( A, L ); │ │ │ │ │ + 329 return detL( L ); │ │ │ │ │ + 330 } │ │ │ │ │ + 331 │ │ │ │ │ + 332 template< int n > │ │ │ │ │ + 333 static ctype spdInvA ( FieldMatrix< ctype, n, n > &A ) │ │ │ │ │ + 334 { │ │ │ │ │ + 335 FieldMatrix< ctype, n, n > L; │ │ │ │ │ + 336 cholesky_L( A, L ); │ │ │ │ │ + 337 const ctype det = invL( L ); │ │ │ │ │ + 338 LTL( L, A ); │ │ │ │ │ + 339 return det; │ │ │ │ │ + 340 } │ │ │ │ │ + 341 │ │ │ │ │ + 342 // calculate x := A^{-1} x │ │ │ │ │ + 343 template< int n > │ │ │ │ │ + 344 static bool spdInvAx ( FieldMatrix< ctype, n, n > &A, FieldVector< ctype, │ │ │ │ │ +n > &x, const bool checkSingular = false ) │ │ │ │ │ + 345 { │ │ │ │ │ + 346 FieldMatrix< ctype, n, n > L; │ │ │ │ │ + 347 const bool invertible = cholesky_L( A, L, checkSingular ); │ │ │ │ │ + 348 if( ! invertible ) return invertible ; │ │ │ │ │ + 349 invLx( L, x ); │ │ │ │ │ + 350 invLTx( L, x ); │ │ │ │ │ + 351 return invertible; │ │ │ │ │ + 352 } │ │ │ │ │ + 353 │ │ │ │ │ + 354 template< int m, int n > │ │ │ │ │ + 355 static ctype detATA ( const FieldMatrix< ctype, m, n > &A ) │ │ │ │ │ + 356 { │ │ │ │ │ + 357 if( m >= n ) │ │ │ │ │ + 358 { │ │ │ │ │ + 359 FieldMatrix< ctype, n, n > ata; │ │ │ │ │ + 360 ATA_L( A, ata ); │ │ │ │ │ + 361 return spdDetA( ata ); │ │ │ │ │ + 362 } │ │ │ │ │ + 363 else │ │ │ │ │ + 364 return ctype( 0 ); │ │ │ │ │ + 365 } │ │ │ │ │ + 366 │ │ │ │ │ + 372 template< int m, int n > │ │ │ │ │ + 373 static ctype sqrtDetAAT ( const FieldMatrix< ctype, m, n > &A ) │ │ │ │ │ + 374 { │ │ │ │ │ + 375 using std::abs; │ │ │ │ │ + 376 using std::sqrt; │ │ │ │ │ + 377 // These special cases are here not only for speed reasons: │ │ │ │ │ + 378 // The general implementation aborts if the matrix is almost singular, │ │ │ │ │ + 379 // and the special implementation provide a stable way to handle that │ │ │ │ │ +case. │ │ │ │ │ + 380 if( (n == 2) && (m == 2) ) │ │ │ │ │ + 381 { │ │ │ │ │ + 382 // Special implementation for 2x2 matrices: faster and more stable │ │ │ │ │ + 383 return abs( A[ 0 ][ 0 ]*A[ 1 ][ 1 ] - A[ 1 ][ 0 ]*A[ 0 ][ 1 ] ); │ │ │ │ │ + 384 } │ │ │ │ │ + 385 else if( (n == 3) && (m == 3) ) │ │ │ │ │ + 386 { │ │ │ │ │ + 387 // Special implementation for 3x3 matrices │ │ │ │ │ + 388 const ctype v0 = A[ 0 ][ 1 ] * A[ 1 ][ 2 ] - A[ 1 ][ 1 ] * A[ 0 ][ 2 ]; │ │ │ │ │ + 389 const ctype v1 = A[ 0 ][ 2 ] * A[ 1 ][ 0 ] - A[ 1 ][ 2 ] * A[ 0 ][ 0 ]; │ │ │ │ │ + 390 const ctype v2 = A[ 0 ][ 0 ] * A[ 1 ][ 1 ] - A[ 1 ][ 0 ] * A[ 0 ][ 1 ]; │ │ │ │ │ + 391 return abs( v0 * A[ 2 ][ 0 ] + v1 * A[ 2 ][ 1 ] + v2 * A[ 2 ][ 2 ] ); │ │ │ │ │ + 392 } │ │ │ │ │ + 393 else if ( (n == 3) && (m == 2) ) │ │ │ │ │ + 394 { │ │ │ │ │ + 395 // Special implementation for 2x3 matrices │ │ │ │ │ + 396 const ctype v0 = A[ 0 ][ 0 ] * A[ 1 ][ 1 ] - A[ 0 ][ 1 ] * A[ 1 ][ 0 ]; │ │ │ │ │ + 397 const ctype v1 = A[ 0 ][ 0 ] * A[ 1 ][ 2 ] - A[ 1 ][ 0 ] * A[ 0 ][ 2 ]; │ │ │ │ │ + 398 const ctype v2 = A[ 0 ][ 1 ] * A[ 1 ][ 2 ] - A[ 0 ][ 2 ] * A[ 1 ][ 1 ]; │ │ │ │ │ + 399 return sqrt( v0*v0 + v1*v1 + v2*v2); │ │ │ │ │ + 400 } │ │ │ │ │ + 401 else if( n >= m ) │ │ │ │ │ + 402 { │ │ │ │ │ + 403 // General case │ │ │ │ │ + 404 FieldMatrix< ctype, m, m > aat; │ │ │ │ │ + 405 AAT_L( A, aat ); │ │ │ │ │ + 406 return spdDetA( aat ); │ │ │ │ │ + 407 } │ │ │ │ │ + 408 else │ │ │ │ │ + 409 return ctype( 0 ); │ │ │ │ │ + 410 } │ │ │ │ │ + 411 │ │ │ │ │ + 412 // A^{-1}_L = (A^T A)^{-1} A^T │ │ │ │ │ + 413 // => A^{-1}_L A = I │ │ │ │ │ + 414 template< int m, int n > │ │ │ │ │ + 415 static ctype leftInvA ( const FieldMatrix< ctype, m, n > &A, FieldMatrix< │ │ │ │ │ +ctype, n, m > &ret ) │ │ │ │ │ + 416 { │ │ │ │ │ + 417 static_assert((m >= n), "Matrix has no left inverse."); │ │ │ │ │ + 418 FieldMatrix< ctype, n, n > ata; │ │ │ │ │ + 419 ATA_L( A, ata ); │ │ │ │ │ + 420 const ctype det = spdInvA( ata ); │ │ │ │ │ + 421 ATBT( ata, A, ret ); │ │ │ │ │ + 422 return det; │ │ │ │ │ + 423 } │ │ │ │ │ + 424 │ │ │ │ │ + 425 template< int m, int n > │ │ │ │ │ + 426 static void leftInvAx ( const FieldMatrix< ctype, m, n > &A, const │ │ │ │ │ +FieldVector< ctype, m > &x, FieldVector< ctype, n > &y ) │ │ │ │ │ + 427 { │ │ │ │ │ + 428 static_assert((m >= n), "Matrix has no left inverse."); │ │ │ │ │ + 429 FieldMatrix< ctype, n, n > ata; │ │ │ │ │ + 430 ATx( A, x, y ); │ │ │ │ │ + 431 ATA_L( A, ata ); │ │ │ │ │ + 432 spdInvAx( ata, y ); │ │ │ │ │ + 433 } │ │ │ │ │ + 434 │ │ │ │ │ + 436 template< int m, int n > │ │ │ │ │ + 437 static ctype rightInvA ( const FieldMatrix< ctype, m, n > &A, FieldMatrix< │ │ │ │ │ +ctype, n, m > &ret ) │ │ │ │ │ + 438 { │ │ │ │ │ + 439 static_assert((n >= m), "Matrix has no right inverse."); │ │ │ │ │ + 440 using std::abs; │ │ │ │ │ + 441 if( (n == 2) && (m == 2) ) │ │ │ │ │ + 442 { │ │ │ │ │ + 443 const ctype det = (A[ 0 ][ 0 ]*A[ 1 ][ 1 ] - A[ 1 ][ 0 ]*A[ 0 ][ 1 ]); │ │ │ │ │ + 444 const ctype detInv = ctype( 1 ) / det; │ │ │ │ │ + 445 ret[ 0 ][ 0 ] = A[ 1 ][ 1 ] * detInv; │ │ │ │ │ + 446 ret[ 1 ][ 1 ] = A[ 0 ][ 0 ] * detInv; │ │ │ │ │ + 447 ret[ 1 ][ 0 ] = -A[ 1 ][ 0 ] * detInv; │ │ │ │ │ + 448 ret[ 0 ][ 1 ] = -A[ 0 ][ 1 ] * detInv; │ │ │ │ │ + 449 return abs( det ); │ │ │ │ │ + 450 } │ │ │ │ │ + 451 else │ │ │ │ │ + 452 { │ │ │ │ │ + 453 FieldMatrix< ctype, m , m > aat; │ │ │ │ │ + 454 AAT_L( A, aat ); │ │ │ │ │ + 455 const ctype det = spdInvA( aat ); │ │ │ │ │ + 456 ATBT( A , aat , ret ); │ │ │ │ │ + 457 return det; │ │ │ │ │ + 458 } │ │ │ │ │ + 459 } │ │ │ │ │ + 460 │ │ │ │ │ + 461 template< int m, int n > │ │ │ │ │ + 462 static bool xTRightInvA ( const FieldMatrix< ctype, m, n > &A, const │ │ │ │ │ +FieldVector< ctype, n > &x, FieldVector< ctype, m > &y ) │ │ │ │ │ + 463 { │ │ │ │ │ + 464 static_assert((n >= m), "Matrix has no right inverse."); │ │ │ │ │ + 465 FieldMatrix< ctype, m, m > aat; │ │ │ │ │ + 466 Ax( A, x, y ); │ │ │ │ │ + 467 AAT_L( A, aat ); │ │ │ │ │ + 468 // check whether aat is singular and return true if non-singular │ │ │ │ │ + 469 return spdInvAx( aat, y, true ); │ │ │ │ │ + 470 } │ │ │ │ │ + 471 }; │ │ │ │ │ + 472 │ │ │ │ │ + 473 } // namespace Impl │ │ │ │ │ + 474 │ │ │ │ │ + 475 │ │ │ │ │ + 476 │ │ │ │ │ + 482 template< class ct, int mydim, int cdim> │ │ │ │ │ +483 class AffineGeometry │ │ │ │ │ + 484 { │ │ │ │ │ + 485 public: │ │ │ │ │ + 486 │ │ │ │ │ +488 typedef ct ctype; │ │ │ │ │ + 489 │ │ │ │ │ +491 static const int mydimension= mydim; │ │ │ │ │ + 492 │ │ │ │ │ +494 static const int coorddimension = cdim; │ │ │ │ │ + 495 │ │ │ │ │ +497 typedef FieldVector< ctype, mydimension > LocalCoordinate; │ │ │ │ │ + 498 │ │ │ │ │ +500 typedef FieldVector< ctype, coorddimension > GlobalCoordinate; │ │ │ │ │ + 501 │ │ │ │ │ +503 typedef ctype Volume; │ │ │ │ │ + 504 │ │ │ │ │ +506 typedef FieldMatrix< ctype, mydimension, coorddimension > │ │ │ │ │ +JacobianTransposed; │ │ │ │ │ + 507 │ │ │ │ │ +509 typedef FieldMatrix< ctype, coorddimension, mydimension > │ │ │ │ │ +JacobianInverseTransposed; │ │ │ │ │ + 510 │ │ │ │ │ +512 typedef FieldMatrix< ctype, coorddimension, mydimension > Jacobian; │ │ │ │ │ + 513 │ │ │ │ │ +515 typedef FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse; │ │ │ │ │ + 516 │ │ │ │ │ + 517 private: │ │ │ │ │ + 519 typedef Geo::ReferenceElement<_Geo::ReferenceElementImplementation<_ctype, │ │ │ │ │ +mydimension_> > ReferenceElement; │ │ │ │ │ + 520 │ │ │ │ │ + 521 typedef Geo::ReferenceElements<_ctype,_mydimension_> ReferenceElements; │ │ │ │ │ + 522 │ │ │ │ │ + 523 // Helper class to compute a matrix pseudo inverse │ │ │ │ │ + 524 typedef Impl::FieldMatrixHelper< ct > MatrixHelper; │ │ │ │ │ + 525 │ │ │ │ │ + 526 public: │ │ │ │ │ +528 AffineGeometry ( const ReferenceElement &refElement, const GlobalCoordinate │ │ │ │ │ +&origin, │ │ │ │ │ + 529 const JacobianTransposed &jt ) │ │ │ │ │ + 530 : refElement_(refElement), origin_(origin), jacobianTransposed_(jt) │ │ │ │ │ + 531 { │ │ │ │ │ + 532 integrationElement_ = MatrixHelper::template rightInvA< mydimension, │ │ │ │ │ +coorddimension >( jacobianTransposed_, jacobianInverseTransposed_ ); │ │ │ │ │ + 533 } │ │ │ │ │ + 534 │ │ │ │ │ +536 AffineGeometry ( Dune::GeometryType gt, const GlobalCoordinate &origin, │ │ │ │ │ + 537 const JacobianTransposed &jt ) │ │ │ │ │ + 538 : AffineGeometry(ReferenceElements::general( gt ), origin, jt) │ │ │ │ │ + 539 { } │ │ │ │ │ + 540 │ │ │ │ │ + 542 template< class CoordVector > │ │ │ │ │ +543 AffineGeometry ( const ReferenceElement &refElement, const CoordVector │ │ │ │ │ +&coordVector ) │ │ │ │ │ + 544 : refElement_(refElement), origin_(coordVector[0]) │ │ │ │ │ + 545 { │ │ │ │ │ + 546 for( int i = 0; i < mydimension; ++i ) │ │ │ │ │ + 547 jacobianTransposed_[ i ] = coordVector[ i+1 ] - origin_; │ │ │ │ │ + 548 integrationElement_ = MatrixHelper::template rightInvA< mydimension, │ │ │ │ │ +coorddimension >( jacobianTransposed_, jacobianInverseTransposed_ ); │ │ │ │ │ + 549 } │ │ │ │ │ + 550 │ │ │ │ │ + 552 template< class CoordVector > │ │ │ │ │ +553 AffineGeometry ( Dune::GeometryType gt, const CoordVector &coordVector ) │ │ │ │ │ + 554 : AffineGeometry(ReferenceElements::general( gt ), coordVector) │ │ │ │ │ + 555 { } │ │ │ │ │ + 556 │ │ │ │ │ +558 bool affine () const { return true; } │ │ │ │ │ + 559 │ │ │ │ │ +561 Dune::GeometryType type () const { return refElement_.type(); } │ │ │ │ │ + 562 │ │ │ │ │ +564 int corners () const { return refElement_.size( mydimension ); } │ │ │ │ │ + 565 │ │ │ │ │ +567 GlobalCoordinate corner ( int i ) const │ │ │ │ │ + 568 { │ │ │ │ │ + 569 return global( refElement_.position( i, mydimension ) ); │ │ │ │ │ + 570 } │ │ │ │ │ + 571 │ │ │ │ │ +573 GlobalCoordinate center () const { return global( refElement_.position( 0, │ │ │ │ │ +0 ) ); } │ │ │ │ │ + 574 │ │ │ │ │ +581 GlobalCoordinate global ( const LocalCoordinate &local ) const │ │ │ │ │ + 582 { │ │ │ │ │ + 583 GlobalCoordinate global( origin_ ); │ │ │ │ │ + 584 jacobianTransposed_.umtv( local, global ); │ │ │ │ │ + 585 return global; │ │ │ │ │ + 586 } │ │ │ │ │ + 587 │ │ │ │ │ +601 LocalCoordinate local ( const GlobalCoordinate &global ) const │ │ │ │ │ + 602 { │ │ │ │ │ + 603 LocalCoordinate local; │ │ │ │ │ + 604 jacobianInverseTransposed_.mtv( global - origin_, local ); │ │ │ │ │ + 605 return local; │ │ │ │ │ + 606 } │ │ │ │ │ + 607 │ │ │ │ │ +618 ctype integrationElement ([[maybe_unused]] const LocalCoordinate &local) │ │ │ │ │ +const │ │ │ │ │ + 619 { │ │ │ │ │ + 620 return integrationElement_; │ │ │ │ │ + 621 } │ │ │ │ │ + 622 │ │ │ │ │ +624 Volume volume () const │ │ │ │ │ + 625 { │ │ │ │ │ + 626 return integrationElement_ * refElement_.volume(); │ │ │ │ │ + 627 } │ │ │ │ │ + 628 │ │ │ │ │ +635 const JacobianTransposed &jacobianTransposed ([[maybe_unused]] const │ │ │ │ │ +LocalCoordinate &local) const │ │ │ │ │ + 636 { │ │ │ │ │ + 637 return jacobianTransposed_; │ │ │ │ │ + 638 } │ │ │ │ │ + 639 │ │ │ │ │ +646 const JacobianInverseTransposed &jacobianInverseTransposed ([ │ │ │ │ │ +[maybe_unused]] const LocalCoordinate &local) const │ │ │ │ │ + 647 { │ │ │ │ │ + 648 return jacobianInverseTransposed_; │ │ │ │ │ + 649 } │ │ │ │ │ + 650 │ │ │ │ │ +657 Jacobian jacobian ([[maybe_unused]] const LocalCoordinate &local) const │ │ │ │ │ + 658 { │ │ │ │ │ + 659 return jacobianTransposed_.transposed(); │ │ │ │ │ + 660 } │ │ │ │ │ + 661 │ │ │ │ │ +668 JacobianInverse jacobianInverse ([[maybe_unused]] const LocalCoordinate │ │ │ │ │ +&local) const │ │ │ │ │ + 669 { │ │ │ │ │ + 670 return jacobianInverseTransposed_.transposed(); │ │ │ │ │ + 671 } │ │ │ │ │ + 672 │ │ │ │ │ +673 friend ReferenceElement referenceElement ( const AffineGeometry &geometry ) │ │ │ │ │ + 674 { │ │ │ │ │ + 675 return geometry.refElement_; │ │ │ │ │ + 676 } │ │ │ │ │ + 677 │ │ │ │ │ + 678 private: │ │ │ │ │ + 679 ReferenceElement refElement_; │ │ │ │ │ + 680 GlobalCoordinate origin_; │ │ │ │ │ + 681 JacobianTransposed jacobianTransposed_; │ │ │ │ │ + 682 JacobianInverseTransposed jacobianInverseTransposed_; │ │ │ │ │ + 683 ctype integrationElement_; │ │ │ │ │ + 684 }; │ │ │ │ │ + 685 │ │ │ │ │ + 686} // namespace Dune │ │ │ │ │ + 687 │ │ │ │ │ + 688#endif // #ifndef DUNE_GEOMETRY_AFFINEGEOMETRY_HH │ │ │ │ │ type.hh │ │ │ │ │ A unique label for each type of element that can occur in a grid. │ │ │ │ │ +Dune::ReferenceElement │ │ │ │ │ +unspecified-type ReferenceElement │ │ │ │ │ +Returns the type of reference element for the argument type T. │ │ │ │ │ +Definition: referenceelements.hh:497 │ │ │ │ │ Dune │ │ │ │ │ Definition: affinegeometry.hh:21 │ │ │ │ │ Dune::Geo::ReferenceElement │ │ │ │ │ This class provides access to geometric and topological properties of a │ │ │ │ │ reference element. │ │ │ │ │ Definition: referenceelement.hh:52 │ │ │ │ │ Dune::Geo::ReferenceElement::volume │ │ │ │ │ CoordinateField volume() const │ │ │ │ │ obtain the volume of the reference element │ │ │ │ │ Definition: referenceelement.hh:241 │ │ │ │ │ -Dune::Geo::ReferenceElement::ReferenceElement │ │ │ │ │ -ReferenceElement() │ │ │ │ │ -Constructs an empty reference element. │ │ │ │ │ -Definition: referenceelement.hh:271 │ │ │ │ │ -Dune::Geo::ReferenceElement::operator!= │ │ │ │ │ -bool operator!=(const ReferenceElement &r) const │ │ │ │ │ -Compares for inequality with another reference element. │ │ │ │ │ -Definition: referenceelement.hh:292 │ │ │ │ │ Dune::Geo::ReferenceElement::type │ │ │ │ │ decltype(auto) type(int i, int c) const │ │ │ │ │ obtain the type of subentity (i,c) │ │ │ │ │ Definition: referenceelement.hh:171 │ │ │ │ │ -Dune::Geo::ReferenceElement::Coordinate │ │ │ │ │ -typename Implementation::Coordinate Coordinate │ │ │ │ │ -The coordinate type. │ │ │ │ │ -Definition: referenceelement.hh:81 │ │ │ │ │ -Dune::Geo::ReferenceElement::geometry │ │ │ │ │ -Codim< codim >::Geometry geometry(int i) const │ │ │ │ │ -obtain the embedding of subentity (i,codim) into the reference element │ │ │ │ │ -Definition: referenceelement.hh:234 │ │ │ │ │ -Dune::Geo::ReferenceElement::dimension │ │ │ │ │ -static constexpr int dimension │ │ │ │ │ -The dimension of the reference element. │ │ │ │ │ -Definition: referenceelement.hh:87 │ │ │ │ │ -Dune::Geo::ReferenceElement::size │ │ │ │ │ -int size(int i, int c, int cc) const │ │ │ │ │ -number of subentities of codimension cc of subentity (i,c) │ │ │ │ │ -Definition: referenceelement.hh:111 │ │ │ │ │ -Dune::Geo::ReferenceElement::subEntity │ │ │ │ │ -int subEntity(int i, int c, int ii, int cc) const │ │ │ │ │ -obtain number of ii-th subentity with codim cc of (i,c) │ │ │ │ │ -Definition: referenceelement.hh:130 │ │ │ │ │ -Dune::Geo::ReferenceElement::ctype │ │ │ │ │ -typename Implementation::ctype ctype │ │ │ │ │ -The coordinate field type. │ │ │ │ │ -Definition: referenceelement.hh:75 │ │ │ │ │ Dune::Geo::ReferenceElement::size │ │ │ │ │ int size(int c) const │ │ │ │ │ number of subentities of codimension c │ │ │ │ │ Definition: referenceelement.hh:94 │ │ │ │ │ -Dune::Geo::ReferenceElement::type │ │ │ │ │ -decltype(auto) type() const │ │ │ │ │ -obtain the type of this reference element │ │ │ │ │ -Definition: referenceelement.hh:184 │ │ │ │ │ -Dune::Geo::ReferenceElement::impl │ │ │ │ │ -const Implementation & impl() const │ │ │ │ │ -Returns a reference to the internal implementation object. │ │ │ │ │ -Definition: referenceelement.hh:280 │ │ │ │ │ -Dune::Geo::ReferenceElement::checkInside │ │ │ │ │ -bool checkInside(const Coordinate &local) const │ │ │ │ │ -check if a coordinate is in the reference element │ │ │ │ │ -Definition: referenceelement.hh:216 │ │ │ │ │ -Dune::Geo::ReferenceElement::CoordinateField │ │ │ │ │ -ctype CoordinateField │ │ │ │ │ -The coordinate field type. │ │ │ │ │ -Definition: referenceelement.hh:78 │ │ │ │ │ -Dune::Geo::ReferenceElement::operator== │ │ │ │ │ -bool operator==(const ReferenceElement &r) const │ │ │ │ │ -Compares for equality with another reference element. │ │ │ │ │ -Definition: referenceelement.hh:286 │ │ │ │ │ Dune::Geo::ReferenceElement::position │ │ │ │ │ decltype(auto) position(int i, int c) const │ │ │ │ │ position of the barycenter of entity (i,c) │ │ │ │ │ Definition: referenceelement.hh:203 │ │ │ │ │ -Dune::Geo::ReferenceElement::integrationOuterNormal │ │ │ │ │ -decltype(auto) integrationOuterNormal(int face) const │ │ │ │ │ -obtain the integration outer normal of the reference element │ │ │ │ │ -Definition: referenceelement.hh:258 │ │ │ │ │ -Dune::Geo::ReferenceElement::hash_value │ │ │ │ │ -friend std::size_t hash_value(const ReferenceElement &r) │ │ │ │ │ -Yields a hash value suitable for storing the reference element a in hash table. │ │ │ │ │ -Definition: referenceelement.hh:298 │ │ │ │ │ -Dune::Geo::ReferenceElement::subEntities │ │ │ │ │ -auto subEntities(int i, int c, int cc) const │ │ │ │ │ -Obtain the range of numbers of subentities with codim cc of (i,c) │ │ │ │ │ -Definition: referenceelement.hh:153 │ │ │ │ │ -Dune::Geo::ReferenceElement::Volume │ │ │ │ │ +Dune::Geo::ReferenceElementImplementation │ │ │ │ │ +Definition: affinegeometry.hh:33 │ │ │ │ │ +Dune::Geo::ReferenceElements │ │ │ │ │ +Class providing access to the singletons of the reference elements. │ │ │ │ │ +Definition: referenceelements.hh:170 │ │ │ │ │ +Dune::AffineGeometry │ │ │ │ │ +Implementation of the Geometry interface for affine geometries. │ │ │ │ │ +Definition: affinegeometry.hh:484 │ │ │ │ │ +Dune::AffineGeometry::AffineGeometry │ │ │ │ │ +AffineGeometry(const ReferenceElement &refElement, const CoordVector │ │ │ │ │ +&coordVector) │ │ │ │ │ +Create affine geometry from reference element and a vector of vertex │ │ │ │ │ +coordinates. │ │ │ │ │ +Definition: affinegeometry.hh:543 │ │ │ │ │ +Dune::AffineGeometry::AffineGeometry │ │ │ │ │ +AffineGeometry(Dune::GeometryType gt, const GlobalCoordinate &origin, const │ │ │ │ │ +JacobianTransposed &jt) │ │ │ │ │ +Create affine geometry from GeometryType, one vertex, and the Jacobian matrix. │ │ │ │ │ +Definition: affinegeometry.hh:536 │ │ │ │ │ +Dune::AffineGeometry::LocalCoordinate │ │ │ │ │ +FieldVector< ctype, mydimension > LocalCoordinate │ │ │ │ │ +Type for local coordinate vector. │ │ │ │ │ +Definition: affinegeometry.hh:497 │ │ │ │ │ +Dune::AffineGeometry::type │ │ │ │ │ +Dune::GeometryType type() const │ │ │ │ │ +Obtain the type of the reference element. │ │ │ │ │ +Definition: affinegeometry.hh:561 │ │ │ │ │ +Dune::AffineGeometry::mydimension │ │ │ │ │ +static const int mydimension │ │ │ │ │ +Dimension of the geometry. │ │ │ │ │ +Definition: affinegeometry.hh:491 │ │ │ │ │ +Dune::AffineGeometry::AffineGeometry │ │ │ │ │ +AffineGeometry(const ReferenceElement &refElement, const GlobalCoordinate │ │ │ │ │ +&origin, const JacobianTransposed &jt) │ │ │ │ │ +Create affine geometry from reference element, one vertex, and the Jacobian │ │ │ │ │ +matrix. │ │ │ │ │ +Definition: affinegeometry.hh:528 │ │ │ │ │ +Dune::AffineGeometry::Volume │ │ │ │ │ ctype Volume │ │ │ │ │ Type used for volume. │ │ │ │ │ -Definition: referenceelement.hh:84 │ │ │ │ │ -Dune::Geo::ReferenceElement::Codim │ │ │ │ │ -Collection of types depending on the codimension. │ │ │ │ │ -Definition: referenceelement.hh:67 │ │ │ │ │ -Dune::Geo::ReferenceElement::Codim::Geometry │ │ │ │ │ -implementation-defined Geometry │ │ │ │ │ -type of geometry embedding a subentity into the reference element │ │ │ │ │ -Definition: referenceelement.hh:69 │ │ │ │ │ +Definition: affinegeometry.hh:503 │ │ │ │ │ +Dune::AffineGeometry::jacobianInverse │ │ │ │ │ +JacobianInverse jacobianInverse(const LocalCoordinate &local) const │ │ │ │ │ +Obtain the Jacobian's inverse. │ │ │ │ │ +Definition: affinegeometry.hh:668 │ │ │ │ │ +Dune::AffineGeometry::referenceElement │ │ │ │ │ +friend ReferenceElement referenceElement(const AffineGeometry &geometry) │ │ │ │ │ +Definition: affinegeometry.hh:673 │ │ │ │ │ +Dune::AffineGeometry::AffineGeometry │ │ │ │ │ +AffineGeometry(Dune::GeometryType gt, const CoordVector &coordVector) │ │ │ │ │ +Create affine geometry from GeometryType and a vector of vertex coordinates. │ │ │ │ │ +Definition: affinegeometry.hh:553 │ │ │ │ │ +Dune::AffineGeometry::integrationElement │ │ │ │ │ +ctype integrationElement(const LocalCoordinate &local) const │ │ │ │ │ +Obtain the integration element. │ │ │ │ │ +Definition: affinegeometry.hh:618 │ │ │ │ │ +Dune::AffineGeometry::JacobianInverse │ │ │ │ │ +FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse │ │ │ │ │ +Type for the inverse Jacobian matrix. │ │ │ │ │ +Definition: affinegeometry.hh:515 │ │ │ │ │ +Dune::AffineGeometry::Jacobian │ │ │ │ │ +FieldMatrix< ctype, coorddimension, mydimension > Jacobian │ │ │ │ │ +Type for the Jacobian matrix. │ │ │ │ │ +Definition: affinegeometry.hh:512 │ │ │ │ │ +Dune::AffineGeometry::jacobianInverseTransposed │ │ │ │ │ +const JacobianInverseTransposed & jacobianInverseTransposed(const │ │ │ │ │ +LocalCoordinate &local) const │ │ │ │ │ +Obtain the transposed of the Jacobian's inverse. │ │ │ │ │ +Definition: affinegeometry.hh:646 │ │ │ │ │ +Dune::AffineGeometry::JacobianTransposed │ │ │ │ │ +FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed │ │ │ │ │ +Type for the transposed Jacobian matrix. │ │ │ │ │ +Definition: affinegeometry.hh:506 │ │ │ │ │ +Dune::AffineGeometry::corner │ │ │ │ │ +GlobalCoordinate corner(int i) const │ │ │ │ │ +Obtain coordinates of the i-th corner. │ │ │ │ │ +Definition: affinegeometry.hh:567 │ │ │ │ │ +Dune::AffineGeometry::corners │ │ │ │ │ +int corners() const │ │ │ │ │ +Obtain number of corners of the corresponding reference element. │ │ │ │ │ +Definition: affinegeometry.hh:564 │ │ │ │ │ +Dune::AffineGeometry::JacobianInverseTransposed │ │ │ │ │ +FieldMatrix< ctype, coorddimension, mydimension > JacobianInverseTransposed │ │ │ │ │ +Type for the transposed inverse Jacobian matrix. │ │ │ │ │ +Definition: affinegeometry.hh:509 │ │ │ │ │ +Dune::AffineGeometry::coorddimension │ │ │ │ │ +static const int coorddimension │ │ │ │ │ +Dimension of the world space. │ │ │ │ │ +Definition: affinegeometry.hh:494 │ │ │ │ │ +Dune::AffineGeometry::global │ │ │ │ │ +GlobalCoordinate global(const LocalCoordinate &local) const │ │ │ │ │ +Evaluate the mapping. │ │ │ │ │ +Definition: affinegeometry.hh:581 │ │ │ │ │ +Dune::AffineGeometry::center │ │ │ │ │ +GlobalCoordinate center() const │ │ │ │ │ +Obtain the centroid of the mapping's image. │ │ │ │ │ +Definition: affinegeometry.hh:573 │ │ │ │ │ +Dune::AffineGeometry::jacobian │ │ │ │ │ +Jacobian jacobian(const LocalCoordinate &local) const │ │ │ │ │ +Obtain the Jacobian. │ │ │ │ │ +Definition: affinegeometry.hh:657 │ │ │ │ │ +Dune::AffineGeometry::ctype │ │ │ │ │ +ct ctype │ │ │ │ │ +Type used for coordinates. │ │ │ │ │ +Definition: affinegeometry.hh:488 │ │ │ │ │ +Dune::AffineGeometry::GlobalCoordinate │ │ │ │ │ +FieldVector< ctype, coorddimension > GlobalCoordinate │ │ │ │ │ +Type for coordinate vector in world space. │ │ │ │ │ +Definition: affinegeometry.hh:500 │ │ │ │ │ +Dune::AffineGeometry::affine │ │ │ │ │ +bool affine() const │ │ │ │ │ +Always true: this is an affine geometry. │ │ │ │ │ +Definition: affinegeometry.hh:558 │ │ │ │ │ +Dune::AffineGeometry::jacobianTransposed │ │ │ │ │ +const JacobianTransposed & jacobianTransposed(const LocalCoordinate &local) │ │ │ │ │ +const │ │ │ │ │ +Obtain the transposed of the Jacobian. │ │ │ │ │ +Definition: affinegeometry.hh:635 │ │ │ │ │ +Dune::AffineGeometry::volume │ │ │ │ │ +Volume volume() const │ │ │ │ │ +Obtain the volume of the element. │ │ │ │ │ +Definition: affinegeometry.hh:624 │ │ │ │ │ +Dune::GeometryType │ │ │ │ │ +Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ +Definition: type.hh:125 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00188.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: referenceelementimplementation.hh File Reference │ │ │ │ +dune-geometry: axisalignedcubegeometry.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -63,45 +63,44 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ +Classes | │ │ │ │ Namespaces
│ │ │ │ -
referenceelementimplementation.hh File Reference
│ │ │ │ +
axisalignedcubegeometry.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <cassert>
│ │ │ │ -#include <algorithm>
│ │ │ │ -#include <limits>
│ │ │ │ -#include <tuple>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <vector>
│ │ │ │ -#include <array>
│ │ │ │ -#include <bitset>
│ │ │ │ -#include <dune/common/fmatrix.hh>
│ │ │ │ + │ │ │ │ +

A geometry implementation for axis-aligned hypercubes. │ │ │ │ +More...

│ │ │ │ +
#include <bitset>
│ │ │ │ #include <dune/common/fvector.hh>
│ │ │ │ -#include <dune/common/hybridutilities.hh>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ -#include <dune/common/iteratorrange.hh>
│ │ │ │ -#include <dune/common/math.hh>
│ │ │ │ -#include <dune/geometry/referenceelement.hh>
│ │ │ │ -#include <dune/geometry/affinegeometry.hh>
│ │ │ │ -#include <dune/geometry/type.hh>
│ │ │ │ +#include <dune/common/fmatrix.hh>
│ │ │ │ +#include <dune/common/diagonalmatrix.hh>
│ │ │ │ +#include <dune/geometry/referenceelements.hh>
│ │ │ │ +#include <dune/geometry/type.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Classes

class  Dune::AxisAlignedCubeGeometry< CoordType, dim, coorddim >
 A geometry implementation for axis-aligned hypercubes. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Geo
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

A geometry implementation for axis-aligned hypercubes.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,35 +4,29 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ -Namespaces │ │ │ │ │ -referenceelementimplementation.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces │ │ │ │ │ +axisalignedcubegeometry.hh File Reference │ │ │ │ │ +A geometry implementation for axis-aligned hypercubes. More... │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ + Classes │ │ │ │ │ +class  Dune::AxisAlignedCubeGeometry<_CoordType,_dim,_coorddim_> │ │ │ │ │ +  A geometry implementation for axis-aligned hypercubes. More... │ │ │ │ │ +  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ -namespace  Dune::Geo │ │ │ │ │ -  │ │ │ │ │ +***** Detailed Description ***** │ │ │ │ │ +A geometry implementation for axis-aligned hypercubes. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00188_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: referenceelementimplementation.hh Source File │ │ │ │ +dune-geometry: axisalignedcubegeometry.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,722 +62,322 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
referenceelementimplementation.hh
│ │ │ │ +
axisalignedcubegeometry.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
2// vi: set et ts=4 sw=2 sts=2:
│ │ │ │
3// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
5#ifndef DUNE_GEOMETRY_REFERENCEELEMENTIMPLEMENTATION_HH
│ │ │ │ -
6#define DUNE_GEOMETRY_REFERENCEELEMENTIMPLEMENTATION_HH
│ │ │ │ -
7
│ │ │ │ -
8#include <cassert>
│ │ │ │ -
9
│ │ │ │ -
10#include <algorithm>
│ │ │ │ -
11#include <limits>
│ │ │ │ -
12#include <tuple>
│ │ │ │ -
13#include <utility>
│ │ │ │ -
14#include <vector>
│ │ │ │ -
15#include <array>
│ │ │ │ -
16#include <bitset>
│ │ │ │ -
17
│ │ │ │ -
18#include <dune/common/fmatrix.hh>
│ │ │ │ -
19#include <dune/common/fvector.hh>
│ │ │ │ -
20#include <dune/common/hybridutilities.hh>
│ │ │ │ -
21#include <dune/common/typetraits.hh>
│ │ │ │ -
22#include <dune/common/iteratorrange.hh>
│ │ │ │ -
23#include <dune/common/math.hh>
│ │ │ │ +
5
│ │ │ │ +
6#ifndef DUNE_GEOMETRY_AXISALIGNED_CUBE_GEOMETRY_HH
│ │ │ │ +
7#define DUNE_GEOMETRY_AXISALIGNED_CUBE_GEOMETRY_HH
│ │ │ │ +
8
│ │ │ │ +
13#include <bitset>
│ │ │ │ +
14
│ │ │ │ +
15#include <dune/common/fvector.hh>
│ │ │ │ +
16#include <dune/common/fmatrix.hh>
│ │ │ │ +
17#include <dune/common/diagonalmatrix.hh>
│ │ │ │ +
18
│ │ │ │ + │ │ │ │ +
20#include <dune/geometry/type.hh>
│ │ │ │ +
21
│ │ │ │ +
22
│ │ │ │ +
23namespace Dune {
│ │ │ │
24
│ │ │ │ - │ │ │ │ - │ │ │ │ -
27#include <dune/geometry/type.hh>
│ │ │ │ -
28
│ │ │ │ -
29namespace Dune
│ │ │ │ -
30{
│ │ │ │ -
31
│ │ │ │ -
32 namespace Geo
│ │ │ │ -
33 {
│ │ │ │ -
34
│ │ │ │ -
35#ifndef DOXYGEN
│ │ │ │ -
36
│ │ │ │ -
37 // Internal Forward Declarations
│ │ │ │ -
38 // -----------------------------
│ │ │ │ -
39
│ │ │ │ -
40 namespace Impl
│ │ │ │ -
41 {
│ │ │ │ -
42 template< class ctype, int dim >
│ │ │ │ -
43 class ReferenceElementContainer;
│ │ │ │ -
44 }
│ │ │ │ -
45
│ │ │ │ -
46 template< class ctype, int dim >
│ │ │ │ -
47 struct ReferenceElements;
│ │ │ │ -
48
│ │ │ │ -
49
│ │ │ │ -
50
│ │ │ │ -
51 namespace Impl
│ │ │ │ -
52 {
│ │ │ │ -
53
│ │ │ │ -
54 using Dune::Impl::isPrism;
│ │ │ │ -
55 using Dune::Impl::isPyramid;
│ │ │ │ -
56 using Dune::Impl::baseTopologyId;
│ │ │ │ -
57 using Dune::Impl::prismConstruction;
│ │ │ │ -
58 using Dune::Impl::pyramidConstruction;
│ │ │ │ -
59 using Dune::Impl::numTopologies;
│ │ │ │ +
48 template <class CoordType, unsigned int dim, unsigned int coorddim>
│ │ │ │ + │ │ │ │ +
50 {
│ │ │ │ +
51
│ │ │ │ +
52
│ │ │ │ +
53 public:
│ │ │ │ +
54
│ │ │ │ +
56 constexpr static int mydimension = dim;
│ │ │ │ +
57
│ │ │ │ +
59 constexpr static int coorddimension = coorddim;
│ │ │ │
60
│ │ │ │ -
62 unsigned int size ( unsigned int topologyId, int dim, int codim );
│ │ │ │ +
62 typedef CoordType ctype;
│ │ │ │
63
│ │ │ │ -
64
│ │ │ │ -
65
│ │ │ │ -
73 unsigned int subTopologyId ( unsigned int topologyId, int dim, int codim, unsigned int i );
│ │ │ │ -
74
│ │ │ │ -
75
│ │ │ │ -
76
│ │ │ │ -
77 // subTopologyNumbering
│ │ │ │ -
78 // --------------------
│ │ │ │ -
79
│ │ │ │ -
80 void subTopologyNumbering ( unsigned int topologyId, int dim, int codim, unsigned int i, int subcodim,
│ │ │ │ -
81 unsigned int *beginOut, unsigned int *endOut );
│ │ │ │ +
65 typedef FieldVector<ctype,dim> LocalCoordinate;
│ │ │ │ +
66
│ │ │ │ +
68 typedef FieldVector<ctype,coorddim> GlobalCoordinate;
│ │ │ │ +
69
│ │ │ │ +
71 typedef ctype Volume;
│ │ │ │ +
72
│ │ │ │ +
79 typedef typename std::conditional<dim==coorddim,
│ │ │ │ +
80 DiagonalMatrix<ctype,dim>,
│ │ │ │ +
81 FieldMatrix<ctype,dim,coorddim> >::type JacobianTransposed;
│ │ │ │
82
│ │ │ │ -
83
│ │ │ │ -
84
│ │ │ │ -
85
│ │ │ │ -
86 // checkInside
│ │ │ │ -
87 // -----------
│ │ │ │ -
88
│ │ │ │ -
89 template< class ct, int cdim >
│ │ │ │ -
90 inline bool
│ │ │ │ -
91 checkInside ( unsigned int topologyId, int dim, const FieldVector< ct, cdim > &x, ct tolerance, ct factor = ct( 1 ) )
│ │ │ │ -
92 {
│ │ │ │ -
93 assert( (dim >= 0) && (dim <= cdim) );
│ │ │ │ -
94 assert( topologyId < numTopologies( dim ) );
│ │ │ │ -
95
│ │ │ │ -
96 if( dim > 0 )
│ │ │ │ -
97 {
│ │ │ │ -
98 const ct baseFactor = (isPrism( topologyId, dim ) ? factor : factor - x[ dim-1 ]);
│ │ │ │ -
99 if( (x[ dim-1 ] > -tolerance) && (factor - x[ dim-1 ] > -tolerance) )
│ │ │ │ -
100 return checkInside< ct, cdim >( baseTopologyId( topologyId, dim ), dim-1, x, tolerance, baseFactor );
│ │ │ │ -
101 else
│ │ │ │ -
102 return false;
│ │ │ │ -
103 }
│ │ │ │ -
104 else
│ │ │ │ -
105 return true;
│ │ │ │ -
106 }
│ │ │ │ -
107
│ │ │ │ -
108
│ │ │ │ -
109
│ │ │ │ -
110 // referenceCorners
│ │ │ │ -
111 // ----------------
│ │ │ │ -
112
│ │ │ │ -
113 template< class ct, int cdim >
│ │ │ │ -
114 inline unsigned int
│ │ │ │ -
115 referenceCorners ( unsigned int topologyId, int dim, FieldVector< ct, cdim > *corners )
│ │ │ │ -
116 {
│ │ │ │ -
117 assert( (dim >= 0) && (dim <= cdim) );
│ │ │ │ -
118 assert( topologyId < numTopologies( dim ) );
│ │ │ │ -
119
│ │ │ │ -
120 if( dim > 0 )
│ │ │ │ -
121 {
│ │ │ │ -
122 const unsigned int nBaseCorners
│ │ │ │ -
123 = referenceCorners( baseTopologyId( topologyId, dim ), dim-1, corners );
│ │ │ │ -
124 assert( nBaseCorners == size( baseTopologyId( topologyId, dim ), dim-1, dim-1 ) );
│ │ │ │ -
125 if( isPrism( topologyId, dim ) )
│ │ │ │ -
126 {
│ │ │ │ -
127 std::copy( corners, corners + nBaseCorners, corners + nBaseCorners );
│ │ │ │ -
128 for( unsigned int i = 0; i < nBaseCorners; ++i )
│ │ │ │ -
129 corners[ i+nBaseCorners ][ dim-1 ] = ct( 1 );
│ │ │ │ -
130 return 2*nBaseCorners;
│ │ │ │ -
131 }
│ │ │ │ -
132 else
│ │ │ │ -
133 {
│ │ │ │ -
134 corners[ nBaseCorners ] = FieldVector< ct, cdim >( ct( 0 ) );
│ │ │ │ -
135 corners[ nBaseCorners ][ dim-1 ] = ct( 1 );
│ │ │ │ -
136 return nBaseCorners+1;
│ │ │ │ -
137 }
│ │ │ │ -
138 }
│ │ │ │ -
139 else
│ │ │ │ -
140 {
│ │ │ │ -
141 *corners = FieldVector< ct, cdim >( ct( 0 ) );
│ │ │ │ -
142 return 1;
│ │ │ │ -
143 }
│ │ │ │ -
144 }
│ │ │ │ +
89 typedef typename std::conditional<dim==coorddim,
│ │ │ │ +
90 DiagonalMatrix<ctype,dim>,
│ │ │ │ +
91 FieldMatrix<ctype,coorddim,dim> >::type JacobianInverseTransposed;
│ │ │ │ +
92
│ │ │ │ +
100 using Jacobian = std::conditional_t<dim==coorddim, DiagonalMatrix<ctype,dim>, FieldMatrix<ctype,coorddim,dim> >;
│ │ │ │ +
101
│ │ │ │ +
109 using JacobianInverse = std::conditional_t<dim==coorddim, DiagonalMatrix<ctype,dim>, FieldMatrix<ctype,dim,coorddim> >;
│ │ │ │ +
110
│ │ │ │ +
115 AxisAlignedCubeGeometry(const Dune::FieldVector<ctype,coorddim> lower,
│ │ │ │ +
116 const Dune::FieldVector<ctype,coorddim> upper)
│ │ │ │ +
117 : lower_(lower),
│ │ │ │ +
118 upper_(upper),
│ │ │ │ +
119 axes_()
│ │ │ │ +
120 {
│ │ │ │ +
121 static_assert(dim==coorddim, "Use this constructor only if dim==coorddim!");
│ │ │ │ +
122 // all 'true', but is never actually used
│ │ │ │ +
123 axes_ = (1<<coorddim)-1;
│ │ │ │ +
124 }
│ │ │ │ +
125
│ │ │ │ +
133 AxisAlignedCubeGeometry(const Dune::FieldVector<ctype,coorddim> lower,
│ │ │ │ +
134 const Dune::FieldVector<ctype,coorddim> upper,
│ │ │ │ +
135 const std::bitset<coorddim>& axes)
│ │ │ │ +
136 : lower_(lower),
│ │ │ │ +
137 upper_(upper),
│ │ │ │ +
138 axes_(axes)
│ │ │ │ +
139 {
│ │ │ │ +
140 assert(axes.count()==dim);
│ │ │ │ +
141 for (size_t i=0; i<coorddim; i++)
│ │ │ │ +
142 if (not axes_[i])
│ │ │ │ +
143 upper_[i] = lower_[i];
│ │ │ │ +
144 }
│ │ │ │
145
│ │ │ │ -
146
│ │ │ │ -
147
│ │ │ │ -
148 // referenceVolume
│ │ │ │ -
149 // ---------------
│ │ │ │ -
150
│ │ │ │ -
151 unsigned long referenceVolumeInverse ( unsigned int topologyId, int dim );
│ │ │ │ -
152
│ │ │ │ -
153 template< class ct >
│ │ │ │ -
154 inline ct referenceVolume ( unsigned int topologyId, int dim )
│ │ │ │ -
155 {
│ │ │ │ -
156 return ct( 1 ) / ct( referenceVolumeInverse( topologyId, dim ) );
│ │ │ │ -
157 }
│ │ │ │ -
158
│ │ │ │ +
150 AxisAlignedCubeGeometry(const Dune::FieldVector<ctype,coorddim> lower)
│ │ │ │ +
151 : lower_(lower)
│ │ │ │ +
152 {}
│ │ │ │ +
153
│ │ │ │ + │ │ │ │ +
156 {
│ │ │ │ +
157 return GeometryTypes::cube(dim);
│ │ │ │ +
158 }
│ │ │ │
159
│ │ │ │ -
160
│ │ │ │ -
161 // referenceOrigins
│ │ │ │ -
162 // ----------------
│ │ │ │ -
163
│ │ │ │ -
164 template< class ct, int cdim >
│ │ │ │ -
165 inline unsigned int
│ │ │ │ -
166 referenceOrigins ( unsigned int topologyId, int dim, int codim, FieldVector< ct, cdim > *origins )
│ │ │ │ -
167 {
│ │ │ │ -
168 assert( (dim >= 0) && (dim <= cdim) );
│ │ │ │ -
169 assert( topologyId < numTopologies( dim ) );
│ │ │ │ -
170 assert( (codim >= 0) && (codim <= dim) );
│ │ │ │ -
171
│ │ │ │ -
172 if( codim > 0 )
│ │ │ │ -
173 {
│ │ │ │ -
174 const unsigned int baseId = baseTopologyId( topologyId, dim );
│ │ │ │ -
175 if( isPrism( topologyId, dim ) )
│ │ │ │ -
176 {
│ │ │ │ -
177 const unsigned int n = (codim < dim ? referenceOrigins( baseId, dim-1, codim, origins ) : 0);
│ │ │ │ -
178 const unsigned int m = referenceOrigins( baseId, dim-1, codim-1, origins+n );
│ │ │ │ -
179 for( unsigned int i = 0; i < m; ++i )
│ │ │ │ -
180 {
│ │ │ │ -
181 origins[ n+m+i ] = origins[ n+i ];
│ │ │ │ -
182 origins[ n+m+i ][ dim-1 ] = ct( 1 );
│ │ │ │ -
183 }
│ │ │ │ -
184 return n+2*m;
│ │ │ │ -
185 }
│ │ │ │ -
186 else
│ │ │ │ -
187 {
│ │ │ │ -
188 const unsigned int m = referenceOrigins( baseId, dim-1, codim-1, origins );
│ │ │ │ -
189 if( codim == dim )
│ │ │ │ -
190 {
│ │ │ │ -
191 origins[ m ] = FieldVector< ct, cdim >( ct( 0 ) );
│ │ │ │ -
192 origins[ m ][ dim-1 ] = ct( 1 );
│ │ │ │ -
193 return m+1;
│ │ │ │ -
194 }
│ │ │ │ -
195 else
│ │ │ │ -
196 return m+referenceOrigins( baseId, dim-1, codim, origins+m );
│ │ │ │ -
197 }
│ │ │ │ -
198 }
│ │ │ │ -
199 else
│ │ │ │ -
200 {
│ │ │ │ -
201 origins[ 0 ] = FieldVector< ct, cdim >( ct( 0 ) );
│ │ │ │ -
202 return 1;
│ │ │ │ -
203 }
│ │ │ │ -
204 }
│ │ │ │ -
205
│ │ │ │ + │ │ │ │ +
162 {
│ │ │ │ +
163 GlobalCoordinate result;
│ │ │ │ +
164 if (dim == coorddim) { // fast case
│ │ │ │ +
165 for (size_t i=0; i<coorddim; i++)
│ │ │ │ +
166 result[i] = lower_[i] + local[i]*(upper_[i] - lower_[i]);
│ │ │ │ +
167 } else if (dim == 0) { // a vertex -- the other fast case
│ │ │ │ +
168 result = lower_; // hope for named-return-type-optimization
│ │ │ │ +
169 } else { // slow case
│ │ │ │ +
170 size_t lc=0;
│ │ │ │ +
171 for (size_t i=0; i<coorddim; i++)
│ │ │ │ +
172 result[i] = (axes_[i])
│ │ │ │ +
173 ? lower_[i] + local[lc++]*(upper_[i] - lower_[i])
│ │ │ │ +
174 : lower_[i];
│ │ │ │ +
175 }
│ │ │ │ +
176 return result;
│ │ │ │ +
177 }
│ │ │ │ +
178
│ │ │ │ + │ │ │ │ +
181 {
│ │ │ │ +
182 LocalCoordinate result;
│ │ │ │ +
183 if (dim == coorddim) { // fast case
│ │ │ │ +
184 for (size_t i=0; i<dim; i++)
│ │ │ │ +
185 result[i] = (global[i] - lower_[i]) / (upper_[i] - lower_[i]);
│ │ │ │ +
186 } else if (dim != 0) { // slow case
│ │ │ │ +
187 size_t lc=0;
│ │ │ │ +
188 for (size_t i=0; i<coorddim; i++)
│ │ │ │ +
189 if (axes_[i])
│ │ │ │ +
190 result[lc++] = (global[i] - lower_[i]) / (upper_[i] - lower_[i]);
│ │ │ │ +
191 }
│ │ │ │ +
192 return result;
│ │ │ │ +
193 }
│ │ │ │ +
194
│ │ │ │ + │ │ │ │ +
197 {
│ │ │ │ +
198 JacobianTransposed result;
│ │ │ │ +
199
│ │ │ │ +
200 // Actually compute the result. Uses different methods depending
│ │ │ │ +
201 // on what kind of matrix JacobianTransposed is.
│ │ │ │ +
202 jacobianTransposed(result);
│ │ │ │ +
203
│ │ │ │ +
204 return result;
│ │ │ │ +
205 }
│ │ │ │
206
│ │ │ │ -
207
│ │ │ │ -
208 // referenceEmbeddings
│ │ │ │ -
209 // -------------------
│ │ │ │ -
210
│ │ │ │ -
211 template< class ct, int cdim, int mydim >
│ │ │ │ -
212 inline unsigned int
│ │ │ │ -
213 referenceEmbeddings ( unsigned int topologyId, int dim, int codim,
│ │ │ │ -
214 FieldVector< ct, cdim > *origins,
│ │ │ │ -
215 FieldMatrix< ct, mydim, cdim > *jacobianTransposeds )
│ │ │ │ -
216 {
│ │ │ │ -
217 assert( (0 <= codim) && (codim <= dim) && (dim <= cdim) );
│ │ │ │ -
218 assert( (dim - codim <= mydim) && (mydim <= cdim) );
│ │ │ │ -
219 assert( topologyId < numTopologies( dim ) );
│ │ │ │ -
220
│ │ │ │ -
221 if( codim > 0 )
│ │ │ │ -
222 {
│ │ │ │ -
223 const unsigned int baseId = baseTopologyId( topologyId, dim );
│ │ │ │ -
224 if( isPrism( topologyId, dim ) )
│ │ │ │ -
225 {
│ │ │ │ -
226 const unsigned int n = (codim < dim ? referenceEmbeddings( baseId, dim-1, codim, origins, jacobianTransposeds ) : 0);
│ │ │ │ -
227 for( unsigned int i = 0; i < n; ++i )
│ │ │ │ -
228 jacobianTransposeds[ i ][ dim-codim-1 ][ dim-1 ] = ct( 1 );
│ │ │ │ -
229
│ │ │ │ -
230 const unsigned int m = referenceEmbeddings( baseId, dim-1, codim-1, origins+n, jacobianTransposeds+n );
│ │ │ │ -
231 std::copy( origins+n, origins+n+m, origins+n+m );
│ │ │ │ -
232 std::copy( jacobianTransposeds+n, jacobianTransposeds+n+m, jacobianTransposeds+n+m );
│ │ │ │ -
233 for( unsigned int i = 0; i < m; ++i )
│ │ │ │ -
234 origins[ n+m+i ][ dim-1 ] = ct( 1 );
│ │ │ │ -
235
│ │ │ │ -
236 return n+2*m;
│ │ │ │ -
237 }
│ │ │ │ -
238 else
│ │ │ │ -
239 {
│ │ │ │ -
240 const unsigned int m = referenceEmbeddings( baseId, dim-1, codim-1, origins, jacobianTransposeds );
│ │ │ │ -
241 if( codim == dim )
│ │ │ │ -
242 {
│ │ │ │ -
243 origins[ m ] = FieldVector< ct, cdim >( ct( 0 ) );
│ │ │ │ -
244 origins[ m ][ dim-1 ] = ct( 1 );
│ │ │ │ -
245 jacobianTransposeds[ m ] = FieldMatrix< ct, mydim, cdim >( ct( 0 ) );
│ │ │ │ -
246 return m+1;
│ │ │ │ -
247 }
│ │ │ │ -
248 else
│ │ │ │ -
249 {
│ │ │ │ -
250 const unsigned int n = referenceEmbeddings( baseId, dim-1, codim, origins+m, jacobianTransposeds+m );
│ │ │ │ -
251 for( unsigned int i = 0; i < n; ++i )
│ │ │ │ -
252 {
│ │ │ │ -
253 for( int k = 0; k < dim-1; ++k )
│ │ │ │ -
254 jacobianTransposeds[ m+i ][ dim-codim-1 ][ k ] = -origins[ m+i ][ k ];
│ │ │ │ -
255 jacobianTransposeds[ m+i ][ dim-codim-1 ][ dim-1 ] = ct( 1 );
│ │ │ │ -
256 }
│ │ │ │ -
257 return m+n;
│ │ │ │ -
258 }
│ │ │ │ -
259 }
│ │ │ │ -
260 }
│ │ │ │ -
261 else
│ │ │ │ -
262 {
│ │ │ │ -
263 origins[ 0 ] = FieldVector< ct, cdim >( ct( 0 ) );
│ │ │ │ -
264 jacobianTransposeds[ 0 ] = FieldMatrix< ct, mydim, cdim >( ct( 0 ) );
│ │ │ │ -
265 for( int k = 0; k < dim; ++k )
│ │ │ │ -
266 jacobianTransposeds[ 0 ][ k ][ k ] = ct( 1 );
│ │ │ │ -
267 return 1;
│ │ │ │ -
268 }
│ │ │ │ -
269 }
│ │ │ │ + │ │ │ │ +
209 {
│ │ │ │ + │ │ │ │ +
211
│ │ │ │ +
212 // Actually compute the result. Uses different methods depending
│ │ │ │ +
213 // on what kind of matrix JacobianTransposed is.
│ │ │ │ + │ │ │ │ +
215
│ │ │ │ +
216 return result;
│ │ │ │ +
217 }
│ │ │ │ +
218
│ │ │ │ +
220 Jacobian jacobian([[maybe_unused]] const LocalCoordinate& local) const
│ │ │ │ +
221 {
│ │ │ │ +
222 return jacobianTransposed(local).transposed();
│ │ │ │ +
223 }
│ │ │ │ +
224
│ │ │ │ + │ │ │ │ +
227 {
│ │ │ │ +
228 return jacobianInverseTransposed(local).transposed();
│ │ │ │ +
229 }
│ │ │ │ +
230
│ │ │ │ +
234 Volume integrationElement([[maybe_unused]] const LocalCoordinate& local) const
│ │ │ │ +
235 {
│ │ │ │ +
236 return volume();
│ │ │ │ +
237 }
│ │ │ │ +
238
│ │ │ │ + │ │ │ │ +
241 {
│ │ │ │ +
242 GlobalCoordinate result;
│ │ │ │ +
243 if (dim==0)
│ │ │ │ +
244 result = lower_;
│ │ │ │ +
245 else {
│ │ │ │ +
246 // Since lower_==upper_ for unused coordinates, this always does the right thing
│ │ │ │ +
247 for (size_t i=0; i<coorddim; i++)
│ │ │ │ +
248 result[i] = CoordType(0.5) * (lower_[i] + upper_[i]);
│ │ │ │ +
249 }
│ │ │ │ +
250 return result;
│ │ │ │ +
251 }
│ │ │ │ +
252
│ │ │ │ +
254 int corners() const
│ │ │ │ +
255 {
│ │ │ │ +
256 return 1<<dim;
│ │ │ │ +
257 }
│ │ │ │ +
258
│ │ │ │ + │ │ │ │ +
261 {
│ │ │ │ +
262 GlobalCoordinate result;
│ │ │ │ +
263 if (dim == coorddim) { // fast case
│ │ │ │ +
264 for (size_t i=0; i<coorddim; i++)
│ │ │ │ +
265 result[i] = (k & (1<<i)) ? upper_[i] : lower_[i];
│ │ │ │ +
266 } else if (dim == 0) { // vertex
│ │ │ │ +
267 result = lower_; // rely on named return-type optimization
│ │ │ │ +
268 } else { // slow case
│ │ │ │ +
269 unsigned int mask = 1;
│ │ │ │
270
│ │ │ │ -
271
│ │ │ │ -
272
│ │ │ │ -
273 // referenceIntegrationOuterNormals
│ │ │ │ -
274 // --------------------------------
│ │ │ │ -
275
│ │ │ │ -
276 template< class ct, int cdim >
│ │ │ │ -
277 inline unsigned int
│ │ │ │ -
278 referenceIntegrationOuterNormals ( unsigned int topologyId, int dim,
│ │ │ │ -
279 const FieldVector< ct, cdim > *origins,
│ │ │ │ -
280 FieldVector< ct, cdim > *normals )
│ │ │ │ -
281 {
│ │ │ │ -
282 assert( (dim > 0) && (dim <= cdim) );
│ │ │ │ -
283 assert( topologyId < numTopologies( dim ) );
│ │ │ │ +
271 for (size_t i=0; i<coorddim; i++) {
│ │ │ │ +
272 if (not axes_[i])
│ │ │ │ +
273 result[i] = lower_[i];
│ │ │ │ +
274 else {
│ │ │ │ +
275 result[i] = (k & mask) ? upper_[i] : lower_[i];
│ │ │ │ +
276 mask = (mask<<1);
│ │ │ │ +
277 }
│ │ │ │ +
278 }
│ │ │ │ +
279 }
│ │ │ │ +
280
│ │ │ │ +
281
│ │ │ │ +
282 return result;
│ │ │ │ +
283 }
│ │ │ │
284
│ │ │ │ -
285 if( dim > 1 )
│ │ │ │ -
286 {
│ │ │ │ -
287 const unsigned int baseId = baseTopologyId( topologyId, dim );
│ │ │ │ -
288 if( isPrism( topologyId, dim ) )
│ │ │ │ -
289 {
│ │ │ │ -
290 const unsigned int numBaseFaces
│ │ │ │ -
291 = referenceIntegrationOuterNormals( baseId, dim-1, origins, normals );
│ │ │ │ -
292
│ │ │ │ -
293 for( unsigned int i = 0; i < 2; ++i )
│ │ │ │ -
294 {
│ │ │ │ -
295 normals[ numBaseFaces+i ] = FieldVector< ct, cdim >( ct( 0 ) );
│ │ │ │ -
296 normals[ numBaseFaces+i ][ dim-1 ] = ct( 2*int( i )-1 );
│ │ │ │ -
297 }
│ │ │ │ -
298
│ │ │ │ -
299 return numBaseFaces+2;
│ │ │ │ -
300 }
│ │ │ │ -
301 else
│ │ │ │ -
302 {
│ │ │ │ -
303 normals[ 0 ] = FieldVector< ct, cdim >( ct( 0 ) );
│ │ │ │ -
304 normals[ 0 ][ dim-1 ] = ct( -1 );
│ │ │ │ -
305
│ │ │ │ -
306 const unsigned int numBaseFaces
│ │ │ │ -
307 = referenceIntegrationOuterNormals( baseId, dim-1, origins+1, normals+1 );
│ │ │ │ -
308 for( unsigned int i = 1; i <= numBaseFaces; ++i )
│ │ │ │ -
309 normals[ i ][ dim-1 ] = normals[ i ]*origins[ i ];
│ │ │ │ -
310
│ │ │ │ -
311 return numBaseFaces+1;
│ │ │ │ -
312 }
│ │ │ │ -
313 }
│ │ │ │ -
314 else
│ │ │ │ -
315 {
│ │ │ │ -
316 for( unsigned int i = 0; i < 2; ++i )
│ │ │ │ -
317 {
│ │ │ │ -
318 normals[ i ] = FieldVector< ct, cdim >( ct( 0 ) );
│ │ │ │ -
319 normals[ i ][ 0 ] = ct( 2*int( i )-1 );
│ │ │ │ -
320 }
│ │ │ │ -
321
│ │ │ │ -
322 return 2;
│ │ │ │ -
323 }
│ │ │ │ -
324 }
│ │ │ │ + │ │ │ │ +
287 {
│ │ │ │ +
288 ctype vol = 1;
│ │ │ │ +
289 if (dim == coorddim) { // fast case
│ │ │ │ +
290 for (size_t i=0; i<dim; i++)
│ │ │ │ +
291 vol *= upper_[i] - lower_[i];
│ │ │ │ +
292 // do nothing if dim == 0
│ │ │ │ +
293 } else if (dim != 0) { // slow case
│ │ │ │ +
294 for (size_t i=0; i<coorddim; i++)
│ │ │ │ +
295 if (axes_[i])
│ │ │ │ +
296 vol *= upper_[i] - lower_[i];
│ │ │ │ +
297 }
│ │ │ │ +
298 return vol;
│ │ │ │ +
299 }
│ │ │ │ +
300
│ │ │ │ +
302 bool affine() const
│ │ │ │ +
303 {
│ │ │ │ +
304 return true;
│ │ │ │ +
305 }
│ │ │ │ +
306
│ │ │ │ + │ │ │ │ +
308 {
│ │ │ │ + │ │ │ │ +
310 }
│ │ │ │ +
311
│ │ │ │ +
312 private:
│ │ │ │ +
313 // jacobianTransposed: fast case --> diagonal matrix
│ │ │ │ +
314 void jacobianTransposed ( DiagonalMatrix<ctype,dim> &jacobianTransposed ) const
│ │ │ │ +
315 {
│ │ │ │ +
316 for (size_t i=0; i<dim; i++)
│ │ │ │ +
317 jacobianTransposed.diagonal()[i] = upper_[i] - lower_[i];
│ │ │ │ +
318 }
│ │ │ │ +
319
│ │ │ │ +
320 // jacobianTransposed: slow case --> dense matrix
│ │ │ │ +
321 void jacobianTransposed ( FieldMatrix<ctype,dim,coorddim> &jacobianTransposed ) const
│ │ │ │ +
322 {
│ │ │ │ +
323 if (dim==0)
│ │ │ │ +
324 return;
│ │ │ │
325
│ │ │ │ -
326 template< class ct, int cdim >
│ │ │ │ -
327 inline unsigned int
│ │ │ │ -
328 referenceIntegrationOuterNormals ( unsigned int topologyId, int dim,
│ │ │ │ -
329 FieldVector< ct, cdim > *normals )
│ │ │ │ -
330 {
│ │ │ │ -
331 assert( (dim > 0) && (dim <= cdim) );
│ │ │ │ -
332
│ │ │ │ -
333 FieldVector< ct, cdim > *origins
│ │ │ │ -
334 = new FieldVector< ct, cdim >[ size( topologyId, dim, 1 ) ];
│ │ │ │ -
335 referenceOrigins( topologyId, dim, 1, origins );
│ │ │ │ -
336
│ │ │ │ -
337 const unsigned int numFaces
│ │ │ │ -
338 = referenceIntegrationOuterNormals( topologyId, dim, origins, normals );
│ │ │ │ -
339 assert( numFaces == size( topologyId, dim, 1 ) );
│ │ │ │ -
340
│ │ │ │ -
341 delete[] origins;
│ │ │ │ -
342
│ │ │ │ -
343 return numFaces;
│ │ │ │ -
344 }
│ │ │ │ -
345
│ │ │ │ -
346 } // namespace Impl
│ │ │ │ -
347
│ │ │ │ -
348
│ │ │ │ -
349
│ │ │ │ -
350 // ReferenceElement
│ │ │ │ -
351 // ----------------
│ │ │ │ +
326 size_t lc = 0;
│ │ │ │ +
327 for (size_t i=0; i<coorddim; i++)
│ │ │ │ +
328 if (axes_[i])
│ │ │ │ +
329 jacobianTransposed[lc++][i] = upper_[i] - lower_[i];
│ │ │ │ +
330 }
│ │ │ │ +
331
│ │ │ │ +
332 // jacobianInverseTransposed: fast case --> diagonal matrix
│ │ │ │ +
333 void jacobianInverseTransposed ( DiagonalMatrix<ctype,dim> &jacobianInverseTransposed ) const
│ │ │ │ +
334 {
│ │ │ │ +
335 for (size_t i=0; i<dim; i++)
│ │ │ │ +
336 jacobianInverseTransposed.diagonal()[i] = CoordType(1.0) / (upper_[i] - lower_[i]);
│ │ │ │ +
337 }
│ │ │ │ +
338
│ │ │ │ +
339 // jacobianInverseTransposed: slow case --> dense matrix
│ │ │ │ +
340 void jacobianInverseTransposed ( FieldMatrix<ctype,coorddim,dim> &jacobianInverseTransposed ) const
│ │ │ │ +
341 {
│ │ │ │ +
342 if (dim==0)
│ │ │ │ +
343 return;
│ │ │ │ +
344
│ │ │ │ +
345 size_t lc = 0;
│ │ │ │ +
346 for (size_t i=0; i<coorddim; i++)
│ │ │ │ +
347 if (axes_[i])
│ │ │ │ +
348 jacobianInverseTransposed[i][lc++] = CoordType(1.0) / (upper_[i] - lower_[i]);
│ │ │ │ +
349 }
│ │ │ │ +
350
│ │ │ │ +
351 Dune::FieldVector<ctype,coorddim> lower_;
│ │ │ │
352
│ │ │ │ -
371 template< class ctype_, int dim >
│ │ │ │ -
372 class ReferenceElementImplementation
│ │ │ │ -
373 {
│ │ │ │ -
374
│ │ │ │ -
375 public:
│ │ │ │ -
376
│ │ │ │ -
378 using ctype = ctype_;
│ │ │ │ -
379
│ │ │ │ -
381 using CoordinateField = ctype;
│ │ │ │ -
382
│ │ │ │ -
384 using Coordinate = Dune::FieldVector<ctype,dim>;
│ │ │ │ -
385
│ │ │ │ -
387 static constexpr int dimension = dim;
│ │ │ │ -
388
│ │ │ │ -
390 typedef ctype Volume;
│ │ │ │ -
391
│ │ │ │ -
392 private:
│ │ │ │ -
393
│ │ │ │ -
394 friend class Impl::ReferenceElementContainer< ctype, dim >;
│ │ │ │ -
395
│ │ │ │ -
396 struct SubEntityInfo;
│ │ │ │ -
397
│ │ │ │ -
398 template< int codim > struct CreateGeometries;
│ │ │ │ -
399
│ │ │ │ -
400 public:
│ │ │ │ -
402 template< int codim >
│ │ │ │ -
403 struct Codim
│ │ │ │ -
404 {
│ │ │ │ -
406 typedef AffineGeometry< ctype, dim-codim, dim > Geometry;
│ │ │ │ -
407 };
│ │ │ │ -
408
│ │ │ │ -
409 // ReferenceElement cannot be copied.
│ │ │ │ -
410 ReferenceElementImplementation ( const ReferenceElementImplementation& ) = delete;
│ │ │ │ -
411
│ │ │ │ -
412 // ReferenceElementImplementation cannot be copied.
│ │ │ │ -
413 ReferenceElementImplementation& operator= ( const ReferenceElementImplementation& ) = delete;
│ │ │ │ -
414
│ │ │ │ -
415 // ReferenceElementImplementation is default-constructible (required for storage in std::array)
│ │ │ │ -
416 ReferenceElementImplementation () = default;
│ │ │ │ -
417
│ │ │ │ -
422 int size ( int c ) const
│ │ │ │ -
423 {
│ │ │ │ -
424 assert( (c >= 0) && (c <= dim) );
│ │ │ │ -
425 return info_[ c ].size();
│ │ │ │ -
426 }
│ │ │ │ -
427
│ │ │ │ -
439 int size ( int i, int c, int cc ) const
│ │ │ │ -
440 {
│ │ │ │ -
441 assert( (i >= 0) && (i < size( c )) );
│ │ │ │ -
442 return info_[ c ][ i ].size( cc );
│ │ │ │ -
443 }
│ │ │ │ -
444
│ │ │ │ -
458 int subEntity ( int i, int c, int ii, int cc ) const
│ │ │ │ -
459 {
│ │ │ │ -
460 assert( (i >= 0) && (i < size( c )) );
│ │ │ │ -
461 return info_[ c ][ i ].number( ii, cc );
│ │ │ │ -
462 }
│ │ │ │ -
463
│ │ │ │ -
479 auto subEntities ( int i, int c, int cc ) const
│ │ │ │ -
480 {
│ │ │ │ -
481 assert( (i >= 0) && (i < size( c )) );
│ │ │ │ -
482 return info_[ c ][ i ].numbers( cc );
│ │ │ │ -
483 }
│ │ │ │ -
484
│ │ │ │ -
493 const GeometryType &type ( int i, int c ) const
│ │ │ │ -
494 {
│ │ │ │ -
495 assert( (i >= 0) && (i < size( c )) );
│ │ │ │ -
496 return info_[ c ][ i ].type();
│ │ │ │ -
497 }
│ │ │ │ -
498
│ │ │ │ -
500 const GeometryType &type () const { return type( 0, 0 ); }
│ │ │ │ -
501
│ │ │ │ -
511 const Coordinate &position( int i, int c ) const
│ │ │ │ -
512 {
│ │ │ │ -
513 assert( (c >= 0) && (c <= dim) );
│ │ │ │ -
514 return baryCenters_[ c ][ i ];
│ │ │ │ -
515 }
│ │ │ │ -
516
│ │ │ │ -
524 bool checkInside ( const Coordinate &local ) const
│ │ │ │ -
525 {
│ │ │ │ -
526 const ctype tolerance = ctype( 64 ) * std::numeric_limits< ctype >::epsilon();
│ │ │ │ -
527 return Impl::template checkInside< ctype, dim >( type().id(), dim, local, tolerance );
│ │ │ │ -
528 }
│ │ │ │ -
529
│ │ │ │ -
541 template< int codim >
│ │ │ │ -
542 typename Codim< codim >::Geometry geometry ( int i ) const
│ │ │ │ -
543 {
│ │ │ │ -
544 return std::get< codim >( geometries_ )[ i ];
│ │ │ │ -
545 }
│ │ │ │ -
546
│ │ │ │ -
548 Volume volume () const
│ │ │ │ -
549 {
│ │ │ │ -
550 return volume_;
│ │ │ │ -
551 }
│ │ │ │ -
552
│ │ │ │ -
560 const Coordinate &integrationOuterNormal ( int face ) const
│ │ │ │ -
561 {
│ │ │ │ -
562 assert( (face >= 0) && (face < int( integrationNormals_.size() )) );
│ │ │ │ -
563 return integrationNormals_[ face ];
│ │ │ │ -
564 }
│ │ │ │ -
565
│ │ │ │ -
566 private:
│ │ │ │ -
567 void initialize ( unsigned int topologyId )
│ │ │ │ -
568 {
│ │ │ │ -
569 assert( topologyId < Impl::numTopologies( dim ) );
│ │ │ │ -
570
│ │ │ │ -
571 // set up subentities
│ │ │ │ -
572 for( int codim = 0; codim <= dim; ++codim )
│ │ │ │ -
573 {
│ │ │ │ -
574 const unsigned int size = Impl::size( topologyId, dim, codim );
│ │ │ │ -
575 info_[ codim ].resize( size );
│ │ │ │ -
576 for( unsigned int i = 0; i < size; ++i )
│ │ │ │ -
577 info_[ codim ][ i ].initialize( topologyId, codim, i );
│ │ │ │ -
578 }
│ │ │ │ -
579
│ │ │ │ -
580 // compute corners
│ │ │ │ -
581 const unsigned int numVertices = size( dim );
│ │ │ │ -
582 baryCenters_[ dim ].resize( numVertices );
│ │ │ │ -
583 Impl::referenceCorners( topologyId, dim, &(baryCenters_[ dim ][ 0 ]) );
│ │ │ │ -
584
│ │ │ │ -
585 // compute barycenters
│ │ │ │ -
586 for( int codim = 0; codim < dim; ++codim )
│ │ │ │ -
587 {
│ │ │ │ -
588 baryCenters_[ codim ].resize( size(codim) );
│ │ │ │ -
589 for( int i = 0; i < size( codim ); ++i )
│ │ │ │ -
590 {
│ │ │ │ -
591 baryCenters_[ codim ][ i ] = Coordinate( ctype( 0 ) );
│ │ │ │ -
592 const unsigned int numCorners = size( i, codim, dim );
│ │ │ │ -
593 for( unsigned int j = 0; j < numCorners; ++j )
│ │ │ │ -
594 baryCenters_[ codim ][ i ] += baryCenters_[ dim ][ subEntity( i, codim, j, dim ) ];
│ │ │ │ -
595 baryCenters_[ codim ][ i ] *= ctype( 1 ) / ctype( numCorners );
│ │ │ │ -
596 }
│ │ │ │ -
597 }
│ │ │ │ -
598
│ │ │ │ -
599 // compute reference element volume
│ │ │ │ -
600 volume_ = Impl::template referenceVolume< ctype >( topologyId, dim );
│ │ │ │ -
601
│ │ │ │ -
602 // compute integration outer normals
│ │ │ │ -
603 if( dim > 0 )
│ │ │ │ -
604 {
│ │ │ │ -
605 integrationNormals_.resize( size( 1 ) );
│ │ │ │ -
606 Impl::referenceIntegrationOuterNormals( topologyId, dim, &(integrationNormals_[ 0 ]) );
│ │ │ │ -
607 }
│ │ │ │ -
608
│ │ │ │ -
609 // set up geometries
│ │ │ │ -
610 Hybrid::forEach( std::make_index_sequence< dim+1 >{}, [ & ]( auto i ){ CreateGeometries< i >::apply( *this, geometries_ ); } );
│ │ │ │ -
611 }
│ │ │ │ -
612
│ │ │ │ -
613 template< int... codim >
│ │ │ │ -
614 static std::tuple< std::vector< typename Codim< codim >::Geometry >... >
│ │ │ │ -
615 makeGeometryTable ( std::integer_sequence< int, codim... > );
│ │ │ │ -
616
│ │ │ │ -
618 typedef decltype( makeGeometryTable( std::make_integer_sequence< int, dim+1 >() ) ) GeometryTable;
│ │ │ │ -
619
│ │ │ │ -
621 ctype volume_;
│ │ │ │ -
622
│ │ │ │ -
623 std::vector< Coordinate > baryCenters_[ dim+1 ];
│ │ │ │ -
624 std::vector< Coordinate > integrationNormals_;
│ │ │ │ -
625
│ │ │ │ -
627 GeometryTable geometries_;
│ │ │ │ -
628
│ │ │ │ -
629 std::vector< SubEntityInfo > info_[ dim+1 ];
│ │ │ │ -
630 };
│ │ │ │ -
631
│ │ │ │ -
633 template< class ctype, int dim >
│ │ │ │ -
634 struct ReferenceElementImplementation< ctype, dim >::SubEntityInfo
│ │ │ │ -
635 {
│ │ │ │ -
636 // Compute upper bound for the number of subsentities.
│ │ │ │ -
637 // If someone knows an explicit formal feel free to
│ │ │ │ -
638 // implement it here.
│ │ │ │ -
639 static constexpr std::size_t maxSubEntityCount()
│ │ │ │ -
640 {
│ │ │ │ -
641 std::size_t maxCount=0;
│ │ │ │ -
642 for(std::size_t codim=0; codim<=dim; ++codim)
│ │ │ │ -
643 maxCount = std::max(maxCount, binomial(std::size_t(dim),codim)*(1 << codim));
│ │ │ │ -
644 return maxCount;
│ │ │ │ -
645 }
│ │ │ │ -
646
│ │ │ │ -
647 using SubEntityFlags = std::bitset<maxSubEntityCount()>;
│ │ │ │ -
648
│ │ │ │ -
649 class SubEntityRange
│ │ │ │ -
650 : public Dune::IteratorRange<const unsigned int*>
│ │ │ │ -
651 {
│ │ │ │ -
652 using Base = typename Dune::IteratorRange<const unsigned int*>;
│ │ │ │ -
653
│ │ │ │ -
654 public:
│ │ │ │ -
655
│ │ │ │ -
656 using iterator = Base::iterator;
│ │ │ │ -
657 using const_iterator = Base::const_iterator;
│ │ │ │ -
658
│ │ │ │ -
659 SubEntityRange(const iterator& begin, const iterator& end, const SubEntityFlags& contains) :
│ │ │ │ -
660 Base(begin, end),
│ │ │ │ -
661 containsPtr_(&contains),
│ │ │ │ -
662 size_(end-begin)
│ │ │ │ -
663 {}
│ │ │ │ -
664
│ │ │ │ -
665 SubEntityRange() :
│ │ │ │ -
666 Base(),
│ │ │ │ -
667 containsPtr_(nullptr),
│ │ │ │ -
668 size_(0)
│ │ │ │ -
669 {}
│ │ │ │ -
670
│ │ │ │ -
671 std::size_t size() const
│ │ │ │ -
672 {
│ │ │ │ -
673 return size_;
│ │ │ │ -
674 }
│ │ │ │ -
675
│ │ │ │ -
676 bool contains(std::size_t i) const
│ │ │ │ -
677 {
│ │ │ │ -
678 return (*containsPtr_)[i];
│ │ │ │ -
679 }
│ │ │ │ -
680
│ │ │ │ -
681 private:
│ │ │ │ -
682 const SubEntityFlags* containsPtr_;
│ │ │ │ -
683 std::size_t size_;
│ │ │ │ -
684 std::size_t offset_;
│ │ │ │ -
685 };
│ │ │ │ -
686
│ │ │ │ -
687 using NumberRange = typename Dune::IteratorRange<const unsigned int*>;
│ │ │ │ -
688
│ │ │ │ -
689 SubEntityInfo ()
│ │ │ │ -
690 : numbering_( nullptr )
│ │ │ │ -
691 {
│ │ │ │ -
692 std::fill( offset_.begin(), offset_.end(), 0 );
│ │ │ │ -
693 }
│ │ │ │ -
694
│ │ │ │ -
695 SubEntityInfo ( const SubEntityInfo &other )
│ │ │ │ -
696 : offset_( other.offset_ ),
│ │ │ │ -
697 type_( other.type_ ),
│ │ │ │ -
698 containsSubentity_( other.containsSubentity_ )
│ │ │ │ -
699 {
│ │ │ │ -
700 numbering_ = allocate();
│ │ │ │ -
701 std::copy( other.numbering_, other.numbering_ + capacity(), numbering_ );
│ │ │ │ -
702 }
│ │ │ │ -
703
│ │ │ │ -
704 ~SubEntityInfo () { deallocate( numbering_ ); }
│ │ │ │ -
705
│ │ │ │ -
706 const SubEntityInfo &operator= ( const SubEntityInfo &other )
│ │ │ │ -
707 {
│ │ │ │ -
708 type_ = other.type_;
│ │ │ │ -
709 offset_ = other.offset_;
│ │ │ │ -
710
│ │ │ │ -
711 deallocate( numbering_ );
│ │ │ │ -
712 numbering_ = allocate();
│ │ │ │ -
713 std::copy( other.numbering_, other.numbering_ + capacity(), numbering_ );
│ │ │ │ -
714
│ │ │ │ -
715 containsSubentity_ = other.containsSubentity_;
│ │ │ │ -
716
│ │ │ │ -
717 return *this;
│ │ │ │ -
718 }
│ │ │ │ -
719
│ │ │ │ -
720 int size ( int cc ) const
│ │ │ │ -
721 {
│ │ │ │ -
722 assert( (cc >= 0) && (cc <= dim) );
│ │ │ │ -
723 return (offset_[ cc+1 ] - offset_[ cc ]);
│ │ │ │ -
724 }
│ │ │ │ -
725
│ │ │ │ -
726 int number ( int ii, int cc ) const
│ │ │ │ -
727 {
│ │ │ │ -
728 assert( (ii >= 0) && (ii < size( cc )) );
│ │ │ │ -
729 return numbering_[ offset_[ cc ] + ii ];
│ │ │ │ -
730 }
│ │ │ │ -
731
│ │ │ │ -
732 auto numbers ( int cc ) const
│ │ │ │ -
733 {
│ │ │ │ -
734 return SubEntityRange( numbering_ + offset_[ cc ], numbering_ + offset_[ cc+1 ], containsSubentity_[cc]);
│ │ │ │ -
735 }
│ │ │ │ -
736
│ │ │ │ -
737 const GeometryType &type () const { return type_; }
│ │ │ │ -
738
│ │ │ │ -
739 void initialize ( unsigned int topologyId, int codim, unsigned int i )
│ │ │ │ -
740 {
│ │ │ │ -
741 const unsigned int subId = Impl::subTopologyId( topologyId, dim, codim, i );
│ │ │ │ -
742 type_ = GeometryType( subId, dim-codim );
│ │ │ │ -
743
│ │ │ │ -
744 // compute offsets
│ │ │ │ -
745 for( int cc = 0; cc <= codim; ++cc )
│ │ │ │ -
746 offset_[ cc ] = 0;
│ │ │ │ -
747 for( int cc = codim; cc <= dim; ++cc )
│ │ │ │ -
748 offset_[ cc+1 ] = offset_[ cc ] + Impl::size( subId, dim-codim, cc-codim );
│ │ │ │ -
749
│ │ │ │ -
750 // compute subnumbering
│ │ │ │ -
751 deallocate( numbering_ );
│ │ │ │ -
752 numbering_ = allocate();
│ │ │ │ -
753 for( int cc = codim; cc <= dim; ++cc )
│ │ │ │ -
754 Impl::subTopologyNumbering( topologyId, dim, codim, i, cc-codim, numbering_+offset_[ cc ], numbering_+offset_[ cc+1 ] );
│ │ │ │ -
755
│ │ │ │ -
756 // initialize containsSubentity lookup-table
│ │ │ │ -
757 for(std::size_t cc=0; cc<= dim; ++cc)
│ │ │ │ -
758 {
│ │ │ │ -
759 containsSubentity_[cc].reset();
│ │ │ │ -
760 for(std::size_t idx=0; idx<std::size_t(size(cc)); ++idx)
│ │ │ │ -
761 containsSubentity_[cc][number(idx,cc)] = true;
│ │ │ │ -
762 }
│ │ │ │ -
763 }
│ │ │ │ -
764
│ │ │ │ -
765 protected:
│ │ │ │ -
766 int codim () const { return dim - type().dim(); }
│ │ │ │ -
767
│ │ │ │ -
768 unsigned int *allocate () { return (capacity() != 0 ? new unsigned int[ capacity() ] : nullptr); }
│ │ │ │ -
769 void deallocate ( unsigned int *ptr ) { delete[] ptr; }
│ │ │ │ -
770 unsigned int capacity () const { return offset_[ dim+1 ]; }
│ │ │ │ -
771
│ │ │ │ -
772 private:
│ │ │ │ -
773 unsigned int *numbering_;
│ │ │ │ -
774 std::array< unsigned int, dim+2 > offset_;
│ │ │ │ -
775 GeometryType type_;
│ │ │ │ -
776 std::array< SubEntityFlags, dim+1> containsSubentity_;
│ │ │ │ -
777 };
│ │ │ │ -
778
│ │ │ │ -
779
│ │ │ │ -
780 template< class ctype, int dim >
│ │ │ │ -
781 template< int codim >
│ │ │ │ -
782 struct ReferenceElementImplementation< ctype, dim >::CreateGeometries
│ │ │ │ -
783 {
│ │ │ │ -
784 template< int cc >
│ │ │ │ -
785 static typename ReferenceElements< ctype, dim-cc >::ReferenceElement
│ │ │ │ -
786 subRefElement( const ReferenceElementImplementation< ctype, dim > &refElement, int i, std::integral_constant< int, cc > )
│ │ │ │ -
787 {
│ │ │ │ -
788 return ReferenceElements< ctype, dim-cc >::general( refElement.type( i, cc ) );
│ │ │ │ -
789 }
│ │ │ │ -
790
│ │ │ │ - │ │ │ │ -
792 subRefElement(const ReferenceElementImplementation< ctype, dim > &refElement,
│ │ │ │ -
793 [[maybe_unused]] int i, std::integral_constant<int, 0>)
│ │ │ │ -
794 {
│ │ │ │ -
795 return refElement;
│ │ │ │ -
796 }
│ │ │ │ -
797
│ │ │ │ -
798 static void apply ( const ReferenceElementImplementation< ctype, dim > &refElement, GeometryTable &geometries )
│ │ │ │ -
799 {
│ │ │ │ -
800 const int size = refElement.size( codim );
│ │ │ │ -
801 std::vector< FieldVector< ctype, dim > > origins( size );
│ │ │ │ -
802 std::vector< FieldMatrix< ctype, dim - codim, dim > > jacobianTransposeds( size );
│ │ │ │ -
803 Impl::referenceEmbeddings( refElement.type().id(), dim, codim, &(origins[ 0 ]), &(jacobianTransposeds[ 0 ]) );
│ │ │ │ -
804
│ │ │ │ -
805 std::get< codim >( geometries ).reserve( size );
│ │ │ │ -
806 for( int i = 0; i < size; ++i )
│ │ │ │ -
807 {
│ │ │ │ -
808 typename Codim< codim >::Geometry geometry( subRefElement( refElement, i, std::integral_constant< int, codim >() ), origins[ i ], jacobianTransposeds[ i ] );
│ │ │ │ -
809 std::get< codim >( geometries ).push_back( geometry );
│ │ │ │ -
810 }
│ │ │ │ -
811 }
│ │ │ │ -
812 };
│ │ │ │ -
813
│ │ │ │ -
814#endif // DOXYGEN
│ │ │ │ -
815
│ │ │ │ -
816 } // namespace Geo
│ │ │ │ -
817
│ │ │ │ -
818} // namespace Dune
│ │ │ │ -
819
│ │ │ │ -
820#endif // #ifndef DUNE_GEOMETRY_REFERENCEELEMENTIMPLEMENTATION_HH
│ │ │ │ -
An implementation of the Geometry interface for affine geometries.
│ │ │ │ -
A unique label for each type of element that can occur in a grid.
│ │ │ │ - │ │ │ │ -
unspecified-type ReferenceElement
Returns the type of reference element for the argument type T.
Definition: referenceelements.hh:497
│ │ │ │ +
353 Dune::FieldVector<ctype,coorddim> upper_;
│ │ │ │ +
354
│ │ │ │ +
355 std::bitset<coorddim> axes_;
│ │ │ │ +
356 };
│ │ │ │ +
357
│ │ │ │ +
358} // namespace Dune
│ │ │ │ +
359#endif
│ │ │ │ + │ │ │ │ +
A unique label for each type of element that can occur in a grid.
│ │ │ │ +
constexpr GeometryType cube(unsigned int dim)
Returns a GeometryType representing a hypercube of dimension dim.
Definition: type.hh:472
│ │ │ │ +
unspecified-type ReferenceElement
Returns the type of reference element for the argument types T...
Definition: referenceelements.hh:417
│ │ │ │
Definition: affinegeometry.hh:21
│ │ │ │ -
@ size
Definition: quadraturerules.hh:145
│ │ │ │ -
int binomial(int upper, int lower)
calculate
Definition: simplex.cc:305
│ │ │ │ -
typename Container::ReferenceElement ReferenceElement
The reference element type.
Definition: referenceelements.hh:188
│ │ │ │ -
static const ReferenceElement & general(const GeometryType &type)
get general reference elements
Definition: referenceelements.hh:198
│ │ │ │ +
static const ReferenceElement & cube()
get hypercube reference elements
Definition: referenceelements.hh:210
│ │ │ │ +
A geometry implementation for axis-aligned hypercubes.
Definition: axisalignedcubegeometry.hh:50
│ │ │ │ +
Volume volume() const
Return the element volume.
Definition: axisalignedcubegeometry.hh:286
│ │ │ │ +
AxisAlignedCubeGeometry(const Dune::FieldVector< ctype, coorddim > lower, const Dune::FieldVector< ctype, coorddim > upper, const std::bitset< coorddim > &axes)
Constructor from a lower left and an upper right corner.
Definition: axisalignedcubegeometry.hh:133
│ │ │ │ +
AxisAlignedCubeGeometry(const Dune::FieldVector< ctype, coorddim > lower, const Dune::FieldVector< ctype, coorddim > upper)
Constructor from a lower left and an upper right corner.
Definition: axisalignedcubegeometry.hh:115
│ │ │ │ +
JacobianInverse jacobianInverse(const LocalCoordinate &local) const
Inverse Jacobian of the transformation from local to global coordinates.
Definition: axisalignedcubegeometry.hh:226
│ │ │ │ +
JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate &local) const
Inverse Jacobian transposed of the transformation from local to global coordinates.
Definition: axisalignedcubegeometry.hh:208
│ │ │ │ +
std::conditional< dim==coorddim, DiagonalMatrix< ctype, dim >, FieldMatrix< ctype, dim, coorddim > >::type JacobianTransposed
Return type of jacobianTransposed.
Definition: axisalignedcubegeometry.hh:81
│ │ │ │ +
AxisAlignedCubeGeometry(const Dune::FieldVector< ctype, coorddim > lower)
Constructor from a single point only.
Definition: axisalignedcubegeometry.hh:150
│ │ │ │ +
static constexpr int mydimension
Dimension of the cube element.
Definition: axisalignedcubegeometry.hh:56
│ │ │ │ +
static constexpr int coorddimension
Dimension of the world space that the cube element is embedded in.
Definition: axisalignedcubegeometry.hh:59
│ │ │ │ +
GlobalCoordinate corner(int k) const
Return world coordinates of the k-th corner of the element.
Definition: axisalignedcubegeometry.hh:260
│ │ │ │ +
ctype Volume
Type used for volume.
Definition: axisalignedcubegeometry.hh:71
│ │ │ │ +
FieldVector< ctype, dim > LocalCoordinate
Type used for a vector of element coordinates.
Definition: axisalignedcubegeometry.hh:65
│ │ │ │ +
friend Dune::Transitional::ReferenceElement< ctype, Dim< dim > > referenceElement(const AxisAlignedCubeGeometry &)
Definition: axisalignedcubegeometry.hh:307
│ │ │ │ +
JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const
Jacobian transposed of the transformation from local to global coordinates.
Definition: axisalignedcubegeometry.hh:196
│ │ │ │ +
FieldVector< ctype, coorddim > GlobalCoordinate
Type used for a vector of world coordinates.
Definition: axisalignedcubegeometry.hh:68
│ │ │ │ +
LocalCoordinate local(const GlobalCoordinate &global) const
Map a point in global (world) coordinates to element coordinates.
Definition: axisalignedcubegeometry.hh:180
│ │ │ │ +
CoordType ctype
Type used for single coordinate coefficients.
Definition: axisalignedcubegeometry.hh:62
│ │ │ │ +
std::conditional_t< dim==coorddim, DiagonalMatrix< ctype, dim >, FieldMatrix< ctype, coorddim, dim > > Jacobian
Return type of jacobian.
Definition: axisalignedcubegeometry.hh:100
│ │ │ │ +
GeometryType type() const
Type of the cube. Here: a hypercube of the correct dimension.
Definition: axisalignedcubegeometry.hh:155
│ │ │ │ +
int corners() const
Return the number of corners of the element.
Definition: axisalignedcubegeometry.hh:254
│ │ │ │ +
Jacobian jacobian(const LocalCoordinate &local) const
Jacobian of the transformation from local to global coordinates.
Definition: axisalignedcubegeometry.hh:220
│ │ │ │ +
std::conditional< dim==coorddim, DiagonalMatrix< ctype, dim >, FieldMatrix< ctype, coorddim, dim > >::type JacobianInverseTransposed
Return type of jacobianInverseTransposed.
Definition: axisalignedcubegeometry.hh:91
│ │ │ │ +
Volume integrationElement(const LocalCoordinate &local) const
Return the integration element, i.e., the determinant term in the integral transformation formula.
Definition: axisalignedcubegeometry.hh:234
│ │ │ │ +
GlobalCoordinate center() const
Return center of mass of the element.
Definition: axisalignedcubegeometry.hh:240
│ │ │ │ +
bool affine() const
Return if the element is affine. Here: yes.
Definition: axisalignedcubegeometry.hh:302
│ │ │ │ +
std::conditional_t< dim==coorddim, DiagonalMatrix< ctype, dim >, FieldMatrix< ctype, dim, coorddim > > JacobianInverse
Return type of jacobianInverse.
Definition: axisalignedcubegeometry.hh:109
│ │ │ │ +
GlobalCoordinate global(const LocalCoordinate &local) const
Map a point in local (element) coordinates to world coordinates.
Definition: axisalignedcubegeometry.hh:161
│ │ │ │ +
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:125
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,775 +4,439 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ -referenceelementimplementation.hh │ │ │ │ │ +axisalignedcubegeometry.hh │ │ │ │ │ Go_to_the_documentation_of_this_file. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ - 5#ifndef DUNE_GEOMETRY_REFERENCEELEMENTIMPLEMENTATION_HH │ │ │ │ │ - 6#define DUNE_GEOMETRY_REFERENCEELEMENTIMPLEMENTATION_HH │ │ │ │ │ - 7 │ │ │ │ │ - 8#include │ │ │ │ │ - 9 │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ - 13#include │ │ │ │ │ - 14#include │ │ │ │ │ - 15#include │ │ │ │ │ - 16#include │ │ │ │ │ - 17 │ │ │ │ │ - 18#include │ │ │ │ │ - 19#include │ │ │ │ │ - 20#include │ │ │ │ │ - 21#include │ │ │ │ │ - 22#include │ │ │ │ │ - 23#include │ │ │ │ │ + 5 │ │ │ │ │ + 6#ifndef DUNE_GEOMETRY_AXISALIGNED_CUBE_GEOMETRY_HH │ │ │ │ │ + 7#define DUNE_GEOMETRY_AXISALIGNED_CUBE_GEOMETRY_HH │ │ │ │ │ + 8 │ │ │ │ │ + 13#include │ │ │ │ │ + 14 │ │ │ │ │ + 15#include │ │ │ │ │ + 16#include │ │ │ │ │ + 17#include │ │ │ │ │ + 18 │ │ │ │ │ + 19#include │ │ │ │ │ + 20#include │ │ │ │ │ + 21 │ │ │ │ │ + 22 │ │ │ │ │ + 23namespace Dune { │ │ │ │ │ 24 │ │ │ │ │ - 25#include │ │ │ │ │ - 26#include │ │ │ │ │ - 27#include │ │ │ │ │ - 28 │ │ │ │ │ - 29namespace Dune │ │ │ │ │ - 30{ │ │ │ │ │ - 31 │ │ │ │ │ - 32 namespace Geo │ │ │ │ │ - 33 { │ │ │ │ │ - 34 │ │ │ │ │ - 35#ifndef DOXYGEN │ │ │ │ │ - 36 │ │ │ │ │ - 37 // Internal Forward Declarations │ │ │ │ │ - 38 // ----------------------------- │ │ │ │ │ - 39 │ │ │ │ │ - 40 namespace Impl │ │ │ │ │ - 41 { │ │ │ │ │ - 42 template< class ctype, int dim > │ │ │ │ │ - 43 class ReferenceElementContainer; │ │ │ │ │ - 44 } │ │ │ │ │ - 45 │ │ │ │ │ - 46 template< class ctype, int dim > │ │ │ │ │ - 47 struct ReferenceElements; │ │ │ │ │ - 48 │ │ │ │ │ - 49 │ │ │ │ │ - 50 │ │ │ │ │ - 51 namespace Impl │ │ │ │ │ - 52 { │ │ │ │ │ - 53 │ │ │ │ │ - 54 using Dune::Impl::isPrism; │ │ │ │ │ - 55 using Dune::Impl::isPyramid; │ │ │ │ │ - 56 using Dune::Impl::baseTopologyId; │ │ │ │ │ - 57 using Dune::Impl::prismConstruction; │ │ │ │ │ - 58 using Dune::Impl::pyramidConstruction; │ │ │ │ │ - 59 using Dune::Impl::numTopologies; │ │ │ │ │ + 48 template │ │ │ │ │ +49 class AxisAlignedCubeGeometry │ │ │ │ │ + 50 { │ │ │ │ │ + 51 │ │ │ │ │ + 52 │ │ │ │ │ + 53 public: │ │ │ │ │ + 54 │ │ │ │ │ +56 constexpr static int mydimension = dim; │ │ │ │ │ + 57 │ │ │ │ │ +59 constexpr static int coorddimension = coorddim; │ │ │ │ │ 60 │ │ │ │ │ - 62 unsigned int size ( unsigned int topologyId, int dim, int codim ); │ │ │ │ │ +62 typedef CoordType ctype; │ │ │ │ │ 63 │ │ │ │ │ - 64 │ │ │ │ │ - 65 │ │ │ │ │ - 73 unsigned int subTopologyId ( unsigned int topologyId, int dim, int codim, │ │ │ │ │ -unsigned int i ); │ │ │ │ │ - 74 │ │ │ │ │ - 75 │ │ │ │ │ - 76 │ │ │ │ │ - 77 // subTopologyNumbering │ │ │ │ │ - 78 // -------------------- │ │ │ │ │ - 79 │ │ │ │ │ - 80 void subTopologyNumbering ( unsigned int topologyId, int dim, int codim, │ │ │ │ │ -unsigned int i, int subcodim, │ │ │ │ │ - 81 unsigned int *beginOut, unsigned int *endOut ); │ │ │ │ │ +65 typedef FieldVector LocalCoordinate; │ │ │ │ │ + 66 │ │ │ │ │ +68 typedef FieldVector GlobalCoordinate; │ │ │ │ │ + 69 │ │ │ │ │ +71 typedef ctype Volume; │ │ │ │ │ + 72 │ │ │ │ │ + 79 typedef typename std::conditional, │ │ │ │ │ +81 FieldMatrix >::type JacobianTransposed; │ │ │ │ │ 82 │ │ │ │ │ - 83 │ │ │ │ │ - 84 │ │ │ │ │ - 85 │ │ │ │ │ - 86 // checkInside │ │ │ │ │ - 87 // ----------- │ │ │ │ │ - 88 │ │ │ │ │ - 89 template< class ct, int cdim > │ │ │ │ │ - 90 inline bool │ │ │ │ │ - 91 checkInside ( unsigned int topologyId, int dim, const FieldVector< ct, cdim │ │ │ │ │ -> &x, ct tolerance, ct factor = ct( 1 ) ) │ │ │ │ │ - 92 { │ │ │ │ │ - 93 assert( (dim >= 0) && (dim <= cdim) ); │ │ │ │ │ - 94 assert( topologyId < numTopologies( dim ) ); │ │ │ │ │ - 95 │ │ │ │ │ - 96 if( dim > 0 ) │ │ │ │ │ - 97 { │ │ │ │ │ - 98 const ct baseFactor = (isPrism( topologyId, dim ) ? factor : factor - x │ │ │ │ │ -[ dim-1 ]); │ │ │ │ │ - 99 if( (x[ dim-1 ] > -tolerance) && (factor - x[ dim-1 ] > -tolerance) ) │ │ │ │ │ - 100 return checkInside< ct, cdim >( baseTopologyId( topologyId, dim ), dim-1, │ │ │ │ │ -x, tolerance, baseFactor ); │ │ │ │ │ - 101 else │ │ │ │ │ - 102 return false; │ │ │ │ │ - 103 } │ │ │ │ │ - 104 else │ │ │ │ │ - 105 return true; │ │ │ │ │ - 106 } │ │ │ │ │ - 107 │ │ │ │ │ - 108 │ │ │ │ │ - 109 │ │ │ │ │ - 110 // referenceCorners │ │ │ │ │ - 111 // ---------------- │ │ │ │ │ - 112 │ │ │ │ │ - 113 template< class ct, int cdim > │ │ │ │ │ - 114 inline unsigned int │ │ │ │ │ - 115 referenceCorners ( unsigned int topologyId, int dim, FieldVector< ct, cdim │ │ │ │ │ -> *corners ) │ │ │ │ │ - 116 { │ │ │ │ │ - 117 assert( (dim >= 0) && (dim <= cdim) ); │ │ │ │ │ - 118 assert( topologyId < numTopologies( dim ) ); │ │ │ │ │ - 119 │ │ │ │ │ - 120 if( dim > 0 ) │ │ │ │ │ - 121 { │ │ │ │ │ - 122 const unsigned int nBaseCorners │ │ │ │ │ - 123 = referenceCorners( baseTopologyId( topologyId, dim ), dim-1, corners ); │ │ │ │ │ - 124 assert( nBaseCorners == size( baseTopologyId( topologyId, dim ), dim-1, │ │ │ │ │ -dim-1 ) ); │ │ │ │ │ - 125 if( isPrism( topologyId, dim ) ) │ │ │ │ │ - 126 { │ │ │ │ │ - 127 std::copy( corners, corners + nBaseCorners, corners + nBaseCorners ); │ │ │ │ │ - 128 for( unsigned int i = 0; i < nBaseCorners; ++i ) │ │ │ │ │ - 129 corners[ i+nBaseCorners ][ dim-1 ] = ct( 1 ); │ │ │ │ │ - 130 return 2*nBaseCorners; │ │ │ │ │ - 131 } │ │ │ │ │ - 132 else │ │ │ │ │ - 133 { │ │ │ │ │ - 134 corners[ nBaseCorners ] = FieldVector< ct, cdim >( ct( 0 ) ); │ │ │ │ │ - 135 corners[ nBaseCorners ][ dim-1 ] = ct( 1 ); │ │ │ │ │ - 136 return nBaseCorners+1; │ │ │ │ │ - 137 } │ │ │ │ │ - 138 } │ │ │ │ │ - 139 else │ │ │ │ │ - 140 { │ │ │ │ │ - 141 *corners = FieldVector< ct, cdim >( ct( 0 ) ); │ │ │ │ │ - 142 return 1; │ │ │ │ │ - 143 } │ │ │ │ │ + 89 typedef typename std::conditional, │ │ │ │ │ +91 FieldMatrix >::type JacobianInverseTransposed; │ │ │ │ │ + 92 │ │ │ │ │ +100 using Jacobian = std::conditional_t, FieldMatrix >; │ │ │ │ │ + 101 │ │ │ │ │ +109 using JacobianInverse = std::conditional_t, FieldMatrix >; │ │ │ │ │ + 110 │ │ │ │ │ +115 AxisAlignedCubeGeometry(const Dune::FieldVector lower, │ │ │ │ │ + 116 const Dune::FieldVector upper) │ │ │ │ │ + 117 : lower_(lower), │ │ │ │ │ + 118 upper_(upper), │ │ │ │ │ + 119 axes_() │ │ │ │ │ + 120 { │ │ │ │ │ + 121 static_assert(dim==coorddim, "Use this constructor only if │ │ │ │ │ +dim==coorddim!"); │ │ │ │ │ + 122 // all 'true', but is never actually used │ │ │ │ │ + 123 axes_ = (1< lower, │ │ │ │ │ + 134 const Dune::FieldVector upper, │ │ │ │ │ + 135 const std::bitset& axes) │ │ │ │ │ + 136 : lower_(lower), │ │ │ │ │ + 137 upper_(upper), │ │ │ │ │ + 138 axes_(axes) │ │ │ │ │ + 139 { │ │ │ │ │ + 140 assert(axes.count()==dim); │ │ │ │ │ + 141 for (size_t i=0; i │ │ │ │ │ - 154 inline ct referenceVolume ( unsigned int topologyId, int dim ) │ │ │ │ │ - 155 { │ │ │ │ │ - 156 return ct( 1 ) / ct( referenceVolumeInverse( topologyId, dim ) ); │ │ │ │ │ - 157 } │ │ │ │ │ - 158 │ │ │ │ │ +150 AxisAlignedCubeGeometry(const Dune::FieldVector lower) │ │ │ │ │ + 151 : lower_(lower) │ │ │ │ │ + 152 {} │ │ │ │ │ + 153 │ │ │ │ │ +155 GeometryType type() const │ │ │ │ │ + 156 { │ │ │ │ │ + 157 return GeometryTypes::cube(dim); │ │ │ │ │ + 158 } │ │ │ │ │ 159 │ │ │ │ │ - 160 │ │ │ │ │ - 161 // referenceOrigins │ │ │ │ │ - 162 // ---------------- │ │ │ │ │ - 163 │ │ │ │ │ - 164 template< class ct, int cdim > │ │ │ │ │ - 165 inline unsigned int │ │ │ │ │ - 166 referenceOrigins ( unsigned int topologyId, int dim, int codim, │ │ │ │ │ -FieldVector< ct, cdim > *origins ) │ │ │ │ │ - 167 { │ │ │ │ │ - 168 assert( (dim >= 0) && (dim <= cdim) ); │ │ │ │ │ - 169 assert( topologyId < numTopologies( dim ) ); │ │ │ │ │ - 170 assert( (codim >= 0) && (codim <= dim) ); │ │ │ │ │ - 171 │ │ │ │ │ - 172 if( codim > 0 ) │ │ │ │ │ - 173 { │ │ │ │ │ - 174 const unsigned int baseId = baseTopologyId( topologyId, dim ); │ │ │ │ │ - 175 if( isPrism( topologyId, dim ) ) │ │ │ │ │ - 176 { │ │ │ │ │ - 177 const unsigned int n = (codim < dim ? referenceOrigins( baseId, dim-1, │ │ │ │ │ -codim, origins ) : 0); │ │ │ │ │ - 178 const unsigned int m = referenceOrigins( baseId, dim-1, codim-1, origins+n │ │ │ │ │ -); │ │ │ │ │ - 179 for( unsigned int i = 0; i < m; ++i ) │ │ │ │ │ - 180 { │ │ │ │ │ - 181 origins[ n+m+i ] = origins[ n+i ]; │ │ │ │ │ - 182 origins[ n+m+i ][ dim-1 ] = ct( 1 ); │ │ │ │ │ - 183 } │ │ │ │ │ - 184 return n+2*m; │ │ │ │ │ - 185 } │ │ │ │ │ - 186 else │ │ │ │ │ - 187 { │ │ │ │ │ - 188 const unsigned int m = referenceOrigins( baseId, dim-1, codim-1, origins │ │ │ │ │ -); │ │ │ │ │ - 189 if( codim == dim ) │ │ │ │ │ - 190 { │ │ │ │ │ - 191 origins[ m ] = FieldVector< ct, cdim >( ct( 0 ) ); │ │ │ │ │ - 192 origins[ m ][ dim-1 ] = ct( 1 ); │ │ │ │ │ - 193 return m+1; │ │ │ │ │ - 194 } │ │ │ │ │ - 195 else │ │ │ │ │ - 196 return m+referenceOrigins( baseId, dim-1, codim, origins+m ); │ │ │ │ │ - 197 } │ │ │ │ │ - 198 } │ │ │ │ │ - 199 else │ │ │ │ │ - 200 { │ │ │ │ │ - 201 origins[ 0 ] = FieldVector< ct, cdim >( ct( 0 ) ); │ │ │ │ │ - 202 return 1; │ │ │ │ │ - 203 } │ │ │ │ │ - 204 } │ │ │ │ │ - 205 │ │ │ │ │ +161 GlobalCoordinate global(const LocalCoordinate& local) const │ │ │ │ │ + 162 { │ │ │ │ │ + 163 GlobalCoordinate result; │ │ │ │ │ + 164 if (dim == coorddim) { // fast case │ │ │ │ │ + 165 for (size_t i=0; i │ │ │ │ │ - 212 inline unsigned int │ │ │ │ │ - 213 referenceEmbeddings ( unsigned int topologyId, int dim, int codim, │ │ │ │ │ - 214 FieldVector< ct, cdim > *origins, │ │ │ │ │ - 215 FieldMatrix< ct, mydim, cdim > *jacobianTransposeds ) │ │ │ │ │ - 216 { │ │ │ │ │ - 217 assert( (0 <= codim) && (codim <= dim) && (dim <= cdim) ); │ │ │ │ │ - 218 assert( (dim - codim <= mydim) && (mydim <= cdim) ); │ │ │ │ │ - 219 assert( topologyId < numTopologies( dim ) ); │ │ │ │ │ - 220 │ │ │ │ │ - 221 if( codim > 0 ) │ │ │ │ │ - 222 { │ │ │ │ │ - 223 const unsigned int baseId = baseTopologyId( topologyId, dim ); │ │ │ │ │ - 224 if( isPrism( topologyId, dim ) ) │ │ │ │ │ - 225 { │ │ │ │ │ - 226 const unsigned int n = (codim < dim ? referenceEmbeddings( baseId, dim-1, │ │ │ │ │ -codim, origins, jacobianTransposeds ) : 0); │ │ │ │ │ - 227 for( unsigned int i = 0; i < n; ++i ) │ │ │ │ │ - 228 jacobianTransposeds[ i ][ dim-codim-1 ][ dim-1 ] = ct( 1 ); │ │ │ │ │ - 229 │ │ │ │ │ - 230 const unsigned int m = referenceEmbeddings( baseId, dim-1, codim-1, │ │ │ │ │ -origins+n, jacobianTransposeds+n ); │ │ │ │ │ - 231 std::copy( origins+n, origins+n+m, origins+n+m ); │ │ │ │ │ - 232 std::copy( jacobianTransposeds+n, jacobianTransposeds+n+m, │ │ │ │ │ -jacobianTransposeds+n+m ); │ │ │ │ │ - 233 for( unsigned int i = 0; i < m; ++i ) │ │ │ │ │ - 234 origins[ n+m+i ][ dim-1 ] = ct( 1 ); │ │ │ │ │ - 235 │ │ │ │ │ - 236 return n+2*m; │ │ │ │ │ +208 JacobianInverseTransposed jacobianInverseTransposed([[maybe_unused]] const │ │ │ │ │ +LocalCoordinate& local) const │ │ │ │ │ + 209 { │ │ │ │ │ + 210 JacobianInverseTransposed result; │ │ │ │ │ + 211 │ │ │ │ │ + 212 // Actually compute the result. Uses different methods depending │ │ │ │ │ + 213 // on what kind of matrix JacobianTransposed is. │ │ │ │ │ + 214 jacobianInverseTransposed(result); │ │ │ │ │ + 215 │ │ │ │ │ + 216 return result; │ │ │ │ │ + 217 } │ │ │ │ │ + 218 │ │ │ │ │ +220 Jacobian jacobian([[maybe_unused]] const LocalCoordinate& local) const │ │ │ │ │ + 221 { │ │ │ │ │ + 222 return jacobianTransposed(local).transposed(); │ │ │ │ │ + 223 } │ │ │ │ │ + 224 │ │ │ │ │ +226 JacobianInverse jacobianInverse([[maybe_unused]] const LocalCoordinate& │ │ │ │ │ +local) const │ │ │ │ │ + 227 { │ │ │ │ │ + 228 return jacobianInverseTransposed(local).transposed(); │ │ │ │ │ + 229 } │ │ │ │ │ + 230 │ │ │ │ │ +234 Volume integrationElement([[maybe_unused]] const LocalCoordinate& local) │ │ │ │ │ +const │ │ │ │ │ + 235 { │ │ │ │ │ + 236 return volume(); │ │ │ │ │ 237 } │ │ │ │ │ - 238 else │ │ │ │ │ - 239 { │ │ │ │ │ - 240 const unsigned int m = referenceEmbeddings( baseId, dim-1, codim-1, │ │ │ │ │ -origins, jacobianTransposeds ); │ │ │ │ │ - 241 if( codim == dim ) │ │ │ │ │ - 242 { │ │ │ │ │ - 243 origins[ m ] = FieldVector< ct, cdim >( ct( 0 ) ); │ │ │ │ │ - 244 origins[ m ][ dim-1 ] = ct( 1 ); │ │ │ │ │ - 245 jacobianTransposeds[ m ] = FieldMatrix< ct, mydim, cdim >( ct( 0 ) ); │ │ │ │ │ - 246 return m+1; │ │ │ │ │ - 247 } │ │ │ │ │ - 248 else │ │ │ │ │ - 249 { │ │ │ │ │ - 250 const unsigned int n = referenceEmbeddings( baseId, dim-1, codim, │ │ │ │ │ -origins+m, jacobianTransposeds+m ); │ │ │ │ │ - 251 for( unsigned int i = 0; i < n; ++i ) │ │ │ │ │ - 252 { │ │ │ │ │ - 253 for( int k = 0; k < dim-1; ++k ) │ │ │ │ │ - 254 jacobianTransposeds[ m+i ][ dim-codim-1 ][ k ] = -origins[ m+i ][ k ]; │ │ │ │ │ - 255 jacobianTransposeds[ m+i ][ dim-codim-1 ][ dim-1 ] = ct( 1 ); │ │ │ │ │ - 256 } │ │ │ │ │ - 257 return m+n; │ │ │ │ │ - 258 } │ │ │ │ │ - 259 } │ │ │ │ │ - 260 } │ │ │ │ │ - 261 else │ │ │ │ │ - 262 { │ │ │ │ │ - 263 origins[ 0 ] = FieldVector< ct, cdim >( ct( 0 ) ); │ │ │ │ │ - 264 jacobianTransposeds[ 0 ] = FieldMatrix< ct, mydim, cdim >( ct( 0 ) ); │ │ │ │ │ - 265 for( int k = 0; k < dim; ++k ) │ │ │ │ │ - 266 jacobianTransposeds[ 0 ][ k ][ k ] = ct( 1 ); │ │ │ │ │ - 267 return 1; │ │ │ │ │ - 268 } │ │ │ │ │ - 269 } │ │ │ │ │ + 238 │ │ │ │ │ +240 GlobalCoordinate center() const │ │ │ │ │ + 241 { │ │ │ │ │ + 242 GlobalCoordinate result; │ │ │ │ │ + 243 if (dim==0) │ │ │ │ │ + 244 result = lower_; │ │ │ │ │ + 245 else { │ │ │ │ │ + 246 // Since lower_==upper_ for unused coordinates, this always does the right │ │ │ │ │ +thing │ │ │ │ │ + 247 for (size_t i=0; i │ │ │ │ │ - 277 inline unsigned int │ │ │ │ │ - 278 referenceIntegrationOuterNormals ( unsigned int topologyId, int dim, │ │ │ │ │ - 279 const FieldVector< ct, cdim > *origins, │ │ │ │ │ - 280 FieldVector< ct, cdim > *normals ) │ │ │ │ │ - 281 { │ │ │ │ │ - 282 assert( (dim > 0) && (dim <= cdim) ); │ │ │ │ │ - 283 assert( topologyId < numTopologies( dim ) ); │ │ │ │ │ + 271 for (size_t i=0; i 1 ) │ │ │ │ │ - 286 { │ │ │ │ │ - 287 const unsigned int baseId = baseTopologyId( topologyId, dim ); │ │ │ │ │ - 288 if( isPrism( topologyId, dim ) ) │ │ │ │ │ - 289 { │ │ │ │ │ - 290 const unsigned int numBaseFaces │ │ │ │ │ - 291 = referenceIntegrationOuterNormals( baseId, dim-1, origins, normals ); │ │ │ │ │ - 292 │ │ │ │ │ - 293 for( unsigned int i = 0; i < 2; ++i ) │ │ │ │ │ - 294 { │ │ │ │ │ - 295 normals[ numBaseFaces+i ] = FieldVector< ct, cdim >( ct( 0 ) ); │ │ │ │ │ - 296 normals[ numBaseFaces+i ][ dim-1 ] = ct( 2*int( i )-1 ); │ │ │ │ │ +286 Volume volume() const │ │ │ │ │ + 287 { │ │ │ │ │ + 288 ctype vol = 1; │ │ │ │ │ + 289 if (dim == coorddim) { // fast case │ │ │ │ │ + 290 for (size_t i=0; i( ct( 0 ) ); │ │ │ │ │ - 304 normals[ 0 ][ dim-1 ] = ct( -1 ); │ │ │ │ │ - 305 │ │ │ │ │ - 306 const unsigned int numBaseFaces │ │ │ │ │ - 307 = referenceIntegrationOuterNormals( baseId, dim-1, origins+1, normals+1 ); │ │ │ │ │ - 308 for( unsigned int i = 1; i <= numBaseFaces; ++i ) │ │ │ │ │ - 309 normals[ i ][ dim-1 ] = normals[ i ]*origins[ i ]; │ │ │ │ │ - 310 │ │ │ │ │ - 311 return numBaseFaces+1; │ │ │ │ │ - 312 } │ │ │ │ │ - 313 } │ │ │ │ │ - 314 else │ │ │ │ │ + 298 return vol; │ │ │ │ │ + 299 } │ │ │ │ │ + 300 │ │ │ │ │ +302 bool affine() const │ │ │ │ │ + 303 { │ │ │ │ │ + 304 return true; │ │ │ │ │ + 305 } │ │ │ │ │ + 306 │ │ │ │ │ +307 friend Dune::Transitional::ReferenceElement<_ctype,_Dim > │ │ │ │ │ +referenceElement ( const AxisAlignedCubeGeometry & /* geometry */ ) │ │ │ │ │ + 308 { │ │ │ │ │ + 309 return ReferenceElements<_ctype,_dim_>::cube(); │ │ │ │ │ + 310 } │ │ │ │ │ + 311 │ │ │ │ │ + 312 private: │ │ │ │ │ + 313 // jacobianTransposed: fast case --> diagonal matrix │ │ │ │ │ + 314 void jacobianTransposed ( DiagonalMatrix &jacobianTransposed ) │ │ │ │ │ +const │ │ │ │ │ 315 { │ │ │ │ │ - 316 for( unsigned int i = 0; i < 2; ++i ) │ │ │ │ │ - 317 { │ │ │ │ │ - 318 normals[ i ] = FieldVector< ct, cdim >( ct( 0 ) ); │ │ │ │ │ - 319 normals[ i ][ 0 ] = ct( 2*int( i )-1 ); │ │ │ │ │ - 320 } │ │ │ │ │ - 321 │ │ │ │ │ - 322 return 2; │ │ │ │ │ - 323 } │ │ │ │ │ - 324 } │ │ │ │ │ + 316 for (size_t i=0; i dense matrix │ │ │ │ │ + 321 void jacobianTransposed ( FieldMatrix │ │ │ │ │ +&jacobianTransposed ) const │ │ │ │ │ + 322 { │ │ │ │ │ + 323 if (dim==0) │ │ │ │ │ + 324 return; │ │ │ │ │ 325 │ │ │ │ │ - 326 template< class ct, int cdim > │ │ │ │ │ - 327 inline unsigned int │ │ │ │ │ - 328 referenceIntegrationOuterNormals ( unsigned int topologyId, int dim, │ │ │ │ │ - 329 FieldVector< ct, cdim > *normals ) │ │ │ │ │ - 330 { │ │ │ │ │ - 331 assert( (dim > 0) && (dim <= cdim) ); │ │ │ │ │ - 332 │ │ │ │ │ - 333 FieldVector< ct, cdim > *origins │ │ │ │ │ - 334 = new FieldVector< ct, cdim >[ size( topologyId, dim, 1 ) ]; │ │ │ │ │ - 335 referenceOrigins( topologyId, dim, 1, origins ); │ │ │ │ │ - 336 │ │ │ │ │ - 337 const unsigned int numFaces │ │ │ │ │ - 338 = referenceIntegrationOuterNormals( topologyId, dim, origins, normals ); │ │ │ │ │ - 339 assert( numFaces == size( topologyId, dim, 1 ) ); │ │ │ │ │ - 340 │ │ │ │ │ - 341 delete[] origins; │ │ │ │ │ - 342 │ │ │ │ │ - 343 return numFaces; │ │ │ │ │ - 344 } │ │ │ │ │ - 345 │ │ │ │ │ - 346 } // namespace Impl │ │ │ │ │ - 347 │ │ │ │ │ - 348 │ │ │ │ │ - 349 │ │ │ │ │ - 350 // ReferenceElement │ │ │ │ │ - 351 // ---------------- │ │ │ │ │ + 326 size_t lc = 0; │ │ │ │ │ + 327 for (size_t i=0; i diagonal matrix │ │ │ │ │ + 333 void jacobianInverseTransposed ( DiagonalMatrix │ │ │ │ │ +&jacobianInverseTransposed ) const │ │ │ │ │ + 334 { │ │ │ │ │ + 335 for (size_t i=0; i dense matrix │ │ │ │ │ + 340 void jacobianInverseTransposed ( FieldMatrix │ │ │ │ │ +&jacobianInverseTransposed ) const │ │ │ │ │ + 341 { │ │ │ │ │ + 342 if (dim==0) │ │ │ │ │ + 343 return; │ │ │ │ │ + 344 │ │ │ │ │ + 345 size_t lc = 0; │ │ │ │ │ + 346 for (size_t i=0; i lower_; │ │ │ │ │ 352 │ │ │ │ │ - 371 template< class ctype_, int dim > │ │ │ │ │ - 372 class ReferenceElementImplementation │ │ │ │ │ - 373 { │ │ │ │ │ - 374 │ │ │ │ │ - 375 public: │ │ │ │ │ - 376 │ │ │ │ │ - 378 using ctype = ctype_; │ │ │ │ │ - 379 │ │ │ │ │ - 381 using CoordinateField = ctype; │ │ │ │ │ - 382 │ │ │ │ │ - 384 using Coordinate = Dune::FieldVector; │ │ │ │ │ - 385 │ │ │ │ │ - 387 static constexpr int dimension = dim; │ │ │ │ │ - 388 │ │ │ │ │ - 390 typedef ctype Volume; │ │ │ │ │ - 391 │ │ │ │ │ - 392 private: │ │ │ │ │ - 393 │ │ │ │ │ - 394 friend class Impl::ReferenceElementContainer< ctype, dim >; │ │ │ │ │ - 395 │ │ │ │ │ - 396 struct SubEntityInfo; │ │ │ │ │ - 397 │ │ │ │ │ - 398 template< int codim > struct CreateGeometries; │ │ │ │ │ - 399 │ │ │ │ │ - 400 public: │ │ │ │ │ - 402 template< int codim > │ │ │ │ │ - 403 struct Codim │ │ │ │ │ - 404 { │ │ │ │ │ - 406 typedef AffineGeometry< ctype, dim-codim, dim > Geometry; │ │ │ │ │ - 407 }; │ │ │ │ │ - 408 │ │ │ │ │ - 409 // ReferenceElement cannot be copied. │ │ │ │ │ - 410 ReferenceElementImplementation ( const ReferenceElementImplementation& ) = │ │ │ │ │ -delete; │ │ │ │ │ - 411 │ │ │ │ │ - 412 // ReferenceElementImplementation cannot be copied. │ │ │ │ │ - 413 ReferenceElementImplementation& operator= ( const │ │ │ │ │ -ReferenceElementImplementation& ) = delete; │ │ │ │ │ - 414 │ │ │ │ │ - 415 // ReferenceElementImplementation is default-constructible (required for │ │ │ │ │ -storage in std::array) │ │ │ │ │ - 416 ReferenceElementImplementation () = default; │ │ │ │ │ - 417 │ │ │ │ │ - 422 int size ( int c ) const │ │ │ │ │ - 423 { │ │ │ │ │ - 424 assert( (c >= 0) && (c <= dim) ); │ │ │ │ │ - 425 return info_[ c ].size(); │ │ │ │ │ - 426 } │ │ │ │ │ - 427 │ │ │ │ │ - 439 int size ( int i, int c, int cc ) const │ │ │ │ │ - 440 { │ │ │ │ │ - 441 assert( (i >= 0) && (i < size( c )) ); │ │ │ │ │ - 442 return info_[ c ][ i ].size( cc ); │ │ │ │ │ - 443 } │ │ │ │ │ - 444 │ │ │ │ │ - 458 int subEntity ( int i, int c, int ii, int cc ) const │ │ │ │ │ - 459 { │ │ │ │ │ - 460 assert( (i >= 0) && (i < size( c )) ); │ │ │ │ │ - 461 return info_[ c ][ i ].number( ii, cc ); │ │ │ │ │ - 462 } │ │ │ │ │ - 463 │ │ │ │ │ - 479 auto subEntities ( int i, int c, int cc ) const │ │ │ │ │ - 480 { │ │ │ │ │ - 481 assert( (i >= 0) && (i < size( c )) ); │ │ │ │ │ - 482 return info_[ c ][ i ].numbers( cc ); │ │ │ │ │ - 483 } │ │ │ │ │ - 484 │ │ │ │ │ - 493 const GeometryType &type ( int i, int c ) const │ │ │ │ │ - 494 { │ │ │ │ │ - 495 assert( (i >= 0) && (i < size( c )) ); │ │ │ │ │ - 496 return info_[ c ][ i ].type(); │ │ │ │ │ - 497 } │ │ │ │ │ - 498 │ │ │ │ │ - 500 const GeometryType &type () const { return type( 0, 0 ); } │ │ │ │ │ - 501 │ │ │ │ │ - 511 const Coordinate &position( int i, int c ) const │ │ │ │ │ - 512 { │ │ │ │ │ - 513 assert( (c >= 0) && (c <= dim) ); │ │ │ │ │ - 514 return baryCenters_[ c ][ i ]; │ │ │ │ │ - 515 } │ │ │ │ │ - 516 │ │ │ │ │ - 524 bool checkInside ( const Coordinate &local ) const │ │ │ │ │ - 525 { │ │ │ │ │ - 526 const ctype tolerance = ctype( 64 ) * std::numeric_limits< ctype >:: │ │ │ │ │ -epsilon(); │ │ │ │ │ - 527 return Impl::template checkInside< ctype, dim >( type().id(), dim, local, │ │ │ │ │ -tolerance ); │ │ │ │ │ - 528 } │ │ │ │ │ - 529 │ │ │ │ │ - 541 template< int codim > │ │ │ │ │ - 542 typename Codim< codim >::Geometry geometry ( int i ) const │ │ │ │ │ - 543 { │ │ │ │ │ - 544 return std::get< codim >( geometries_ )[ i ]; │ │ │ │ │ - 545 } │ │ │ │ │ - 546 │ │ │ │ │ - 548 Volume volume () const │ │ │ │ │ - 549 { │ │ │ │ │ - 550 return volume_; │ │ │ │ │ - 551 } │ │ │ │ │ - 552 │ │ │ │ │ - 560 const Coordinate &integrationOuterNormal ( int face ) const │ │ │ │ │ - 561 { │ │ │ │ │ - 562 assert( (face >= 0) && (face < int( integrationNormals_.size() )) ); │ │ │ │ │ - 563 return integrationNormals_[ face ]; │ │ │ │ │ - 564 } │ │ │ │ │ - 565 │ │ │ │ │ - 566 private: │ │ │ │ │ - 567 void initialize ( unsigned int topologyId ) │ │ │ │ │ - 568 { │ │ │ │ │ - 569 assert( topologyId < Impl::numTopologies( dim ) ); │ │ │ │ │ - 570 │ │ │ │ │ - 571 // set up subentities │ │ │ │ │ - 572 for( int codim = 0; codim <= dim; ++codim ) │ │ │ │ │ - 573 { │ │ │ │ │ - 574 const unsigned int size = Impl::size( topologyId, dim, codim ); │ │ │ │ │ - 575 info_[ codim ].resize( size ); │ │ │ │ │ - 576 for( unsigned int i = 0; i < size; ++i ) │ │ │ │ │ - 577 info_[ codim ][ i ].initialize( topologyId, codim, i ); │ │ │ │ │ - 578 } │ │ │ │ │ - 579 │ │ │ │ │ - 580 // compute corners │ │ │ │ │ - 581 const unsigned int numVertices = size( dim ); │ │ │ │ │ - 582 baryCenters_[ dim ].resize( numVertices ); │ │ │ │ │ - 583 Impl::referenceCorners( topologyId, dim, &(baryCenters_[ dim ][ 0 ]) ); │ │ │ │ │ - 584 │ │ │ │ │ - 585 // compute barycenters │ │ │ │ │ - 586 for( int codim = 0; codim < dim; ++codim ) │ │ │ │ │ - 587 { │ │ │ │ │ - 588 baryCenters_[ codim ].resize( size(codim) ); │ │ │ │ │ - 589 for( int i = 0; i < size( codim ); ++i ) │ │ │ │ │ - 590 { │ │ │ │ │ - 591 baryCenters_[ codim ][ i ] = Coordinate( ctype( 0 ) ); │ │ │ │ │ - 592 const unsigned int numCorners = size( i, codim, dim ); │ │ │ │ │ - 593 for( unsigned int j = 0; j < numCorners; ++j ) │ │ │ │ │ - 594 baryCenters_[ codim ][ i ] += baryCenters_[ dim ][ subEntity( i, codim, j, │ │ │ │ │ -dim ) ]; │ │ │ │ │ - 595 baryCenters_[ codim ][ i ] *= ctype( 1 ) / ctype( numCorners ); │ │ │ │ │ - 596 } │ │ │ │ │ - 597 } │ │ │ │ │ - 598 │ │ │ │ │ - 599 // compute reference element volume │ │ │ │ │ - 600 volume_ = Impl::template referenceVolume< ctype >( topologyId, dim ); │ │ │ │ │ - 601 │ │ │ │ │ - 602 // compute integration outer normals │ │ │ │ │ - 603 if( dim > 0 ) │ │ │ │ │ - 604 { │ │ │ │ │ - 605 integrationNormals_.resize( size( 1 ) ); │ │ │ │ │ - 606 Impl::referenceIntegrationOuterNormals( topologyId, dim, & │ │ │ │ │ -(integrationNormals_[ 0 ]) ); │ │ │ │ │ - 607 } │ │ │ │ │ - 608 │ │ │ │ │ - 609 // set up geometries │ │ │ │ │ - 610 Hybrid::forEach( std::make_index_sequence< dim+1 >{}, [ & ]( auto i ) │ │ │ │ │ -{ CreateGeometries< i >::apply( *this, geometries_ ); } ); │ │ │ │ │ - 611 } │ │ │ │ │ - 612 │ │ │ │ │ - 613 template< int... codim > │ │ │ │ │ - 614 static std::tuple< std::vector< typename Codim< codim >::Geometry >... > │ │ │ │ │ - 615 makeGeometryTable ( std::integer_sequence< int, codim... > ); │ │ │ │ │ - 616 │ │ │ │ │ - 618 typedef decltype( makeGeometryTable( std::make_integer_sequence< int, │ │ │ │ │ -dim+1 >() ) ) GeometryTable; │ │ │ │ │ - 619 │ │ │ │ │ - 621 ctype volume_; │ │ │ │ │ - 622 │ │ │ │ │ - 623 std::vector< Coordinate > baryCenters_[ dim+1 ]; │ │ │ │ │ - 624 std::vector< Coordinate > integrationNormals_; │ │ │ │ │ - 625 │ │ │ │ │ - 627 GeometryTable geometries_; │ │ │ │ │ - 628 │ │ │ │ │ - 629 std::vector< SubEntityInfo > info_[ dim+1 ]; │ │ │ │ │ - 630 }; │ │ │ │ │ - 631 │ │ │ │ │ - 633 template< class ctype, int dim > │ │ │ │ │ - 634 struct ReferenceElementImplementation< ctype, dim >::SubEntityInfo │ │ │ │ │ - 635 { │ │ │ │ │ - 636 // Compute upper bound for the number of subsentities. │ │ │ │ │ - 637 // If someone knows an explicit formal feel free to │ │ │ │ │ - 638 // implement it here. │ │ │ │ │ - 639 static constexpr std::size_t maxSubEntityCount() │ │ │ │ │ - 640 { │ │ │ │ │ - 641 std::size_t maxCount=0; │ │ │ │ │ - 642 for(std::size_t codim=0; codim<=dim; ++codim) │ │ │ │ │ - 643 maxCount = std::max(maxCount, binomial(std::size_t(dim),codim)*(1 << │ │ │ │ │ -codim)); │ │ │ │ │ - 644 return maxCount; │ │ │ │ │ - 645 } │ │ │ │ │ - 646 │ │ │ │ │ - 647 using SubEntityFlags = std::bitset; │ │ │ │ │ - 648 │ │ │ │ │ - 649 class SubEntityRange │ │ │ │ │ - 650 : public Dune::IteratorRange │ │ │ │ │ - 651 { │ │ │ │ │ - 652 using Base = typename Dune::IteratorRange; │ │ │ │ │ - 653 │ │ │ │ │ - 654 public: │ │ │ │ │ - 655 │ │ │ │ │ - 656 using iterator = Base::iterator; │ │ │ │ │ - 657 using const_iterator = Base::const_iterator; │ │ │ │ │ - 658 │ │ │ │ │ - 659 SubEntityRange(const iterator& begin, const iterator& end, const │ │ │ │ │ -SubEntityFlags& contains) : │ │ │ │ │ - 660 Base(begin, end), │ │ │ │ │ - 661 containsPtr_(&contains), │ │ │ │ │ - 662 size_(end-begin) │ │ │ │ │ - 663 {} │ │ │ │ │ - 664 │ │ │ │ │ - 665 SubEntityRange() : │ │ │ │ │ - 666 Base(), │ │ │ │ │ - 667 containsPtr_(nullptr), │ │ │ │ │ - 668 size_(0) │ │ │ │ │ - 669 {} │ │ │ │ │ - 670 │ │ │ │ │ - 671 std::size_t size() const │ │ │ │ │ - 672 { │ │ │ │ │ - 673 return size_; │ │ │ │ │ - 674 } │ │ │ │ │ - 675 │ │ │ │ │ - 676 bool contains(std::size_t i) const │ │ │ │ │ - 677 { │ │ │ │ │ - 678 return (*containsPtr_)[i]; │ │ │ │ │ - 679 } │ │ │ │ │ - 680 │ │ │ │ │ - 681 private: │ │ │ │ │ - 682 const SubEntityFlags* containsPtr_; │ │ │ │ │ - 683 std::size_t size_; │ │ │ │ │ - 684 std::size_t offset_; │ │ │ │ │ - 685 }; │ │ │ │ │ - 686 │ │ │ │ │ - 687 using NumberRange = typename Dune::IteratorRange; │ │ │ │ │ - 688 │ │ │ │ │ - 689 SubEntityInfo () │ │ │ │ │ - 690 : numbering_( nullptr ) │ │ │ │ │ - 691 { │ │ │ │ │ - 692 std::fill( offset_.begin(), offset_.end(), 0 ); │ │ │ │ │ - 693 } │ │ │ │ │ - 694 │ │ │ │ │ - 695 SubEntityInfo ( const SubEntityInfo &other ) │ │ │ │ │ - 696 : offset_( other.offset_ ), │ │ │ │ │ - 697 type_( other.type_ ), │ │ │ │ │ - 698 containsSubentity_( other.containsSubentity_ ) │ │ │ │ │ - 699 { │ │ │ │ │ - 700 numbering_ = allocate(); │ │ │ │ │ - 701 std::copy( other.numbering_, other.numbering_ + capacity(), numbering_ ); │ │ │ │ │ - 702 } │ │ │ │ │ - 703 │ │ │ │ │ - 704 ~SubEntityInfo () { deallocate( numbering_ ); } │ │ │ │ │ - 705 │ │ │ │ │ - 706 const SubEntityInfo &operator= ( const SubEntityInfo &other ) │ │ │ │ │ - 707 { │ │ │ │ │ - 708 type_ = other.type_; │ │ │ │ │ - 709 offset_ = other.offset_; │ │ │ │ │ - 710 │ │ │ │ │ - 711 deallocate( numbering_ ); │ │ │ │ │ - 712 numbering_ = allocate(); │ │ │ │ │ - 713 std::copy( other.numbering_, other.numbering_ + capacity(), numbering_ ); │ │ │ │ │ - 714 │ │ │ │ │ - 715 containsSubentity_ = other.containsSubentity_; │ │ │ │ │ - 716 │ │ │ │ │ - 717 return *this; │ │ │ │ │ - 718 } │ │ │ │ │ - 719 │ │ │ │ │ - 720 int size ( int cc ) const │ │ │ │ │ - 721 { │ │ │ │ │ - 722 assert( (cc >= 0) && (cc <= dim) ); │ │ │ │ │ - 723 return (offset_[ cc+1 ] - offset_[ cc ]); │ │ │ │ │ - 724 } │ │ │ │ │ - 725 │ │ │ │ │ - 726 int number ( int ii, int cc ) const │ │ │ │ │ - 727 { │ │ │ │ │ - 728 assert( (ii >= 0) && (ii < size( cc )) ); │ │ │ │ │ - 729 return numbering_[ offset_[ cc ] + ii ]; │ │ │ │ │ - 730 } │ │ │ │ │ - 731 │ │ │ │ │ - 732 auto numbers ( int cc ) const │ │ │ │ │ - 733 { │ │ │ │ │ - 734 return SubEntityRange( numbering_ + offset_[ cc ], numbering_ + offset_ │ │ │ │ │ -[ cc+1 ], containsSubentity_[cc]); │ │ │ │ │ - 735 } │ │ │ │ │ - 736 │ │ │ │ │ - 737 const GeometryType &type () const { return type_; } │ │ │ │ │ - 738 │ │ │ │ │ - 739 void initialize ( unsigned int topologyId, int codim, unsigned int i ) │ │ │ │ │ - 740 { │ │ │ │ │ - 741 const unsigned int subId = Impl::subTopologyId( topologyId, dim, codim, i │ │ │ │ │ -); │ │ │ │ │ - 742 type_ = GeometryType( subId, dim-codim ); │ │ │ │ │ - 743 │ │ │ │ │ - 744 // compute offsets │ │ │ │ │ - 745 for( int cc = 0; cc <= codim; ++cc ) │ │ │ │ │ - 746 offset_[ cc ] = 0; │ │ │ │ │ - 747 for( int cc = codim; cc <= dim; ++cc ) │ │ │ │ │ - 748 offset_[ cc+1 ] = offset_[ cc ] + Impl::size( subId, dim-codim, cc-codim │ │ │ │ │ -); │ │ │ │ │ - 749 │ │ │ │ │ - 750 // compute subnumbering │ │ │ │ │ - 751 deallocate( numbering_ ); │ │ │ │ │ - 752 numbering_ = allocate(); │ │ │ │ │ - 753 for( int cc = codim; cc <= dim; ++cc ) │ │ │ │ │ - 754 Impl::subTopologyNumbering( topologyId, dim, codim, i, cc-codim, │ │ │ │ │ -numbering_+offset_[ cc ], numbering_+offset_[ cc+1 ] ); │ │ │ │ │ - 755 │ │ │ │ │ - 756 // initialize containsSubentity lookup-table │ │ │ │ │ - 757 for(std::size_t cc=0; cc<= dim; ++cc) │ │ │ │ │ - 758 { │ │ │ │ │ - 759 containsSubentity_[cc].reset(); │ │ │ │ │ - 760 for(std::size_t idx=0; idx offset_; │ │ │ │ │ - 775 GeometryType type_; │ │ │ │ │ - 776 std::array< SubEntityFlags, dim+1> containsSubentity_; │ │ │ │ │ - 777 }; │ │ │ │ │ - 778 │ │ │ │ │ - 779 │ │ │ │ │ - 780 template< class ctype, int dim > │ │ │ │ │ - 781 template< int codim > │ │ │ │ │ - 782 struct ReferenceElementImplementation< ctype, dim >::CreateGeometries │ │ │ │ │ - 783 { │ │ │ │ │ - 784 template< int cc > │ │ │ │ │ - 785 static typename ReferenceElements< ctype, dim-cc >::ReferenceElement │ │ │ │ │ - 786 subRefElement( const ReferenceElementImplementation< ctype, dim > │ │ │ │ │ -&refElement, int i, std::integral_constant< int, cc > ) │ │ │ │ │ - 787 { │ │ │ │ │ - 788 return ReferenceElements<_ctype,_dim-cc_>::general( refElement.type( i, cc │ │ │ │ │ -) ); │ │ │ │ │ - 789 } │ │ │ │ │ - 790 │ │ │ │ │ - 791 static typename ReferenceElements<_ctype,_dim_>::ReferenceElement │ │ │ │ │ - 792 subRefElement(const ReferenceElementImplementation< ctype, dim > │ │ │ │ │ -&refElement, │ │ │ │ │ - 793 [[maybe_unused]] int i, std::integral_constant) │ │ │ │ │ - 794 { │ │ │ │ │ - 795 return refElement; │ │ │ │ │ - 796 } │ │ │ │ │ - 797 │ │ │ │ │ - 798 static void apply ( const ReferenceElementImplementation< ctype, dim > │ │ │ │ │ -&refElement, GeometryTable &geometries ) │ │ │ │ │ - 799 { │ │ │ │ │ - 800 const int size = refElement.size( codim ); │ │ │ │ │ - 801 std::vector< FieldVector< ctype, dim > > origins( size ); │ │ │ │ │ - 802 std::vector< FieldMatrix< ctype, dim - codim, dim > > jacobianTransposeds │ │ │ │ │ -( size ); │ │ │ │ │ - 803 Impl::referenceEmbeddings( refElement.type().id(), dim, codim, &(origins │ │ │ │ │ -[ 0 ]), &(jacobianTransposeds[ 0 ]) ); │ │ │ │ │ - 804 │ │ │ │ │ - 805 std::get< codim >( geometries ).reserve( size ); │ │ │ │ │ - 806 for( int i = 0; i < size; ++i ) │ │ │ │ │ - 807 { │ │ │ │ │ - 808 typename Codim< codim >::Geometry geometry( subRefElement( refElement, i, │ │ │ │ │ -std::integral_constant< int, codim >() ), origins[ i ], jacobianTransposeds[ i │ │ │ │ │ -] ); │ │ │ │ │ - 809 std::get< codim >( geometries ).push_back( geometry ); │ │ │ │ │ - 810 } │ │ │ │ │ - 811 } │ │ │ │ │ - 812 }; │ │ │ │ │ - 813 │ │ │ │ │ - 814#endif // DOXYGEN │ │ │ │ │ - 815 │ │ │ │ │ - 816 } // namespace Geo │ │ │ │ │ - 817 │ │ │ │ │ - 818} // namespace Dune │ │ │ │ │ - 819 │ │ │ │ │ - 820#endif // #ifndef DUNE_GEOMETRY_REFERENCEELEMENTIMPLEMENTATION_HH │ │ │ │ │ -affinegeometry.hh │ │ │ │ │ -An implementation of the Geometry interface for affine geometries. │ │ │ │ │ + 353 Dune::FieldVector upper_; │ │ │ │ │ + 354 │ │ │ │ │ + 355 std::bitset axes_; │ │ │ │ │ + 356 }; │ │ │ │ │ + 357 │ │ │ │ │ + 358} // namespace Dune │ │ │ │ │ + 359#endif │ │ │ │ │ +referenceelements.hh │ │ │ │ │ type.hh │ │ │ │ │ A unique label for each type of element that can occur in a grid. │ │ │ │ │ -referenceelement.hh │ │ │ │ │ -Dune::ReferenceElement │ │ │ │ │ +Dune::GeometryTypes::cube │ │ │ │ │ +constexpr GeometryType cube(unsigned int dim) │ │ │ │ │ +Returns a GeometryType representing a hypercube of dimension dim. │ │ │ │ │ +Definition: type.hh:472 │ │ │ │ │ +Dune::Transitional::ReferenceElement │ │ │ │ │ unspecified-type ReferenceElement │ │ │ │ │ -Returns the type of reference element for the argument type T. │ │ │ │ │ -Definition: referenceelements.hh:497 │ │ │ │ │ +Returns the type of reference element for the argument types T... │ │ │ │ │ +Definition: referenceelements.hh:417 │ │ │ │ │ Dune │ │ │ │ │ Definition: affinegeometry.hh:21 │ │ │ │ │ -Dune::QuadratureType::size │ │ │ │ │ -@ size │ │ │ │ │ -Definition: quadraturerules.hh:145 │ │ │ │ │ -Dune::RefinementImp::Simplex::binomial │ │ │ │ │ -int binomial(int upper, int lower) │ │ │ │ │ -calculate │ │ │ │ │ -Definition: simplex.cc:305 │ │ │ │ │ -Dune::Geo::ReferenceElements::ReferenceElement │ │ │ │ │ -typename Container::ReferenceElement ReferenceElement │ │ │ │ │ -The reference element type. │ │ │ │ │ -Definition: referenceelements.hh:188 │ │ │ │ │ -Dune::Geo::ReferenceElements::general │ │ │ │ │ -static const ReferenceElement & general(const GeometryType &type) │ │ │ │ │ -get general reference elements │ │ │ │ │ -Definition: referenceelements.hh:198 │ │ │ │ │ +Dune::Geo::ReferenceElements::cube │ │ │ │ │ +static const ReferenceElement & cube() │ │ │ │ │ +get hypercube reference elements │ │ │ │ │ +Definition: referenceelements.hh:210 │ │ │ │ │ +Dune::AxisAlignedCubeGeometry │ │ │ │ │ +A geometry implementation for axis-aligned hypercubes. │ │ │ │ │ +Definition: axisalignedcubegeometry.hh:50 │ │ │ │ │ +Dune::AxisAlignedCubeGeometry::volume │ │ │ │ │ +Volume volume() const │ │ │ │ │ +Return the element volume. │ │ │ │ │ +Definition: axisalignedcubegeometry.hh:286 │ │ │ │ │ +Dune::AxisAlignedCubeGeometry::AxisAlignedCubeGeometry │ │ │ │ │ +AxisAlignedCubeGeometry(const Dune::FieldVector< ctype, coorddim > lower, const │ │ │ │ │ +Dune::FieldVector< ctype, coorddim > upper, const std::bitset< coorddim > │ │ │ │ │ +&axes) │ │ │ │ │ +Constructor from a lower left and an upper right corner. │ │ │ │ │ +Definition: axisalignedcubegeometry.hh:133 │ │ │ │ │ +Dune::AxisAlignedCubeGeometry::AxisAlignedCubeGeometry │ │ │ │ │ +AxisAlignedCubeGeometry(const Dune::FieldVector< ctype, coorddim > lower, const │ │ │ │ │ +Dune::FieldVector< ctype, coorddim > upper) │ │ │ │ │ +Constructor from a lower left and an upper right corner. │ │ │ │ │ +Definition: axisalignedcubegeometry.hh:115 │ │ │ │ │ +Dune::AxisAlignedCubeGeometry::jacobianInverse │ │ │ │ │ +JacobianInverse jacobianInverse(const LocalCoordinate &local) const │ │ │ │ │ +Inverse Jacobian of the transformation from local to global coordinates. │ │ │ │ │ +Definition: axisalignedcubegeometry.hh:226 │ │ │ │ │ +Dune::AxisAlignedCubeGeometry::jacobianInverseTransposed │ │ │ │ │ +JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate │ │ │ │ │ +&local) const │ │ │ │ │ +Inverse Jacobian transposed of the transformation from local to global │ │ │ │ │ +coordinates. │ │ │ │ │ +Definition: axisalignedcubegeometry.hh:208 │ │ │ │ │ +Dune::AxisAlignedCubeGeometry::JacobianTransposed │ │ │ │ │ +std::conditional< dim==coorddim, DiagonalMatrix< ctype, dim >, FieldMatrix< │ │ │ │ │ +ctype, dim, coorddim > >::type JacobianTransposed │ │ │ │ │ +Return type of jacobianTransposed. │ │ │ │ │ +Definition: axisalignedcubegeometry.hh:81 │ │ │ │ │ +Dune::AxisAlignedCubeGeometry::AxisAlignedCubeGeometry │ │ │ │ │ +AxisAlignedCubeGeometry(const Dune::FieldVector< ctype, coorddim > lower) │ │ │ │ │ +Constructor from a single point only. │ │ │ │ │ +Definition: axisalignedcubegeometry.hh:150 │ │ │ │ │ +Dune::AxisAlignedCubeGeometry::mydimension │ │ │ │ │ +static constexpr int mydimension │ │ │ │ │ +Dimension of the cube element. │ │ │ │ │ +Definition: axisalignedcubegeometry.hh:56 │ │ │ │ │ +Dune::AxisAlignedCubeGeometry::coorddimension │ │ │ │ │ +static constexpr int coorddimension │ │ │ │ │ +Dimension of the world space that the cube element is embedded in. │ │ │ │ │ +Definition: axisalignedcubegeometry.hh:59 │ │ │ │ │ +Dune::AxisAlignedCubeGeometry::corner │ │ │ │ │ +GlobalCoordinate corner(int k) const │ │ │ │ │ +Return world coordinates of the k-th corner of the element. │ │ │ │ │ +Definition: axisalignedcubegeometry.hh:260 │ │ │ │ │ +Dune::AxisAlignedCubeGeometry::Volume │ │ │ │ │ +ctype Volume │ │ │ │ │ +Type used for volume. │ │ │ │ │ +Definition: axisalignedcubegeometry.hh:71 │ │ │ │ │ +Dune::AxisAlignedCubeGeometry::LocalCoordinate │ │ │ │ │ +FieldVector< ctype, dim > LocalCoordinate │ │ │ │ │ +Type used for a vector of element coordinates. │ │ │ │ │ +Definition: axisalignedcubegeometry.hh:65 │ │ │ │ │ +Dune::AxisAlignedCubeGeometry::referenceElement │ │ │ │ │ +friend Dune::Transitional::ReferenceElement< ctype, Dim< dim > > │ │ │ │ │ +referenceElement(const AxisAlignedCubeGeometry &) │ │ │ │ │ +Definition: axisalignedcubegeometry.hh:307 │ │ │ │ │ +Dune::AxisAlignedCubeGeometry::jacobianTransposed │ │ │ │ │ +JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const │ │ │ │ │ +Jacobian transposed of the transformation from local to global coordinates. │ │ │ │ │ +Definition: axisalignedcubegeometry.hh:196 │ │ │ │ │ +Dune::AxisAlignedCubeGeometry::GlobalCoordinate │ │ │ │ │ +FieldVector< ctype, coorddim > GlobalCoordinate │ │ │ │ │ +Type used for a vector of world coordinates. │ │ │ │ │ +Definition: axisalignedcubegeometry.hh:68 │ │ │ │ │ +Dune::AxisAlignedCubeGeometry::local │ │ │ │ │ +LocalCoordinate local(const GlobalCoordinate &global) const │ │ │ │ │ +Map a point in global (world) coordinates to element coordinates. │ │ │ │ │ +Definition: axisalignedcubegeometry.hh:180 │ │ │ │ │ +Dune::AxisAlignedCubeGeometry::ctype │ │ │ │ │ +CoordType ctype │ │ │ │ │ +Type used for single coordinate coefficients. │ │ │ │ │ +Definition: axisalignedcubegeometry.hh:62 │ │ │ │ │ +Dune::AxisAlignedCubeGeometry::Jacobian │ │ │ │ │ +std::conditional_t< dim==coorddim, DiagonalMatrix< ctype, dim >, FieldMatrix< │ │ │ │ │ +ctype, coorddim, dim > > Jacobian │ │ │ │ │ +Return type of jacobian. │ │ │ │ │ +Definition: axisalignedcubegeometry.hh:100 │ │ │ │ │ +Dune::AxisAlignedCubeGeometry::type │ │ │ │ │ +GeometryType type() const │ │ │ │ │ +Type of the cube. Here: a hypercube of the correct dimension. │ │ │ │ │ +Definition: axisalignedcubegeometry.hh:155 │ │ │ │ │ +Dune::AxisAlignedCubeGeometry::corners │ │ │ │ │ +int corners() const │ │ │ │ │ +Return the number of corners of the element. │ │ │ │ │ +Definition: axisalignedcubegeometry.hh:254 │ │ │ │ │ +Dune::AxisAlignedCubeGeometry::jacobian │ │ │ │ │ +Jacobian jacobian(const LocalCoordinate &local) const │ │ │ │ │ +Jacobian of the transformation from local to global coordinates. │ │ │ │ │ +Definition: axisalignedcubegeometry.hh:220 │ │ │ │ │ +Dune::AxisAlignedCubeGeometry::JacobianInverseTransposed │ │ │ │ │ +std::conditional< dim==coorddim, DiagonalMatrix< ctype, dim >, FieldMatrix< │ │ │ │ │ +ctype, coorddim, dim > >::type JacobianInverseTransposed │ │ │ │ │ +Return type of jacobianInverseTransposed. │ │ │ │ │ +Definition: axisalignedcubegeometry.hh:91 │ │ │ │ │ +Dune::AxisAlignedCubeGeometry::integrationElement │ │ │ │ │ +Volume integrationElement(const LocalCoordinate &local) const │ │ │ │ │ +Return the integration element, i.e., the determinant term in the integral │ │ │ │ │ +transformation formula. │ │ │ │ │ +Definition: axisalignedcubegeometry.hh:234 │ │ │ │ │ +Dune::AxisAlignedCubeGeometry::center │ │ │ │ │ +GlobalCoordinate center() const │ │ │ │ │ +Return center of mass of the element. │ │ │ │ │ +Definition: axisalignedcubegeometry.hh:240 │ │ │ │ │ +Dune::AxisAlignedCubeGeometry::affine │ │ │ │ │ +bool affine() const │ │ │ │ │ +Return if the element is affine. Here: yes. │ │ │ │ │ +Definition: axisalignedcubegeometry.hh:302 │ │ │ │ │ +Dune::AxisAlignedCubeGeometry::JacobianInverse │ │ │ │ │ +std::conditional_t< dim==coorddim, DiagonalMatrix< ctype, dim >, FieldMatrix< │ │ │ │ │ +ctype, dim, coorddim > > JacobianInverse │ │ │ │ │ +Return type of jacobianInverse. │ │ │ │ │ +Definition: axisalignedcubegeometry.hh:109 │ │ │ │ │ +Dune::AxisAlignedCubeGeometry::global │ │ │ │ │ +GlobalCoordinate global(const LocalCoordinate &local) const │ │ │ │ │ +Map a point in local (element) coordinates to world coordinates. │ │ │ │ │ +Definition: axisalignedcubegeometry.hh:161 │ │ │ │ │ +Dune::GeometryType │ │ │ │ │ +Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ +Definition: type.hh:125 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00191.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: axisalignedcubegeometry.hh File Reference │ │ │ │ +dune-geometry: typefromvertexcount.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,49 +58,39 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces
│ │ │ │ -
axisalignedcubegeometry.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
typefromvertexcount.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ -

A geometry implementation for axis-aligned hypercubes. │ │ │ │ -More...

│ │ │ │ -
#include <bitset>
│ │ │ │ -#include <dune/common/fvector.hh>
│ │ │ │ -#include <dune/common/fmatrix.hh>
│ │ │ │ -#include <dune/common/diagonalmatrix.hh>
│ │ │ │ -#include <dune/geometry/referenceelements.hh>
│ │ │ │ -#include <dune/geometry/type.hh>
│ │ │ │ +
#include <dune/geometry/type.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Classes

class  Dune::AxisAlignedCubeGeometry< CoordType, dim, coorddim >
 A geometry implementation for axis-aligned hypercubes. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

GeometryType Dune::geometryTypeFromVertexCount (unsigned int dim, unsigned int vertices)
 Utitlity function to construct the correct geometry type given the dimension and the number of vertices. More...
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

A geometry implementation for axis-aligned hypercubes.

│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,29 +4,24 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ -Classes | Namespaces │ │ │ │ │ -axisalignedcubegeometry.hh File Reference │ │ │ │ │ -A geometry implementation for axis-aligned hypercubes. More... │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * utility │ │ │ │ │ +Namespaces | Functions │ │ │ │ │ +typefromvertexcount.hh File Reference │ │ │ │ │ #include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ - Classes │ │ │ │ │ -class  Dune::AxisAlignedCubeGeometry<_CoordType,_dim,_coorddim_> │ │ │ │ │ -  A geometry implementation for axis-aligned hypercubes. More... │ │ │ │ │ -  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ -***** Detailed Description ***** │ │ │ │ │ -A geometry implementation for axis-aligned hypercubes. │ │ │ │ │ + Functions │ │ │ │ │ +GeometryType Dune::geometryTypeFromVertexCount (unsigned int dim, unsigned int │ │ │ │ │ + vertices) │ │ │ │ │ +  Utitlity function to construct the correct geometry type given │ │ │ │ │ + the dimension and the number of vertices. More... │ │ │ │ │ +  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00191_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: axisalignedcubegeometry.hh Source File │ │ │ │ +dune-geometry: typefromvertexcount.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,325 +58,82 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
axisalignedcubegeometry.hh
│ │ │ │ +
typefromvertexcount.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
2// vi: set et ts=4 sw=2 sts=2:
│ │ │ │
3// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
5
│ │ │ │ -
6#ifndef DUNE_GEOMETRY_AXISALIGNED_CUBE_GEOMETRY_HH
│ │ │ │ -
7#define DUNE_GEOMETRY_AXISALIGNED_CUBE_GEOMETRY_HH
│ │ │ │ -
8
│ │ │ │ -
13#include <bitset>
│ │ │ │ -
14
│ │ │ │ -
15#include <dune/common/fvector.hh>
│ │ │ │ -
16#include <dune/common/fmatrix.hh>
│ │ │ │ -
17#include <dune/common/diagonalmatrix.hh>
│ │ │ │ -
18
│ │ │ │ - │ │ │ │ -
20#include <dune/geometry/type.hh>
│ │ │ │ -
21
│ │ │ │ -
22
│ │ │ │ -
23namespace Dune {
│ │ │ │ -
24
│ │ │ │ -
48 template <class CoordType, unsigned int dim, unsigned int coorddim>
│ │ │ │ - │ │ │ │ -
50 {
│ │ │ │ +
5#ifndef DUNE_GEOMETRY_TYPE_FROM_VERTEX_COUNT_HH
│ │ │ │ +
6#define DUNE_GEOMETRY_TYPE_FROM_VERTEX_COUNT_HH
│ │ │ │ +
7
│ │ │ │ + │ │ │ │ +
9
│ │ │ │ +
10namespace Dune {
│ │ │ │ +
11
│ │ │ │ +
16 inline
│ │ │ │ +
17 GeometryType geometryTypeFromVertexCount(unsigned int dim, unsigned int vertices)
│ │ │ │ +
18 {
│ │ │ │ +
19 switch (dim)
│ │ │ │ +
20 {
│ │ │ │ +
21 case 0 :
│ │ │ │ + │ │ │ │ +
23 case 1 :
│ │ │ │ + │ │ │ │ +
25 case 2 :
│ │ │ │ +
26 switch (vertices) {
│ │ │ │ +
27 case 3 :
│ │ │ │ + │ │ │ │ +
29 case 4 :
│ │ │ │ + │ │ │ │ +
31 default :
│ │ │ │ +
32 DUNE_THROW(NotImplemented, "2d elements with " << vertices << " corners are not supported!");
│ │ │ │ +
33 }
│ │ │ │ +
34 case 3 :
│ │ │ │ +
35 switch (vertices) {
│ │ │ │ +
36 case 4 :
│ │ │ │ + │ │ │ │ +
38 case 5 :
│ │ │ │ + │ │ │ │ +
40 case 6 :
│ │ │ │ + │ │ │ │ +
42 case 8 :
│ │ │ │ + │ │ │ │ +
44 default :
│ │ │ │ +
45 DUNE_THROW(NotImplemented, "3d elements with " << vertices << " corners are not supported!");
│ │ │ │ +
46 }
│ │ │ │ +
47 default :
│ │ │ │ +
48 DUNE_THROW(NotImplemented, "geometryTypeFromVertexCount works only up to dim=3");
│ │ │ │ +
49 }
│ │ │ │ +
50 }
│ │ │ │
51
│ │ │ │ -
52
│ │ │ │ -
53 public:
│ │ │ │ -
54
│ │ │ │ -
56 constexpr static int mydimension = dim;
│ │ │ │ -
57
│ │ │ │ -
59 constexpr static int coorddimension = coorddim;
│ │ │ │ -
60
│ │ │ │ -
62 typedef CoordType ctype;
│ │ │ │ -
63
│ │ │ │ -
65 typedef FieldVector<ctype,dim> LocalCoordinate;
│ │ │ │ -
66
│ │ │ │ -
68 typedef FieldVector<ctype,coorddim> GlobalCoordinate;
│ │ │ │ -
69
│ │ │ │ -
71 typedef ctype Volume;
│ │ │ │ -
72
│ │ │ │ -
79 typedef typename std::conditional<dim==coorddim,
│ │ │ │ -
80 DiagonalMatrix<ctype,dim>,
│ │ │ │ -
81 FieldMatrix<ctype,dim,coorddim> >::type JacobianTransposed;
│ │ │ │ -
82
│ │ │ │ -
89 typedef typename std::conditional<dim==coorddim,
│ │ │ │ -
90 DiagonalMatrix<ctype,dim>,
│ │ │ │ -
91 FieldMatrix<ctype,coorddim,dim> >::type JacobianInverseTransposed;
│ │ │ │ -
92
│ │ │ │ -
100 using Jacobian = std::conditional_t<dim==coorddim, DiagonalMatrix<ctype,dim>, FieldMatrix<ctype,coorddim,dim> >;
│ │ │ │ -
101
│ │ │ │ -
109 using JacobianInverse = std::conditional_t<dim==coorddim, DiagonalMatrix<ctype,dim>, FieldMatrix<ctype,dim,coorddim> >;
│ │ │ │ -
110
│ │ │ │ -
115 AxisAlignedCubeGeometry(const Dune::FieldVector<ctype,coorddim> lower,
│ │ │ │ -
116 const Dune::FieldVector<ctype,coorddim> upper)
│ │ │ │ -
117 : lower_(lower),
│ │ │ │ -
118 upper_(upper),
│ │ │ │ -
119 axes_()
│ │ │ │ -
120 {
│ │ │ │ -
121 static_assert(dim==coorddim, "Use this constructor only if dim==coorddim!");
│ │ │ │ -
122 // all 'true', but is never actually used
│ │ │ │ -
123 axes_ = (1<<coorddim)-1;
│ │ │ │ -
124 }
│ │ │ │ -
125
│ │ │ │ -
133 AxisAlignedCubeGeometry(const Dune::FieldVector<ctype,coorddim> lower,
│ │ │ │ -
134 const Dune::FieldVector<ctype,coorddim> upper,
│ │ │ │ -
135 const std::bitset<coorddim>& axes)
│ │ │ │ -
136 : lower_(lower),
│ │ │ │ -
137 upper_(upper),
│ │ │ │ -
138 axes_(axes)
│ │ │ │ -
139 {
│ │ │ │ -
140 assert(axes.count()==dim);
│ │ │ │ -
141 for (size_t i=0; i<coorddim; i++)
│ │ │ │ -
142 if (not axes_[i])
│ │ │ │ -
143 upper_[i] = lower_[i];
│ │ │ │ -
144 }
│ │ │ │ -
145
│ │ │ │ -
150 AxisAlignedCubeGeometry(const Dune::FieldVector<ctype,coorddim> lower)
│ │ │ │ -
151 : lower_(lower)
│ │ │ │ -
152 {}
│ │ │ │ -
153
│ │ │ │ - │ │ │ │ -
156 {
│ │ │ │ -
157 return GeometryTypes::cube(dim);
│ │ │ │ -
158 }
│ │ │ │ -
159
│ │ │ │ - │ │ │ │ -
162 {
│ │ │ │ -
163 GlobalCoordinate result;
│ │ │ │ -
164 if (dim == coorddim) { // fast case
│ │ │ │ -
165 for (size_t i=0; i<coorddim; i++)
│ │ │ │ -
166 result[i] = lower_[i] + local[i]*(upper_[i] - lower_[i]);
│ │ │ │ -
167 } else if (dim == 0) { // a vertex -- the other fast case
│ │ │ │ -
168 result = lower_; // hope for named-return-type-optimization
│ │ │ │ -
169 } else { // slow case
│ │ │ │ -
170 size_t lc=0;
│ │ │ │ -
171 for (size_t i=0; i<coorddim; i++)
│ │ │ │ -
172 result[i] = (axes_[i])
│ │ │ │ -
173 ? lower_[i] + local[lc++]*(upper_[i] - lower_[i])
│ │ │ │ -
174 : lower_[i];
│ │ │ │ -
175 }
│ │ │ │ -
176 return result;
│ │ │ │ -
177 }
│ │ │ │ -
178
│ │ │ │ - │ │ │ │ -
181 {
│ │ │ │ -
182 LocalCoordinate result;
│ │ │ │ -
183 if (dim == coorddim) { // fast case
│ │ │ │ -
184 for (size_t i=0; i<dim; i++)
│ │ │ │ -
185 result[i] = (global[i] - lower_[i]) / (upper_[i] - lower_[i]);
│ │ │ │ -
186 } else if (dim != 0) { // slow case
│ │ │ │ -
187 size_t lc=0;
│ │ │ │ -
188 for (size_t i=0; i<coorddim; i++)
│ │ │ │ -
189 if (axes_[i])
│ │ │ │ -
190 result[lc++] = (global[i] - lower_[i]) / (upper_[i] - lower_[i]);
│ │ │ │ -
191 }
│ │ │ │ -
192 return result;
│ │ │ │ -
193 }
│ │ │ │ -
194
│ │ │ │ - │ │ │ │ -
197 {
│ │ │ │ -
198 JacobianTransposed result;
│ │ │ │ -
199
│ │ │ │ -
200 // Actually compute the result. Uses different methods depending
│ │ │ │ -
201 // on what kind of matrix JacobianTransposed is.
│ │ │ │ -
202 jacobianTransposed(result);
│ │ │ │ -
203
│ │ │ │ -
204 return result;
│ │ │ │ -
205 }
│ │ │ │ -
206
│ │ │ │ - │ │ │ │ -
209 {
│ │ │ │ - │ │ │ │ -
211
│ │ │ │ -
212 // Actually compute the result. Uses different methods depending
│ │ │ │ -
213 // on what kind of matrix JacobianTransposed is.
│ │ │ │ - │ │ │ │ -
215
│ │ │ │ -
216 return result;
│ │ │ │ -
217 }
│ │ │ │ -
218
│ │ │ │ -
220 Jacobian jacobian([[maybe_unused]] const LocalCoordinate& local) const
│ │ │ │ -
221 {
│ │ │ │ -
222 return jacobianTransposed(local).transposed();
│ │ │ │ -
223 }
│ │ │ │ -
224
│ │ │ │ - │ │ │ │ -
227 {
│ │ │ │ -
228 return jacobianInverseTransposed(local).transposed();
│ │ │ │ -
229 }
│ │ │ │ -
230
│ │ │ │ -
234 Volume integrationElement([[maybe_unused]] const LocalCoordinate& local) const
│ │ │ │ -
235 {
│ │ │ │ -
236 return volume();
│ │ │ │ -
237 }
│ │ │ │ -
238
│ │ │ │ - │ │ │ │ -
241 {
│ │ │ │ -
242 GlobalCoordinate result;
│ │ │ │ -
243 if (dim==0)
│ │ │ │ -
244 result = lower_;
│ │ │ │ -
245 else {
│ │ │ │ -
246 // Since lower_==upper_ for unused coordinates, this always does the right thing
│ │ │ │ -
247 for (size_t i=0; i<coorddim; i++)
│ │ │ │ -
248 result[i] = CoordType(0.5) * (lower_[i] + upper_[i]);
│ │ │ │ -
249 }
│ │ │ │ -
250 return result;
│ │ │ │ -
251 }
│ │ │ │ -
252
│ │ │ │ -
254 int corners() const
│ │ │ │ -
255 {
│ │ │ │ -
256 return 1<<dim;
│ │ │ │ -
257 }
│ │ │ │ -
258
│ │ │ │ - │ │ │ │ -
261 {
│ │ │ │ -
262 GlobalCoordinate result;
│ │ │ │ -
263 if (dim == coorddim) { // fast case
│ │ │ │ -
264 for (size_t i=0; i<coorddim; i++)
│ │ │ │ -
265 result[i] = (k & (1<<i)) ? upper_[i] : lower_[i];
│ │ │ │ -
266 } else if (dim == 0) { // vertex
│ │ │ │ -
267 result = lower_; // rely on named return-type optimization
│ │ │ │ -
268 } else { // slow case
│ │ │ │ -
269 unsigned int mask = 1;
│ │ │ │ -
270
│ │ │ │ -
271 for (size_t i=0; i<coorddim; i++) {
│ │ │ │ -
272 if (not axes_[i])
│ │ │ │ -
273 result[i] = lower_[i];
│ │ │ │ -
274 else {
│ │ │ │ -
275 result[i] = (k & mask) ? upper_[i] : lower_[i];
│ │ │ │ -
276 mask = (mask<<1);
│ │ │ │ -
277 }
│ │ │ │ -
278 }
│ │ │ │ -
279 }
│ │ │ │ -
280
│ │ │ │ -
281
│ │ │ │ -
282 return result;
│ │ │ │ -
283 }
│ │ │ │ -
284
│ │ │ │ - │ │ │ │ -
287 {
│ │ │ │ -
288 ctype vol = 1;
│ │ │ │ -
289 if (dim == coorddim) { // fast case
│ │ │ │ -
290 for (size_t i=0; i<dim; i++)
│ │ │ │ -
291 vol *= upper_[i] - lower_[i];
│ │ │ │ -
292 // do nothing if dim == 0
│ │ │ │ -
293 } else if (dim != 0) { // slow case
│ │ │ │ -
294 for (size_t i=0; i<coorddim; i++)
│ │ │ │ -
295 if (axes_[i])
│ │ │ │ -
296 vol *= upper_[i] - lower_[i];
│ │ │ │ -
297 }
│ │ │ │ -
298 return vol;
│ │ │ │ -
299 }
│ │ │ │ -
300
│ │ │ │ -
302 bool affine() const
│ │ │ │ -
303 {
│ │ │ │ -
304 return true;
│ │ │ │ -
305 }
│ │ │ │ -
306
│ │ │ │ - │ │ │ │ -
308 {
│ │ │ │ - │ │ │ │ -
310 }
│ │ │ │ -
311
│ │ │ │ -
312 private:
│ │ │ │ -
313 // jacobianTransposed: fast case --> diagonal matrix
│ │ │ │ -
314 void jacobianTransposed ( DiagonalMatrix<ctype,dim> &jacobianTransposed ) const
│ │ │ │ -
315 {
│ │ │ │ -
316 for (size_t i=0; i<dim; i++)
│ │ │ │ -
317 jacobianTransposed.diagonal()[i] = upper_[i] - lower_[i];
│ │ │ │ -
318 }
│ │ │ │ -
319
│ │ │ │ -
320 // jacobianTransposed: slow case --> dense matrix
│ │ │ │ -
321 void jacobianTransposed ( FieldMatrix<ctype,dim,coorddim> &jacobianTransposed ) const
│ │ │ │ -
322 {
│ │ │ │ -
323 if (dim==0)
│ │ │ │ -
324 return;
│ │ │ │ -
325
│ │ │ │ -
326 size_t lc = 0;
│ │ │ │ -
327 for (size_t i=0; i<coorddim; i++)
│ │ │ │ -
328 if (axes_[i])
│ │ │ │ -
329 jacobianTransposed[lc++][i] = upper_[i] - lower_[i];
│ │ │ │ -
330 }
│ │ │ │ -
331
│ │ │ │ -
332 // jacobianInverseTransposed: fast case --> diagonal matrix
│ │ │ │ -
333 void jacobianInverseTransposed ( DiagonalMatrix<ctype,dim> &jacobianInverseTransposed ) const
│ │ │ │ -
334 {
│ │ │ │ -
335 for (size_t i=0; i<dim; i++)
│ │ │ │ -
336 jacobianInverseTransposed.diagonal()[i] = CoordType(1.0) / (upper_[i] - lower_[i]);
│ │ │ │ -
337 }
│ │ │ │ -
338
│ │ │ │ -
339 // jacobianInverseTransposed: slow case --> dense matrix
│ │ │ │ -
340 void jacobianInverseTransposed ( FieldMatrix<ctype,coorddim,dim> &jacobianInverseTransposed ) const
│ │ │ │ -
341 {
│ │ │ │ -
342 if (dim==0)
│ │ │ │ -
343 return;
│ │ │ │ -
344
│ │ │ │ -
345 size_t lc = 0;
│ │ │ │ -
346 for (size_t i=0; i<coorddim; i++)
│ │ │ │ -
347 if (axes_[i])
│ │ │ │ -
348 jacobianInverseTransposed[i][lc++] = CoordType(1.0) / (upper_[i] - lower_[i]);
│ │ │ │ -
349 }
│ │ │ │ -
350
│ │ │ │ -
351 Dune::FieldVector<ctype,coorddim> lower_;
│ │ │ │ -
352
│ │ │ │ -
353 Dune::FieldVector<ctype,coorddim> upper_;
│ │ │ │ -
354
│ │ │ │ -
355 std::bitset<coorddim> axes_;
│ │ │ │ -
356 };
│ │ │ │ -
357
│ │ │ │ -
358} // namespace Dune
│ │ │ │ -
359#endif
│ │ │ │ -
A unique label for each type of element that can occur in a grid.
│ │ │ │ - │ │ │ │ -
constexpr GeometryType cube(unsigned int dim)
Returns a GeometryType representing a hypercube of dimension dim.
Definition: type.hh:472
│ │ │ │ -
unspecified-type ReferenceElement
Returns the type of reference element for the argument types T...
Definition: referenceelements.hh:417
│ │ │ │ +
52}
│ │ │ │ +
53
│ │ │ │ +
54#endif // DUNE_GEOMETRY_TYPE_FROM_VERTEX_COUNT_HH
│ │ │ │ +
A unique label for each type of element that can occur in a grid.
│ │ │ │ +
constexpr GeometryType line
GeometryType representing a line.
Definition: type.hh:512
│ │ │ │ +
constexpr GeometryType prism
GeometryType representing a 3D prism.
Definition: type.hh:542
│ │ │ │ +
constexpr GeometryType triangle
GeometryType representing a triangle.
Definition: type.hh:518
│ │ │ │ +
constexpr GeometryType quadrilateral
GeometryType representing a quadrilateral (a square).
Definition: type.hh:524
│ │ │ │ +
constexpr GeometryType hexahedron
GeometryType representing a hexahedron.
Definition: type.hh:548
│ │ │ │ +
constexpr GeometryType pyramid
GeometryType representing a 3D pyramid.
Definition: type.hh:536
│ │ │ │ +
constexpr GeometryType tetrahedron
GeometryType representing a tetrahedron.
Definition: type.hh:530
│ │ │ │ +
constexpr GeometryType vertex
GeometryType representing a vertex.
Definition: type.hh:506
│ │ │ │
Definition: affinegeometry.hh:21
│ │ │ │ -
static const ReferenceElement & cube()
get hypercube reference elements
Definition: referenceelements.hh:210
│ │ │ │ -
A geometry implementation for axis-aligned hypercubes.
Definition: axisalignedcubegeometry.hh:50
│ │ │ │ -
Volume volume() const
Return the element volume.
Definition: axisalignedcubegeometry.hh:286
│ │ │ │ -
AxisAlignedCubeGeometry(const Dune::FieldVector< ctype, coorddim > lower, const Dune::FieldVector< ctype, coorddim > upper, const std::bitset< coorddim > &axes)
Constructor from a lower left and an upper right corner.
Definition: axisalignedcubegeometry.hh:133
│ │ │ │ -
AxisAlignedCubeGeometry(const Dune::FieldVector< ctype, coorddim > lower, const Dune::FieldVector< ctype, coorddim > upper)
Constructor from a lower left and an upper right corner.
Definition: axisalignedcubegeometry.hh:115
│ │ │ │ -
JacobianInverse jacobianInverse(const LocalCoordinate &local) const
Inverse Jacobian of the transformation from local to global coordinates.
Definition: axisalignedcubegeometry.hh:226
│ │ │ │ -
JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate &local) const
Inverse Jacobian transposed of the transformation from local to global coordinates.
Definition: axisalignedcubegeometry.hh:208
│ │ │ │ -
std::conditional< dim==coorddim, DiagonalMatrix< ctype, dim >, FieldMatrix< ctype, dim, coorddim > >::type JacobianTransposed
Return type of jacobianTransposed.
Definition: axisalignedcubegeometry.hh:81
│ │ │ │ -
AxisAlignedCubeGeometry(const Dune::FieldVector< ctype, coorddim > lower)
Constructor from a single point only.
Definition: axisalignedcubegeometry.hh:150
│ │ │ │ -
static constexpr int mydimension
Dimension of the cube element.
Definition: axisalignedcubegeometry.hh:56
│ │ │ │ -
static constexpr int coorddimension
Dimension of the world space that the cube element is embedded in.
Definition: axisalignedcubegeometry.hh:59
│ │ │ │ -
GlobalCoordinate corner(int k) const
Return world coordinates of the k-th corner of the element.
Definition: axisalignedcubegeometry.hh:260
│ │ │ │ -
ctype Volume
Type used for volume.
Definition: axisalignedcubegeometry.hh:71
│ │ │ │ -
FieldVector< ctype, dim > LocalCoordinate
Type used for a vector of element coordinates.
Definition: axisalignedcubegeometry.hh:65
│ │ │ │ -
friend Dune::Transitional::ReferenceElement< ctype, Dim< dim > > referenceElement(const AxisAlignedCubeGeometry &)
Definition: axisalignedcubegeometry.hh:307
│ │ │ │ -
JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const
Jacobian transposed of the transformation from local to global coordinates.
Definition: axisalignedcubegeometry.hh:196
│ │ │ │ -
FieldVector< ctype, coorddim > GlobalCoordinate
Type used for a vector of world coordinates.
Definition: axisalignedcubegeometry.hh:68
│ │ │ │ -
LocalCoordinate local(const GlobalCoordinate &global) const
Map a point in global (world) coordinates to element coordinates.
Definition: axisalignedcubegeometry.hh:180
│ │ │ │ -
CoordType ctype
Type used for single coordinate coefficients.
Definition: axisalignedcubegeometry.hh:62
│ │ │ │ -
std::conditional_t< dim==coorddim, DiagonalMatrix< ctype, dim >, FieldMatrix< ctype, coorddim, dim > > Jacobian
Return type of jacobian.
Definition: axisalignedcubegeometry.hh:100
│ │ │ │ -
GeometryType type() const
Type of the cube. Here: a hypercube of the correct dimension.
Definition: axisalignedcubegeometry.hh:155
│ │ │ │ -
int corners() const
Return the number of corners of the element.
Definition: axisalignedcubegeometry.hh:254
│ │ │ │ -
Jacobian jacobian(const LocalCoordinate &local) const
Jacobian of the transformation from local to global coordinates.
Definition: axisalignedcubegeometry.hh:220
│ │ │ │ -
std::conditional< dim==coorddim, DiagonalMatrix< ctype, dim >, FieldMatrix< ctype, coorddim, dim > >::type JacobianInverseTransposed
Return type of jacobianInverseTransposed.
Definition: axisalignedcubegeometry.hh:91
│ │ │ │ -
Volume integrationElement(const LocalCoordinate &local) const
Return the integration element, i.e., the determinant term in the integral transformation formula.
Definition: axisalignedcubegeometry.hh:234
│ │ │ │ -
GlobalCoordinate center() const
Return center of mass of the element.
Definition: axisalignedcubegeometry.hh:240
│ │ │ │ -
bool affine() const
Return if the element is affine. Here: yes.
Definition: axisalignedcubegeometry.hh:302
│ │ │ │ -
std::conditional_t< dim==coorddim, DiagonalMatrix< ctype, dim >, FieldMatrix< ctype, dim, coorddim > > JacobianInverse
Return type of jacobianInverse.
Definition: axisalignedcubegeometry.hh:109
│ │ │ │ -
GlobalCoordinate global(const LocalCoordinate &local) const
Map a point in local (element) coordinates to world coordinates.
Definition: axisalignedcubegeometry.hh:161
│ │ │ │ +
GeometryType geometryTypeFromVertexCount(unsigned int dim, unsigned int vertices)
Utitlity function to construct the correct geometry type given the dimension and the number of vertic...
Definition: typefromvertexcount.hh:17
│ │ │ │
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:125
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,439 +4,113 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ -axisalignedcubegeometry.hh │ │ │ │ │ + * utility │ │ │ │ │ +typefromvertexcount.hh │ │ │ │ │ Go_to_the_documentation_of_this_file. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ - 5 │ │ │ │ │ - 6#ifndef DUNE_GEOMETRY_AXISALIGNED_CUBE_GEOMETRY_HH │ │ │ │ │ - 7#define DUNE_GEOMETRY_AXISALIGNED_CUBE_GEOMETRY_HH │ │ │ │ │ - 8 │ │ │ │ │ - 13#include │ │ │ │ │ - 14 │ │ │ │ │ - 15#include │ │ │ │ │ - 16#include │ │ │ │ │ - 17#include │ │ │ │ │ - 18 │ │ │ │ │ - 19#include │ │ │ │ │ - 20#include │ │ │ │ │ - 21 │ │ │ │ │ - 22 │ │ │ │ │ - 23namespace Dune { │ │ │ │ │ - 24 │ │ │ │ │ - 48 template │ │ │ │ │ -49 class AxisAlignedCubeGeometry │ │ │ │ │ - 50 { │ │ │ │ │ + 5#ifndef DUNE_GEOMETRY_TYPE_FROM_VERTEX_COUNT_HH │ │ │ │ │ + 6#define DUNE_GEOMETRY_TYPE_FROM_VERTEX_COUNT_HH │ │ │ │ │ + 7 │ │ │ │ │ + 8#include │ │ │ │ │ + 9 │ │ │ │ │ + 10namespace Dune { │ │ │ │ │ + 11 │ │ │ │ │ + 16 inline │ │ │ │ │ +17 GeometryType geometryTypeFromVertexCount(unsigned int dim, unsigned int │ │ │ │ │ +vertices) │ │ │ │ │ + 18 { │ │ │ │ │ + 19 switch (dim) │ │ │ │ │ + 20 { │ │ │ │ │ + 21 case 0 : │ │ │ │ │ + 22 return GeometryTypes::vertex; │ │ │ │ │ + 23 case 1 : │ │ │ │ │ + 24 return GeometryTypes::line; │ │ │ │ │ + 25 case 2 : │ │ │ │ │ + 26 switch (vertices) { │ │ │ │ │ + 27 case 3 : │ │ │ │ │ + 28 return GeometryTypes::triangle; │ │ │ │ │ + 29 case 4 : │ │ │ │ │ + 30 return GeometryTypes::quadrilateral; │ │ │ │ │ + 31 default : │ │ │ │ │ + 32 DUNE_THROW(NotImplemented, "2d elements with " << vertices << " corners are │ │ │ │ │ +not supported!"); │ │ │ │ │ + 33 } │ │ │ │ │ + 34 case 3 : │ │ │ │ │ + 35 switch (vertices) { │ │ │ │ │ + 36 case 4 : │ │ │ │ │ + 37 return GeometryTypes::tetrahedron; │ │ │ │ │ + 38 case 5 : │ │ │ │ │ + 39 return GeometryTypes::pyramid; │ │ │ │ │ + 40 case 6 : │ │ │ │ │ + 41 return GeometryTypes::prism; │ │ │ │ │ + 42 case 8 : │ │ │ │ │ + 43 return GeometryTypes::hexahedron; │ │ │ │ │ + 44 default : │ │ │ │ │ + 45 DUNE_THROW(NotImplemented, "3d elements with " << vertices << " corners are │ │ │ │ │ +not supported!"); │ │ │ │ │ + 46 } │ │ │ │ │ + 47 default : │ │ │ │ │ + 48 DUNE_THROW(NotImplemented, "geometryTypeFromVertexCount works only up to │ │ │ │ │ +dim=3"); │ │ │ │ │ + 49 } │ │ │ │ │ + 50 } │ │ │ │ │ 51 │ │ │ │ │ - 52 │ │ │ │ │ - 53 public: │ │ │ │ │ - 54 │ │ │ │ │ -56 constexpr static int mydimension = dim; │ │ │ │ │ - 57 │ │ │ │ │ -59 constexpr static int coorddimension = coorddim; │ │ │ │ │ - 60 │ │ │ │ │ -62 typedef CoordType ctype; │ │ │ │ │ - 63 │ │ │ │ │ -65 typedef FieldVector LocalCoordinate; │ │ │ │ │ - 66 │ │ │ │ │ -68 typedef FieldVector GlobalCoordinate; │ │ │ │ │ - 69 │ │ │ │ │ -71 typedef ctype Volume; │ │ │ │ │ - 72 │ │ │ │ │ - 79 typedef typename std::conditional, │ │ │ │ │ -81 FieldMatrix >::type JacobianTransposed; │ │ │ │ │ - 82 │ │ │ │ │ - 89 typedef typename std::conditional, │ │ │ │ │ -91 FieldMatrix >::type JacobianInverseTransposed; │ │ │ │ │ - 92 │ │ │ │ │ -100 using Jacobian = std::conditional_t, FieldMatrix >; │ │ │ │ │ - 101 │ │ │ │ │ -109 using JacobianInverse = std::conditional_t, FieldMatrix >; │ │ │ │ │ - 110 │ │ │ │ │ -115 AxisAlignedCubeGeometry(const Dune::FieldVector lower, │ │ │ │ │ - 116 const Dune::FieldVector upper) │ │ │ │ │ - 117 : lower_(lower), │ │ │ │ │ - 118 upper_(upper), │ │ │ │ │ - 119 axes_() │ │ │ │ │ - 120 { │ │ │ │ │ - 121 static_assert(dim==coorddim, "Use this constructor only if │ │ │ │ │ -dim==coorddim!"); │ │ │ │ │ - 122 // all 'true', but is never actually used │ │ │ │ │ - 123 axes_ = (1< lower, │ │ │ │ │ - 134 const Dune::FieldVector upper, │ │ │ │ │ - 135 const std::bitset& axes) │ │ │ │ │ - 136 : lower_(lower), │ │ │ │ │ - 137 upper_(upper), │ │ │ │ │ - 138 axes_(axes) │ │ │ │ │ - 139 { │ │ │ │ │ - 140 assert(axes.count()==dim); │ │ │ │ │ - 141 for (size_t i=0; i lower) │ │ │ │ │ - 151 : lower_(lower) │ │ │ │ │ - 152 {} │ │ │ │ │ - 153 │ │ │ │ │ -155 GeometryType type() const │ │ │ │ │ - 156 { │ │ │ │ │ - 157 return GeometryTypes::cube(dim); │ │ │ │ │ - 158 } │ │ │ │ │ - 159 │ │ │ │ │ -161 GlobalCoordinate global(const LocalCoordinate& local) const │ │ │ │ │ - 162 { │ │ │ │ │ - 163 GlobalCoordinate result; │ │ │ │ │ - 164 if (dim == coorddim) { // fast case │ │ │ │ │ - 165 for (size_t i=0; i > │ │ │ │ │ -referenceElement ( const AxisAlignedCubeGeometry & /* geometry */ ) │ │ │ │ │ - 308 { │ │ │ │ │ - 309 return ReferenceElements<_ctype,_dim_>::cube(); │ │ │ │ │ - 310 } │ │ │ │ │ - 311 │ │ │ │ │ - 312 private: │ │ │ │ │ - 313 // jacobianTransposed: fast case --> diagonal matrix │ │ │ │ │ - 314 void jacobianTransposed ( DiagonalMatrix &jacobianTransposed ) │ │ │ │ │ -const │ │ │ │ │ - 315 { │ │ │ │ │ - 316 for (size_t i=0; i dense matrix │ │ │ │ │ - 321 void jacobianTransposed ( FieldMatrix │ │ │ │ │ -&jacobianTransposed ) const │ │ │ │ │ - 322 { │ │ │ │ │ - 323 if (dim==0) │ │ │ │ │ - 324 return; │ │ │ │ │ - 325 │ │ │ │ │ - 326 size_t lc = 0; │ │ │ │ │ - 327 for (size_t i=0; i diagonal matrix │ │ │ │ │ - 333 void jacobianInverseTransposed ( DiagonalMatrix │ │ │ │ │ -&jacobianInverseTransposed ) const │ │ │ │ │ - 334 { │ │ │ │ │ - 335 for (size_t i=0; i dense matrix │ │ │ │ │ - 340 void jacobianInverseTransposed ( FieldMatrix │ │ │ │ │ -&jacobianInverseTransposed ) const │ │ │ │ │ - 341 { │ │ │ │ │ - 342 if (dim==0) │ │ │ │ │ - 343 return; │ │ │ │ │ - 344 │ │ │ │ │ - 345 size_t lc = 0; │ │ │ │ │ - 346 for (size_t i=0; i lower_; │ │ │ │ │ - 352 │ │ │ │ │ - 353 Dune::FieldVector upper_; │ │ │ │ │ - 354 │ │ │ │ │ - 355 std::bitset axes_; │ │ │ │ │ - 356 }; │ │ │ │ │ - 357 │ │ │ │ │ - 358} // namespace Dune │ │ │ │ │ - 359#endif │ │ │ │ │ + 52} │ │ │ │ │ + 53 │ │ │ │ │ + 54#endif // DUNE_GEOMETRY_TYPE_FROM_VERTEX_COUNT_HH │ │ │ │ │ type.hh │ │ │ │ │ A unique label for each type of element that can occur in a grid. │ │ │ │ │ -referenceelements.hh │ │ │ │ │ -Dune::GeometryTypes::cube │ │ │ │ │ -constexpr GeometryType cube(unsigned int dim) │ │ │ │ │ -Returns a GeometryType representing a hypercube of dimension dim. │ │ │ │ │ -Definition: type.hh:472 │ │ │ │ │ -Dune::Transitional::ReferenceElement │ │ │ │ │ -unspecified-type ReferenceElement │ │ │ │ │ -Returns the type of reference element for the argument types T... │ │ │ │ │ -Definition: referenceelements.hh:417 │ │ │ │ │ +Dune::GeometryTypes::line │ │ │ │ │ +constexpr GeometryType line │ │ │ │ │ +GeometryType representing a line. │ │ │ │ │ +Definition: type.hh:512 │ │ │ │ │ +Dune::GeometryTypes::prism │ │ │ │ │ +constexpr GeometryType prism │ │ │ │ │ +GeometryType representing a 3D prism. │ │ │ │ │ +Definition: type.hh:542 │ │ │ │ │ +Dune::GeometryTypes::triangle │ │ │ │ │ +constexpr GeometryType triangle │ │ │ │ │ +GeometryType representing a triangle. │ │ │ │ │ +Definition: type.hh:518 │ │ │ │ │ +Dune::GeometryTypes::quadrilateral │ │ │ │ │ +constexpr GeometryType quadrilateral │ │ │ │ │ +GeometryType representing a quadrilateral (a square). │ │ │ │ │ +Definition: type.hh:524 │ │ │ │ │ +Dune::GeometryTypes::hexahedron │ │ │ │ │ +constexpr GeometryType hexahedron │ │ │ │ │ +GeometryType representing a hexahedron. │ │ │ │ │ +Definition: type.hh:548 │ │ │ │ │ +Dune::GeometryTypes::pyramid │ │ │ │ │ +constexpr GeometryType pyramid │ │ │ │ │ +GeometryType representing a 3D pyramid. │ │ │ │ │ +Definition: type.hh:536 │ │ │ │ │ +Dune::GeometryTypes::tetrahedron │ │ │ │ │ +constexpr GeometryType tetrahedron │ │ │ │ │ +GeometryType representing a tetrahedron. │ │ │ │ │ +Definition: type.hh:530 │ │ │ │ │ +Dune::GeometryTypes::vertex │ │ │ │ │ +constexpr GeometryType vertex │ │ │ │ │ +GeometryType representing a vertex. │ │ │ │ │ +Definition: type.hh:506 │ │ │ │ │ Dune │ │ │ │ │ Definition: affinegeometry.hh:21 │ │ │ │ │ -Dune::Geo::ReferenceElements::cube │ │ │ │ │ -static const ReferenceElement & cube() │ │ │ │ │ -get hypercube reference elements │ │ │ │ │ -Definition: referenceelements.hh:210 │ │ │ │ │ -Dune::AxisAlignedCubeGeometry │ │ │ │ │ -A geometry implementation for axis-aligned hypercubes. │ │ │ │ │ -Definition: axisalignedcubegeometry.hh:50 │ │ │ │ │ -Dune::AxisAlignedCubeGeometry::volume │ │ │ │ │ -Volume volume() const │ │ │ │ │ -Return the element volume. │ │ │ │ │ -Definition: axisalignedcubegeometry.hh:286 │ │ │ │ │ -Dune::AxisAlignedCubeGeometry::AxisAlignedCubeGeometry │ │ │ │ │ -AxisAlignedCubeGeometry(const Dune::FieldVector< ctype, coorddim > lower, const │ │ │ │ │ -Dune::FieldVector< ctype, coorddim > upper, const std::bitset< coorddim > │ │ │ │ │ -&axes) │ │ │ │ │ -Constructor from a lower left and an upper right corner. │ │ │ │ │ -Definition: axisalignedcubegeometry.hh:133 │ │ │ │ │ -Dune::AxisAlignedCubeGeometry::AxisAlignedCubeGeometry │ │ │ │ │ -AxisAlignedCubeGeometry(const Dune::FieldVector< ctype, coorddim > lower, const │ │ │ │ │ -Dune::FieldVector< ctype, coorddim > upper) │ │ │ │ │ -Constructor from a lower left and an upper right corner. │ │ │ │ │ -Definition: axisalignedcubegeometry.hh:115 │ │ │ │ │ -Dune::AxisAlignedCubeGeometry::jacobianInverse │ │ │ │ │ -JacobianInverse jacobianInverse(const LocalCoordinate &local) const │ │ │ │ │ -Inverse Jacobian of the transformation from local to global coordinates. │ │ │ │ │ -Definition: axisalignedcubegeometry.hh:226 │ │ │ │ │ -Dune::AxisAlignedCubeGeometry::jacobianInverseTransposed │ │ │ │ │ -JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate │ │ │ │ │ -&local) const │ │ │ │ │ -Inverse Jacobian transposed of the transformation from local to global │ │ │ │ │ -coordinates. │ │ │ │ │ -Definition: axisalignedcubegeometry.hh:208 │ │ │ │ │ -Dune::AxisAlignedCubeGeometry::JacobianTransposed │ │ │ │ │ -std::conditional< dim==coorddim, DiagonalMatrix< ctype, dim >, FieldMatrix< │ │ │ │ │ -ctype, dim, coorddim > >::type JacobianTransposed │ │ │ │ │ -Return type of jacobianTransposed. │ │ │ │ │ -Definition: axisalignedcubegeometry.hh:81 │ │ │ │ │ -Dune::AxisAlignedCubeGeometry::AxisAlignedCubeGeometry │ │ │ │ │ -AxisAlignedCubeGeometry(const Dune::FieldVector< ctype, coorddim > lower) │ │ │ │ │ -Constructor from a single point only. │ │ │ │ │ -Definition: axisalignedcubegeometry.hh:150 │ │ │ │ │ -Dune::AxisAlignedCubeGeometry::mydimension │ │ │ │ │ -static constexpr int mydimension │ │ │ │ │ -Dimension of the cube element. │ │ │ │ │ -Definition: axisalignedcubegeometry.hh:56 │ │ │ │ │ -Dune::AxisAlignedCubeGeometry::coorddimension │ │ │ │ │ -static constexpr int coorddimension │ │ │ │ │ -Dimension of the world space that the cube element is embedded in. │ │ │ │ │ -Definition: axisalignedcubegeometry.hh:59 │ │ │ │ │ -Dune::AxisAlignedCubeGeometry::corner │ │ │ │ │ -GlobalCoordinate corner(int k) const │ │ │ │ │ -Return world coordinates of the k-th corner of the element. │ │ │ │ │ -Definition: axisalignedcubegeometry.hh:260 │ │ │ │ │ -Dune::AxisAlignedCubeGeometry::Volume │ │ │ │ │ -ctype Volume │ │ │ │ │ -Type used for volume. │ │ │ │ │ -Definition: axisalignedcubegeometry.hh:71 │ │ │ │ │ -Dune::AxisAlignedCubeGeometry::LocalCoordinate │ │ │ │ │ -FieldVector< ctype, dim > LocalCoordinate │ │ │ │ │ -Type used for a vector of element coordinates. │ │ │ │ │ -Definition: axisalignedcubegeometry.hh:65 │ │ │ │ │ -Dune::AxisAlignedCubeGeometry::referenceElement │ │ │ │ │ -friend Dune::Transitional::ReferenceElement< ctype, Dim< dim > > │ │ │ │ │ -referenceElement(const AxisAlignedCubeGeometry &) │ │ │ │ │ -Definition: axisalignedcubegeometry.hh:307 │ │ │ │ │ -Dune::AxisAlignedCubeGeometry::jacobianTransposed │ │ │ │ │ -JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const │ │ │ │ │ -Jacobian transposed of the transformation from local to global coordinates. │ │ │ │ │ -Definition: axisalignedcubegeometry.hh:196 │ │ │ │ │ -Dune::AxisAlignedCubeGeometry::GlobalCoordinate │ │ │ │ │ -FieldVector< ctype, coorddim > GlobalCoordinate │ │ │ │ │ -Type used for a vector of world coordinates. │ │ │ │ │ -Definition: axisalignedcubegeometry.hh:68 │ │ │ │ │ -Dune::AxisAlignedCubeGeometry::local │ │ │ │ │ -LocalCoordinate local(const GlobalCoordinate &global) const │ │ │ │ │ -Map a point in global (world) coordinates to element coordinates. │ │ │ │ │ -Definition: axisalignedcubegeometry.hh:180 │ │ │ │ │ -Dune::AxisAlignedCubeGeometry::ctype │ │ │ │ │ -CoordType ctype │ │ │ │ │ -Type used for single coordinate coefficients. │ │ │ │ │ -Definition: axisalignedcubegeometry.hh:62 │ │ │ │ │ -Dune::AxisAlignedCubeGeometry::Jacobian │ │ │ │ │ -std::conditional_t< dim==coorddim, DiagonalMatrix< ctype, dim >, FieldMatrix< │ │ │ │ │ -ctype, coorddim, dim > > Jacobian │ │ │ │ │ -Return type of jacobian. │ │ │ │ │ -Definition: axisalignedcubegeometry.hh:100 │ │ │ │ │ -Dune::AxisAlignedCubeGeometry::type │ │ │ │ │ -GeometryType type() const │ │ │ │ │ -Type of the cube. Here: a hypercube of the correct dimension. │ │ │ │ │ -Definition: axisalignedcubegeometry.hh:155 │ │ │ │ │ -Dune::AxisAlignedCubeGeometry::corners │ │ │ │ │ -int corners() const │ │ │ │ │ -Return the number of corners of the element. │ │ │ │ │ -Definition: axisalignedcubegeometry.hh:254 │ │ │ │ │ -Dune::AxisAlignedCubeGeometry::jacobian │ │ │ │ │ -Jacobian jacobian(const LocalCoordinate &local) const │ │ │ │ │ -Jacobian of the transformation from local to global coordinates. │ │ │ │ │ -Definition: axisalignedcubegeometry.hh:220 │ │ │ │ │ -Dune::AxisAlignedCubeGeometry::JacobianInverseTransposed │ │ │ │ │ -std::conditional< dim==coorddim, DiagonalMatrix< ctype, dim >, FieldMatrix< │ │ │ │ │ -ctype, coorddim, dim > >::type JacobianInverseTransposed │ │ │ │ │ -Return type of jacobianInverseTransposed. │ │ │ │ │ -Definition: axisalignedcubegeometry.hh:91 │ │ │ │ │ -Dune::AxisAlignedCubeGeometry::integrationElement │ │ │ │ │ -Volume integrationElement(const LocalCoordinate &local) const │ │ │ │ │ -Return the integration element, i.e., the determinant term in the integral │ │ │ │ │ -transformation formula. │ │ │ │ │ -Definition: axisalignedcubegeometry.hh:234 │ │ │ │ │ -Dune::AxisAlignedCubeGeometry::center │ │ │ │ │ -GlobalCoordinate center() const │ │ │ │ │ -Return center of mass of the element. │ │ │ │ │ -Definition: axisalignedcubegeometry.hh:240 │ │ │ │ │ -Dune::AxisAlignedCubeGeometry::affine │ │ │ │ │ -bool affine() const │ │ │ │ │ -Return if the element is affine. Here: yes. │ │ │ │ │ -Definition: axisalignedcubegeometry.hh:302 │ │ │ │ │ -Dune::AxisAlignedCubeGeometry::JacobianInverse │ │ │ │ │ -std::conditional_t< dim==coorddim, DiagonalMatrix< ctype, dim >, FieldMatrix< │ │ │ │ │ -ctype, dim, coorddim > > JacobianInverse │ │ │ │ │ -Return type of jacobianInverse. │ │ │ │ │ -Definition: axisalignedcubegeometry.hh:109 │ │ │ │ │ -Dune::AxisAlignedCubeGeometry::global │ │ │ │ │ -GlobalCoordinate global(const LocalCoordinate &local) const │ │ │ │ │ -Map a point in local (element) coordinates to world coordinates. │ │ │ │ │ -Definition: axisalignedcubegeometry.hh:161 │ │ │ │ │ +Dune::geometryTypeFromVertexCount │ │ │ │ │ +GeometryType geometryTypeFromVertexCount(unsigned int dim, unsigned int │ │ │ │ │ +vertices) │ │ │ │ │ +Utitlity function to construct the correct geometry type given the dimension │ │ │ │ │ +and the number of vertic... │ │ │ │ │ +Definition: typefromvertexcount.hh:17 │ │ │ │ │ Dune::GeometryType │ │ │ │ │ Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ Definition: type.hh:125 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00194.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: hcubetriangulation.cc File Reference │ │ │ │ +dune-geometry: referenceelement.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,80 +58,44 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Macros
│ │ │ │ -
hcubetriangulation.cc File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
referenceelement.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ -

This file contains the Refinement implementation for triangulating hypercubes (quadrilateral -> triangle, hexahedron -> tetrahedron) │ │ │ │ -More...

│ │ │ │ -
#include <dune/geometry/referenceelements.hh>
│ │ │ │ -#include <dune/geometry/type.hh>
│ │ │ │ -#include "base.cc"
│ │ │ │ -#include "simplex.cc"
│ │ │ │ -
│ │ │ │ +
#include <dune/geometry/type.hh>
│ │ │ │ +
│ │ │ │ +

Go to the source code of this file.

│ │ │ │ +
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Classes

class  Dune::RefinementImp::HCubeTriangulation::RefinementImp< dimension_, CoordType >
 
struct  Dune::RefinementImp::HCubeTriangulation::RefinementImp< dimension_, CoordType >::Codim< codimension >
class  Dune::Geo::ReferenceElement< Implementation >
 This class provides access to geometric and topological properties of a reference element. More...
 
class  Dune::RefinementImp::HCubeTriangulation::RefinementIteratorSpecial< dimension, CoordType, dimension >
 
class  Dune::RefinementImp::HCubeTriangulation::RefinementIteratorSpecial< dimension, CoordType, 0 >
 
class  Dune::RefinementImp::HCubeTriangulation::RefinementImp< dimension_, CoordType >::Codim< codimension >
struct  Dune::Geo::ReferenceElement< Implementation >::Codim< codim >
 Collection of types depending on the codimension. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::RefinementImp
 This namespace contains the implementation of Refinement.
 
namespace  Dune::RefinementImp::HCubeTriangulation
 This namespace contains the Refinement implementation for triangulating hypercubes (GeometryType::cube -> GeometryType::simplex)
namespace  Dune::Geo
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Macros

#define DUNE_GEOMETRY_REFINEMENT_HCUBETRIANGULATION_CC
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

This file contains the Refinement implementation for triangulating hypercubes (quadrilateral -> triangle, hexahedron -> tetrahedron)

│ │ │ │ -

See Refinement implementation for triangulating hypercubes.

│ │ │ │ -

Macro Definition Documentation

│ │ │ │ - │ │ │ │ -

◆ DUNE_GEOMETRY_REFINEMENT_HCUBETRIANGULATION_CC

│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
#define DUNE_GEOMETRY_REFINEMENT_HCUBETRIANGULATION_CC
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,56 +4,27 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ - * refinement │ │ │ │ │ -Classes | Namespaces | Macros │ │ │ │ │ -hcubetriangulation.cc File Reference │ │ │ │ │ -This file contains the Refinement implementation for triangulating hypercubes │ │ │ │ │ -(quadrilateral -> triangle, hexahedron -> tetrahedron) More... │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces │ │ │ │ │ +referenceelement.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include "base.cc" │ │ │ │ │ -#include "simplex.cc" │ │ │ │ │ +Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ - class  Dune::RefinementImp::HCubeTriangulation::RefinementImp<_dimension_, │ │ │ │ │ - CoordType_> │ │ │ │ │ + class  Dune::Geo::ReferenceElement<_Implementation_> │ │ │ │ │ +  This class provides access to geometric and topological properties of │ │ │ │ │ + a reference element. More... │ │ │ │ │   │ │ │ │ │ -struct  Dune::RefinementImp::HCubeTriangulation::RefinementImp<_dimension_, │ │ │ │ │ - CoordType_>::Codim<_codimension_> │ │ │ │ │ -  │ │ │ │ │ - class  Dune::RefinementImp::HCubeTriangulation::RefinementIteratorSpecial< │ │ │ │ │ - dimension,_CoordType,_dimension_> │ │ │ │ │ -  │ │ │ │ │ - class  Dune::RefinementImp::HCubeTriangulation::RefinementIteratorSpecial< │ │ │ │ │ - dimension,_CoordType,_0_> │ │ │ │ │ -  │ │ │ │ │ - class  Dune::RefinementImp::HCubeTriangulation::RefinementImp<_dimension_, │ │ │ │ │ - CoordType_>::Codim<_codimension_> │ │ │ │ │ +struct  Dune::Geo::ReferenceElement<_Implementation_>::Codim<_codim_> │ │ │ │ │ +  Collection of types depending on the codimension. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ -namespace  Dune::RefinementImp │ │ │ │ │ -  This namespace contains the implementation of Refinement. │ │ │ │ │ -  │ │ │ │ │ -namespace  Dune::RefinementImp::HCubeTriangulation │ │ │ │ │ - This namespace contains the Refinement implementation for │ │ │ │ │ -  triangulating hypercubes (GeometryType::cube -> GeometryType:: │ │ │ │ │ - simplex) │ │ │ │ │ -  │ │ │ │ │ - Macros │ │ │ │ │ -#define DUNE_GEOMETRY_REFINEMENT_HCUBETRIANGULATION_CC │ │ │ │ │ +namespace  Dune::Geo │ │ │ │ │   │ │ │ │ │ -***** Detailed Description ***** │ │ │ │ │ -This file contains the Refinement implementation for triangulating hypercubes │ │ │ │ │ -(quadrilateral -> triangle, hexahedron -> tetrahedron) │ │ │ │ │ -See Refinement_implementation_for_triangulating_hypercubes. │ │ │ │ │ -***** Macro Definition Documentation ***** │ │ │ │ │ -***** ◆ DUNE_GEOMETRY_REFINEMENT_HCUBETRIANGULATION_CC ***** │ │ │ │ │ -#define DUNE_GEOMETRY_REFINEMENT_HCUBETRIANGULATION_CC │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00197.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: pyramidtriangulation.cc File Reference │ │ │ │ +dune-geometry: dimension.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,84 +58,42 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Macros | │ │ │ │ -Functions
│ │ │ │ -
pyramidtriangulation.cc File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
dimension.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <dune/common/fvector.hh>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ -#include <dune/geometry/referenceelements.hh>
│ │ │ │ -#include <dune/geometry/type.hh>
│ │ │ │ -#include "base.cc"
│ │ │ │ -#include "simplex.cc"
│ │ │ │ -
│ │ │ │ +
#include <type_traits>
│ │ │ │ +
│ │ │ │ +

Go to the source code of this file.

│ │ │ │ +
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Classes

class  Dune::RefinementImp::PyramidTriangulation::RefinementImp< dimension_, CoordType >
 Implementation of the refinement of a pyramid into simplices. More...
 
struct  Dune::RefinementImp::PyramidTriangulation::RefinementImp< dimension_, CoordType >::Codim< codimension >
 
class  Dune::RefinementImp::PyramidTriangulation::RefinementIteratorSpecial< dimension, CoordType, dimension >
struct  Dune::Dim< dim >
 Static tag representing a dimension. More...
 
class  Dune::RefinementImp::PyramidTriangulation::RefinementIteratorSpecial< dimension, CoordType, 0 >
 
class  Dune::RefinementImp::PyramidTriangulation::RefinementImp< dimension_, CoordType >::Codim< codimension >
struct  Dune::Codim< codim >
 Static tag representing a codimension. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::RefinementImp
 This namespace contains the implementation of Refinement.
 
namespace  Dune::RefinementImp::PyramidTriangulation
 This namespace contains the Refinement implementation for triangulating pyramids (GeometryType::pyramid -> GeometryType::simplex)
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Macros

#define DUNE_GEOMETRY_REFINEMENT_PYRAMIDTRIANGULATION_CC
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

template<int dimension, class CoordType >
FieldVector< CoordType, dimension > Dune::RefinementImp::PyramidTriangulation::transformCoordinate (FieldVector< CoordType, dimension > point)
 
│ │ │ │ -

Macro Definition Documentation

│ │ │ │ - │ │ │ │ -

◆ DUNE_GEOMETRY_REFINEMENT_PYRAMIDTRIANGULATION_CC

│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
#define DUNE_GEOMETRY_REFINEMENT_PYRAMIDTRIANGULATION_CC
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,60 +4,24 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ - * refinement │ │ │ │ │ -Classes | Namespaces | Macros | Functions │ │ │ │ │ -pyramidtriangulation.cc File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "base.cc" │ │ │ │ │ -#include "simplex.cc" │ │ │ │ │ +Classes | Namespaces │ │ │ │ │ +dimension.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ - class  Dune::RefinementImp::PyramidTriangulation::RefinementImp<_dimension_, │ │ │ │ │ - CoordType_> │ │ │ │ │ -  Implementation of the refinement of a pyramid into simplices. More... │ │ │ │ │ +struct  Dune::Dim<_dim_> │ │ │ │ │ +  Static tag representing a dimension. More... │ │ │ │ │   │ │ │ │ │ -struct  Dune::RefinementImp::PyramidTriangulation::RefinementImp<_dimension_, │ │ │ │ │ - CoordType_>::Codim<_codimension_> │ │ │ │ │ -  │ │ │ │ │ - class  Dune::RefinementImp::PyramidTriangulation::RefinementIteratorSpecial< │ │ │ │ │ - dimension,_CoordType,_dimension_> │ │ │ │ │ -  │ │ │ │ │ - class  Dune::RefinementImp::PyramidTriangulation::RefinementIteratorSpecial< │ │ │ │ │ - dimension,_CoordType,_0_> │ │ │ │ │ -  │ │ │ │ │ - class  Dune::RefinementImp::PyramidTriangulation::RefinementImp<_dimension_, │ │ │ │ │ - CoordType_>::Codim<_codimension_> │ │ │ │ │ +struct  Dune::Codim<_codim_> │ │ │ │ │ +  Static tag representing a codimension. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ -namespace  Dune::RefinementImp │ │ │ │ │ -  This namespace contains the implementation of Refinement. │ │ │ │ │ -  │ │ │ │ │ -namespace  Dune::RefinementImp::PyramidTriangulation │ │ │ │ │ - This namespace contains the Refinement implementation for │ │ │ │ │ -  triangulating pyramids (GeometryType::pyramid -> GeometryType:: │ │ │ │ │ - simplex) │ │ │ │ │ -  │ │ │ │ │ - Macros │ │ │ │ │ -#define DUNE_GEOMETRY_REFINEMENT_PYRAMIDTRIANGULATION_CC │ │ │ │ │ -  │ │ │ │ │ - Functions │ │ │ │ │ -template │ │ │ │ │ -FieldVector< CoordType, dimension > Dune::RefinementImp:: │ │ │ │ │ - PyramidTriangulation::transformCoordinate │ │ │ │ │ - (FieldVector< CoordType, dimension > │ │ │ │ │ - point) │ │ │ │ │ -  │ │ │ │ │ -***** Macro Definition Documentation ***** │ │ │ │ │ -***** ◆ DUNE_GEOMETRY_REFINEMENT_PYRAMIDTRIANGULATION_CC ***** │ │ │ │ │ -#define DUNE_GEOMETRY_REFINEMENT_PYRAMIDTRIANGULATION_CC │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00200.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: simplex.cc File Reference │ │ │ │ +dune-geometry: generalvertexorder.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,109 +58,57 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ -Macros
│ │ │ │ -
simplex.cc File Reference
│ │ │ │ +Functions
│ │ │ │ +
generalvertexorder.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ -

This file contains the Refinement implementation for simplices (triangles, tetrahedrons...) │ │ │ │ -More...

│ │ │ │
#include <algorithm>
│ │ │ │ -#include <dune/common/fvector.hh>
│ │ │ │ -#include <dune/common/math.hh>
│ │ │ │ -#include <dune/geometry/multilineargeometry.hh>
│ │ │ │ -#include <dune/geometry/referenceelements.hh>
│ │ │ │ -#include <dune/geometry/type.hh>
│ │ │ │ -#include "base.cc"
│ │ │ │ -
│ │ │ │ +#include <cassert>
│ │ │ │ +#include <cstddef>
│ │ │ │ +#include <iterator>
│ │ │ │ +#include <vector>
│ │ │ │ +#include <dune/common/iteratorfacades.hh>
│ │ │ │ +#include "type.hh"
│ │ │ │ +#include <dune/geometry/referenceelements.hh>
│ │ │ │ + │ │ │ │ +

Go to the source code of this file.

│ │ │ │ +
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Classes

class  Dune::RefinementImp::Simplex::RefinementImp< dimension_, CoordType >
 
struct  Dune::RefinementImp::Simplex::RefinementImp< dimension_, CoordType >::Codim< codimension >
class  Dune::GeneralVertexOrder< dim, Index_ >
 Class providing information on the ordering of vertices. More...
 
class  Dune::RefinementImp::Simplex::RefinementIteratorSpecial< dimension, CoordType, dimension >
 
class  Dune::RefinementImp::Simplex::RefinementIteratorSpecial< dimension, CoordType, 0 >
 
class  Dune::RefinementImp::Simplex::RefinementImp< dimension_, CoordType >::Codim< codimension >
class  Dune::GeneralVertexOrder< dim, Index_ >::iterator
 Iterate over the vertex indices of some sub-entity. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::RefinementImp
 This namespace contains the implementation of Refinement.
 
namespace  Dune::RefinementImp::Simplex
 This namespace contains the Refinement implementation for simplices (triangles, tetrahedrons...)
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Macros

#define DUNE_GRID_COMMON_REFINEMENT_SIMPLEX_CC
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

Utilities
int Dune::RefinementImp::Simplex::factorial (int n)
 Calculate n! More...
 
int Dune::RefinementImp::Simplex::binomial (int upper, int lower)
 calculate $\left({upper}\atop{lower}\right)$ More...
 
template<int dimension>
int Dune::RefinementImp::Simplex::pointIndex (const FieldVector< int, dimension > &point)
 calculate the index of a given gridpoint within a Kuhn0 simplex More...
 
template<int n>
FieldVector< int, n > Dune::RefinementImp::Simplex::getPermutation (int m)
 Calculate permutation from it's index. More...
 
template<int dimension, class CoordType >
FieldVector< CoordType, dimension > Dune::RefinementImp::Simplex::referenceToKuhn (FieldVector< CoordType, dimension > point, const FieldVector< int, dimension > &kuhn)
 Map from the reference simplex to some Kuhn simplex. More...
 
template<int dimension, class CoordType >
FieldVector< CoordType, dimension > Dune::RefinementImp::Simplex::kuhnToReference (FieldVector< CoordType, dimension > point, const FieldVector< int, dimension > &kuhn)
 Map from some Kuhn simplex to the reference simplex. More...
 
template<class InIterator , class OutIterator >
void Dune::reduceOrder (const InIterator &inBegin, const InIterator &inEnd, OutIterator outIt)
 Algorithm to reduce vertex order information. More...
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

This file contains the Refinement implementation for simplices (triangles, tetrahedrons...)

│ │ │ │ -

See Refinement implementation for simplices.

│ │ │ │ -

Macro Definition Documentation

│ │ │ │ - │ │ │ │ -

◆ DUNE_GRID_COMMON_REFINEMENT_SIMPLEX_CC

│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
#define DUNE_GRID_COMMON_REFINEMENT_SIMPLEX_CC
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,97 +4,37 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ - * refinement │ │ │ │ │ -Classes | Namespaces | Macros │ │ │ │ │ -simplex.cc File Reference │ │ │ │ │ -This file contains the Refinement implementation for simplices (triangles, │ │ │ │ │ -tetrahedrons...) More... │ │ │ │ │ +Classes | Namespaces | Functions │ │ │ │ │ +generalvertexorder.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "type.hh" │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include "base.cc" │ │ │ │ │ +Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ - class  Dune::RefinementImp::Simplex::RefinementImp<_dimension_,_CoordType_> │ │ │ │ │ +class  Dune::GeneralVertexOrder<_dim,_Index__> │ │ │ │ │ +  Class providing information on the ordering of vertices. More... │ │ │ │ │   │ │ │ │ │ -struct  Dune::RefinementImp::Simplex::RefinementImp<_dimension_,_CoordType_>:: │ │ │ │ │ - Codim<_codimension_> │ │ │ │ │ -  │ │ │ │ │ - class  Dune::RefinementImp::Simplex::RefinementIteratorSpecial<_dimension, │ │ │ │ │ - CoordType,_dimension_> │ │ │ │ │ -  │ │ │ │ │ - class  Dune::RefinementImp::Simplex::RefinementIteratorSpecial<_dimension, │ │ │ │ │ - CoordType,_0_> │ │ │ │ │ -  │ │ │ │ │ - class  Dune::RefinementImp::Simplex::RefinementImp<_dimension_,_CoordType_>:: │ │ │ │ │ - Codim<_codimension_> │ │ │ │ │ +class  Dune::GeneralVertexOrder<_dim,_Index__>::iterator │ │ │ │ │ +  Iterate over the vertex indices of some sub-entity. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ -namespace  Dune::RefinementImp │ │ │ │ │ -  This namespace contains the implementation of Refinement. │ │ │ │ │ -  │ │ │ │ │ -namespace  Dune::RefinementImp::Simplex │ │ │ │ │ -  This namespace contains the Refinement implementation for simplices │ │ │ │ │ - (triangles, tetrahedrons...) │ │ │ │ │ -  │ │ │ │ │ - Macros │ │ │ │ │ -#define DUNE_GRID_COMMON_REFINEMENT_SIMPLEX_CC │ │ │ │ │ -  │ │ │ │ │ Functions │ │ │ │ │ -Utilities │ │ │ │ │ - int Dune::RefinementImp::Simplex::factorial │ │ │ │ │ - (int n) │ │ │ │ │ -  Calculate n! More... │ │ │ │ │ -  │ │ │ │ │ - int Dune::RefinementImp::Simplex::binomial │ │ │ │ │ - (int upper, int lower) │ │ │ │ │ -  calculate [$\left({upper}\atop │ │ │ │ │ - {lower}\right)$] More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - int Dune::RefinementImp::Simplex::pointIndex │ │ │ │ │ - (const FieldVector< int, dimension > │ │ │ │ │ - &point) │ │ │ │ │ -  calculate the index of a given gridpoint │ │ │ │ │ - within a Kuhn0 simplex More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - FieldVector< int, n > Dune::RefinementImp::Simplex:: │ │ │ │ │ - getPermutation (int m) │ │ │ │ │ -  Calculate permutation from it's index. │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -FieldVector< CoordType, dimension > Dune::RefinementImp::Simplex:: │ │ │ │ │ - referenceToKuhn (FieldVector< CoordType, │ │ │ │ │ - dimension > point, const FieldVector< int, │ │ │ │ │ - dimension > &kuhn) │ │ │ │ │ -  Map from the reference simplex to some │ │ │ │ │ - Kuhn simplex. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -FieldVector< CoordType, dimension > Dune::RefinementImp::Simplex:: │ │ │ │ │ - kuhnToReference (FieldVector< CoordType, │ │ │ │ │ - dimension > point, const FieldVector< int, │ │ │ │ │ - dimension > &kuhn) │ │ │ │ │ -  Map from some Kuhn simplex to the │ │ │ │ │ - reference simplex. More... │ │ │ │ │ +template │ │ │ │ │ +void Dune::reduceOrder (const InIterator &inBegin, const InIterator &inEnd, │ │ │ │ │ + OutIterator outIt) │ │ │ │ │ +  Algorithm to reduce vertex order information. More... │ │ │ │ │   │ │ │ │ │ -***** Detailed Description ***** │ │ │ │ │ -This file contains the Refinement implementation for simplices (triangles, │ │ │ │ │ -tetrahedrons...) │ │ │ │ │ -See Refinement_implementation_for_simplices. │ │ │ │ │ -***** Macro Definition Documentation ***** │ │ │ │ │ -***** ◆ DUNE_GRID_COMMON_REFINEMENT_SIMPLEX_CC ***** │ │ │ │ │ -#define DUNE_GRID_COMMON_REFINEMENT_SIMPLEX_CC │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00203.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: prismtriangulation.cc File Reference │ │ │ │ +dune-geometry: deprecated_topology.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,84 +58,23 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
│ │ │ │ -Classes | │ │ │ │ -Namespaces | │ │ │ │ -Macros | │ │ │ │ -Functions
│ │ │ │ -
prismtriangulation.cc File Reference
│ │ │ │ +
deprecated_topology.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <dune/common/fvector.hh>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ -#include <dune/geometry/referenceelements.hh>
│ │ │ │ -#include <dune/geometry/type.hh>
│ │ │ │ -#include "base.cc"
│ │ │ │ -#include "simplex.cc"
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Classes

class  Dune::RefinementImp::PrismTriangulation::RefinementImp< dimension_, CoordType >
 Implementation of the refinement of a prism into simplices. More...
 
struct  Dune::RefinementImp::PrismTriangulation::RefinementImp< dimension_, CoordType >::Codim< codimension >
 
class  Dune::RefinementImp::PrismTriangulation::RefinementIteratorSpecial< dimension, CoordType, dimension >
 
class  Dune::RefinementImp::PrismTriangulation::RefinementIteratorSpecial< dimension, CoordType, 0 >
 
class  Dune::RefinementImp::PrismTriangulation::RefinementImp< dimension_, CoordType >::Codim< codimension >
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Namespaces

namespace  Dune
 
namespace  Dune::RefinementImp
 This namespace contains the implementation of Refinement.
 
namespace  Dune::RefinementImp::PrismTriangulation
 This namespace contains the Refinement implementation for triangulating prisms (GeometryType::prism -> GeometryType::simplex)
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Macros

#define DUNE_GEOMETRY_REFINEMENT_PRISMTRIANGULATION_CC
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Functions

template<int dimension, class CoordType >
FieldVector< CoordType, dimension > Dune::RefinementImp::PrismTriangulation::transformCoordinate (FieldVector< CoordType, dimension > point)
 
│ │ │ │ -

Macro Definition Documentation

│ │ │ │ - │ │ │ │ -

◆ DUNE_GEOMETRY_REFINEMENT_PRISMTRIANGULATION_CC

│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
#define DUNE_GEOMETRY_REFINEMENT_PRISMTRIANGULATION_CC
│ │ │ │ -
│ │ │ │ │ │ │ │ -
│ │ │ │ -
│ │ │ │ +

Go to the source code of this file.

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,59 +4,12 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ - * refinement │ │ │ │ │ -Classes | Namespaces | Macros | Functions │ │ │ │ │ -prismtriangulation.cc File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "base.cc" │ │ │ │ │ -#include "simplex.cc" │ │ │ │ │ - Classes │ │ │ │ │ - class  Dune::RefinementImp::PrismTriangulation::RefinementImp<_dimension_, │ │ │ │ │ - CoordType_> │ │ │ │ │ -  Implementation of the refinement of a prism into simplices. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::RefinementImp::PrismTriangulation::RefinementImp<_dimension_, │ │ │ │ │ - CoordType_>::Codim<_codimension_> │ │ │ │ │ -  │ │ │ │ │ - class  Dune::RefinementImp::PrismTriangulation::RefinementIteratorSpecial< │ │ │ │ │ - dimension,_CoordType,_dimension_> │ │ │ │ │ -  │ │ │ │ │ - class  Dune::RefinementImp::PrismTriangulation::RefinementIteratorSpecial< │ │ │ │ │ - dimension,_CoordType,_0_> │ │ │ │ │ -  │ │ │ │ │ - class  Dune::RefinementImp::PrismTriangulation::RefinementImp<_dimension_, │ │ │ │ │ - CoordType_>::Codim<_codimension_> │ │ │ │ │ -  │ │ │ │ │ - Namespaces │ │ │ │ │ -namespace  Dune │ │ │ │ │ -  │ │ │ │ │ -namespace  Dune::RefinementImp │ │ │ │ │ -  This namespace contains the implementation of Refinement. │ │ │ │ │ -  │ │ │ │ │ -namespace  Dune::RefinementImp::PrismTriangulation │ │ │ │ │ - This namespace contains the Refinement implementation for │ │ │ │ │ -  triangulating prisms (GeometryType::prism -> GeometryType::simplex) │ │ │ │ │ - │ │ │ │ │ -  │ │ │ │ │ - Macros │ │ │ │ │ -#define DUNE_GEOMETRY_REFINEMENT_PRISMTRIANGULATION_CC │ │ │ │ │ -  │ │ │ │ │ - Functions │ │ │ │ │ -template │ │ │ │ │ -FieldVector< CoordType, dimension > Dune::RefinementImp::PrismTriangulation:: │ │ │ │ │ - transformCoordinate (FieldVector< │ │ │ │ │ - CoordType, dimension > point) │ │ │ │ │ -  │ │ │ │ │ -***** Macro Definition Documentation ***** │ │ │ │ │ -***** ◆ DUNE_GEOMETRY_REFINEMENT_PRISMTRIANGULATION_CC ***** │ │ │ │ │ -#define DUNE_GEOMETRY_REFINEMENT_PRISMTRIANGULATION_CC │ │ │ │ │ +deprecated_topology.hh File Reference │ │ │ │ │ +Go_to_the_source_code_of_this_file. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00206.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: base.cc File Reference │ │ │ │ +dune-geometry: referenceelementimplementation.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,85 +58,50 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces | │ │ │ │ -Macros | │ │ │ │ -Functions
│ │ │ │ -
base.cc File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
referenceelementimplementation.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ -

This file contains the parts independent of a particular Refinement implementation. │ │ │ │ -More...

│ │ │ │ -
#include <dune/geometry/type.hh>
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Classes

struct  Dune::RefinementImp::Traits< topologyId, CoordType, coerceToId, dimension, Dummy >
 Mapping from geometryType, CoordType and coerceTo to a particular Refinement implementation. More...
 
class  Dune::RefinementIntervals
 Holds the number of refined intervals per axis needed for virtual and static refinement. More...
 
class  Dune::StaticRefinement< topologyId, CoordType, coerceToId, dimension_ >
 Wrap each Refinement implementation to get a consistent interface. More...
 
struct  Dune::StaticRefinement< topologyId, CoordType, coerceToId, dimension_ >::Codim< codimension >
 The Codim struct inherited from the Refinement implementation. More...
 
│ │ │ │ +
#include <cassert>
│ │ │ │ +#include <algorithm>
│ │ │ │ +#include <limits>
│ │ │ │ +#include <tuple>
│ │ │ │ +#include <utility>
│ │ │ │ +#include <vector>
│ │ │ │ +#include <array>
│ │ │ │ +#include <bitset>
│ │ │ │ +#include <dune/common/fmatrix.hh>
│ │ │ │ +#include <dune/common/fvector.hh>
│ │ │ │ +#include <dune/common/hybridutilities.hh>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │ +#include <dune/common/iteratorrange.hh>
│ │ │ │ +#include <dune/common/math.hh>
│ │ │ │ +#include <dune/geometry/referenceelement.hh>
│ │ │ │ +#include <dune/geometry/affinegeometry.hh>
│ │ │ │ +#include <dune/geometry/type.hh>
│ │ │ │ +
│ │ │ │ +

Go to the source code of this file.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::RefinementImp
 This namespace contains the implementation of Refinement.
namespace  Dune::Geo
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Macros

#define DUNE_GEOMETRY_REFINEMENT_BASE_CC
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

RefinementIntervals Dune::refinementIntervals (int intervals)
 Creates a RefinementIntervals object. More...
 
RefinementIntervals Dune::refinementLevels (int levels)
 Creates a RefinementIntervals object. More...
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

This file contains the parts independent of a particular Refinement implementation.

│ │ │ │ -

Macro Definition Documentation

│ │ │ │ - │ │ │ │ -

◆ DUNE_GEOMETRY_REFINEMENT_BASE_CC

│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
#define DUNE_GEOMETRY_REFINEMENT_BASE_CC
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,57 +4,35 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ - * refinement │ │ │ │ │ -Classes | Namespaces | Macros | Functions │ │ │ │ │ -base.cc File Reference │ │ │ │ │ -This file contains the parts independent of a particular Refinement │ │ │ │ │ -implementation. More... │ │ │ │ │ +Namespaces │ │ │ │ │ +referenceelementimplementation.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ - Classes │ │ │ │ │ -struct  Dune::RefinementImp::Traits<_topologyId,_CoordType,_coerceToId, │ │ │ │ │ - dimension,_Dummy_> │ │ │ │ │ -  Mapping from geometryType, CoordType and coerceTo to a particular │ │ │ │ │ - Refinement implementation. More... │ │ │ │ │ -  │ │ │ │ │ - class  Dune::RefinementIntervals │ │ │ │ │ -  Holds the number of refined intervals per axis needed for virtual and │ │ │ │ │ - static refinement. More... │ │ │ │ │ -  │ │ │ │ │ - class  Dune::StaticRefinement<_topologyId,_CoordType,_coerceToId,_dimension_ │ │ │ │ │ - > │ │ │ │ │ -  Wrap each Refinement implementation to get a consistent interface. │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::StaticRefinement<_topologyId,_CoordType,_coerceToId,_dimension_ │ │ │ │ │ - >::Codim<_codimension_> │ │ │ │ │ -  The Codim struct inherited from the Refinement implementation. More... │ │ │ │ │ -  │ │ │ │ │ +Go_to_the_source_code_of_this_file. │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ -namespace  Dune::RefinementImp │ │ │ │ │ -  This namespace contains the implementation of Refinement. │ │ │ │ │ -  │ │ │ │ │ - Macros │ │ │ │ │ -#define DUNE_GEOMETRY_REFINEMENT_BASE_CC │ │ │ │ │ -  │ │ │ │ │ - Functions │ │ │ │ │ -RefinementIntervals Dune::refinementIntervals (int intervals) │ │ │ │ │ -  Creates a RefinementIntervals object. More... │ │ │ │ │ -  │ │ │ │ │ -RefinementIntervals Dune::refinementLevels (int levels) │ │ │ │ │ -  Creates a RefinementIntervals object. More... │ │ │ │ │ +namespace  Dune::Geo │ │ │ │ │   │ │ │ │ │ -***** Detailed Description ***** │ │ │ │ │ -This file contains the parts independent of a particular Refinement │ │ │ │ │ -implementation. │ │ │ │ │ -***** Macro Definition Documentation ***** │ │ │ │ │ -***** ◆ DUNE_GEOMETRY_REFINEMENT_BASE_CC ***** │ │ │ │ │ -#define DUNE_GEOMETRY_REFINEMENT_BASE_CC │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00209.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: hcube.cc File Reference │ │ │ │ +dune-geometry: virtualrefinement.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,86 +58,59 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ -Macros
│ │ │ │ -
hcube.cc File Reference
│ │ │ │ +Functions
│ │ │ │ +
virtualrefinement.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

This file contains the Refinement implementation for hypercubes (quadrilaterals, hexahedrons, etc.). │ │ │ │ +

This file contains the virtual wrapper around refinement. │ │ │ │ More...

│ │ │ │ -
#include <cassert>
│ │ │ │ +
#include <vector>
│ │ │ │ #include <dune/common/fvector.hh>
│ │ │ │ -#include <dune/common/iteratorfacades.hh>
│ │ │ │ -#include <dune/geometry/referenceelements.hh>
│ │ │ │ -#include <dune/geometry/axisalignedcubegeometry.hh>
│ │ │ │ -#include "base.cc"
│ │ │ │ -
│ │ │ │ +#include "refinement.hh"
│ │ │ │ +#include "type.hh"
│ │ │ │ +#include "virtualrefinement.cc"
│ │ │ │ + │ │ │ │ +

Go to the source code of this file.

│ │ │ │ +
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Classes

class  Dune::RefinementImp::HCube::RefinementImp< dimension_, CoordType >
 Refinement implementation for hypercubes More...
 
struct  Dune::RefinementImp::HCube::RefinementImp< dimension_, CoordType >::Codim< codimension >
 
class  Dune::RefinementImp::HCube::RefinementSubEntityIteratorSpecial< dimension, CoordType, codimension >
 SubEntityIterator base class for hypercube refinement. More...
class  Dune::VirtualRefinement< dimension, CoordType >
 VirtualRefinement base class. More...
 
class  Dune::RefinementImp::HCube::RefinementSubEntityIteratorSpecial< dimension, CoordType, dimension >
 
class  Dune::RefinementImp::HCube::RefinementSubEntityIteratorSpecial< dimension, CoordType, 0 >
 
class  Dune::RefinementImp::HCube::RefinementImp< dimension_, CoordType >::Codim< codimension >
struct  Dune::VirtualRefinement< dimension, CoordType >::Codim< codimension >
 codim database of VirtualRefinement More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::RefinementImp
 This namespace contains the implementation of Refinement.
 
namespace  Dune::RefinementImp::HCube
 This namespace contains the Refinement implementation for hypercubes (GeometryType::cube).
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Macros

#define DUNE_GEOMETRY_REFINEMENT_HCUBE_CC
 

│ │ │ │ +Functions

template<int dimension, class CoordType >
VirtualRefinement< dimension, CoordType > & Dune::buildRefinement (GeometryType geometryType, GeometryType coerceTo)
 return a reference to the VirtualRefinement according to the parameters More...
 
│ │ │ │

Detailed Description

│ │ │ │ -

This file contains the Refinement implementation for hypercubes (quadrilaterals, hexahedrons, etc.).

│ │ │ │ -

See Refinement implementation for hypercubes.

│ │ │ │ -

Macro Definition Documentation

│ │ │ │ - │ │ │ │ -

◆ DUNE_GEOMETRY_REFINEMENT_HCUBE_CC

│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
#define DUNE_GEOMETRY_REFINEMENT_HCUBE_CC
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ +

This file contains the virtual wrapper around refinement.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,61 +4,39 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ - * refinement │ │ │ │ │ -Classes | Namespaces | Macros │ │ │ │ │ -hcube.cc File Reference │ │ │ │ │ -This file contains the Refinement implementation for hypercubes │ │ │ │ │ -(quadrilaterals, hexahedrons, etc.). More... │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces | Functions │ │ │ │ │ +virtualrefinement.hh File Reference │ │ │ │ │ +This file contains the virtual wrapper around refinement. More... │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "base.cc" │ │ │ │ │ +#include "refinement.hh" │ │ │ │ │ +#include "type.hh" │ │ │ │ │ +#include "virtualrefinement.cc" │ │ │ │ │ +Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ - class  Dune::RefinementImp::HCube::RefinementImp<_dimension_,_CoordType_> │ │ │ │ │ -  Refinement implementation for hypercubes More... │ │ │ │ │ + class  Dune::VirtualRefinement<_dimension,_CoordType_> │ │ │ │ │ +  VirtualRefinement base class. More... │ │ │ │ │   │ │ │ │ │ -struct  Dune::RefinementImp::HCube::RefinementImp<_dimension_,_CoordType_>:: │ │ │ │ │ - Codim<_codimension_> │ │ │ │ │ -  │ │ │ │ │ - class  Dune::RefinementImp::HCube::RefinementSubEntityIteratorSpecial< │ │ │ │ │ - dimension,_CoordType,_codimension_> │ │ │ │ │ -  SubEntityIterator base class for hypercube refinement. More... │ │ │ │ │ -  │ │ │ │ │ - class  Dune::RefinementImp::HCube::RefinementSubEntityIteratorSpecial< │ │ │ │ │ - dimension,_CoordType,_dimension_> │ │ │ │ │ -  │ │ │ │ │ - class  Dune::RefinementImp::HCube::RefinementSubEntityIteratorSpecial< │ │ │ │ │ - dimension,_CoordType,_0_> │ │ │ │ │ -  │ │ │ │ │ - class  Dune::RefinementImp::HCube::RefinementImp<_dimension_,_CoordType_>:: │ │ │ │ │ - Codim<_codimension_> │ │ │ │ │ +struct  Dune::VirtualRefinement<_dimension,_CoordType_>::Codim<_codimension_> │ │ │ │ │ +  codim database of VirtualRefinement More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ -namespace  Dune::RefinementImp │ │ │ │ │ -  This namespace contains the implementation of Refinement. │ │ │ │ │ -  │ │ │ │ │ -namespace  Dune::RefinementImp::HCube │ │ │ │ │ -  This namespace contains the Refinement implementation for │ │ │ │ │ - hypercubes (GeometryType::cube). │ │ │ │ │ -  │ │ │ │ │ - Macros │ │ │ │ │ -#define DUNE_GEOMETRY_REFINEMENT_HCUBE_CC │ │ │ │ │ + Functions │ │ │ │ │ +template │ │ │ │ │ +VirtualRefinement< dimension, CoordType > Dune::buildRefinement (GeometryType │ │ │ │ │ + & geometryType, GeometryType coerceTo) │ │ │ │ │ + return a reference to the │ │ │ │ │ +  VirtualRefinement according to the │ │ │ │ │ + parameters More... │ │ │ │ │   │ │ │ │ │ ***** Detailed Description ***** │ │ │ │ │ -This file contains the Refinement implementation for hypercubes │ │ │ │ │ -(quadrilaterals, hexahedrons, etc.). │ │ │ │ │ -See Refinement_implementation_for_hypercubes. │ │ │ │ │ -***** Macro Definition Documentation ***** │ │ │ │ │ -***** ◆ DUNE_GEOMETRY_REFINEMENT_HCUBE_CC ***** │ │ │ │ │ -#define DUNE_GEOMETRY_REFINEMENT_HCUBE_CC │ │ │ │ │ +This file contains the virtual wrapper around refinement. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00212.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: quadraturerules.hh File Reference │ │ │ │ +dune-geometry: typeindex.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -64,119 +64,44 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Macros | │ │ │ │ -Enumerations
│ │ │ │ -
quadraturerules.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
typeindex.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <algorithm>
│ │ │ │ -#include <iostream>
│ │ │ │ -#include <limits>
│ │ │ │ -#include <mutex>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <vector>
│ │ │ │ -#include <dune/common/fvector.hh>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/common/stdstreams.hh>
│ │ │ │ -#include <dune/common/stdthread.hh>
│ │ │ │ -#include <dune/common/visibility.hh>
│ │ │ │ -#include <dune/geometry/type.hh>
│ │ │ │ -#include <dune/geometry/typeindex.hh>
│ │ │ │ -#include "quadraturerules/pointquadrature.hh"
│ │ │ │ -#include "quadraturerules/gausslobattoquadrature.hh"
│ │ │ │ -#include "quadraturerules/gaussquadrature.hh"
│ │ │ │ -#include "quadraturerules/gaussradauleftquadrature.hh"
│ │ │ │ -#include "quadraturerules/gaussradaurightquadrature.hh"
│ │ │ │ -#include "quadraturerules/jacobi1quadrature.hh"
│ │ │ │ -#include "quadraturerules/jacobi2quadrature.hh"
│ │ │ │ -#include "quadraturerules/jacobiNquadrature.hh"
│ │ │ │ -#include "quadraturerules/prismquadrature.hh"
│ │ │ │ -#include "quadraturerules/simplexquadrature.hh"
│ │ │ │ -#include "quadraturerules/tensorproductquadrature.hh"
│ │ │ │ + │ │ │ │ +

Helper classes to provide indices for geometrytypes for use in a vector. │ │ │ │ +More...

│ │ │ │ +
#include <cstddef>
│ │ │ │ +#include <dune/common/indices.hh>
│ │ │ │ +#include <dune/common/hybridutilities.hh>
│ │ │ │ +#include "type.hh"
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Classes

class  Dune::QuadratureOrderOutOfRange
 Exception thrown if a desired QuadratureRule is not available, because the requested order is to high. More...
 
class  Dune::QuadraturePoint< ct, dim >
 Single evaluation point in a quadrature rule. More...
 
class  Dune::QuadratureRule< ct, dim >
 Abstract base class for quadrature rules. More...
 
class  Dune::QuadratureRules< ctype, dim >
 A container for all quadrature rules of dimension dim More...
 
class  Dune::QuadratureRuleFactory< ctype, dim >
 Factory class for creation of quadrature rules, depending on GeometryType, order and QuadratureType. More...
 
class  Dune::QuadratureRuleFactory< ctype, 0 >
 
class  Dune::QuadratureRuleFactory< ctype, 1 >
 
class  Dune::QuadratureRuleFactory< ctype, 2 >
class  Dune::LocalGeometryTypeIndex
 Compute per-dimension indices for geometry types. More...
 
class  Dune::QuadratureRuleFactory< ctype, 3 >
class  Dune::GlobalGeometryTypeIndex
 Compute indices for geometry types, taking the dimension into account. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::QuadratureType
 Defines an enum for currently available quadrature rules.
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Macros

#define DUNE_INCLUDING_IMPLEMENTATION
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Enumerations

enum  Dune::QuadratureType::Enum {
│ │ │ │ -  Dune::QuadratureType::GaussLegendre = 0 │ │ │ │ -, Dune::QuadratureType::GaussJacobi_1_0 = 1 │ │ │ │ -, Dune::QuadratureType::GaussJacobi_2_0 = 2 │ │ │ │ -, Dune::QuadratureType::GaussJacobi_n_0 = 3 │ │ │ │ -,
│ │ │ │ -  Dune::QuadratureType::GaussLobatto = 4 │ │ │ │ -, Dune::QuadratureType::GaussRadauLeft = 5 │ │ │ │ -, Dune::QuadratureType::GaussRadauRight = 6 │ │ │ │ -, Dune::QuadratureType::size │ │ │ │ -
│ │ │ │ - }
 
│ │ │ │

Detailed Description

│ │ │ │ -

Interface for quadrature points and rules

│ │ │ │ -

Macro Definition Documentation

│ │ │ │ - │ │ │ │ -

◆ DUNE_INCLUDING_IMPLEMENTATION

│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
#define DUNE_INCLUDING_IMPLEMENTATION
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ +

Helper classes to provide indices for geometrytypes for use in a vector.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,87 +4,32 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ -Classes | Namespaces | Macros | Enumerations │ │ │ │ │ -quadraturerules.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "quadraturerules/pointquadrature.hh" │ │ │ │ │ -#include "quadraturerules/gausslobattoquadrature.hh" │ │ │ │ │ -#include "quadraturerules/gaussquadrature.hh" │ │ │ │ │ -#include "quadraturerules/gaussradauleftquadrature.hh" │ │ │ │ │ -#include "quadraturerules/gaussradaurightquadrature.hh" │ │ │ │ │ -#include "quadraturerules/jacobi1quadrature.hh" │ │ │ │ │ -#include "quadraturerules/jacobi2quadrature.hh" │ │ │ │ │ -#include "quadraturerules/jacobiNquadrature.hh" │ │ │ │ │ -#include "quadraturerules/prismquadrature.hh" │ │ │ │ │ -#include "quadraturerules/simplexquadrature.hh" │ │ │ │ │ -#include "quadraturerules/tensorproductquadrature.hh" │ │ │ │ │ +Classes | Namespaces │ │ │ │ │ +typeindex.hh File Reference │ │ │ │ │ +Helper classes to provide indices for geometrytypes for use in a vector. │ │ │ │ │ +More... │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "type.hh" │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::QuadratureOrderOutOfRange │ │ │ │ │ -  Exception thrown if a desired QuadratureRule is not available, because │ │ │ │ │ - the requested order is to high. More... │ │ │ │ │ +class  Dune::LocalGeometryTypeIndex │ │ │ │ │ +  Compute per-dimension indices for geometry types. More... │ │ │ │ │   │ │ │ │ │ -class  Dune::QuadraturePoint<_ct,_dim_> │ │ │ │ │ -  Single evaluation point in a quadrature rule. More... │ │ │ │ │ -  │ │ │ │ │ -class  Dune::QuadratureRule<_ct,_dim_> │ │ │ │ │ -  Abstract base class for quadrature rules. More... │ │ │ │ │ -  │ │ │ │ │ -class  Dune::QuadratureRules<_ctype,_dim_> │ │ │ │ │ -  A container for all quadrature rules of dimension dim More... │ │ │ │ │ -  │ │ │ │ │ -class  Dune::QuadratureRuleFactory<_ctype,_dim_> │ │ │ │ │ -  Factory class for creation of quadrature rules, depending on │ │ │ │ │ - GeometryType, order and QuadratureType. More... │ │ │ │ │ -  │ │ │ │ │ -class  Dune::QuadratureRuleFactory<_ctype,_0_> │ │ │ │ │ -  │ │ │ │ │ -class  Dune::QuadratureRuleFactory<_ctype,_1_> │ │ │ │ │ -  │ │ │ │ │ -class  Dune::QuadratureRuleFactory<_ctype,_2_> │ │ │ │ │ -  │ │ │ │ │ -class  Dune::QuadratureRuleFactory<_ctype,_3_> │ │ │ │ │ +class  Dune::GlobalGeometryTypeIndex │ │ │ │ │ +  Compute indices for geometry types, taking the dimension into account. │ │ │ │ │ + More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ -namespace  Dune::QuadratureType │ │ │ │ │ -  Defines an enum for currently available quadrature rules. │ │ │ │ │ -  │ │ │ │ │ - Macros │ │ │ │ │ -#define DUNE_INCLUDING_IMPLEMENTATION │ │ │ │ │ -  │ │ │ │ │ - Enumerations │ │ │ │ │ -enum  Dune::QuadratureType::Enum { │ │ │ │ │ -   Dune::QuadratureType::GaussLegendre = 0 , Dune::QuadratureType:: │ │ │ │ │ - GaussJacobi_1_0 = 1 , Dune::QuadratureType::GaussJacobi_2_0 = 2 , Dune:: │ │ │ │ │ - QuadratureType::GaussJacobi_n_0 = 3 , │ │ │ │ │ -   Dune::QuadratureType::GaussLobatto = 4 , Dune::QuadratureType:: │ │ │ │ │ - GaussRadauLeft = 5 , Dune::QuadratureType::GaussRadauRight = 6 , Dune:: │ │ │ │ │ - QuadratureType::size │ │ │ │ │ - } │ │ │ │ │ -  │ │ │ │ │ ***** Detailed Description ***** │ │ │ │ │ -Interface for quadrature points and rules │ │ │ │ │ -***** Macro Definition Documentation ***** │ │ │ │ │ -***** ◆ DUNE_INCLUDING_IMPLEMENTATION ***** │ │ │ │ │ -#define DUNE_INCLUDING_IMPLEMENTATION │ │ │ │ │ +Helper classes to provide indices for geometrytypes for use in a vector. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00212_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: quadraturerules.hh Source File │ │ │ │ +dune-geometry: typeindex.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,442 +62,146 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
quadraturerules.hh
│ │ │ │ +
typeindex.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
2// vi: set et ts=4 sw=2 sts=2:
│ │ │ │
3// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
5
│ │ │ │ -
6#ifndef DUNE_GEOMETRY_QUADRATURERULES_HH
│ │ │ │ -
7#define DUNE_GEOMETRY_QUADRATURERULES_HH
│ │ │ │ -
8
│ │ │ │ -
9#include <algorithm>
│ │ │ │ -
10#include <iostream>
│ │ │ │ -
11#include <limits>
│ │ │ │ -
12#include <mutex>
│ │ │ │ -
13#include <utility>
│ │ │ │ -
14#include <vector>
│ │ │ │ +
5#ifndef DUNE_GEOMETRY_TYPEINDEX_HH
│ │ │ │ +
6#define DUNE_GEOMETRY_TYPEINDEX_HH
│ │ │ │ +
7
│ │ │ │ +
14#include <cstddef>
│ │ │ │
15
│ │ │ │ -
16#include <dune/common/fvector.hh>
│ │ │ │ -
17#include <dune/common/exceptions.hh>
│ │ │ │ -
18#include <dune/common/stdstreams.hh>
│ │ │ │ -
19#include <dune/common/stdthread.hh>
│ │ │ │ -
20#include <dune/common/visibility.hh>
│ │ │ │ -
21
│ │ │ │ -
22#include <dune/geometry/type.hh>
│ │ │ │ - │ │ │ │ -
24
│ │ │ │ -
30namespace Dune {
│ │ │ │ -
31
│ │ │ │ -
36 class QuadratureOrderOutOfRange : public NotImplemented {};
│ │ │ │ -
37
│ │ │ │ -
43 template<typename ct, int dim>
│ │ │ │ - │ │ │ │ -
45 public:
│ │ │ │ -
47 constexpr static int dimension = dim;
│ │ │ │ -
48
│ │ │ │ -
50 typedef ct Field;
│ │ │ │ -
51
│ │ │ │ -
53 typedef Dune::FieldVector<ct,dim> Vector;
│ │ │ │ +
16#include <dune/common/indices.hh>
│ │ │ │ +
17#include <dune/common/hybridutilities.hh>
│ │ │ │ +
18
│ │ │ │ +
19#include "type.hh"
│ │ │ │ +
20
│ │ │ │ +
21namespace Dune
│ │ │ │ +
22{
│ │ │ │ + │ │ │ │ +
25 {
│ │ │ │ +
32 inline static constexpr std::size_t regular_size(std::size_t dim)
│ │ │ │ +
33 {
│ │ │ │ +
34 // The following expression is derived from the expression for
│ │ │ │ +
35 // GlobalGeometryTypeIndex::regular_offset(). Subtracting
│ │ │ │ +
36 // regular_offset(dim+1)-regular_offset(dim) we get:
│ │ │ │ +
37 //
│ │ │ │ +
38 // ((1 << dim+1) >> 1) - ((1 << dim) >> 1)
│ │ │ │ +
39 //
│ │ │ │ +
40 // We always have
│ │ │ │ +
41 //
│ │ │ │ +
42 // dim >= 0,
│ │ │ │ +
43 //
│ │ │ │ +
44 // so
│ │ │ │ +
45 //
│ │ │ │ +
46 // (1 << dim+1) >= 2 and (1 << dim+2) % 2 == 0.
│ │ │ │ +
47 //
│ │ │ │ +
48 // So if we apply a single right-shift to that, we will never lose any
│ │ │ │ +
49 // set bits, thus
│ │ │ │ +
50 //
│ │ │ │ +
51 // ((1 << dim+1) >> 1) == (1 << dim)
│ │ │ │ +
52 return (1 << dim) - ((1 << dim) >> 1);
│ │ │ │ +
53 }
│ │ │ │
54
│ │ │ │ -
56 QuadraturePoint (const Vector& x, ct w) : local(x)
│ │ │ │ -
57 {
│ │ │ │ -
58 weight_ = w;
│ │ │ │ -
59 }
│ │ │ │ -
60
│ │ │ │ -
62 const Vector& position () const
│ │ │ │ -
63 {
│ │ │ │ -
64 return local;
│ │ │ │ +
55 public:
│ │ │ │ +
61 inline static constexpr std::size_t size(std::size_t dim)
│ │ │ │ +
62 {
│ │ │ │ +
63 // one for "none"
│ │ │ │ +
64 return regular_size(dim) + 1;
│ │ │ │
65 }
│ │ │ │
66
│ │ │ │ -
68 const ct &weight () const
│ │ │ │ -
69 {
│ │ │ │ -
70 return weight_;
│ │ │ │ -
71 }
│ │ │ │ -
72
│ │ │ │ -
73 protected:
│ │ │ │ -
74 FieldVector<ct, dim> local;
│ │ │ │ - │ │ │ │ -
76 };
│ │ │ │ +
73 inline static constexpr std::size_t index(const GeometryType &gt)
│ │ │ │ +
74 {
│ │ │ │ +
75 return gt.isNone() ? regular_size(gt.dim()) : (gt.id() >> 1);
│ │ │ │ +
76 }
│ │ │ │
77
│ │ │ │ -
81 namespace QuadratureType {
│ │ │ │ -
82 enum Enum {
│ │ │ │ - │ │ │ │ -
93
│ │ │ │ - │ │ │ │ -
100
│ │ │ │ - │ │ │ │ +
79 inline static constexpr GeometryType type(std::size_t dim, std::size_t index) {
│ │ │ │ +
80 return (index == regular_size(dim)) ?
│ │ │ │ + │ │ │ │ +
82 // the cast to unsigned makes sure this is interpreted as the topology
│ │ │ │ +
83 // ID constructor
│ │ │ │ +
84 GeometryType(static_cast< unsigned int >(index << 1), dim);
│ │ │ │ +
85 }
│ │ │ │ +
86 };
│ │ │ │ +
87
│ │ │ │ + │ │ │ │ +
90 {
│ │ │ │ +
98 inline static constexpr std::size_t regular_offset(std::size_t dim)
│ │ │ │ +
99 {
│ │ │ │ +
100 // The number of regular geometry types in a given dimension is
│ │ │ │ +
101 // 2^(dim-1). For dim==0 this would yield 1/2 geometry types (which is
│ │ │ │ +
102 // obviously bogus, dim==0 has one regular geometry type, the point).
│ │ │ │ +
103 // The following expression relies on 1 >> 1 == 0 to treat dim==0
│ │ │ │ +
104 // specially.
│ │ │ │ +
105 return (1 << dim) >> 1;
│ │ │ │ +
106 }
│ │ │ │
107
│ │ │ │ - │ │ │ │ -
120
│ │ │ │ - │ │ │ │ -
128
│ │ │ │ - │ │ │ │ -
136
│ │ │ │ - │ │ │ │ -
145 size
│ │ │ │ -
146 };
│ │ │ │ -
147 }
│ │ │ │ -
148
│ │ │ │ -
152 template<typename ct, int dim>
│ │ │ │ -
153 class QuadratureRule : public std::vector<QuadraturePoint<ct,dim> >
│ │ │ │ -
154 {
│ │ │ │ -
155 public:
│ │ │ │ - │ │ │ │ -
162
│ │ │ │ -
163 protected:
│ │ │ │ - │ │ │ │ -
166
│ │ │ │ - │ │ │ │ -
169 public:
│ │ │ │ -
171 constexpr static int d = dim;
│ │ │ │ -
172
│ │ │ │ -
174 typedef ct CoordType;
│ │ │ │ -
175
│ │ │ │ -
177 virtual int order () const { return delivered_order; }
│ │ │ │ -
178
│ │ │ │ -
180 virtual GeometryType type () const { return geometry_type; }
│ │ │ │ -
181 virtual ~QuadratureRule(){}
│ │ │ │ -
182
│ │ │ │ -
185 typedef typename std::vector<QuadraturePoint<ct,dim> >::const_iterator iterator;
│ │ │ │ -
186
│ │ │ │ -
187 protected:
│ │ │ │ - │ │ │ │ - │ │ │ │ -
190 };
│ │ │ │ -
191
│ │ │ │ -
192 // Forward declaration of the factory class,
│ │ │ │ -
193 // needed internally by the QuadratureRules container class.
│ │ │ │ -
194 template<typename ctype, int dim> class QuadratureRuleFactory;
│ │ │ │ -
195
│ │ │ │ -
199 template<typename ctype, int dim>
│ │ │ │ - │ │ │ │ -
201
│ │ │ │ - │ │ │ │ -
204
│ │ │ │ -
205 // indexed by quadrature order
│ │ │ │ -
206 using QuadratureOrderVector = std::vector<std::pair<std::once_flag, QuadratureRule> >;
│ │ │ │ -
207
│ │ │ │ -
208 // indexed by geometry type
│ │ │ │ -
209 using GeometryTypeVector = std::vector<std::pair<std::once_flag, QuadratureOrderVector> >;
│ │ │ │ -
210
│ │ │ │ -
211 // indexed by quadrature type enum
│ │ │ │ -
212 using QuadratureCacheVector = std::vector<std::pair<std::once_flag, GeometryTypeVector> >;
│ │ │ │ -
213
│ │ │ │ -
215 DUNE_EXPORT const QuadratureRule& _rule(const GeometryType& t, int p, QuadratureType::Enum qt=QuadratureType::GaussLegendre) const
│ │ │ │ -
216 {
│ │ │ │ -
217 assert(t.dim()==dim);
│ │ │ │ -
218
│ │ │ │ -
219 DUNE_ASSERT_CALL_ONCE();
│ │ │ │ -
220
│ │ │ │ -
221 static QuadratureCacheVector quadratureCache(QuadratureType::size);
│ │ │ │ -
222
│ │ │ │ -
223 auto& [ onceFlagQuadratureType, geometryTypes ] = quadratureCache[qt];
│ │ │ │ -
224 // initialize geometry types for this quadrature type once
│ │ │ │ -
225 std::call_once(onceFlagQuadratureType, [&types = geometryTypes]{
│ │ │ │ -
226 types = GeometryTypeVector(LocalGeometryTypeIndex::size(dim));
│ │ │ │ -
227 });
│ │ │ │ -
228
│ │ │ │ -
229 auto& [ onceFlagGeometryType, quadratureOrders ] = geometryTypes[LocalGeometryTypeIndex::index(t)];
│ │ │ │ -
230 // initialize quadrature orders for this geometry type and quadrature type once
│ │ │ │ -
231 std::call_once(onceFlagGeometryType, [&, &orders = quadratureOrders]{
│ │ │ │ -
232 // we only need one quadrature rule for points, not maxint
│ │ │ │ -
233 const auto numRules = dim == 0 ? 1 : QuadratureRuleFactory<ctype,dim>::maxOrder(t, qt)+1;
│ │ │ │ -
234 orders = QuadratureOrderVector(numRules);
│ │ │ │ -
235 });
│ │ │ │ -
236
│ │ │ │ -
237 // we only have one quadrature rule for points
│ │ │ │ -
238 auto& [ onceFlagQuadratureOrder, quadratureRule ] = quadratureOrders[dim == 0 ? 0 : p];
│ │ │ │ -
239 // initialize quadrature rule once
│ │ │ │ -
240 std::call_once(onceFlagQuadratureOrder, [&, &rule = quadratureRule]{
│ │ │ │ - │ │ │ │ -
242 });
│ │ │ │ -
243
│ │ │ │ -
244 return quadratureRule;
│ │ │ │ -
245 }
│ │ │ │ -
246
│ │ │ │ -
248 DUNE_EXPORT static QuadratureRules& instance()
│ │ │ │ -
249 {
│ │ │ │ -
250 static QuadratureRules instance;
│ │ │ │ -
251 return instance;
│ │ │ │ -
252 }
│ │ │ │ -
253
│ │ │ │ -
255 QuadratureRules () = default;
│ │ │ │ -
256 public:
│ │ │ │ -
258 static unsigned
│ │ │ │ - │ │ │ │ - │ │ │ │ -
261 {
│ │ │ │ - │ │ │ │ -
263 }
│ │ │ │ -
264
│ │ │ │ - │ │ │ │ -
267 {
│ │ │ │ -
268 return instance()._rule(t,p,qt);
│ │ │ │ -
269 }
│ │ │ │ -
270
│ │ │ │ - │ │ │ │ -
273 {
│ │ │ │ -
274 GeometryType gt(t,dim);
│ │ │ │ -
275 return instance()._rule(gt,p,qt);
│ │ │ │ -
276 }
│ │ │ │ -
277 };
│ │ │ │ -
278
│ │ │ │ -
279} // end namespace Dune
│ │ │ │ -
280
│ │ │ │ -
281#define DUNE_INCLUDING_IMPLEMENTATION
│ │ │ │ -
282
│ │ │ │ -
283// 0d rules
│ │ │ │ -
284#include "quadraturerules/pointquadrature.hh"
│ │ │ │ -
285// 1d rules
│ │ │ │ -
286#include "quadraturerules/gausslobattoquadrature.hh"
│ │ │ │ -
287#include "quadraturerules/gaussquadrature.hh"
│ │ │ │ -
288#include "quadraturerules/gaussradauleftquadrature.hh"
│ │ │ │ -
289#include "quadraturerules/gaussradaurightquadrature.hh"
│ │ │ │ -
290#include "quadraturerules/jacobi1quadrature.hh"
│ │ │ │ -
291#include "quadraturerules/jacobi2quadrature.hh"
│ │ │ │ -
292#include "quadraturerules/jacobiNquadrature.hh"
│ │ │ │ -
293// 3d rules
│ │ │ │ -
294#include "quadraturerules/prismquadrature.hh"
│ │ │ │ -
295// general rules
│ │ │ │ -
296#include "quadraturerules/simplexquadrature.hh"
│ │ │ │ -
297#include "quadraturerules/tensorproductquadrature.hh"
│ │ │ │ -
298
│ │ │ │ -
299#undef DUNE_INCLUDING_IMPLEMENTATION
│ │ │ │ -
300
│ │ │ │ -
301namespace Dune {
│ │ │ │ -
302
│ │ │ │ -
309 template<typename ctype, int dim>
│ │ │ │ - │ │ │ │ -
311 private:
│ │ │ │ -
312 friend class QuadratureRules<ctype, dim>;
│ │ │ │ -
313 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt)
│ │ │ │ -
314 {
│ │ │ │ -
315 return TensorProductQuadratureRule<ctype,dim>::maxOrder(t.id(), qt);
│ │ │ │ -
316 }
│ │ │ │ -
317 static QuadratureRule<ctype, dim> rule(const GeometryType& t, int p, QuadratureType::Enum qt)
│ │ │ │ -
318 {
│ │ │ │ -
319 return TensorProductQuadratureRule<ctype,dim>(t.id(), p, qt);
│ │ │ │ -
320 }
│ │ │ │ -
321 };
│ │ │ │ -
322
│ │ │ │ -
323 template<typename ctype>
│ │ │ │ -
324 class QuadratureRuleFactory<ctype, 0> {
│ │ │ │ -
325 private:
│ │ │ │ -
326 constexpr static int dim = 0;
│ │ │ │ -
327 friend class QuadratureRules<ctype, dim>;
│ │ │ │ -
328 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum)
│ │ │ │ -
329 {
│ │ │ │ -
330 if (t.isVertex())
│ │ │ │ -
331 {
│ │ │ │ -
332 return std::numeric_limits<int>::max();
│ │ │ │ -
333 }
│ │ │ │ -
334 DUNE_THROW(Exception, "Unknown GeometryType");
│ │ │ │ -
335 }
│ │ │ │ -
336 static QuadratureRule<ctype, dim> rule(const GeometryType& t, int , QuadratureType::Enum)
│ │ │ │ -
337 {
│ │ │ │ -
338 if (t.isVertex())
│ │ │ │ -
339 {
│ │ │ │ -
340 return PointQuadratureRule<ctype>();
│ │ │ │ -
341 }
│ │ │ │ -
342 DUNE_THROW(Exception, "Unknown GeometryType");
│ │ │ │ -
343 }
│ │ │ │ -
344 };
│ │ │ │ -
345
│ │ │ │ -
346 template<typename ctype>
│ │ │ │ -
347 class QuadratureRuleFactory<ctype, 1> {
│ │ │ │ -
348 private:
│ │ │ │ -
349 constexpr static int dim = 1;
│ │ │ │ -
350 friend class QuadratureRules<ctype, dim>;
│ │ │ │ -
351 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt)
│ │ │ │ -
352 {
│ │ │ │ -
353 if (t.isLine())
│ │ │ │ -
354 {
│ │ │ │ -
355 switch (qt) {
│ │ │ │ - │ │ │ │ -
357 return GaussQuadratureRule1D<ctype>::highest_order;
│ │ │ │ - │ │ │ │ -
359 return Jacobi1QuadratureRule1D<ctype>::highest_order;
│ │ │ │ - │ │ │ │ -
361 return Jacobi2QuadratureRule1D<ctype>::highest_order;
│ │ │ │ - │ │ │ │ -
363 return GaussLobattoQuadratureRule1D<ctype>::highest_order;
│ │ │ │ - │ │ │ │ -
365 return JacobiNQuadratureRule1D<ctype>::maxOrder();
│ │ │ │ - │ │ │ │ -
367 return GaussRadauLeftQuadratureRule1D<ctype>::highest_order;
│ │ │ │ - │ │ │ │ -
369 return GaussRadauRightQuadratureRule1D<ctype>::highest_order;
│ │ │ │ -
370 default :
│ │ │ │ -
371 DUNE_THROW(Exception, "Unknown QuadratureType");
│ │ │ │ -
372 }
│ │ │ │ -
373 }
│ │ │ │ -
374 DUNE_THROW(Exception, "Unknown GeometryType");
│ │ │ │ -
375 }
│ │ │ │ -
376 static QuadratureRule<ctype, dim> rule(const GeometryType& t, int p, QuadratureType::Enum qt)
│ │ │ │ -
377 {
│ │ │ │ -
378 if (t.isLine())
│ │ │ │ -
379 {
│ │ │ │ -
380 switch (qt) {
│ │ │ │ - │ │ │ │ -
382 return GaussQuadratureRule1D<ctype>(p);
│ │ │ │ - │ │ │ │ -
384 return Jacobi1QuadratureRule1D<ctype>(p);
│ │ │ │ - │ │ │ │ -
386 return Jacobi2QuadratureRule1D<ctype>(p);
│ │ │ │ - │ │ │ │ -
388 return GaussLobattoQuadratureRule1D<ctype>(p);
│ │ │ │ - │ │ │ │ -
390 return JacobiNQuadratureRule1D<ctype>(p);
│ │ │ │ - │ │ │ │ -
392 return GaussRadauLeftQuadratureRule1D<ctype>(p);
│ │ │ │ - │ │ │ │ -
394 return GaussRadauRightQuadratureRule1D<ctype>(p);
│ │ │ │ -
395 default :
│ │ │ │ -
396 DUNE_THROW(Exception, "Unknown QuadratureType");
│ │ │ │ -
397 }
│ │ │ │ -
398 }
│ │ │ │ -
399 DUNE_THROW(Exception, "Unknown GeometryType");
│ │ │ │ -
400 }
│ │ │ │ -
401 };
│ │ │ │ -
402
│ │ │ │ -
403 template<typename ctype>
│ │ │ │ -
404 class QuadratureRuleFactory<ctype, 2> {
│ │ │ │ -
405 private:
│ │ │ │ -
406 constexpr static int dim = 2;
│ │ │ │ -
407 friend class QuadratureRules<ctype, dim>;
│ │ │ │ -
408 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt)
│ │ │ │ -
409 {
│ │ │ │ -
410 unsigned order =
│ │ │ │ -
411 TensorProductQuadratureRule<ctype,dim>::maxOrder(t.id(), qt);
│ │ │ │ -
412 if (t.isSimplex())
│ │ │ │ -
413 order = std::max
│ │ │ │ -
414 (order, unsigned(SimplexQuadratureRule<ctype,dim>::highest_order));
│ │ │ │ -
415 return order;
│ │ │ │ -
416 }
│ │ │ │ -
417 static QuadratureRule<ctype, dim> rule(const GeometryType& t, int p, QuadratureType::Enum qt)
│ │ │ │ -
418 {
│ │ │ │ -
419 if (t.isSimplex()
│ │ │ │ - │ │ │ │ -
421 && p <= SimplexQuadratureRule<ctype,dim>::highest_order)
│ │ │ │ -
422 {
│ │ │ │ -
423 return SimplexQuadratureRule<ctype,dim>(p);
│ │ │ │ -
424 }
│ │ │ │ -
425 return TensorProductQuadratureRule<ctype,dim>(t.id(), p, qt);
│ │ │ │ -
426 }
│ │ │ │ -
427 };
│ │ │ │ -
428
│ │ │ │ -
429 template<typename ctype>
│ │ │ │ -
430 class QuadratureRuleFactory<ctype, 3> {
│ │ │ │ -
431 private:
│ │ │ │ -
432 constexpr static int dim = 3;
│ │ │ │ -
433 friend class QuadratureRules<ctype, dim>;
│ │ │ │ -
434 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt)
│ │ │ │ -
435 {
│ │ │ │ -
436 unsigned order =
│ │ │ │ -
437 TensorProductQuadratureRule<ctype,dim>::maxOrder(t.id(), qt);
│ │ │ │ -
438 if (t.isSimplex())
│ │ │ │ -
439 order = std::max
│ │ │ │ -
440 (order, unsigned(SimplexQuadratureRule<ctype,dim>::highest_order));
│ │ │ │ -
441 if (t.isPrism())
│ │ │ │ -
442 order = std::max
│ │ │ │ -
443 (order, unsigned(PrismQuadratureRule<ctype,dim>::highest_order));
│ │ │ │ -
444 return order;
│ │ │ │ -
445 }
│ │ │ │ -
446 static QuadratureRule<ctype, dim> rule(const GeometryType& t, int p, QuadratureType::Enum qt)
│ │ │ │ -
447 {
│ │ │ │ -
448
│ │ │ │ -
449 if (t.isSimplex()
│ │ │ │ - │ │ │ │ -
451 && p <= SimplexQuadratureRule<ctype,dim>::highest_order)
│ │ │ │ -
452 {
│ │ │ │ -
453 return SimplexQuadratureRule<ctype,dim>(p);
│ │ │ │ -
454 }
│ │ │ │ -
455 if (t.isPrism()
│ │ │ │ - │ │ │ │ -
457 && p <= PrismQuadratureRule<ctype,dim>::highest_order)
│ │ │ │ -
458 {
│ │ │ │ -
459 return PrismQuadratureRule<ctype,dim>(p);
│ │ │ │ -
460 }
│ │ │ │ -
461 return TensorProductQuadratureRule<ctype,dim>(t.id(), p, qt);
│ │ │ │ -
462 }
│ │ │ │ -
463 };
│ │ │ │ -
464
│ │ │ │ -
465#ifndef DUNE_NO_EXTERN_QUADRATURERULES
│ │ │ │ -
466 extern template class GaussLobattoQuadratureRule<double, 1>;
│ │ │ │ -
467 extern template class GaussQuadratureRule<double, 1>;
│ │ │ │ -
468 extern template class GaussRadauLeftQuadratureRule<double, 1>;
│ │ │ │ -
469 extern template class GaussRadauRightQuadratureRule<double, 1>;
│ │ │ │ -
470 extern template class Jacobi1QuadratureRule<double, 1>;
│ │ │ │ -
471 extern template class Jacobi2QuadratureRule<double, 1>;
│ │ │ │ -
472 extern template class JacobiNQuadratureRule<double, 1>;
│ │ │ │ -
473 extern template class PrismQuadratureRule<double, 3>;
│ │ │ │ -
474 extern template class SimplexQuadratureRule<double, 2>;
│ │ │ │ -
475 extern template class SimplexQuadratureRule<double, 3>;
│ │ │ │ -
476#endif // !DUNE_NO_EXTERN_QUADRATURERULES
│ │ │ │ -
477
│ │ │ │ -
478} // end namespace
│ │ │ │ -
479
│ │ │ │ -
480#endif // DUNE_GEOMETRY_QUADRATURERULES_HH
│ │ │ │ -
A unique label for each type of element that can occur in a grid.
│ │ │ │ -
Helper classes to provide indices for geometrytypes for use in a vector.
│ │ │ │ +
108 public:
│ │ │ │ +
113 inline static constexpr std::size_t offset(std::size_t dim)
│ │ │ │ +
114 {
│ │ │ │ +
115 // dim times "none"
│ │ │ │ +
116 return regular_offset(dim) + dim;
│ │ │ │ +
117 }
│ │ │ │ +
118
│ │ │ │ +
125 inline static constexpr std::size_t size(std::size_t maxdim)
│ │ │ │ +
126 {
│ │ │ │ +
127 return offset(maxdim+1);
│ │ │ │ +
128 }
│ │ │ │ +
129
│ │ │ │ +
138 inline static constexpr std::size_t index(const GeometryType &gt)
│ │ │ │ +
139 {
│ │ │ │ +
140 return offset(gt.dim()) + LocalGeometryTypeIndex::index(gt);
│ │ │ │ +
141 }
│ │ │ │ +
142 };
│ │ │ │ +
143
│ │ │ │ +
144 namespace Impl {
│ │ │ │ +
145
│ │ │ │ +
146 // Map a dynamic GeometryType to a static integral_constant<GeometryType::Id, ...>
│ │ │ │ +
147 template<int dim, class F>
│ │ │ │ +
148 static auto toGeometryTypeIdConstant(const GeometryType& gt, F&& f) {
│ │ │ │ +
149 // Transform LocalGeometryTypeIndex to GeometryType::Id
│ │ │ │ +
150 auto callWithId = [&](auto index) {
│ │ │ │ +
151 static constexpr auto id = LocalGeometryTypeIndex::type(dim, decltype(index)::value).toId();
│ │ │ │ +
152 return f(std::integral_constant<GeometryType::Id, id>{});
│ │ │ │ +
153 };
│ │ │ │ +
154 // switchCases needs a fallback to determine the return type.
│ │ │ │ +
155 auto fallBack = [&]() { return callWithId(Dune::Indices::_0); };
│ │ │ │ +
156 // Iterate over all _regular_ GeometryType indices for given dimension
│ │ │ │ +
157 auto allIndices = std::make_index_sequence<LocalGeometryTypeIndex::size(dim)-1>{};
│ │ │ │ +
158 return Dune::Hybrid::switchCases(allIndices, LocalGeometryTypeIndex::index(gt), callWithId, fallBack);
│ │ │ │ +
159 }
│ │ │ │ +
160
│ │ │ │ +
161 } // namespace Impl
│ │ │ │ +
162} // namespace Dune
│ │ │ │ +
163
│ │ │ │ +
164#endif // DUNE_GEOMETRY_TYPEINDEX_HH
│ │ │ │ +
A unique label for each type of element that can occur in a grid.
│ │ │ │ +
constexpr GeometryType none(unsigned int dim)
Returns a GeometryType representing a singular of dimension dim.
Definition: type.hh:481
│ │ │ │
Definition: affinegeometry.hh:21
│ │ │ │ -
Enum
Definition: quadraturerules.hh:82
│ │ │ │ -
@ GaussJacobi_n_0
Gauss-Legendre rules with .
Definition: quadraturerules.hh:119
│ │ │ │ -
@ GaussJacobi_2_0
Gauss-Legendre rules with .
Definition: quadraturerules.hh:106
│ │ │ │ -
@ GaussRadauRight
Gauss-Radau rules including the right endpoint.
Definition: quadraturerules.hh:144
│ │ │ │ -
@ GaussJacobi_1_0
Gauss-Jacobi rules with .
Definition: quadraturerules.hh:99
│ │ │ │ -
@ size
Definition: quadraturerules.hh:145
│ │ │ │ -
@ GaussLobatto
Gauss-Lobatto rules.
Definition: quadraturerules.hh:127
│ │ │ │ -
@ GaussRadauLeft
Gauss-Radau rules including the left endpoint.
Definition: quadraturerules.hh:135
│ │ │ │ -
@ GaussLegendre
Gauss-Legendre rules (default)
Definition: quadraturerules.hh:92
│ │ │ │ -
Exception thrown if a desired QuadratureRule is not available, because the requested order is to high...
Definition: quadraturerules.hh:36
│ │ │ │ -
Single evaluation point in a quadrature rule.
Definition: quadraturerules.hh:44
│ │ │ │ -
const Vector & position() const
return local coordinates of integration point i
Definition: quadraturerules.hh:62
│ │ │ │ -
Dune::FieldVector< ct, dim > Vector
Type used for the position of a quadrature point.
Definition: quadraturerules.hh:53
│ │ │ │ -
ct Field
Number type used for coordinates and quadrature weights.
Definition: quadraturerules.hh:50
│ │ │ │ -
const ct & weight() const
return weight associated with integration point i
Definition: quadraturerules.hh:68
│ │ │ │ -
ct weight_
Definition: quadraturerules.hh:75
│ │ │ │ -
static constexpr int dimension
Dimension of the integration domain.
Definition: quadraturerules.hh:47
│ │ │ │ -
QuadraturePoint(const Vector &x, ct w)
set up quadrature of given order in d dimensions
Definition: quadraturerules.hh:56
│ │ │ │ -
FieldVector< ct, dim > local
Definition: quadraturerules.hh:74
│ │ │ │ -
Abstract base class for quadrature rules.
Definition: quadraturerules.hh:154
│ │ │ │ -
virtual ~QuadratureRule()
Definition: quadraturerules.hh:181
│ │ │ │ -
static constexpr int d
The space dimension.
Definition: quadraturerules.hh:171
│ │ │ │ -
virtual GeometryType type() const
return type of element
Definition: quadraturerules.hh:180
│ │ │ │ -
int delivered_order
Definition: quadraturerules.hh:189
│ │ │ │ -
QuadratureRule(GeometryType t, int order)
Constructor for a given geometry type and a given quadrature order.
Definition: quadraturerules.hh:168
│ │ │ │ -
GeometryType geometry_type
Definition: quadraturerules.hh:188
│ │ │ │ -
ct CoordType
The type used for coordinates.
Definition: quadraturerules.hh:174
│ │ │ │ -
QuadratureRule()
Default constructor.
Definition: quadraturerules.hh:161
│ │ │ │ -
virtual int order() const
return order
Definition: quadraturerules.hh:177
│ │ │ │ -
QuadratureRule(GeometryType t)
Constructor for a given geometry type. Leaves the quadrature order invalid
Definition: quadraturerules.hh:165
│ │ │ │ -
std::vector< QuadraturePoint< ct, dim > >::const_iterator iterator
Definition: quadraturerules.hh:185
│ │ │ │ -
Factory class for creation of quadrature rules, depending on GeometryType, order and QuadratureType.
Definition: quadraturerules.hh:310
│ │ │ │ -
A container for all quadrature rules of dimension dim
Definition: quadraturerules.hh:200
│ │ │ │ -
static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt=QuadratureType::GaussLegendre)
maximum quadrature order for given geometry type and quadrature type
Definition: quadraturerules.hh:259
│ │ │ │ -
static const QuadratureRule & rule(const GeometryType::BasicType t, int p, QuadratureType::Enum qt=QuadratureType::GaussLegendre)
select the appropriate QuadratureRule for GeometryType t and order p
Definition: quadraturerules.hh:272
│ │ │ │ -
static const QuadratureRule & rule(const GeometryType &t, int p, QuadratureType::Enum qt=QuadratureType::GaussLegendre)
select the appropriate QuadratureRule for GeometryType t and order p
Definition: quadraturerules.hh:266
│ │ │ │
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:125
│ │ │ │ -
constexpr bool isPrism() const
Return true if entity is a prism.
Definition: type.hh:320
│ │ │ │ -
constexpr bool isVertex() const
Return true if entity is a vertex.
Definition: type.hh:290
│ │ │ │ +
constexpr Id toId() const
Create an Id representation of this GeometryType.
Definition: type.hh:221
│ │ │ │
constexpr unsigned int dim() const
Return dimension of the type.
Definition: type.hh:371
│ │ │ │ -
BasicType
Each entity can be tagged by one of these basic types plus its space dimension.
Definition: type.hh:131
│ │ │ │ -
constexpr bool isLine() const
Return true if entity is a line segment.
Definition: type.hh:295
│ │ │ │
constexpr unsigned int id() const
Return the topology id of the type.
Definition: type.hh:376
│ │ │ │ -
constexpr bool isSimplex() const
Return true if entity is a simplex of any dimension.
Definition: type.hh:330
│ │ │ │ +
constexpr bool isNone() const
Return true if entity is a singular of any dimension.
Definition: type.hh:366
│ │ │ │ +
Compute per-dimension indices for geometry types.
Definition: typeindex.hh:25
│ │ │ │
static constexpr std::size_t size(std::size_t dim)
Compute total number of geometry types for the given dimension.
Definition: typeindex.hh:61
│ │ │ │ +
static constexpr GeometryType type(std::size_t dim, std::size_t index)
compute the geometry type for the given local index and dimension
Definition: typeindex.hh:79
│ │ │ │
static constexpr std::size_t index(const GeometryType &gt)
Compute the index for the given geometry type within its dimension.
Definition: typeindex.hh:73
│ │ │ │ +
Compute indices for geometry types, taking the dimension into account.
Definition: typeindex.hh:90
│ │ │ │ +
static constexpr std::size_t index(const GeometryType &gt)
Compute the index for the given geometry type over all dimensions.
Definition: typeindex.hh:138
│ │ │ │ +
static constexpr std::size_t offset(std::size_t dim)
Compute the starting index for a given dimension including irregular geometry types.
Definition: typeindex.hh:113
│ │ │ │ +
static constexpr std::size_t size(std::size_t maxdim)
Compute total number of geometry types up to and including the given dimension.
Definition: typeindex.hh:125
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,589 +4,189 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ -quadraturerules.hh │ │ │ │ │ +typeindex.hh │ │ │ │ │ Go_to_the_documentation_of_this_file. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ - 5 │ │ │ │ │ - 6#ifndef DUNE_GEOMETRY_QUADRATURERULES_HH │ │ │ │ │ - 7#define DUNE_GEOMETRY_QUADRATURERULES_HH │ │ │ │ │ - 8 │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ - 13#include │ │ │ │ │ - 14#include │ │ │ │ │ + 5#ifndef DUNE_GEOMETRY_TYPEINDEX_HH │ │ │ │ │ + 6#define DUNE_GEOMETRY_TYPEINDEX_HH │ │ │ │ │ + 7 │ │ │ │ │ + 14#include │ │ │ │ │ 15 │ │ │ │ │ - 16#include │ │ │ │ │ - 17#include │ │ │ │ │ - 18#include │ │ │ │ │ - 19#include │ │ │ │ │ - 20#include │ │ │ │ │ - 21 │ │ │ │ │ - 22#include │ │ │ │ │ - 23#include │ │ │ │ │ - 24 │ │ │ │ │ - 30namespace Dune { │ │ │ │ │ - 31 │ │ │ │ │ -36 class QuadratureOrderOutOfRange : public NotImplemented {}; │ │ │ │ │ - 37 │ │ │ │ │ - 43 template │ │ │ │ │ -44 class QuadraturePoint { │ │ │ │ │ - 45 public: │ │ │ │ │ -47 constexpr static int dimension = dim; │ │ │ │ │ - 48 │ │ │ │ │ -50 typedef ct Field; │ │ │ │ │ - 51 │ │ │ │ │ -53 typedef Dune::FieldVector Vector; │ │ │ │ │ + 16#include │ │ │ │ │ + 17#include │ │ │ │ │ + 18 │ │ │ │ │ + 19#include "type.hh" │ │ │ │ │ + 20 │ │ │ │ │ + 21namespace Dune │ │ │ │ │ + 22{ │ │ │ │ │ +24 class LocalGeometryTypeIndex │ │ │ │ │ + 25 { │ │ │ │ │ + 32 inline static constexpr std::size_t regular_size(std::size_t dim) │ │ │ │ │ + 33 { │ │ │ │ │ + 34 // The following expression is derived from the expression for │ │ │ │ │ + 35 // GlobalGeometryTypeIndex::regular_offset(). Subtracting │ │ │ │ │ + 36 // regular_offset(dim+1)-regular_offset(dim) we get: │ │ │ │ │ + 37 // │ │ │ │ │ + 38 // ((1 << dim+1) >> 1) - ((1 << dim) >> 1) │ │ │ │ │ + 39 // │ │ │ │ │ + 40 // We always have │ │ │ │ │ + 41 // │ │ │ │ │ + 42 // dim >= 0, │ │ │ │ │ + 43 // │ │ │ │ │ + 44 // so │ │ │ │ │ + 45 // │ │ │ │ │ + 46 // (1 << dim+1) >= 2 and (1 << dim+2) % 2 == 0. │ │ │ │ │ + 47 // │ │ │ │ │ + 48 // So if we apply a single right-shift to that, we will never lose any │ │ │ │ │ + 49 // set bits, thus │ │ │ │ │ + 50 // │ │ │ │ │ + 51 // ((1 << dim+1) >> 1) == (1 << dim) │ │ │ │ │ + 52 return (1 << dim) - ((1 << dim) >> 1); │ │ │ │ │ + 53 } │ │ │ │ │ 54 │ │ │ │ │ -56 QuadraturePoint (const Vector& x, ct w) : local(x) │ │ │ │ │ - 57 { │ │ │ │ │ - 58 weight_ = w; │ │ │ │ │ - 59 } │ │ │ │ │ - 60 │ │ │ │ │ -62 const Vector& position () const │ │ │ │ │ - 63 { │ │ │ │ │ - 64 return local; │ │ │ │ │ + 55 public: │ │ │ │ │ +61 inline static constexpr std::size_t size(std::size_t dim) │ │ │ │ │ + 62 { │ │ │ │ │ + 63 // one for "none" │ │ │ │ │ + 64 return regular_size(dim) + 1; │ │ │ │ │ 65 } │ │ │ │ │ 66 │ │ │ │ │ -68 const ct &weight () const │ │ │ │ │ - 69 { │ │ │ │ │ - 70 return weight_; │ │ │ │ │ - 71 } │ │ │ │ │ - 72 │ │ │ │ │ - 73 protected: │ │ │ │ │ -74 FieldVector local; │ │ │ │ │ -75 ct weight_; │ │ │ │ │ - 76 }; │ │ │ │ │ +73 inline static constexpr std::size_t index(const GeometryType >) │ │ │ │ │ + 74 { │ │ │ │ │ + 75 return gt.isNone() ? regular_size(gt.dim()) : (gt.id() >> 1); │ │ │ │ │ + 76 } │ │ │ │ │ 77 │ │ │ │ │ -81 namespace QuadratureType { │ │ │ │ │ -82 enum Enum { │ │ │ │ │ -92 GaussLegendre = 0, │ │ │ │ │ - 93 │ │ │ │ │ -99 GaussJacobi_1_0 = 1, │ │ │ │ │ - 100 │ │ │ │ │ -106 GaussJacobi_2_0 = 2, │ │ │ │ │ +79 inline static constexpr GeometryType type(std::size_t dim, std::size_t │ │ │ │ │ +index) { │ │ │ │ │ + 80 return (index == regular_size(dim)) ? │ │ │ │ │ + 81 GeometryTypes::none(dim) : │ │ │ │ │ + 82 // the cast to unsigned makes sure this is interpreted as the topology │ │ │ │ │ + 83 // ID constructor │ │ │ │ │ + 84 GeometryType(static_cast< unsigned int >(index << 1), dim); │ │ │ │ │ + 85 } │ │ │ │ │ + 86 }; │ │ │ │ │ + 87 │ │ │ │ │ +89 class GlobalGeometryTypeIndex │ │ │ │ │ + 90 { │ │ │ │ │ + 98 inline static constexpr std::size_t regular_offset(std::size_t dim) │ │ │ │ │ + 99 { │ │ │ │ │ + 100 // The number of regular geometry types in a given dimension is │ │ │ │ │ + 101 // 2^(dim-1). For dim==0 this would yield 1/2 geometry types (which is │ │ │ │ │ + 102 // obviously bogus, dim==0 has one regular geometry type, the point). │ │ │ │ │ + 103 // The following expression relies on 1 >> 1 == 0 to treat dim==0 │ │ │ │ │ + 104 // specially. │ │ │ │ │ + 105 return (1 << dim) >> 1; │ │ │ │ │ + 106 } │ │ │ │ │ 107 │ │ │ │ │ -119 GaussJacobi_n_0 = 3, │ │ │ │ │ - 120 │ │ │ │ │ -127 GaussLobatto = 4, │ │ │ │ │ - 128 │ │ │ │ │ -135 GaussRadauLeft = 5, │ │ │ │ │ - 136 │ │ │ │ │ -144 GaussRadauRight = 6, │ │ │ │ │ - 145 size │ │ │ │ │ -146 }; │ │ │ │ │ - 147 } │ │ │ │ │ - 148 │ │ │ │ │ - 152 template │ │ │ │ │ -153 class QuadratureRule : public std::vector > │ │ │ │ │ - 154 { │ │ │ │ │ - 155 public: │ │ │ │ │ -161 QuadratureRule() : delivered_order(-1) {} │ │ │ │ │ - 162 │ │ │ │ │ - 163 protected: │ │ │ │ │ -165 QuadratureRule(GeometryType t) : geometry_type(t), delivered_order(-1) {} │ │ │ │ │ - 166 │ │ │ │ │ -168 QuadratureRule(GeometryType t, int order) : geometry_type(t), │ │ │ │ │ -delivered_order(order) {} │ │ │ │ │ - 169 public: │ │ │ │ │ -171 constexpr static int d = dim; │ │ │ │ │ - 172 │ │ │ │ │ -174 typedef ct CoordType; │ │ │ │ │ - 175 │ │ │ │ │ -177 virtual int order () const { return delivered_order; } │ │ │ │ │ - 178 │ │ │ │ │ -180 virtual GeometryType type () const { return geometry_type; } │ │ │ │ │ -181 virtual ~QuadratureRule(){} │ │ │ │ │ - 182 │ │ │ │ │ -185 typedef typename std::vector >::const_iterator │ │ │ │ │ -iterator; │ │ │ │ │ - 186 │ │ │ │ │ - 187 protected: │ │ │ │ │ -188 GeometryType geometry_type; │ │ │ │ │ -189 int delivered_order; │ │ │ │ │ - 190 }; │ │ │ │ │ - 191 │ │ │ │ │ - 192 // Forward declaration of the factory class, │ │ │ │ │ - 193 // needed internally by the QuadratureRules container class. │ │ │ │ │ - 194 template class QuadratureRuleFactory; │ │ │ │ │ - 195 │ │ │ │ │ - 199 template │ │ │ │ │ -200 class QuadratureRules { │ │ │ │ │ - 201 │ │ │ │ │ - 203 using QuadratureRule = Dune::QuadratureRule; │ │ │ │ │ - 204 │ │ │ │ │ - 205 // indexed by quadrature order │ │ │ │ │ - 206 using QuadratureOrderVector = std::vector >; │ │ │ │ │ - 207 │ │ │ │ │ - 208 // indexed by geometry type │ │ │ │ │ - 209 using GeometryTypeVector = std::vector >; │ │ │ │ │ - 210 │ │ │ │ │ - 211 // indexed by quadrature type enum │ │ │ │ │ - 212 using QuadratureCacheVector = std::vector >; │ │ │ │ │ - 213 │ │ │ │ │ - 215 DUNE_EXPORT const QuadratureRule& _rule(const GeometryType& t, int p, │ │ │ │ │ -QuadratureType::Enum qt=QuadratureType::GaussLegendre) const │ │ │ │ │ - 216 { │ │ │ │ │ - 217 assert(t.dim()==dim); │ │ │ │ │ - 218 │ │ │ │ │ - 219 DUNE_ASSERT_CALL_ONCE(); │ │ │ │ │ - 220 │ │ │ │ │ - 221 static QuadratureCacheVector quadratureCache(QuadratureType::size); │ │ │ │ │ - 222 │ │ │ │ │ - 223 auto& [ onceFlagQuadratureType, geometryTypes ] = quadratureCache[qt]; │ │ │ │ │ - 224 // initialize geometry types for this quadrature type once │ │ │ │ │ - 225 std::call_once(onceFlagQuadratureType, [&types = geometryTypes]{ │ │ │ │ │ - 226 types = GeometryTypeVector(LocalGeometryTypeIndex::size(dim)); │ │ │ │ │ - 227 }); │ │ │ │ │ - 228 │ │ │ │ │ - 229 auto& [ onceFlagGeometryType, quadratureOrders ] = geometryTypes │ │ │ │ │ -[LocalGeometryTypeIndex::index(t)]; │ │ │ │ │ - 230 // initialize quadrature orders for this geometry type and quadrature type │ │ │ │ │ -once │ │ │ │ │ - 231 std::call_once(onceFlagGeometryType, [&, &orders = quadratureOrders]{ │ │ │ │ │ - 232 // we only need one quadrature rule for points, not maxint │ │ │ │ │ - 233 const auto numRules = dim == 0 ? 1 : QuadratureRuleFactory:: │ │ │ │ │ -maxOrder(t, qt)+1; │ │ │ │ │ - 234 orders = QuadratureOrderVector(numRules); │ │ │ │ │ - 235 }); │ │ │ │ │ - 236 │ │ │ │ │ - 237 // we only have one quadrature rule for points │ │ │ │ │ - 238 auto& [ onceFlagQuadratureOrder, quadratureRule ] = quadratureOrders[dim │ │ │ │ │ -== 0 ? 0 : p]; │ │ │ │ │ - 239 // initialize quadrature rule once │ │ │ │ │ - 240 std::call_once(onceFlagQuadratureOrder, [&, &rule = quadratureRule]{ │ │ │ │ │ - 241 rule = QuadratureRuleFactory::rule(t, p, qt); │ │ │ │ │ - 242 }); │ │ │ │ │ - 243 │ │ │ │ │ - 244 return quadratureRule; │ │ │ │ │ - 245 } │ │ │ │ │ - 246 │ │ │ │ │ - 248 DUNE_EXPORT static QuadratureRules& instance() │ │ │ │ │ - 249 { │ │ │ │ │ - 250 static QuadratureRules instance; │ │ │ │ │ - 251 return instance; │ │ │ │ │ - 252 } │ │ │ │ │ - 253 │ │ │ │ │ - 255 QuadratureRules () = default; │ │ │ │ │ - 256 public: │ │ │ │ │ - 258 static unsigned │ │ │ │ │ -259 maxOrder(const GeometryType& t, │ │ │ │ │ - 260 QuadratureType::Enum qt=QuadratureType::GaussLegendre) │ │ │ │ │ - 261 { │ │ │ │ │ - 262 return QuadratureRuleFactory::maxOrder(t,qt); │ │ │ │ │ - 263 } │ │ │ │ │ - 264 │ │ │ │ │ -266 static const QuadratureRule& rule(const GeometryType& t, int p, │ │ │ │ │ -QuadratureType::Enum qt=QuadratureType::GaussLegendre) │ │ │ │ │ - 267 { │ │ │ │ │ - 268 return instance()._rule(t,p,qt); │ │ │ │ │ - 269 } │ │ │ │ │ - 270 │ │ │ │ │ -272 static const QuadratureRule& rule(const GeometryType::BasicType t, int p, │ │ │ │ │ -QuadratureType::Enum qt=QuadratureType::GaussLegendre) │ │ │ │ │ - 273 { │ │ │ │ │ - 274 GeometryType gt(t,dim); │ │ │ │ │ - 275 return instance()._rule(gt,p,qt); │ │ │ │ │ - 276 } │ │ │ │ │ - 277 }; │ │ │ │ │ - 278 │ │ │ │ │ - 279} // end namespace Dune │ │ │ │ │ - 280 │ │ │ │ │ -281#define DUNE_INCLUDING_IMPLEMENTATION │ │ │ │ │ - 282 │ │ │ │ │ - 283// 0d rules │ │ │ │ │ - 284#include "quadraturerules/pointquadrature.hh" │ │ │ │ │ - 285// 1d rules │ │ │ │ │ - 286#include "quadraturerules/gausslobattoquadrature.hh" │ │ │ │ │ - 287#include "quadraturerules/gaussquadrature.hh" │ │ │ │ │ - 288#include "quadraturerules/gaussradauleftquadrature.hh" │ │ │ │ │ - 289#include "quadraturerules/gaussradaurightquadrature.hh" │ │ │ │ │ - 290#include "quadraturerules/jacobi1quadrature.hh" │ │ │ │ │ - 291#include "quadraturerules/jacobi2quadrature.hh" │ │ │ │ │ - 292#include "quadraturerules/jacobiNquadrature.hh" │ │ │ │ │ - 293// 3d rules │ │ │ │ │ - 294#include "quadraturerules/prismquadrature.hh" │ │ │ │ │ - 295// general rules │ │ │ │ │ - 296#include "quadraturerules/simplexquadrature.hh" │ │ │ │ │ - 297#include "quadraturerules/tensorproductquadrature.hh" │ │ │ │ │ - 298 │ │ │ │ │ - 299#undef DUNE_INCLUDING_IMPLEMENTATION │ │ │ │ │ - 300 │ │ │ │ │ - 301namespace Dune { │ │ │ │ │ - 302 │ │ │ │ │ - 309 template │ │ │ │ │ -310 class QuadratureRuleFactory { │ │ │ │ │ - 311 private: │ │ │ │ │ - 312 friend class QuadratureRules; │ │ │ │ │ - 313 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt) │ │ │ │ │ - 314 { │ │ │ │ │ - 315 return TensorProductQuadratureRule::maxOrder(t.id(), qt); │ │ │ │ │ - 316 } │ │ │ │ │ - 317 static QuadratureRule rule(const GeometryType& t, int p, │ │ │ │ │ -QuadratureType::Enum qt) │ │ │ │ │ - 318 { │ │ │ │ │ - 319 return TensorProductQuadratureRule(t.id(), p, qt); │ │ │ │ │ - 320 } │ │ │ │ │ - 321 }; │ │ │ │ │ - 322 │ │ │ │ │ - 323 template │ │ │ │ │ -324 class QuadratureRuleFactory { │ │ │ │ │ - 325 private: │ │ │ │ │ -326 constexpr static int dim = 0; │ │ │ │ │ - 327 friend class QuadratureRules; │ │ │ │ │ - 328 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum) │ │ │ │ │ - 329 { │ │ │ │ │ - 330 if (t.isVertex()) │ │ │ │ │ - 331 { │ │ │ │ │ - 332 return std::numeric_limits::max(); │ │ │ │ │ - 333 } │ │ │ │ │ - 334 DUNE_THROW(Exception, "Unknown GeometryType"); │ │ │ │ │ - 335 } │ │ │ │ │ - 336 static QuadratureRule rule(const GeometryType& t, int , │ │ │ │ │ -QuadratureType::Enum) │ │ │ │ │ - 337 { │ │ │ │ │ - 338 if (t.isVertex()) │ │ │ │ │ - 339 { │ │ │ │ │ - 340 return PointQuadratureRule(); │ │ │ │ │ - 341 } │ │ │ │ │ - 342 DUNE_THROW(Exception, "Unknown GeometryType"); │ │ │ │ │ - 343 } │ │ │ │ │ - 344 }; │ │ │ │ │ - 345 │ │ │ │ │ - 346 template │ │ │ │ │ -347 class QuadratureRuleFactory { │ │ │ │ │ - 348 private: │ │ │ │ │ -349 constexpr static int dim = 1; │ │ │ │ │ - 350 friend class QuadratureRules; │ │ │ │ │ - 351 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt) │ │ │ │ │ - 352 { │ │ │ │ │ - 353 if (t.isLine()) │ │ │ │ │ - 354 { │ │ │ │ │ - 355 switch (qt) { │ │ │ │ │ - 356 case QuadratureType::GaussLegendre : │ │ │ │ │ - 357 return GaussQuadratureRule1D::highest_order; │ │ │ │ │ - 358 case QuadratureType::GaussJacobi_1_0 : │ │ │ │ │ - 359 return Jacobi1QuadratureRule1D::highest_order; │ │ │ │ │ - 360 case QuadratureType::GaussJacobi_2_0 : │ │ │ │ │ - 361 return Jacobi2QuadratureRule1D::highest_order; │ │ │ │ │ - 362 case QuadratureType::GaussLobatto : │ │ │ │ │ - 363 return GaussLobattoQuadratureRule1D::highest_order; │ │ │ │ │ - 364 case QuadratureType::GaussJacobi_n_0 : │ │ │ │ │ - 365 return JacobiNQuadratureRule1D::maxOrder(); │ │ │ │ │ - 366 case QuadratureType::GaussRadauLeft : │ │ │ │ │ - 367 return GaussRadauLeftQuadratureRule1D::highest_order; │ │ │ │ │ - 368 case QuadratureType::GaussRadauRight : │ │ │ │ │ - 369 return GaussRadauRightQuadratureRule1D::highest_order; │ │ │ │ │ - 370 default : │ │ │ │ │ - 371 DUNE_THROW(Exception, "Unknown QuadratureType"); │ │ │ │ │ - 372 } │ │ │ │ │ - 373 } │ │ │ │ │ - 374 DUNE_THROW(Exception, "Unknown GeometryType"); │ │ │ │ │ - 375 } │ │ │ │ │ - 376 static QuadratureRule rule(const GeometryType& t, int p, │ │ │ │ │ -QuadratureType::Enum qt) │ │ │ │ │ - 377 { │ │ │ │ │ - 378 if (t.isLine()) │ │ │ │ │ - 379 { │ │ │ │ │ - 380 switch (qt) { │ │ │ │ │ - 381 case QuadratureType::GaussLegendre : │ │ │ │ │ - 382 return GaussQuadratureRule1D(p); │ │ │ │ │ - 383 case QuadratureType::GaussJacobi_1_0 : │ │ │ │ │ - 384 return Jacobi1QuadratureRule1D(p); │ │ │ │ │ - 385 case QuadratureType::GaussJacobi_2_0 : │ │ │ │ │ - 386 return Jacobi2QuadratureRule1D(p); │ │ │ │ │ - 387 case QuadratureType::GaussLobatto : │ │ │ │ │ - 388 return GaussLobattoQuadratureRule1D(p); │ │ │ │ │ - 389 case QuadratureType::GaussJacobi_n_0 : │ │ │ │ │ - 390 return JacobiNQuadratureRule1D(p); │ │ │ │ │ - 391 case QuadratureType::GaussRadauLeft : │ │ │ │ │ - 392 return GaussRadauLeftQuadratureRule1D(p); │ │ │ │ │ - 393 case QuadratureType::GaussRadauRight : │ │ │ │ │ - 394 return GaussRadauRightQuadratureRule1D(p); │ │ │ │ │ - 395 default : │ │ │ │ │ - 396 DUNE_THROW(Exception, "Unknown QuadratureType"); │ │ │ │ │ - 397 } │ │ │ │ │ - 398 } │ │ │ │ │ - 399 DUNE_THROW(Exception, "Unknown GeometryType"); │ │ │ │ │ - 400 } │ │ │ │ │ - 401 }; │ │ │ │ │ - 402 │ │ │ │ │ - 403 template │ │ │ │ │ -404 class QuadratureRuleFactory { │ │ │ │ │ - 405 private: │ │ │ │ │ -406 constexpr static int dim = 2; │ │ │ │ │ - 407 friend class QuadratureRules; │ │ │ │ │ - 408 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt) │ │ │ │ │ - 409 { │ │ │ │ │ - 410 unsigned order = │ │ │ │ │ - 411 TensorProductQuadratureRule::maxOrder(t.id(), qt); │ │ │ │ │ - 412 if (t.isSimplex()) │ │ │ │ │ - 413 order = std::max │ │ │ │ │ - 414 (order, unsigned(SimplexQuadratureRule::highest_order)); │ │ │ │ │ - 415 return order; │ │ │ │ │ - 416 } │ │ │ │ │ - 417 static QuadratureRule rule(const GeometryType& t, int p, │ │ │ │ │ -QuadratureType::Enum qt) │ │ │ │ │ - 418 { │ │ │ │ │ - 419 if (t.isSimplex() │ │ │ │ │ - 420 && ( qt == QuadratureType::GaussLegendre || qt == QuadratureType:: │ │ │ │ │ -GaussJacobi_n_0 ) │ │ │ │ │ - 421 && p <= SimplexQuadratureRule::highest_order) │ │ │ │ │ - 422 { │ │ │ │ │ - 423 return SimplexQuadratureRule(p); │ │ │ │ │ - 424 } │ │ │ │ │ - 425 return TensorProductQuadratureRule(t.id(), p, qt); │ │ │ │ │ - 426 } │ │ │ │ │ - 427 }; │ │ │ │ │ - 428 │ │ │ │ │ - 429 template │ │ │ │ │ -430 class QuadratureRuleFactory { │ │ │ │ │ - 431 private: │ │ │ │ │ -432 constexpr static int dim = 3; │ │ │ │ │ - 433 friend class QuadratureRules; │ │ │ │ │ - 434 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt) │ │ │ │ │ - 435 { │ │ │ │ │ - 436 unsigned order = │ │ │ │ │ - 437 TensorProductQuadratureRule::maxOrder(t.id(), qt); │ │ │ │ │ - 438 if (t.isSimplex()) │ │ │ │ │ - 439 order = std::max │ │ │ │ │ - 440 (order, unsigned(SimplexQuadratureRule::highest_order)); │ │ │ │ │ - 441 if (t.isPrism()) │ │ │ │ │ - 442 order = std::max │ │ │ │ │ - 443 (order, unsigned(PrismQuadratureRule::highest_order)); │ │ │ │ │ - 444 return order; │ │ │ │ │ - 445 } │ │ │ │ │ - 446 static QuadratureRule rule(const GeometryType& t, int p, │ │ │ │ │ -QuadratureType::Enum qt) │ │ │ │ │ - 447 { │ │ │ │ │ - 448 │ │ │ │ │ - 449 if (t.isSimplex() │ │ │ │ │ - 450 && ( qt == QuadratureType::GaussLegendre || qt == QuadratureType:: │ │ │ │ │ -GaussJacobi_n_0 ) │ │ │ │ │ - 451 && p <= SimplexQuadratureRule::highest_order) │ │ │ │ │ - 452 { │ │ │ │ │ - 453 return SimplexQuadratureRule(p); │ │ │ │ │ - 454 } │ │ │ │ │ - 455 if (t.isPrism() │ │ │ │ │ - 456 && qt == QuadratureType::GaussLegendre │ │ │ │ │ - 457 && p <= PrismQuadratureRule::highest_order) │ │ │ │ │ - 458 { │ │ │ │ │ - 459 return PrismQuadratureRule(p); │ │ │ │ │ - 460 } │ │ │ │ │ - 461 return TensorProductQuadratureRule(t.id(), p, qt); │ │ │ │ │ - 462 } │ │ │ │ │ - 463 }; │ │ │ │ │ - 464 │ │ │ │ │ - 465#ifndef DUNE_NO_EXTERN_QUADRATURERULES │ │ │ │ │ - 466 extern template class GaussLobattoQuadratureRule; │ │ │ │ │ - 467 extern template class GaussQuadratureRule; │ │ │ │ │ - 468 extern template class GaussRadauLeftQuadratureRule; │ │ │ │ │ - 469 extern template class GaussRadauRightQuadratureRule; │ │ │ │ │ - 470 extern template class Jacobi1QuadratureRule; │ │ │ │ │ - 471 extern template class Jacobi2QuadratureRule; │ │ │ │ │ - 472 extern template class JacobiNQuadratureRule; │ │ │ │ │ - 473 extern template class PrismQuadratureRule; │ │ │ │ │ - 474 extern template class SimplexQuadratureRule; │ │ │ │ │ -475 extern template class SimplexQuadratureRule; │ │ │ │ │ - 476#endif // !DUNE_NO_EXTERN_QUADRATURERULES │ │ │ │ │ - 477 │ │ │ │ │ - 478} // end namespace │ │ │ │ │ - 479 │ │ │ │ │ - 480#endif // DUNE_GEOMETRY_QUADRATURERULES_HH │ │ │ │ │ + 108 public: │ │ │ │ │ +113 inline static constexpr std::size_t offset(std::size_t dim) │ │ │ │ │ + 114 { │ │ │ │ │ + 115 // dim times "none" │ │ │ │ │ + 116 return regular_offset(dim) + dim; │ │ │ │ │ + 117 } │ │ │ │ │ + 118 │ │ │ │ │ +125 inline static constexpr std::size_t size(std::size_t maxdim) │ │ │ │ │ + 126 { │ │ │ │ │ + 127 return offset(maxdim+1); │ │ │ │ │ + 128 } │ │ │ │ │ + 129 │ │ │ │ │ +138 inline static constexpr std::size_t index(const GeometryType >) │ │ │ │ │ + 139 { │ │ │ │ │ + 140 return offset(gt.dim()) + LocalGeometryTypeIndex::index(gt); │ │ │ │ │ + 141 } │ │ │ │ │ + 142 }; │ │ │ │ │ + 143 │ │ │ │ │ + 144 namespace Impl { │ │ │ │ │ + 145 │ │ │ │ │ + 146 // Map a dynamic GeometryType to a static integral_constant │ │ │ │ │ + 147 template │ │ │ │ │ + 148 static auto toGeometryTypeIdConstant(const GeometryType& gt, F&& f) { │ │ │ │ │ + 149 // Transform LocalGeometryTypeIndex to GeometryType::Id │ │ │ │ │ + 150 auto callWithId = [&](auto index) { │ │ │ │ │ + 151 static constexpr auto id = LocalGeometryTypeIndex::type(dim, decltype │ │ │ │ │ +(index)::value).toId(); │ │ │ │ │ + 152 return f(std::integral_constant{}); │ │ │ │ │ + 153 }; │ │ │ │ │ + 154 // switchCases needs a fallback to determine the return type. │ │ │ │ │ + 155 auto fallBack = [&]() { return callWithId(Dune::Indices::_0); }; │ │ │ │ │ + 156 // Iterate over all _regular_ GeometryType indices for given dimension │ │ │ │ │ + 157 auto allIndices = std::make_index_sequence{}; │ │ │ │ │ + 158 return Dune::Hybrid::switchCases(allIndices, LocalGeometryTypeIndex::index │ │ │ │ │ +(gt), callWithId, fallBack); │ │ │ │ │ + 159 } │ │ │ │ │ + 160 │ │ │ │ │ + 161 } // namespace Impl │ │ │ │ │ + 162} // namespace Dune │ │ │ │ │ + 163 │ │ │ │ │ + 164#endif // DUNE_GEOMETRY_TYPEINDEX_HH │ │ │ │ │ type.hh │ │ │ │ │ A unique label for each type of element that can occur in a grid. │ │ │ │ │ -typeindex.hh │ │ │ │ │ -Helper classes to provide indices for geometrytypes for use in a vector. │ │ │ │ │ +Dune::GeometryTypes::none │ │ │ │ │ +constexpr GeometryType none(unsigned int dim) │ │ │ │ │ +Returns a GeometryType representing a singular of dimension dim. │ │ │ │ │ +Definition: type.hh:481 │ │ │ │ │ Dune │ │ │ │ │ Definition: affinegeometry.hh:21 │ │ │ │ │ -Dune::QuadratureType::Enum │ │ │ │ │ -Enum │ │ │ │ │ -Definition: quadraturerules.hh:82 │ │ │ │ │ -Dune::QuadratureType::GaussJacobi_n_0 │ │ │ │ │ -@ GaussJacobi_n_0 │ │ │ │ │ -Gauss-Legendre rules with . │ │ │ │ │ -Definition: quadraturerules.hh:119 │ │ │ │ │ -Dune::QuadratureType::GaussJacobi_2_0 │ │ │ │ │ -@ GaussJacobi_2_0 │ │ │ │ │ -Gauss-Legendre rules with . │ │ │ │ │ -Definition: quadraturerules.hh:106 │ │ │ │ │ -Dune::QuadratureType::GaussRadauRight │ │ │ │ │ -@ GaussRadauRight │ │ │ │ │ -Gauss-Radau rules including the right endpoint. │ │ │ │ │ -Definition: quadraturerules.hh:144 │ │ │ │ │ -Dune::QuadratureType::GaussJacobi_1_0 │ │ │ │ │ -@ GaussJacobi_1_0 │ │ │ │ │ -Gauss-Jacobi rules with . │ │ │ │ │ -Definition: quadraturerules.hh:99 │ │ │ │ │ -Dune::QuadratureType::size │ │ │ │ │ -@ size │ │ │ │ │ -Definition: quadraturerules.hh:145 │ │ │ │ │ -Dune::QuadratureType::GaussLobatto │ │ │ │ │ -@ GaussLobatto │ │ │ │ │ -Gauss-Lobatto rules. │ │ │ │ │ -Definition: quadraturerules.hh:127 │ │ │ │ │ -Dune::QuadratureType::GaussRadauLeft │ │ │ │ │ -@ GaussRadauLeft │ │ │ │ │ -Gauss-Radau rules including the left endpoint. │ │ │ │ │ -Definition: quadraturerules.hh:135 │ │ │ │ │ -Dune::QuadratureType::GaussLegendre │ │ │ │ │ -@ GaussLegendre │ │ │ │ │ -Gauss-Legendre rules (default) │ │ │ │ │ -Definition: quadraturerules.hh:92 │ │ │ │ │ -Dune::QuadratureOrderOutOfRange │ │ │ │ │ -Exception thrown if a desired QuadratureRule is not available, because the │ │ │ │ │ -requested order is to high... │ │ │ │ │ -Definition: quadraturerules.hh:36 │ │ │ │ │ -Dune::QuadraturePoint │ │ │ │ │ -Single evaluation point in a quadrature rule. │ │ │ │ │ -Definition: quadraturerules.hh:44 │ │ │ │ │ -Dune::QuadraturePoint::position │ │ │ │ │ -const Vector & position() const │ │ │ │ │ -return local coordinates of integration point i │ │ │ │ │ -Definition: quadraturerules.hh:62 │ │ │ │ │ -Dune::QuadraturePoint::Vector │ │ │ │ │ -Dune::FieldVector< ct, dim > Vector │ │ │ │ │ -Type used for the position of a quadrature point. │ │ │ │ │ -Definition: quadraturerules.hh:53 │ │ │ │ │ -Dune::QuadraturePoint::Field │ │ │ │ │ -ct Field │ │ │ │ │ -Number type used for coordinates and quadrature weights. │ │ │ │ │ -Definition: quadraturerules.hh:50 │ │ │ │ │ -Dune::QuadraturePoint::weight │ │ │ │ │ -const ct & weight() const │ │ │ │ │ -return weight associated with integration point i │ │ │ │ │ -Definition: quadraturerules.hh:68 │ │ │ │ │ -Dune::QuadraturePoint::weight_ │ │ │ │ │ -ct weight_ │ │ │ │ │ -Definition: quadraturerules.hh:75 │ │ │ │ │ -Dune::QuadraturePoint::dimension │ │ │ │ │ -static constexpr int dimension │ │ │ │ │ -Dimension of the integration domain. │ │ │ │ │ -Definition: quadraturerules.hh:47 │ │ │ │ │ -Dune::QuadraturePoint::QuadraturePoint │ │ │ │ │ -QuadraturePoint(const Vector &x, ct w) │ │ │ │ │ -set up quadrature of given order in d dimensions │ │ │ │ │ -Definition: quadraturerules.hh:56 │ │ │ │ │ -Dune::QuadraturePoint::local │ │ │ │ │ -FieldVector< ct, dim > local │ │ │ │ │ -Definition: quadraturerules.hh:74 │ │ │ │ │ -Dune::QuadratureRule │ │ │ │ │ -Abstract base class for quadrature rules. │ │ │ │ │ -Definition: quadraturerules.hh:154 │ │ │ │ │ -Dune::QuadratureRule::~QuadratureRule │ │ │ │ │ -virtual ~QuadratureRule() │ │ │ │ │ -Definition: quadraturerules.hh:181 │ │ │ │ │ -Dune::QuadratureRule::d │ │ │ │ │ -static constexpr int d │ │ │ │ │ -The space dimension. │ │ │ │ │ -Definition: quadraturerules.hh:171 │ │ │ │ │ -Dune::QuadratureRule::type │ │ │ │ │ -virtual GeometryType type() const │ │ │ │ │ -return type of element │ │ │ │ │ -Definition: quadraturerules.hh:180 │ │ │ │ │ -Dune::QuadratureRule::delivered_order │ │ │ │ │ -int delivered_order │ │ │ │ │ -Definition: quadraturerules.hh:189 │ │ │ │ │ -Dune::QuadratureRule::QuadratureRule │ │ │ │ │ -QuadratureRule(GeometryType t, int order) │ │ │ │ │ -Constructor for a given geometry type and a given quadrature order. │ │ │ │ │ -Definition: quadraturerules.hh:168 │ │ │ │ │ -Dune::QuadratureRule::geometry_type │ │ │ │ │ -GeometryType geometry_type │ │ │ │ │ -Definition: quadraturerules.hh:188 │ │ │ │ │ -Dune::QuadratureRule::CoordType │ │ │ │ │ -ct CoordType │ │ │ │ │ -The type used for coordinates. │ │ │ │ │ -Definition: quadraturerules.hh:174 │ │ │ │ │ -Dune::QuadratureRule::QuadratureRule │ │ │ │ │ -QuadratureRule() │ │ │ │ │ -Default constructor. │ │ │ │ │ -Definition: quadraturerules.hh:161 │ │ │ │ │ -Dune::QuadratureRule::order │ │ │ │ │ -virtual int order() const │ │ │ │ │ -return order │ │ │ │ │ -Definition: quadraturerules.hh:177 │ │ │ │ │ -Dune::QuadratureRule::QuadratureRule │ │ │ │ │ -QuadratureRule(GeometryType t) │ │ │ │ │ -Constructor for a given geometry type. Leaves the quadrature order invalid │ │ │ │ │ -Definition: quadraturerules.hh:165 │ │ │ │ │ -Dune::QuadratureRule::iterator │ │ │ │ │ -std::vector< QuadraturePoint< ct, dim > >::const_iterator iterator │ │ │ │ │ -Definition: quadraturerules.hh:185 │ │ │ │ │ -Dune::QuadratureRuleFactory │ │ │ │ │ -Factory class for creation of quadrature rules, depending on GeometryType, │ │ │ │ │ -order and QuadratureType. │ │ │ │ │ -Definition: quadraturerules.hh:310 │ │ │ │ │ -Dune::QuadratureRules │ │ │ │ │ -A container for all quadrature rules of dimension dim │ │ │ │ │ -Definition: quadraturerules.hh:200 │ │ │ │ │ -Dune::QuadratureRules::maxOrder │ │ │ │ │ -static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum │ │ │ │ │ -qt=QuadratureType::GaussLegendre) │ │ │ │ │ -maximum quadrature order for given geometry type and quadrature type │ │ │ │ │ -Definition: quadraturerules.hh:259 │ │ │ │ │ -Dune::QuadratureRules::rule │ │ │ │ │ -static const QuadratureRule & rule(const GeometryType::BasicType t, int p, │ │ │ │ │ -QuadratureType::Enum qt=QuadratureType::GaussLegendre) │ │ │ │ │ -select the appropriate QuadratureRule for GeometryType t and order p │ │ │ │ │ -Definition: quadraturerules.hh:272 │ │ │ │ │ -Dune::QuadratureRules::rule │ │ │ │ │ -static const QuadratureRule & rule(const GeometryType &t, int p, │ │ │ │ │ -QuadratureType::Enum qt=QuadratureType::GaussLegendre) │ │ │ │ │ -select the appropriate QuadratureRule for GeometryType t and order p │ │ │ │ │ -Definition: quadraturerules.hh:266 │ │ │ │ │ Dune::GeometryType │ │ │ │ │ Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ Definition: type.hh:125 │ │ │ │ │ -Dune::GeometryType::isPrism │ │ │ │ │ -constexpr bool isPrism() const │ │ │ │ │ -Return true if entity is a prism. │ │ │ │ │ -Definition: type.hh:320 │ │ │ │ │ -Dune::GeometryType::isVertex │ │ │ │ │ -constexpr bool isVertex() const │ │ │ │ │ -Return true if entity is a vertex. │ │ │ │ │ -Definition: type.hh:290 │ │ │ │ │ +Dune::GeometryType::toId │ │ │ │ │ +constexpr Id toId() const │ │ │ │ │ +Create an Id representation of this GeometryType. │ │ │ │ │ +Definition: type.hh:221 │ │ │ │ │ Dune::GeometryType::dim │ │ │ │ │ constexpr unsigned int dim() const │ │ │ │ │ Return dimension of the type. │ │ │ │ │ Definition: type.hh:371 │ │ │ │ │ -Dune::GeometryType::BasicType │ │ │ │ │ -BasicType │ │ │ │ │ -Each entity can be tagged by one of these basic types plus its space dimension. │ │ │ │ │ -Definition: type.hh:131 │ │ │ │ │ -Dune::GeometryType::isLine │ │ │ │ │ -constexpr bool isLine() const │ │ │ │ │ -Return true if entity is a line segment. │ │ │ │ │ -Definition: type.hh:295 │ │ │ │ │ Dune::GeometryType::id │ │ │ │ │ constexpr unsigned int id() const │ │ │ │ │ Return the topology id of the type. │ │ │ │ │ Definition: type.hh:376 │ │ │ │ │ -Dune::GeometryType::isSimplex │ │ │ │ │ -constexpr bool isSimplex() const │ │ │ │ │ -Return true if entity is a simplex of any dimension. │ │ │ │ │ -Definition: type.hh:330 │ │ │ │ │ +Dune::GeometryType::isNone │ │ │ │ │ +constexpr bool isNone() const │ │ │ │ │ +Return true if entity is a singular of any dimension. │ │ │ │ │ +Definition: type.hh:366 │ │ │ │ │ +Dune::LocalGeometryTypeIndex │ │ │ │ │ +Compute per-dimension indices for geometry types. │ │ │ │ │ +Definition: typeindex.hh:25 │ │ │ │ │ Dune::LocalGeometryTypeIndex::size │ │ │ │ │ static constexpr std::size_t size(std::size_t dim) │ │ │ │ │ Compute total number of geometry types for the given dimension. │ │ │ │ │ Definition: typeindex.hh:61 │ │ │ │ │ +Dune::LocalGeometryTypeIndex::type │ │ │ │ │ +static constexpr GeometryType type(std::size_t dim, std::size_t index) │ │ │ │ │ +compute the geometry type for the given local index and dimension │ │ │ │ │ +Definition: typeindex.hh:79 │ │ │ │ │ Dune::LocalGeometryTypeIndex::index │ │ │ │ │ static constexpr std::size_t index(const GeometryType >) │ │ │ │ │ Compute the index for the given geometry type within its dimension. │ │ │ │ │ Definition: typeindex.hh:73 │ │ │ │ │ +Dune::GlobalGeometryTypeIndex │ │ │ │ │ +Compute indices for geometry types, taking the dimension into account. │ │ │ │ │ +Definition: typeindex.hh:90 │ │ │ │ │ +Dune::GlobalGeometryTypeIndex::index │ │ │ │ │ +static constexpr std::size_t index(const GeometryType >) │ │ │ │ │ +Compute the index for the given geometry type over all dimensions. │ │ │ │ │ +Definition: typeindex.hh:138 │ │ │ │ │ +Dune::GlobalGeometryTypeIndex::offset │ │ │ │ │ +static constexpr std::size_t offset(std::size_t dim) │ │ │ │ │ +Compute the starting index for a given dimension including irregular geometry │ │ │ │ │ +types. │ │ │ │ │ +Definition: typeindex.hh:113 │ │ │ │ │ +Dune::GlobalGeometryTypeIndex::size │ │ │ │ │ +static constexpr std::size_t size(std::size_t maxdim) │ │ │ │ │ +Compute total number of geometry types up to and including the given dimension. │ │ │ │ │ +Definition: typeindex.hh:125 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00215.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: typefromvertexcount.hh File Reference │ │ │ │ +dune-geometry: multilineargeometry.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,38 +58,62 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
typefromvertexcount.hh File Reference
│ │ │ │ +Classes | │ │ │ │ +Namespaces
│ │ │ │ +
multilineargeometry.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <dune/geometry/type.hh>
│ │ │ │ +
#include <cassert>
│ │ │ │ +#include <functional>
│ │ │ │ +#include <iterator>
│ │ │ │ +#include <limits>
│ │ │ │ +#include <vector>
│ │ │ │ +#include <dune/common/fmatrix.hh>
│ │ │ │ +#include <dune/common/fvector.hh>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │ +#include <dune/geometry/affinegeometry.hh>
│ │ │ │ +#include <dune/geometry/referenceelements.hh>
│ │ │ │ +#include <dune/geometry/type.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Classes

struct  Dune::MultiLinearGeometryTraits< ct >
 default traits class for MultiLinearGeometry More...
 
struct  Dune::MultiLinearGeometryTraits< ct >::CornerStorage< mydim, cdim >
 template specifying the storage for the corners More...
 
struct  Dune::MultiLinearGeometryTraits< ct >::hasSingleGeometryType< dim >
 will there be only one geometry type for a dimension? More...
 
class  Dune::MultiLinearGeometry< ct, mydim, cdim, Traits >
 generic geometry implementation based on corner coordinates More...
 
class  Dune::MultiLinearGeometry< ct, mydim, cdim, Traits >::JacobianInverseTransposed
 
class  Dune::CachedMultiLinearGeometry< ct, mydim, cdim, Traits >
 Implement a MultiLinearGeometry with additional caching. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

GeometryType Dune::geometryTypeFromVertexCount (unsigned int dim, unsigned int vertices)
 Utitlity function to construct the correct geometry type given the dimension and the number of vertices. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,24 +4,46 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ - * utility │ │ │ │ │ -Namespaces | Functions │ │ │ │ │ -typefromvertexcount.hh File Reference │ │ │ │ │ +Classes | Namespaces │ │ │ │ │ +multilineargeometry.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ + Classes │ │ │ │ │ +struct  Dune::MultiLinearGeometryTraits<_ct_> │ │ │ │ │ +  default traits class for MultiLinearGeometry More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::MultiLinearGeometryTraits<_ct_>::CornerStorage<_mydim,_cdim_> │ │ │ │ │ +  template specifying the storage for the corners More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::MultiLinearGeometryTraits<_ct_>::hasSingleGeometryType<_dim_> │ │ │ │ │ +  will there be only one geometry type for a dimension? More... │ │ │ │ │ +  │ │ │ │ │ + class  Dune::MultiLinearGeometry<_ct,_mydim,_cdim,_Traits_> │ │ │ │ │ +  generic geometry implementation based on corner coordinates More... │ │ │ │ │ +  │ │ │ │ │ + class  Dune::MultiLinearGeometry<_ct,_mydim,_cdim,_Traits_>:: │ │ │ │ │ + JacobianInverseTransposed │ │ │ │ │ +  │ │ │ │ │ + class  Dune::CachedMultiLinearGeometry<_ct,_mydim,_cdim,_Traits_> │ │ │ │ │ +  Implement a MultiLinearGeometry with additional caching. More... │ │ │ │ │ +  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ - Functions │ │ │ │ │ -GeometryType Dune::geometryTypeFromVertexCount (unsigned int dim, unsigned int │ │ │ │ │ - vertices) │ │ │ │ │ -  Utitlity function to construct the correct geometry type given │ │ │ │ │ - the dimension and the number of vertices. More... │ │ │ │ │ -  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00215_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: typefromvertexcount.hh Source File │ │ │ │ +dune-geometry: multilineargeometry.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,82 +58,747 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
typefromvertexcount.hh
│ │ │ │ +
multilineargeometry.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
2// vi: set et ts=4 sw=2 sts=2:
│ │ │ │
3// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
5#ifndef DUNE_GEOMETRY_TYPE_FROM_VERTEX_COUNT_HH
│ │ │ │ -
6#define DUNE_GEOMETRY_TYPE_FROM_VERTEX_COUNT_HH
│ │ │ │ +
5#ifndef DUNE_GEOMETRY_MULTILINEARGEOMETRY_HH
│ │ │ │ +
6#define DUNE_GEOMETRY_MULTILINEARGEOMETRY_HH
│ │ │ │
7
│ │ │ │ - │ │ │ │ -
9
│ │ │ │ -
10namespace Dune {
│ │ │ │ -
11
│ │ │ │ -
16 inline
│ │ │ │ -
17 GeometryType geometryTypeFromVertexCount(unsigned int dim, unsigned int vertices)
│ │ │ │ -
18 {
│ │ │ │ -
19 switch (dim)
│ │ │ │ -
20 {
│ │ │ │ -
21 case 0 :
│ │ │ │ - │ │ │ │ -
23 case 1 :
│ │ │ │ - │ │ │ │ -
25 case 2 :
│ │ │ │ -
26 switch (vertices) {
│ │ │ │ -
27 case 3 :
│ │ │ │ - │ │ │ │ -
29 case 4 :
│ │ │ │ - │ │ │ │ -
31 default :
│ │ │ │ -
32 DUNE_THROW(NotImplemented, "2d elements with " << vertices << " corners are not supported!");
│ │ │ │ -
33 }
│ │ │ │ -
34 case 3 :
│ │ │ │ -
35 switch (vertices) {
│ │ │ │ -
36 case 4 :
│ │ │ │ - │ │ │ │ -
38 case 5 :
│ │ │ │ - │ │ │ │ -
40 case 6 :
│ │ │ │ - │ │ │ │ -
42 case 8 :
│ │ │ │ - │ │ │ │ -
44 default :
│ │ │ │ -
45 DUNE_THROW(NotImplemented, "3d elements with " << vertices << " corners are not supported!");
│ │ │ │ -
46 }
│ │ │ │ -
47 default :
│ │ │ │ -
48 DUNE_THROW(NotImplemented, "geometryTypeFromVertexCount works only up to dim=3");
│ │ │ │ -
49 }
│ │ │ │ -
50 }
│ │ │ │ -
51
│ │ │ │ -
52}
│ │ │ │ -
53
│ │ │ │ -
54#endif // DUNE_GEOMETRY_TYPE_FROM_VERTEX_COUNT_HH
│ │ │ │ -
A unique label for each type of element that can occur in a grid.
│ │ │ │ -
constexpr GeometryType line
GeometryType representing a line.
Definition: type.hh:512
│ │ │ │ -
constexpr GeometryType prism
GeometryType representing a 3D prism.
Definition: type.hh:542
│ │ │ │ -
constexpr GeometryType triangle
GeometryType representing a triangle.
Definition: type.hh:518
│ │ │ │ -
constexpr GeometryType quadrilateral
GeometryType representing a quadrilateral (a square).
Definition: type.hh:524
│ │ │ │ -
constexpr GeometryType hexahedron
GeometryType representing a hexahedron.
Definition: type.hh:548
│ │ │ │ -
constexpr GeometryType pyramid
GeometryType representing a 3D pyramid.
Definition: type.hh:536
│ │ │ │ -
constexpr GeometryType tetrahedron
GeometryType representing a tetrahedron.
Definition: type.hh:530
│ │ │ │ -
constexpr GeometryType vertex
GeometryType representing a vertex.
Definition: type.hh:506
│ │ │ │ +
8#include <cassert>
│ │ │ │ +
9#include <functional>
│ │ │ │ +
10#include <iterator>
│ │ │ │ +
11#include <limits>
│ │ │ │ +
12#include <vector>
│ │ │ │ +
13
│ │ │ │ +
14#include <dune/common/fmatrix.hh>
│ │ │ │ +
15#include <dune/common/fvector.hh>
│ │ │ │ +
16#include <dune/common/typetraits.hh>
│ │ │ │ +
17
│ │ │ │ + │ │ │ │ + │ │ │ │ +
20#include <dune/geometry/type.hh>
│ │ │ │ +
21
│ │ │ │ +
22namespace Dune
│ │ │ │ +
23{
│ │ │ │ +
24
│ │ │ │ +
25 // MultiLinearGeometryTraits
│ │ │ │ +
26 // -------------------------
│ │ │ │ +
27
│ │ │ │ +
37 template< class ct >
│ │ │ │ + │ │ │ │ +
39 {
│ │ │ │ +
58 typedef Impl::FieldMatrixHelper< ct > MatrixHelper;
│ │ │ │ +
59
│ │ │ │ +
61 static ct tolerance () { return ct( 16 ) * std::numeric_limits< ct >::epsilon(); }
│ │ │ │ +
62
│ │ │ │ +
127 template< int mydim, int cdim >
│ │ │ │ + │ │ │ │ +
129 {
│ │ │ │ +
130 typedef std::vector< FieldVector< ct, cdim > > Type;
│ │ │ │ +
131 };
│ │ │ │ +
132
│ │ │ │ +
146 template< int dim >
│ │ │ │ + │ │ │ │ +
148 {
│ │ │ │ +
149 static const bool v = false;
│ │ │ │ +
150 static const unsigned int topologyId = ~0u;
│ │ │ │ +
151 };
│ │ │ │ +
152 };
│ │ │ │ +
153
│ │ │ │ +
154
│ │ │ │ +
155
│ │ │ │ +
156 // MultiLinearGeometry
│ │ │ │ +
157 // -------------------
│ │ │ │ +
158
│ │ │ │ +
179 template< class ct, int mydim, int cdim, class Traits = MultiLinearGeometryTraits< ct > >
│ │ │ │ + │ │ │ │ +
181 {
│ │ │ │ + │ │ │ │ +
183
│ │ │ │ +
184 public:
│ │ │ │ +
186 typedef ct ctype;
│ │ │ │ +
187
│ │ │ │ +
189 static const int mydimension= mydim;
│ │ │ │ +
191 static const int coorddimension = cdim;
│ │ │ │ +
192
│ │ │ │ +
194 typedef FieldVector< ctype, mydimension > LocalCoordinate;
│ │ │ │ +
196 typedef FieldVector< ctype, coorddimension > GlobalCoordinate;
│ │ │ │ +
198 typedef ctype Volume;
│ │ │ │ +
199
│ │ │ │ +
201 typedef FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed;
│ │ │ │ +
202
│ │ │ │ + │ │ │ │ +
205
│ │ │ │ +
207 typedef FieldMatrix< ctype, coorddimension, mydimension > Jacobian;
│ │ │ │ +
208
│ │ │ │ +
210 typedef FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse;
│ │ │ │ +
211
│ │ │ │ +
212 protected:
│ │ │ │ +
213
│ │ │ │ + │ │ │ │ +
215
│ │ │ │ +
216 public:
│ │ │ │ +
217
│ │ │ │ + │ │ │ │ +
220
│ │ │ │ +
221 private:
│ │ │ │ +
222 static const bool hasSingleGeometryType = Traits::template hasSingleGeometryType< mydimension >::v;
│ │ │ │ +
223
│ │ │ │ +
224 protected:
│ │ │ │ +
225 typedef typename Traits::MatrixHelper MatrixHelper;
│ │ │ │ +
226 typedef typename std::conditional< hasSingleGeometryType, std::integral_constant< unsigned int, Traits::template hasSingleGeometryType< mydimension >::topologyId >, unsigned int >::type TopologyId;
│ │ │ │ +
227
│ │ │ │ +
228 public:
│ │ │ │ +
238 template< class Corners >
│ │ │ │ + │ │ │ │ +
240 const Corners &corners )
│ │ │ │ +
241 : refElement_( refElement ),
│ │ │ │ +
242 corners_( corners )
│ │ │ │ +
243 {}
│ │ │ │ +
244
│ │ │ │ +
254 template< class Corners >
│ │ │ │ + │ │ │ │ +
256 const Corners &corners )
│ │ │ │ +
257 : refElement_( ReferenceElements::general( gt ) ),
│ │ │ │ +
258 corners_( corners )
│ │ │ │ +
259 {}
│ │ │ │ +
260
│ │ │ │ +
262 bool affine () const
│ │ │ │ +
263 {
│ │ │ │ + │ │ │ │ +
265 return affine( jt );
│ │ │ │ +
266 }
│ │ │ │ +
267
│ │ │ │ +
269 Dune::GeometryType type () const { return GeometryType( toUnsignedInt(topologyId()), mydimension ); }
│ │ │ │ +
270
│ │ │ │ +
272 int corners () const { return refElement().size( mydimension ); }
│ │ │ │ +
273
│ │ │ │ +
275 GlobalCoordinate corner ( int i ) const
│ │ │ │ +
276 {
│ │ │ │ +
277 assert( (i >= 0) && (i < corners()) );
│ │ │ │ +
278 return std::cref(corners_).get()[ i ];
│ │ │ │ +
279 }
│ │ │ │ +
280
│ │ │ │ +
282 GlobalCoordinate center () const { return global( refElement().position( 0, 0 ) ); }
│ │ │ │ +
283
│ │ │ │ + │ │ │ │ +
291 {
│ │ │ │ +
292 using std::begin;
│ │ │ │ +
293
│ │ │ │ +
294 auto cit = begin(std::cref(corners_).get());
│ │ │ │ + │ │ │ │ +
296 global< false >( topologyId(), std::integral_constant< int, mydimension >(), cit, ctype( 1 ), local, ctype( 1 ), y );
│ │ │ │ +
297 return y;
│ │ │ │ +
298 }
│ │ │ │ +
299
│ │ │ │ +
312 LocalCoordinate local ( const GlobalCoordinate &globalCoord ) const
│ │ │ │ +
313 {
│ │ │ │ +
314 const ctype tolerance = Traits::tolerance();
│ │ │ │ +
315 LocalCoordinate x = refElement().position( 0, 0 );
│ │ │ │ + │ │ │ │ +
317 const bool affineMapping = this->affine();
│ │ │ │ +
318 do
│ │ │ │ +
319 {
│ │ │ │ +
320 // Newton's method: DF^n dx^n = F^n, x^{n+1} -= dx^n
│ │ │ │ +
321 const GlobalCoordinate dglobal = (*this).global( x ) - globalCoord;
│ │ │ │ +
322 const bool invertible =
│ │ │ │ +
323 MatrixHelper::template xTRightInvA< mydimension, coorddimension >( jacobianTransposed( x ), dglobal, dx );
│ │ │ │ +
324 if( ! invertible )
│ │ │ │ +
325 return LocalCoordinate( std::numeric_limits< ctype > :: max() );
│ │ │ │ +
326
│ │ │ │ +
327 // update x with correction
│ │ │ │ +
328 x -= dx;
│ │ │ │ +
329
│ │ │ │ +
330 // for affine mappings only one iteration is needed
│ │ │ │ +
331 if ( affineMapping ) break;
│ │ │ │ +
332 } while( dx.two_norm2() > tolerance );
│ │ │ │ +
333 return x;
│ │ │ │ +
334 }
│ │ │ │ +
335
│ │ │ │ + │ │ │ │ +
351 {
│ │ │ │ +
352 return MatrixHelper::template sqrtDetAAT< mydimension, coorddimension >( jacobianTransposed( local ) );
│ │ │ │ +
353 }
│ │ │ │ +
354
│ │ │ │ +
363 Volume volume () const
│ │ │ │ +
364 {
│ │ │ │ +
365 return integrationElement( refElement().position( 0, 0 ) ) * refElement().volume();
│ │ │ │ +
366 }
│ │ │ │ +
367
│ │ │ │ + │ │ │ │ +
378 {
│ │ │ │ +
379 using std::begin;
│ │ │ │ +
380
│ │ │ │ + │ │ │ │ +
382 auto cit = begin(std::cref(corners_).get());
│ │ │ │ +
383 jacobianTransposed< false >( topologyId(), std::integral_constant< int, mydimension >(), cit, ctype( 1 ), local, ctype( 1 ), jt );
│ │ │ │ +
384 return jt;
│ │ │ │ +
385 }
│ │ │ │ +
386
│ │ │ │ +
393 JacobianInverseTransposed jacobianInverseTransposed ( const LocalCoordinate &local ) const;
│ │ │ │ +
394
│ │ │ │ + │ │ │ │ +
396 {
│ │ │ │ +
397 return geometry.refElement();
│ │ │ │ +
398 }
│ │ │ │ +
399
│ │ │ │ +
400
│ │ │ │ +
407 Jacobian jacobian (const LocalCoordinate &local) const
│ │ │ │ +
408 {
│ │ │ │ +
409 return jacobianTransposed(local).transposed();
│ │ │ │ +
410 }
│ │ │ │ +
411
│ │ │ │ + │ │ │ │ +
419 {
│ │ │ │ +
420 return jacobianInverseTransposed(local).transposed();
│ │ │ │ +
421 }
│ │ │ │ +
422
│ │ │ │ +
423 protected:
│ │ │ │ +
424
│ │ │ │ + │ │ │ │ +
426 {
│ │ │ │ +
427 return refElement_;
│ │ │ │ +
428 }
│ │ │ │ +
429
│ │ │ │ + │ │ │ │ +
431 {
│ │ │ │ +
432 return topologyId( std::integral_constant< bool, hasSingleGeometryType >() );
│ │ │ │ +
433 }
│ │ │ │ +
434
│ │ │ │ +
435 template< bool add, int dim, class CornerIterator >
│ │ │ │ +
436 static void global ( TopologyId topologyId, std::integral_constant< int, dim >,
│ │ │ │ +
437 CornerIterator &cit, const ctype &df, const LocalCoordinate &x,
│ │ │ │ +
438 const ctype &rf, GlobalCoordinate &y );
│ │ │ │ +
439 template< bool add, class CornerIterator >
│ │ │ │ +
440 static void global ( TopologyId topologyId, std::integral_constant< int, 0 >,
│ │ │ │ +
441 CornerIterator &cit, const ctype &df, const LocalCoordinate &x,
│ │ │ │ +
442 const ctype &rf, GlobalCoordinate &y );
│ │ │ │ +
443
│ │ │ │ +
444 template< bool add, int rows, int dim, class CornerIterator >
│ │ │ │ +
445 static void jacobianTransposed ( TopologyId topologyId, std::integral_constant< int, dim >,
│ │ │ │ +
446 CornerIterator &cit, const ctype &df, const LocalCoordinate &x,
│ │ │ │ +
447 const ctype &rf, FieldMatrix< ctype, rows, cdim > &jt );
│ │ │ │ +
448 template< bool add, int rows, class CornerIterator >
│ │ │ │ +
449 static void jacobianTransposed ( TopologyId topologyId, std::integral_constant< int, 0 >,
│ │ │ │ +
450 CornerIterator &cit, const ctype &df, const LocalCoordinate &x,
│ │ │ │ +
451 const ctype &rf, FieldMatrix< ctype, rows, cdim > &jt );
│ │ │ │ +
452
│ │ │ │ +
453 template< int dim, class CornerIterator >
│ │ │ │ +
454 static bool affine ( TopologyId topologyId, std::integral_constant< int, dim >, CornerIterator &cit, JacobianTransposed &jt );
│ │ │ │ +
455 template< class CornerIterator >
│ │ │ │ +
456 static bool affine ( TopologyId topologyId, std::integral_constant< int, 0 >, CornerIterator &cit, JacobianTransposed &jt );
│ │ │ │ +
457
│ │ │ │ +
458 bool affine ( JacobianTransposed &jacobianT ) const
│ │ │ │ +
459 {
│ │ │ │ +
460 using std::begin;
│ │ │ │ +
461
│ │ │ │ +
462 auto cit = begin(std::cref(corners_).get());
│ │ │ │ +
463 return affine( topologyId(), std::integral_constant< int, mydimension >(), cit, jacobianT );
│ │ │ │ +
464 }
│ │ │ │ +
465
│ │ │ │ +
466 private:
│ │ │ │ +
467 // The following methods are needed to convert the return type of topologyId to
│ │ │ │ +
468 // unsigned int with g++-4.4. It has problems casting integral_constant to the
│ │ │ │ +
469 // integral type.
│ │ │ │ +
470 static unsigned int toUnsignedInt(unsigned int i) { return i; }
│ │ │ │ +
471 template<unsigned int v>
│ │ │ │ +
472 static unsigned int toUnsignedInt(std::integral_constant<unsigned int,v> ) { return v; }
│ │ │ │ +
473 TopologyId topologyId ( std::integral_constant< bool, true > ) const { return TopologyId(); }
│ │ │ │ +
474 unsigned int topologyId ( std::integral_constant< bool, false > ) const { return refElement().type().id(); }
│ │ │ │ +
475
│ │ │ │ +
476 ReferenceElement refElement_;
│ │ │ │ +
477 typename Traits::template CornerStorage< mydimension, coorddimension >::Type corners_;
│ │ │ │ +
478 };
│ │ │ │ +
479
│ │ │ │ +
480
│ │ │ │ +
481
│ │ │ │ +
482 // MultiLinearGeometry::JacobianInverseTransposed
│ │ │ │ +
483 // ----------------------------------------------
│ │ │ │ +
484
│ │ │ │ +
485 template< class ct, int mydim, int cdim, class Traits >
│ │ │ │ +
486 class MultiLinearGeometry< ct, mydim, cdim, Traits >::JacobianInverseTransposed
│ │ │ │ +
487 : public FieldMatrix< ctype, coorddimension, mydimension >
│ │ │ │ +
488 {
│ │ │ │ +
489 typedef FieldMatrix< ctype, coorddimension, mydimension > Base;
│ │ │ │ +
490
│ │ │ │ +
491 public:
│ │ │ │ +
492 void setup ( const JacobianTransposed &jt )
│ │ │ │ +
493 {
│ │ │ │ +
494 detInv_ = MatrixHelper::template rightInvA< mydimension, coorddimension >( jt, static_cast< Base & >( *this ) );
│ │ │ │ +
495 }
│ │ │ │ +
496
│ │ │ │ + │ │ │ │ +
498 {
│ │ │ │ +
499 detInv_ = MatrixHelper::template sqrtDetAAT< mydimension, coorddimension >( jt );
│ │ │ │ +
500 }
│ │ │ │ +
501
│ │ │ │ +
502 ctype det () const { return ctype( 1 ) / detInv_; }
│ │ │ │ +
503 ctype detInv () const { return detInv_; }
│ │ │ │ +
504
│ │ │ │ +
505 private:
│ │ │ │ +
506 ctype detInv_;
│ │ │ │ +
507 };
│ │ │ │ +
508
│ │ │ │ +
509
│ │ │ │ +
510
│ │ │ │ +
523 template< class ct, int mydim, int cdim, class Traits = MultiLinearGeometryTraits< ct > >
│ │ │ │ + │ │ │ │ +
525 : public MultiLinearGeometry< ct, mydim, cdim, Traits >
│ │ │ │ +
526 {
│ │ │ │ + │ │ │ │ + │ │ │ │ +
529
│ │ │ │ +
530 protected:
│ │ │ │ + │ │ │ │ +
532
│ │ │ │ +
533 public:
│ │ │ │ + │ │ │ │ +
535
│ │ │ │ +
536 typedef typename Base::ctype ctype;
│ │ │ │ +
537
│ │ │ │ +
538 using Base::mydimension;
│ │ │ │ + │ │ │ │ +
540
│ │ │ │ + │ │ │ │ + │ │ │ │ +
543 typedef typename Base::Volume Volume;
│ │ │ │ +
544
│ │ │ │ + │ │ │ │ + │ │ │ │ +
547 typedef typename Base::Jacobian Jacobian;
│ │ │ │ + │ │ │ │ +
549
│ │ │ │ +
550 template< class CornerStorage >
│ │ │ │ +
551 CachedMultiLinearGeometry ( const ReferenceElement &referenceElement, const CornerStorage &cornerStorage )
│ │ │ │ +
552 : Base( referenceElement, cornerStorage ),
│ │ │ │ +
553 affine_( Base::affine( jacobianTransposed_ ) ),
│ │ │ │ +
554 jacobianInverseTransposedComputed_( false ),
│ │ │ │ +
555 integrationElementComputed_( false )
│ │ │ │ +
556 {}
│ │ │ │ +
557
│ │ │ │ +
558 template< class CornerStorage >
│ │ │ │ +
559 CachedMultiLinearGeometry ( Dune::GeometryType gt, const CornerStorage &cornerStorage )
│ │ │ │ +
560 : Base( gt, cornerStorage ),
│ │ │ │ +
561 affine_( Base::affine( jacobianTransposed_ ) ),
│ │ │ │ +
562 jacobianInverseTransposedComputed_( false ),
│ │ │ │ +
563 integrationElementComputed_( false )
│ │ │ │ +
564 {}
│ │ │ │ +
565
│ │ │ │ +
567 bool affine () const { return affine_; }
│ │ │ │ +
568
│ │ │ │ +
569 using Base::corner;
│ │ │ │ +
570
│ │ │ │ +
572 GlobalCoordinate center () const { return global( refElement().position( 0, 0 ) ); }
│ │ │ │ +
573
│ │ │ │ + │ │ │ │ +
581 {
│ │ │ │ +
582 if( affine() )
│ │ │ │ +
583 {
│ │ │ │ + │ │ │ │ +
585 jacobianTransposed_.umtv( local, global );
│ │ │ │ +
586 return global;
│ │ │ │ +
587 }
│ │ │ │ +
588 else
│ │ │ │ +
589 return Base::global( local );
│ │ │ │ +
590 }
│ │ │ │ +
591
│ │ │ │ + │ │ │ │ +
605 {
│ │ │ │ +
606 if( affine() )
│ │ │ │ +
607 {
│ │ │ │ +
608 LocalCoordinate local;
│ │ │ │ +
609 if( jacobianInverseTransposedComputed_ )
│ │ │ │ +
610 jacobianInverseTransposed_.mtv( global - corner( 0 ), local );
│ │ │ │ +
611 else
│ │ │ │ +
612 MatrixHelper::template xTRightInvA< mydimension, coorddimension >( jacobianTransposed_, global - corner( 0 ), local );
│ │ │ │ +
613 return local;
│ │ │ │ +
614 }
│ │ │ │ +
615 else
│ │ │ │ +
616 return Base::local( global );
│ │ │ │ +
617 }
│ │ │ │ +
618
│ │ │ │ + │ │ │ │ +
634 {
│ │ │ │ +
635 if( affine() )
│ │ │ │ +
636 {
│ │ │ │ +
637 if( !integrationElementComputed_ )
│ │ │ │ +
638 {
│ │ │ │ +
639 jacobianInverseTransposed_.setupDeterminant( jacobianTransposed_ );
│ │ │ │ +
640 integrationElementComputed_ = true;
│ │ │ │ +
641 }
│ │ │ │ +
642 return jacobianInverseTransposed_.detInv();
│ │ │ │ +
643 }
│ │ │ │ +
644 else
│ │ │ │ +
645 return Base::integrationElement( local );
│ │ │ │ +
646 }
│ │ │ │ +
647
│ │ │ │ +
649 Volume volume () const
│ │ │ │ +
650 {
│ │ │ │ +
651 if( affine() )
│ │ │ │ +
652 return integrationElement( refElement().position( 0, 0 ) ) * refElement().volume();
│ │ │ │ +
653 else
│ │ │ │ +
654 return Base::volume();
│ │ │ │ +
655 }
│ │ │ │ +
656
│ │ │ │ + │ │ │ │ +
667 {
│ │ │ │ +
668 if( affine() )
│ │ │ │ +
669 return jacobianTransposed_;
│ │ │ │ +
670 else
│ │ │ │ +
671 return Base::jacobianTransposed( local );
│ │ │ │ +
672 }
│ │ │ │ +
673
│ │ │ │ + │ │ │ │ +
681 {
│ │ │ │ +
682 if( affine() )
│ │ │ │ +
683 {
│ │ │ │ +
684 if( !jacobianInverseTransposedComputed_ )
│ │ │ │ +
685 {
│ │ │ │ +
686 jacobianInverseTransposed_.setup( jacobianTransposed_ );
│ │ │ │ +
687 jacobianInverseTransposedComputed_ = true;
│ │ │ │ +
688 integrationElementComputed_ = true;
│ │ │ │ +
689 }
│ │ │ │ +
690 return jacobianInverseTransposed_;
│ │ │ │ +
691 }
│ │ │ │ +
692 else
│ │ │ │ +
693 return Base::jacobianInverseTransposed( local );
│ │ │ │ +
694 }
│ │ │ │ +
695
│ │ │ │ +
702 Jacobian jacobian (const LocalCoordinate &local) const
│ │ │ │ +
703 {
│ │ │ │ +
704 return jacobianTransposed(local).transposed();
│ │ │ │ +
705 }
│ │ │ │ +
706
│ │ │ │ + │ │ │ │ +
714 {
│ │ │ │ +
715 return jacobianInverseTransposed(local).transposed();
│ │ │ │ +
716 }
│ │ │ │ +
717
│ │ │ │ +
718 protected:
│ │ │ │ +
719 using Base::refElement;
│ │ │ │ +
720
│ │ │ │ +
721 private:
│ │ │ │ +
722 mutable JacobianTransposed jacobianTransposed_;
│ │ │ │ +
723 mutable JacobianInverseTransposed jacobianInverseTransposed_;
│ │ │ │ +
724
│ │ │ │ +
725 mutable bool affine_ : 1;
│ │ │ │ +
726
│ │ │ │ +
727 mutable bool jacobianInverseTransposedComputed_ : 1;
│ │ │ │ +
728 mutable bool integrationElementComputed_ : 1;
│ │ │ │ +
729 };
│ │ │ │ +
730
│ │ │ │ +
731
│ │ │ │ +
732
│ │ │ │ +
733 // Implementation of MultiLinearGeometry
│ │ │ │ +
734 // -------------------------------------
│ │ │ │ +
735
│ │ │ │ +
736 template< class ct, int mydim, int cdim, class Traits >
│ │ │ │ +
737 inline typename MultiLinearGeometry< ct, mydim, cdim, Traits >::JacobianInverseTransposed
│ │ │ │ + │ │ │ │ +
739 {
│ │ │ │ + │ │ │ │ +
741 jit.setup( jacobianTransposed( local ) );
│ │ │ │ +
742 return jit;
│ │ │ │ +
743 }
│ │ │ │ +
744
│ │ │ │ +
745
│ │ │ │ +
746 template< class ct, int mydim, int cdim, class Traits >
│ │ │ │ +
747 template< bool add, int dim, class CornerIterator >
│ │ │ │ + │ │ │ │ +
749 ::global ( TopologyId topologyId, std::integral_constant< int, dim >,
│ │ │ │ +
750 CornerIterator &cit, const ctype &df, const LocalCoordinate &x,
│ │ │ │ +
751 const ctype &rf, GlobalCoordinate &y )
│ │ │ │ +
752 {
│ │ │ │ +
753 const ctype xn = df*x[ dim-1 ];
│ │ │ │ +
754 const ctype cxn = ctype( 1 ) - xn;
│ │ │ │ +
755
│ │ │ │ +
756 if( Impl::isPrism( toUnsignedInt(topologyId), mydimension, mydimension-dim ) )
│ │ │ │ +
757 {
│ │ │ │ +
758 // apply (1-xn) times mapping for bottom
│ │ │ │ +
759 global< add >( topologyId, std::integral_constant< int, dim-1 >(), cit, df, x, rf*cxn, y );
│ │ │ │ +
760 // apply xn times mapping for top
│ │ │ │ +
761 global< true >( topologyId, std::integral_constant< int, dim-1 >(), cit, df, x, rf*xn, y );
│ │ │ │ +
762 }
│ │ │ │ +
763 else
│ │ │ │ +
764 {
│ │ │ │ +
765 assert( Impl::isPyramid( toUnsignedInt(topologyId), mydimension, mydimension-dim ) );
│ │ │ │ +
766 // apply (1-xn) times mapping for bottom (with argument x/(1-xn))
│ │ │ │ +
767 if( cxn > Traits::tolerance() || cxn < -Traits::tolerance() )
│ │ │ │ +
768 global< add >( topologyId, std::integral_constant< int, dim-1 >(), cit, df/cxn, x, rf*cxn, y );
│ │ │ │ +
769 else
│ │ │ │ +
770 global< add >( topologyId, std::integral_constant< int, dim-1 >(), cit, df, x, ctype( 0 ), y );
│ │ │ │ +
771 // apply xn times the tip
│ │ │ │ +
772 y.axpy( rf*xn, *cit );
│ │ │ │ +
773 ++cit;
│ │ │ │ +
774 }
│ │ │ │ +
775 }
│ │ │ │ +
776
│ │ │ │ +
777 template< class ct, int mydim, int cdim, class Traits >
│ │ │ │ +
778 template< bool add, class CornerIterator >
│ │ │ │ + │ │ │ │ +
780 ::global ( TopologyId, std::integral_constant< int, 0 >,
│ │ │ │ +
781 CornerIterator &cit, const ctype &, const LocalCoordinate &,
│ │ │ │ +
782 const ctype &rf, GlobalCoordinate &y )
│ │ │ │ +
783 {
│ │ │ │ +
784 const GlobalCoordinate &origin = *cit;
│ │ │ │ +
785 ++cit;
│ │ │ │ +
786 for( int i = 0; i < coorddimension; ++i )
│ │ │ │ +
787 y[ i ] = (add ? y[ i ] + rf*origin[ i ] : rf*origin[ i ]);
│ │ │ │ +
788 }
│ │ │ │ +
789
│ │ │ │ +
790
│ │ │ │ +
791 template< class ct, int mydim, int cdim, class Traits >
│ │ │ │ +
792 template< bool add, int rows, int dim, class CornerIterator >
│ │ │ │ + │ │ │ │ +
794 ::jacobianTransposed ( TopologyId topologyId, std::integral_constant< int, dim >,
│ │ │ │ +
795 CornerIterator &cit, const ctype &df, const LocalCoordinate &x,
│ │ │ │ +
796 const ctype &rf, FieldMatrix< ctype, rows, cdim > &jt )
│ │ │ │ +
797 {
│ │ │ │ +
798 assert( rows >= dim );
│ │ │ │ +
799
│ │ │ │ +
800 const ctype xn = df*x[ dim-1 ];
│ │ │ │ +
801 const ctype cxn = ctype( 1 ) - xn;
│ │ │ │ +
802
│ │ │ │ +
803 auto cit2( cit );
│ │ │ │ +
804 if( Impl::isPrism( toUnsignedInt(topologyId), mydimension, mydimension-dim ) )
│ │ │ │ +
805 {
│ │ │ │ +
806 // apply (1-xn) times Jacobian for bottom
│ │ │ │ +
807 jacobianTransposed< add >( topologyId, std::integral_constant< int, dim-1 >(), cit2, df, x, rf*cxn, jt );
│ │ │ │ +
808 // apply xn times Jacobian for top
│ │ │ │ +
809 jacobianTransposed< true >( topologyId, std::integral_constant< int, dim-1 >(), cit2, df, x, rf*xn, jt );
│ │ │ │ +
810 // compute last row as difference between top value and bottom value
│ │ │ │ +
811 global< add >( topologyId, std::integral_constant< int, dim-1 >(), cit, df, x, -rf, jt[ dim-1 ] );
│ │ │ │ +
812 global< true >( topologyId, std::integral_constant< int, dim-1 >(), cit, df, x, rf, jt[ dim-1 ] );
│ │ │ │ +
813 }
│ │ │ │ +
814 else
│ │ │ │ +
815 {
│ │ │ │ +
816 assert( Impl::isPyramid( toUnsignedInt(topologyId), mydimension, mydimension-dim ) );
│ │ │ │ +
817 /*
│ │ │ │ +
818 * In the pyramid case, we need a transformation Tb: B -> R^n for the
│ │ │ │ +
819 * base B \subset R^{n-1}. The pyramid transformation is then defined as
│ │ │ │ +
820 * T: P \subset R^n -> R^n
│ │ │ │ +
821 * (x, xn) |-> (1-xn) Tb(x*) + xn t (x \in R^{n-1}, xn \in R)
│ │ │ │ +
822 * with the tip of the pyramid mapped to t and x* = x/(1-xn)
│ │ │ │ +
823 * the projection of (x,xn) onto the base.
│ │ │ │ +
824 *
│ │ │ │ +
825 * For the Jacobi matrix DT we get
│ │ │ │ +
826 * DT = ( A | b )
│ │ │ │ +
827 * with A = DTb(x*) (n x n-1 matrix)
│ │ │ │ +
828 * and b = dT/dxn (n-dim column vector).
│ │ │ │ +
829 * Furthermore
│ │ │ │ +
830 * b = -Tb(x*) + t + \sum_i dTb/dx_i(x^*) x_i/(1-xn)
│ │ │ │ +
831 *
│ │ │ │ +
832 * Note that both A and b are not defined in the pyramid tip (x=0, xn=1)!
│ │ │ │ +
833 * Indeed for B the unit square, Tb mapping B to the quadrilateral given
│ │ │ │ +
834 * by the vertices (0,0,0), (2,0,0), (0,1,0), (1,1,0) and t=(0,0,1), we get
│ │ │ │ +
835 *
│ │ │ │ +
836 * T(x,y,xn) = ( x(2-y/(1-xn)), y, xn )
│ │ │ │ +
837 * / 2-y/(1-xn) -x 0 \
│ │ │ │ +
838 * DT(x,y,xn) = | 0 1 0 |
│ │ │ │ +
839 * \ 0 0 1 /
│ │ │ │ +
840 * which is not continuous for xn -> 1, choose for example
│ │ │ │ +
841 * x=0, y=1-xn, xn -> 1 --> DT -> diag(1,1,1)
│ │ │ │ +
842 * x=1-xn, y=0, xn -> 1 --> DT -> diag(2,1,1)
│ │ │ │ +
843 *
│ │ │ │ +
844 * However, for Tb affine-linear, Tb(y) = My + y0, DTb = M:
│ │ │ │ +
845 * A = M
│ │ │ │ +
846 * b = -M x* - y0 + t + \sum_i M_i x_i/(1-xn)
│ │ │ │ +
847 * = -M x* - y0 + t + M x*
│ │ │ │ +
848 * = -y0 + t
│ │ │ │ +
849 * which is continuous for xn -> 1. Note that this b is also given by
│ │ │ │ +
850 * b = -Tb(0) + t + \sum_i dTb/dx_i(0) x_i/1
│ │ │ │ +
851 * that is replacing x* by 1 and 1-xn by 1 in the formular above.
│ │ │ │ +
852 *
│ │ │ │ +
853 * For xn -> 1, we can thus set x*=0, "1-xn"=1 (or anything != 0) and get
│ │ │ │ +
854 * the right result in case Tb is affine-linear.
│ │ │ │ +
855 */
│ │ │ │ +
856
│ │ │ │ +
857 /* The second case effectively results in x* = 0 */
│ │ │ │ +
858 ctype dfcxn = (cxn > Traits::tolerance() || cxn < -Traits::tolerance()) ? ctype(df / cxn) : ctype(0);
│ │ │ │ +
859
│ │ │ │ +
860 // initialize last row
│ │ │ │ +
861 // b = -Tb(x*)
│ │ │ │ +
862 // (b = -Tb(0) = -y0 in case xn -> 1 and Tb affine-linear)
│ │ │ │ +
863 global< add >( topologyId, std::integral_constant< int, dim-1 >(), cit, dfcxn, x, -rf, jt[ dim-1 ] );
│ │ │ │ +
864 // b += t
│ │ │ │ +
865 jt[ dim-1 ].axpy( rf, *cit );
│ │ │ │ +
866 ++cit;
│ │ │ │ +
867 // apply Jacobian for bottom (with argument x/(1-xn)) and correct last row
│ │ │ │ +
868 if( add )
│ │ │ │ +
869 {
│ │ │ │ +
870 FieldMatrix< ctype, dim-1, coorddimension > jt2;
│ │ │ │ +
871 // jt2 = dTb/dx_i(x*)
│ │ │ │ +
872 jacobianTransposed< false >( topologyId, std::integral_constant< int, dim-1 >(), cit2, dfcxn, x, rf, jt2 );
│ │ │ │ +
873 // A = dTb/dx_i(x*) (jt[j], j=0..dim-1)
│ │ │ │ +
874 // b += \sum_i dTb/dx_i(x*) x_i/(1-xn) (jt[dim-1])
│ │ │ │ +
875 // (b += 0 in case xn -> 1)
│ │ │ │ +
876 for( int j = 0; j < dim-1; ++j )
│ │ │ │ +
877 {
│ │ │ │ +
878 jt[ j ] += jt2[ j ];
│ │ │ │ +
879 jt[ dim-1 ].axpy( dfcxn*x[ j ], jt2[ j ] );
│ │ │ │ +
880 }
│ │ │ │ +
881 }
│ │ │ │ +
882 else
│ │ │ │ +
883 {
│ │ │ │ +
884 // jt = dTb/dx_i(x*)
│ │ │ │ +
885 jacobianTransposed< false >( topologyId, std::integral_constant< int, dim-1 >(), cit2, dfcxn, x, rf, jt );
│ │ │ │ +
886 // b += \sum_i dTb/dx_i(x*) x_i/(1-xn)
│ │ │ │ +
887 for( int j = 0; j < dim-1; ++j )
│ │ │ │ +
888 jt[ dim-1 ].axpy( dfcxn*x[ j ], jt[ j ] );
│ │ │ │ +
889 }
│ │ │ │ +
890 }
│ │ │ │ +
891 }
│ │ │ │ +
892
│ │ │ │ +
893 template< class ct, int mydim, int cdim, class Traits >
│ │ │ │ +
894 template< bool add, int rows, class CornerIterator >
│ │ │ │ + │ │ │ │ +
896 ::jacobianTransposed ( TopologyId, std::integral_constant< int, 0 >,
│ │ │ │ +
897 CornerIterator &cit, const ctype &, const LocalCoordinate &,
│ │ │ │ +
898 const ctype &, FieldMatrix< ctype, rows, cdim > & )
│ │ │ │ +
899 {
│ │ │ │ +
900 ++cit;
│ │ │ │ +
901 }
│ │ │ │ +
902
│ │ │ │ +
903
│ │ │ │ +
904
│ │ │ │ +
905 template< class ct, int mydim, int cdim, class Traits >
│ │ │ │ +
906 template< int dim, class CornerIterator >
│ │ │ │ + │ │ │ │ +
908 ::affine ( TopologyId topologyId, std::integral_constant< int, dim >, CornerIterator &cit, JacobianTransposed &jt )
│ │ │ │ +
909 {
│ │ │ │ +
910 const GlobalCoordinate &orgBottom = *cit;
│ │ │ │ +
911 if( !affine( topologyId, std::integral_constant< int, dim-1 >(), cit, jt ) )
│ │ │ │ +
912 return false;
│ │ │ │ +
913 const GlobalCoordinate &orgTop = *cit;
│ │ │ │ +
914
│ │ │ │ +
915 if( Impl::isPrism( toUnsignedInt(topologyId), mydimension, mydimension-dim ) )
│ │ │ │ +
916 {
│ │ │ │ +
917 JacobianTransposed jtTop;
│ │ │ │ +
918 if( !affine( topologyId, std::integral_constant< int, dim-1 >(), cit, jtTop ) )
│ │ │ │ +
919 return false;
│ │ │ │ +
920
│ │ │ │ +
921 // check whether both jacobians are identical
│ │ │ │ +
922 ctype norm( 0 );
│ │ │ │ +
923 for( int i = 0; i < dim-1; ++i )
│ │ │ │ +
924 norm += (jtTop[ i ] - jt[ i ]).two_norm2();
│ │ │ │ +
925 if( norm >= Traits::tolerance() )
│ │ │ │ +
926 return false;
│ │ │ │ +
927 }
│ │ │ │ +
928 else
│ │ │ │ +
929 ++cit;
│ │ │ │ +
930 jt[ dim-1 ] = orgTop - orgBottom;
│ │ │ │ +
931 return true;
│ │ │ │ +
932 }
│ │ │ │ +
933
│ │ │ │ +
934 template< class ct, int mydim, int cdim, class Traits >
│ │ │ │ +
935 template< class CornerIterator >
│ │ │ │ + │ │ │ │ +
937 ::affine ( TopologyId, std::integral_constant< int, 0 >, CornerIterator &cit, JacobianTransposed & )
│ │ │ │ +
938 {
│ │ │ │ +
939 ++cit;
│ │ │ │ +
940 return true;
│ │ │ │ +
941 }
│ │ │ │ +
942
│ │ │ │ +
943} // namespace Dune
│ │ │ │ +
944
│ │ │ │ +
945#endif // #ifndef DUNE_GEOMETRY_MULTILINEARGEOMETRY_HH
│ │ │ │ + │ │ │ │ +
An implementation of the Geometry interface for affine geometries.
│ │ │ │ +
A unique label for each type of element that can occur in a grid.
│ │ │ │
Definition: affinegeometry.hh:21
│ │ │ │ -
GeometryType geometryTypeFromVertexCount(unsigned int dim, unsigned int vertices)
Utitlity function to construct the correct geometry type given the dimension and the number of vertic...
Definition: typefromvertexcount.hh:17
│ │ │ │ +
Class providing access to the singletons of the reference elements.
Definition: referenceelements.hh:170
│ │ │ │ +
typename Container::ReferenceElement ReferenceElement
The reference element type.
Definition: referenceelements.hh:188
│ │ │ │ +
default traits class for MultiLinearGeometry
Definition: multilineargeometry.hh:39
│ │ │ │ +
Impl::FieldMatrixHelper< ct > MatrixHelper
helper structure containing some matrix routines
Definition: multilineargeometry.hh:58
│ │ │ │ +
static ct tolerance()
tolerance to numerical algorithms
Definition: multilineargeometry.hh:61
│ │ │ │ +
template specifying the storage for the corners
Definition: multilineargeometry.hh:129
│ │ │ │ +
std::vector< FieldVector< ct, cdim > > Type
Definition: multilineargeometry.hh:130
│ │ │ │ +
will there be only one geometry type for a dimension?
Definition: multilineargeometry.hh:148
│ │ │ │ +
static const unsigned int topologyId
Definition: multilineargeometry.hh:150
│ │ │ │ +
static const bool v
Definition: multilineargeometry.hh:149
│ │ │ │ +
generic geometry implementation based on corner coordinates
Definition: multilineargeometry.hh:181
│ │ │ │ +
static void global(TopologyId topologyId, std::integral_constant< int, dim >, CornerIterator &cit, const ctype &df, const LocalCoordinate &x, const ctype &rf, GlobalCoordinate &y)
Definition: multilineargeometry.hh:749
│ │ │ │ +
static const int mydimension
geometry dimension
Definition: multilineargeometry.hh:189
│ │ │ │ +
Dune::GeometryType type() const
obtain the name of the reference element
Definition: multilineargeometry.hh:269
│ │ │ │ +
Traits::MatrixHelper MatrixHelper
Definition: multilineargeometry.hh:225
│ │ │ │ +
FieldVector< ctype, coorddimension > GlobalCoordinate
type of global coordinates
Definition: multilineargeometry.hh:196
│ │ │ │ +
static void jacobianTransposed(TopologyId topologyId, std::integral_constant< int, 0 >, CornerIterator &cit, const ctype &df, const LocalCoordinate &x, const ctype &rf, FieldMatrix< ctype, rows, cdim > &jt)
Definition: multilineargeometry.hh:896
│ │ │ │ +
JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const
obtain the transposed of the Jacobian
Definition: multilineargeometry.hh:377
│ │ │ │ +
ReferenceElement refElement() const
Definition: multilineargeometry.hh:425
│ │ │ │ +
GlobalCoordinate global(const LocalCoordinate &local) const
evaluate the mapping
Definition: multilineargeometry.hh:290
│ │ │ │ +
GlobalCoordinate center() const
obtain the centroid of the mapping's image
Definition: multilineargeometry.hh:282
│ │ │ │ +
GlobalCoordinate corner(int i) const
obtain coordinates of the i-th corner
Definition: multilineargeometry.hh:275
│ │ │ │ +
Dune::ReferenceElements< ctype, mydimension > ReferenceElements
Definition: multilineargeometry.hh:214
│ │ │ │ +
ct ctype
coordinate type
Definition: multilineargeometry.hh:186
│ │ │ │ +
static void jacobianTransposed(TopologyId topologyId, std::integral_constant< int, dim >, CornerIterator &cit, const ctype &df, const LocalCoordinate &x, const ctype &rf, FieldMatrix< ctype, rows, cdim > &jt)
Definition: multilineargeometry.hh:794
│ │ │ │ +
static const int coorddimension
coordinate dimension
Definition: multilineargeometry.hh:191
│ │ │ │ +
int corners() const
obtain number of corners of the corresponding reference element
Definition: multilineargeometry.hh:272
│ │ │ │ +
TopologyId topologyId() const
Definition: multilineargeometry.hh:430
│ │ │ │ +
friend ReferenceElement referenceElement(const MultiLinearGeometry &geometry)
Definition: multilineargeometry.hh:395
│ │ │ │ +
static void global(TopologyId topologyId, std::integral_constant< int, 0 >, CornerIterator &cit, const ctype &df, const LocalCoordinate &x, const ctype &rf, GlobalCoordinate &y)
Definition: multilineargeometry.hh:780
│ │ │ │ +
Volume volume() const
obtain the volume of the mapping's image
Definition: multilineargeometry.hh:363
│ │ │ │ +
FieldVector< ctype, mydimension > LocalCoordinate
type of local coordinates
Definition: multilineargeometry.hh:194
│ │ │ │ +
MultiLinearGeometry(const ReferenceElement &refElement, const Corners &corners)
constructor
Definition: multilineargeometry.hh:239
│ │ │ │ +
static bool affine(TopologyId topologyId, std::integral_constant< int, 0 >, CornerIterator &cit, JacobianTransposed &jt)
Definition: multilineargeometry.hh:937
│ │ │ │ +
std::conditional< hasSingleGeometryType, std::integral_constant< unsignedint, Traits::templatehasSingleGeometryType< mydimension >::topologyId >, unsignedint >::type TopologyId
Definition: multilineargeometry.hh:226
│ │ │ │ +
ctype Volume
type of volume
Definition: multilineargeometry.hh:198
│ │ │ │ +
static bool affine(TopologyId topologyId, std::integral_constant< int, dim >, CornerIterator &cit, JacobianTransposed &jt)
Definition: multilineargeometry.hh:908
│ │ │ │ +
JacobianInverse jacobianInverse(const LocalCoordinate &local) const
Obtain the Jacobian's inverse.
Definition: multilineargeometry.hh:418
│ │ │ │ +
MultiLinearGeometry(Dune::GeometryType gt, const Corners &corners)
constructor
Definition: multilineargeometry.hh:255
│ │ │ │ +
FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed
type of jacobian transposed
Definition: multilineargeometry.hh:201
│ │ │ │ +
ReferenceElements::ReferenceElement ReferenceElement
type of reference element
Definition: multilineargeometry.hh:219
│ │ │ │ +
JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate &local) const
obtain the transposed of the Jacobian's inverse
Definition: multilineargeometry.hh:738
│ │ │ │ +
FieldMatrix< ctype, coorddimension, mydimension > Jacobian
Type for the Jacobian matrix.
Definition: multilineargeometry.hh:207
│ │ │ │ +
bool affine() const
is this mapping affine?
Definition: multilineargeometry.hh:262
│ │ │ │ +
FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse
Type for the inverse Jacobian matrix.
Definition: multilineargeometry.hh:210
│ │ │ │ +
bool affine(JacobianTransposed &jacobianT) const
Definition: multilineargeometry.hh:458
│ │ │ │ +
Volume integrationElement(const LocalCoordinate &local) const
obtain the integration element
Definition: multilineargeometry.hh:350
│ │ │ │ +
Jacobian jacobian(const LocalCoordinate &local) const
Obtain the Jacobian.
Definition: multilineargeometry.hh:407
│ │ │ │ +
Definition: multilineargeometry.hh:488
│ │ │ │ +
void setup(const JacobianTransposed &jt)
Definition: multilineargeometry.hh:492
│ │ │ │ +
ctype det() const
Definition: multilineargeometry.hh:502
│ │ │ │ +
ctype detInv() const
Definition: multilineargeometry.hh:503
│ │ │ │ +
void setupDeterminant(const JacobianTransposed &jt)
Definition: multilineargeometry.hh:497
│ │ │ │ +
Implement a MultiLinearGeometry with additional caching.
Definition: multilineargeometry.hh:526
│ │ │ │ +
GlobalCoordinate global(const LocalCoordinate &local) const
evaluate the mapping
Definition: multilineargeometry.hh:580
│ │ │ │ +
Base::ReferenceElement ReferenceElement
Definition: multilineargeometry.hh:534
│ │ │ │ +
bool affine() const
is this mapping affine?
Definition: multilineargeometry.hh:567
│ │ │ │ +
CachedMultiLinearGeometry(const ReferenceElement &referenceElement, const CornerStorage &cornerStorage)
Definition: multilineargeometry.hh:551
│ │ │ │ +
ReferenceElement refElement() const
Definition: multilineargeometry.hh:425
│ │ │ │ +
Base::MatrixHelper MatrixHelper
Definition: multilineargeometry.hh:531
│ │ │ │ +
Base::LocalCoordinate LocalCoordinate
Definition: multilineargeometry.hh:541
│ │ │ │ +
JacobianInverse jacobianInverse(const LocalCoordinate &local) const
Obtain the Jacobian's inverse.
Definition: multilineargeometry.hh:713
│ │ │ │ +
JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const
obtain the transposed of the Jacobian
Definition: multilineargeometry.hh:666
│ │ │ │ +
GlobalCoordinate corner(int i) const
obtain coordinates of the i-th corner
Definition: multilineargeometry.hh:275
│ │ │ │ +
Volume volume() const
obtain the volume of the mapping's image
Definition: multilineargeometry.hh:649
│ │ │ │ +
CachedMultiLinearGeometry(Dune::GeometryType gt, const CornerStorage &cornerStorage)
Definition: multilineargeometry.hh:559
│ │ │ │ +
ctype integrationElement(const LocalCoordinate &local) const
obtain the integration element
Definition: multilineargeometry.hh:633
│ │ │ │ +
Base::ctype ctype
Definition: multilineargeometry.hh:536
│ │ │ │ +
Jacobian jacobian(const LocalCoordinate &local) const
Obtain the Jacobian.
Definition: multilineargeometry.hh:702
│ │ │ │ +
Base::JacobianInverseTransposed JacobianInverseTransposed
Definition: multilineargeometry.hh:546
│ │ │ │ +
Base::JacobianTransposed JacobianTransposed
Definition: multilineargeometry.hh:545
│ │ │ │ +
Base::JacobianInverse JacobianInverse
Definition: multilineargeometry.hh:548
│ │ │ │ +
Base::Jacobian Jacobian
Definition: multilineargeometry.hh:547
│ │ │ │ +
Base::Volume Volume
Definition: multilineargeometry.hh:543
│ │ │ │ +
Base::GlobalCoordinate GlobalCoordinate
Definition: multilineargeometry.hh:542
│ │ │ │ +
GlobalCoordinate center() const
obtain the centroid of the mapping's image
Definition: multilineargeometry.hh:572
│ │ │ │ +
JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate &local) const
obtain the transposed of the Jacobian's inverse
Definition: multilineargeometry.hh:680
│ │ │ │
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:125
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,113 +4,1016 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ - * utility │ │ │ │ │ -typefromvertexcount.hh │ │ │ │ │ +multilineargeometry.hh │ │ │ │ │ Go_to_the_documentation_of_this_file. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ - 5#ifndef DUNE_GEOMETRY_TYPE_FROM_VERTEX_COUNT_HH │ │ │ │ │ - 6#define DUNE_GEOMETRY_TYPE_FROM_VERTEX_COUNT_HH │ │ │ │ │ + 5#ifndef DUNE_GEOMETRY_MULTILINEARGEOMETRY_HH │ │ │ │ │ + 6#define DUNE_GEOMETRY_MULTILINEARGEOMETRY_HH │ │ │ │ │ 7 │ │ │ │ │ - 8#include │ │ │ │ │ - 9 │ │ │ │ │ - 10namespace Dune { │ │ │ │ │ - 11 │ │ │ │ │ - 16 inline │ │ │ │ │ -17 GeometryType geometryTypeFromVertexCount(unsigned int dim, unsigned int │ │ │ │ │ -vertices) │ │ │ │ │ - 18 { │ │ │ │ │ - 19 switch (dim) │ │ │ │ │ - 20 { │ │ │ │ │ - 21 case 0 : │ │ │ │ │ - 22 return GeometryTypes::vertex; │ │ │ │ │ - 23 case 1 : │ │ │ │ │ - 24 return GeometryTypes::line; │ │ │ │ │ - 25 case 2 : │ │ │ │ │ - 26 switch (vertices) { │ │ │ │ │ - 27 case 3 : │ │ │ │ │ - 28 return GeometryTypes::triangle; │ │ │ │ │ - 29 case 4 : │ │ │ │ │ - 30 return GeometryTypes::quadrilateral; │ │ │ │ │ - 31 default : │ │ │ │ │ - 32 DUNE_THROW(NotImplemented, "2d elements with " << vertices << " corners are │ │ │ │ │ -not supported!"); │ │ │ │ │ - 33 } │ │ │ │ │ - 34 case 3 : │ │ │ │ │ - 35 switch (vertices) { │ │ │ │ │ - 36 case 4 : │ │ │ │ │ - 37 return GeometryTypes::tetrahedron; │ │ │ │ │ - 38 case 5 : │ │ │ │ │ - 39 return GeometryTypes::pyramid; │ │ │ │ │ - 40 case 6 : │ │ │ │ │ - 41 return GeometryTypes::prism; │ │ │ │ │ - 42 case 8 : │ │ │ │ │ - 43 return GeometryTypes::hexahedron; │ │ │ │ │ - 44 default : │ │ │ │ │ - 45 DUNE_THROW(NotImplemented, "3d elements with " << vertices << " corners are │ │ │ │ │ -not supported!"); │ │ │ │ │ - 46 } │ │ │ │ │ - 47 default : │ │ │ │ │ - 48 DUNE_THROW(NotImplemented, "geometryTypeFromVertexCount works only up to │ │ │ │ │ -dim=3"); │ │ │ │ │ - 49 } │ │ │ │ │ - 50 } │ │ │ │ │ - 51 │ │ │ │ │ - 52} │ │ │ │ │ - 53 │ │ │ │ │ - 54#endif // DUNE_GEOMETRY_TYPE_FROM_VERTEX_COUNT_HH │ │ │ │ │ + 8#include │ │ │ │ │ + 9#include │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12#include │ │ │ │ │ + 13 │ │ │ │ │ + 14#include │ │ │ │ │ + 15#include │ │ │ │ │ + 16#include │ │ │ │ │ + 17 │ │ │ │ │ + 18#include │ │ │ │ │ + 19#include │ │ │ │ │ + 20#include │ │ │ │ │ + 21 │ │ │ │ │ + 22namespace Dune │ │ │ │ │ + 23{ │ │ │ │ │ + 24 │ │ │ │ │ + 25 // MultiLinearGeometryTraits │ │ │ │ │ + 26 // ------------------------- │ │ │ │ │ + 27 │ │ │ │ │ + 37 template< class ct > │ │ │ │ │ +38 struct MultiLinearGeometryTraits │ │ │ │ │ + 39 { │ │ │ │ │ +58 typedef Impl::FieldMatrixHelper< ct > MatrixHelper; │ │ │ │ │ + 59 │ │ │ │ │ +61 static ct tolerance () { return ct( 16 ) * std::numeric_limits< ct >:: │ │ │ │ │ +epsilon(); } │ │ │ │ │ + 62 │ │ │ │ │ + 127 template< int mydim, int cdim > │ │ │ │ │ +128 struct CornerStorage │ │ │ │ │ + 129 { │ │ │ │ │ +130 typedef std::vector< FieldVector< ct, cdim > > Type; │ │ │ │ │ + 131 }; │ │ │ │ │ + 132 │ │ │ │ │ + 146 template< int dim > │ │ │ │ │ +147 struct hasSingleGeometryType │ │ │ │ │ + 148 { │ │ │ │ │ +149 static const bool v = false; │ │ │ │ │ +150 static const unsigned int topologyId = ~0u; │ │ │ │ │ + 151 }; │ │ │ │ │ + 152 }; │ │ │ │ │ + 153 │ │ │ │ │ + 154 │ │ │ │ │ + 155 │ │ │ │ │ + 156 // MultiLinearGeometry │ │ │ │ │ + 157 // ------------------- │ │ │ │ │ + 158 │ │ │ │ │ + 179 template< class ct, int mydim, int cdim, class Traits = │ │ │ │ │ +MultiLinearGeometryTraits< ct > > │ │ │ │ │ +180 class MultiLinearGeometry │ │ │ │ │ + 181 { │ │ │ │ │ + 182 typedef MultiLinearGeometry<_ct,_mydim,_cdim,_Traits_> This; │ │ │ │ │ + 183 │ │ │ │ │ + 184 public: │ │ │ │ │ +186 typedef ct ctype; │ │ │ │ │ + 187 │ │ │ │ │ +189 static const int mydimension= mydim; │ │ │ │ │ +191 static const int coorddimension = cdim; │ │ │ │ │ + 192 │ │ │ │ │ +194 typedef FieldVector< ctype, mydimension > LocalCoordinate; │ │ │ │ │ +196 typedef FieldVector< ctype, coorddimension > GlobalCoordinate; │ │ │ │ │ +198 typedef ctype Volume; │ │ │ │ │ + 199 │ │ │ │ │ +201 typedef FieldMatrix< ctype, mydimension, coorddimension > │ │ │ │ │ +JacobianTransposed; │ │ │ │ │ + 202 │ │ │ │ │ + 204 class JacobianInverseTransposed; │ │ │ │ │ + 205 │ │ │ │ │ +207 typedef FieldMatrix< ctype, coorddimension, mydimension > Jacobian; │ │ │ │ │ + 208 │ │ │ │ │ +210 typedef FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse; │ │ │ │ │ + 211 │ │ │ │ │ + 212 protected: │ │ │ │ │ + 213 │ │ │ │ │ +214 typedef Dune::ReferenceElements<_ctype,_mydimension_> ReferenceElements; │ │ │ │ │ + 215 │ │ │ │ │ + 216 public: │ │ │ │ │ + 217 │ │ │ │ │ +219 typedef typename ReferenceElements::ReferenceElement ReferenceElement; │ │ │ │ │ + 220 │ │ │ │ │ + 221 private: │ │ │ │ │ + 222 static const bool hasSingleGeometryType = Traits::template │ │ │ │ │ +hasSingleGeometryType< mydimension >::v; │ │ │ │ │ + 223 │ │ │ │ │ + 224 protected: │ │ │ │ │ +225 typedef typename Traits::MatrixHelper MatrixHelper; │ │ │ │ │ +226 typedef typename std::conditional< hasSingleGeometryType, std:: │ │ │ │ │ +integral_constant< unsigned int, Traits::template hasSingleGeometryType< │ │ │ │ │ +mydimension >::topologyId >, unsigned int >::type TopologyId; │ │ │ │ │ + 227 │ │ │ │ │ + 228 public: │ │ │ │ │ + 238 template< class Corners > │ │ │ │ │ +239 MultiLinearGeometry ( const ReferenceElement &refElement, │ │ │ │ │ + 240 const Corners &corners ) │ │ │ │ │ + 241 : refElement_( refElement ), │ │ │ │ │ + 242 corners_( corners ) │ │ │ │ │ + 243 {} │ │ │ │ │ + 244 │ │ │ │ │ + 254 template< class Corners > │ │ │ │ │ +255 MultiLinearGeometry ( Dune::GeometryType gt, │ │ │ │ │ + 256 const Corners &corners ) │ │ │ │ │ + 257 : refElement_( ReferenceElements::general( gt ) ), │ │ │ │ │ + 258 corners_( corners ) │ │ │ │ │ + 259 {} │ │ │ │ │ + 260 │ │ │ │ │ +262 bool affine () const │ │ │ │ │ + 263 { │ │ │ │ │ + 264 JacobianTransposed jt; │ │ │ │ │ + 265 return affine( jt ); │ │ │ │ │ + 266 } │ │ │ │ │ + 267 │ │ │ │ │ +269 Dune::GeometryType type () const { return GeometryType( toUnsignedInt │ │ │ │ │ +(topologyId()), mydimension ); } │ │ │ │ │ + 270 │ │ │ │ │ +272 int corners () const { return refElement().size( mydimension ); } │ │ │ │ │ + 273 │ │ │ │ │ +275 GlobalCoordinate corner ( int i ) const │ │ │ │ │ + 276 { │ │ │ │ │ + 277 assert( (i >= 0) && (i < corners()) ); │ │ │ │ │ + 278 return std::cref(corners_).get()[ i ]; │ │ │ │ │ + 279 } │ │ │ │ │ + 280 │ │ │ │ │ +282 GlobalCoordinate center () const { return global( refElement().position( 0, │ │ │ │ │ +0 ) ); } │ │ │ │ │ + 283 │ │ │ │ │ +290 GlobalCoordinate global ( const LocalCoordinate &local ) const │ │ │ │ │ + 291 { │ │ │ │ │ + 292 using std::begin; │ │ │ │ │ + 293 │ │ │ │ │ + 294 auto cit = begin(std::cref(corners_).get()); │ │ │ │ │ + 295 GlobalCoordinate y; │ │ │ │ │ + 296 global< false >( topologyId(), std::integral_constant< int, mydimension > │ │ │ │ │ +(), cit, ctype( 1 ), local, ctype( 1 ), y ); │ │ │ │ │ + 297 return y; │ │ │ │ │ + 298 } │ │ │ │ │ + 299 │ │ │ │ │ +312 LocalCoordinate local ( const GlobalCoordinate &globalCoord ) const │ │ │ │ │ + 313 { │ │ │ │ │ + 314 const ctype tolerance = Traits::tolerance(); │ │ │ │ │ + 315 LocalCoordinate x = refElement().position( 0, 0 ); │ │ │ │ │ + 316 LocalCoordinate dx; │ │ │ │ │ + 317 const bool affineMapping = this->affine(); │ │ │ │ │ + 318 do │ │ │ │ │ + 319 { │ │ │ │ │ + 320 // Newton's method: DF^n dx^n = F^n, x^{n+1} -= dx^n │ │ │ │ │ + 321 const GlobalCoordinate dglobal = (*this).global( x ) - globalCoord; │ │ │ │ │ + 322 const bool invertible = │ │ │ │ │ + 323 MatrixHelper::template xTRightInvA< mydimension, coorddimension > │ │ │ │ │ +( jacobianTransposed( x ), dglobal, dx ); │ │ │ │ │ + 324 if( ! invertible ) │ │ │ │ │ + 325 return LocalCoordinate( std::numeric_limits< ctype > :: max() ); │ │ │ │ │ + 326 │ │ │ │ │ + 327 // update x with correction │ │ │ │ │ + 328 x -= dx; │ │ │ │ │ + 329 │ │ │ │ │ + 330 // for affine mappings only one iteration is needed │ │ │ │ │ + 331 if ( affineMapping ) break; │ │ │ │ │ + 332 } while( dx.two_norm2() > tolerance ); │ │ │ │ │ + 333 return x; │ │ │ │ │ + 334 } │ │ │ │ │ + 335 │ │ │ │ │ +350 Volume integrationElement ( const LocalCoordinate &local ) const │ │ │ │ │ + 351 { │ │ │ │ │ + 352 return MatrixHelper::template sqrtDetAAT< mydimension, coorddimension > │ │ │ │ │ +( jacobianTransposed( local ) ); │ │ │ │ │ + 353 } │ │ │ │ │ + 354 │ │ │ │ │ +363 Volume volume () const │ │ │ │ │ + 364 { │ │ │ │ │ + 365 return integrationElement( refElement().position( 0, 0 ) ) * refElement │ │ │ │ │ +().volume(); │ │ │ │ │ + 366 } │ │ │ │ │ + 367 │ │ │ │ │ +377 JacobianTransposed jacobianTransposed ( const LocalCoordinate &local ) │ │ │ │ │ +const │ │ │ │ │ + 378 { │ │ │ │ │ + 379 using std::begin; │ │ │ │ │ + 380 │ │ │ │ │ + 381 JacobianTransposed jt; │ │ │ │ │ + 382 auto cit = begin(std::cref(corners_).get()); │ │ │ │ │ + 383 jacobianTransposed< false >( topologyId(), std::integral_constant< int, │ │ │ │ │ +mydimension >(), cit, ctype( 1 ), local, ctype( 1 ), jt ); │ │ │ │ │ + 384 return jt; │ │ │ │ │ + 385 } │ │ │ │ │ + 386 │ │ │ │ │ +393 JacobianInverseTransposed jacobianInverseTransposed ( const LocalCoordinate │ │ │ │ │ +&local ) const; │ │ │ │ │ + 394 │ │ │ │ │ +395 friend ReferenceElement referenceElement ( const MultiLinearGeometry │ │ │ │ │ +&geometry ) │ │ │ │ │ + 396 { │ │ │ │ │ + 397 return geometry.refElement(); │ │ │ │ │ + 398 } │ │ │ │ │ + 399 │ │ │ │ │ + 400 │ │ │ │ │ +407 Jacobian jacobian (const LocalCoordinate &local) const │ │ │ │ │ + 408 { │ │ │ │ │ + 409 return jacobianTransposed(local).transposed(); │ │ │ │ │ + 410 } │ │ │ │ │ + 411 │ │ │ │ │ +418 JacobianInverse jacobianInverse (const LocalCoordinate &local) const │ │ │ │ │ + 419 { │ │ │ │ │ + 420 return jacobianInverseTransposed(local).transposed(); │ │ │ │ │ + 421 } │ │ │ │ │ + 422 │ │ │ │ │ + 423 protected: │ │ │ │ │ + 424 │ │ │ │ │ +425 ReferenceElement refElement () const │ │ │ │ │ + 426 { │ │ │ │ │ + 427 return refElement_; │ │ │ │ │ + 428 } │ │ │ │ │ + 429 │ │ │ │ │ +430 TopologyId topologyId () const │ │ │ │ │ + 431 { │ │ │ │ │ + 432 return topologyId( std::integral_constant< bool, hasSingleGeometryType >() │ │ │ │ │ +); │ │ │ │ │ + 433 } │ │ │ │ │ + 434 │ │ │ │ │ + 435 template< bool add, int dim, class CornerIterator > │ │ │ │ │ +436 static void global ( TopologyId topologyId, std::integral_constant< int, │ │ │ │ │ +dim >, │ │ │ │ │ + 437 CornerIterator &cit, const ctype &df, const LocalCoordinate &x, │ │ │ │ │ + 438 const ctype &rf, GlobalCoordinate &y ); │ │ │ │ │ + 439 template< bool add, class CornerIterator > │ │ │ │ │ +440 static void global ( TopologyId topologyId, std::integral_constant< int, 0 │ │ │ │ │ +>, │ │ │ │ │ + 441 CornerIterator &cit, const ctype &df, const LocalCoordinate &x, │ │ │ │ │ + 442 const ctype &rf, GlobalCoordinate &y ); │ │ │ │ │ + 443 │ │ │ │ │ + 444 template< bool add, int rows, int dim, class CornerIterator > │ │ │ │ │ +445 static void jacobianTransposed ( TopologyId topologyId, std:: │ │ │ │ │ +integral_constant< int, dim >, │ │ │ │ │ + 446 CornerIterator &cit, const ctype &df, const LocalCoordinate &x, │ │ │ │ │ + 447 const ctype &rf, FieldMatrix< ctype, rows, cdim > &jt ); │ │ │ │ │ + 448 template< bool add, int rows, class CornerIterator > │ │ │ │ │ +449 static void jacobianTransposed ( TopologyId topologyId, std:: │ │ │ │ │ +integral_constant< int, 0 >, │ │ │ │ │ + 450 CornerIterator &cit, const ctype &df, const LocalCoordinate &x, │ │ │ │ │ + 451 const ctype &rf, FieldMatrix< ctype, rows, cdim > &jt ); │ │ │ │ │ + 452 │ │ │ │ │ + 453 template< int dim, class CornerIterator > │ │ │ │ │ +454 static bool affine ( TopologyId topologyId, std::integral_constant< int, │ │ │ │ │ +dim >, CornerIterator &cit, JacobianTransposed &jt ); │ │ │ │ │ + 455 template< class CornerIterator > │ │ │ │ │ +456 static bool affine ( TopologyId topologyId, std::integral_constant< int, 0 │ │ │ │ │ +>, CornerIterator &cit, JacobianTransposed &jt ); │ │ │ │ │ + 457 │ │ │ │ │ +458 bool affine ( JacobianTransposed &jacobianT ) const │ │ │ │ │ + 459 { │ │ │ │ │ + 460 using std::begin; │ │ │ │ │ + 461 │ │ │ │ │ + 462 auto cit = begin(std::cref(corners_).get()); │ │ │ │ │ + 463 return affine( topologyId(), std::integral_constant< int, mydimension >(), │ │ │ │ │ +cit, jacobianT ); │ │ │ │ │ + 464 } │ │ │ │ │ + 465 │ │ │ │ │ + 466 private: │ │ │ │ │ + 467 // The following methods are needed to convert the return type of │ │ │ │ │ +topologyId to │ │ │ │ │ + 468 // unsigned int with g++-4.4. It has problems casting integral_constant to │ │ │ │ │ +the │ │ │ │ │ + 469 // integral type. │ │ │ │ │ + 470 static unsigned int toUnsignedInt(unsigned int i) { return i; } │ │ │ │ │ + 471 template │ │ │ │ │ + 472 static unsigned int toUnsignedInt(std::integral_constant ) │ │ │ │ │ +{ return v; } │ │ │ │ │ + 473 TopologyId topologyId ( std::integral_constant< bool, true > ) const │ │ │ │ │ +{ return TopologyId(); } │ │ │ │ │ + 474 unsigned int topologyId ( std::integral_constant< bool, false > ) const │ │ │ │ │ +{ return refElement().type().id(); } │ │ │ │ │ + 475 │ │ │ │ │ + 476 ReferenceElement refElement_; │ │ │ │ │ + 477 typename Traits::template CornerStorage< mydimension, coorddimension >:: │ │ │ │ │ +Type corners_; │ │ │ │ │ + 478 }; │ │ │ │ │ + 479 │ │ │ │ │ + 480 │ │ │ │ │ + 481 │ │ │ │ │ + 482 // MultiLinearGeometry::JacobianInverseTransposed │ │ │ │ │ + 483 // ---------------------------------------------- │ │ │ │ │ + 484 │ │ │ │ │ + 485 template< class ct, int mydim, int cdim, class Traits > │ │ │ │ │ +486 class MultiLinearGeometry< ct, mydim, cdim, Traits >:: │ │ │ │ │ +JacobianInverseTransposed │ │ │ │ │ + 487 : public FieldMatrix< ctype, coorddimension, mydimension > │ │ │ │ │ + 488 { │ │ │ │ │ + 489 typedef FieldMatrix< ctype, coorddimension, mydimension > Base; │ │ │ │ │ + 490 │ │ │ │ │ + 491 public: │ │ │ │ │ +492 void setup ( const JacobianTransposed &jt ) │ │ │ │ │ + 493 { │ │ │ │ │ + 494 detInv_ = MatrixHelper::template rightInvA< mydimension, coorddimension > │ │ │ │ │ +( jt, static_cast< Base & >( *this ) ); │ │ │ │ │ + 495 } │ │ │ │ │ + 496 │ │ │ │ │ +497 void setupDeterminant ( const JacobianTransposed &jt ) │ │ │ │ │ + 498 { │ │ │ │ │ + 499 detInv_ = MatrixHelper::template sqrtDetAAT< mydimension, coorddimension > │ │ │ │ │ +( jt ); │ │ │ │ │ + 500 } │ │ │ │ │ + 501 │ │ │ │ │ +502 ctype det () const { return ctype( 1 ) / detInv_; } │ │ │ │ │ +503 ctype detInv () const { return detInv_; } │ │ │ │ │ + 504 │ │ │ │ │ + 505 private: │ │ │ │ │ + 506 ctype detInv_; │ │ │ │ │ + 507 }; │ │ │ │ │ + 508 │ │ │ │ │ + 509 │ │ │ │ │ + 510 │ │ │ │ │ + 523 template< class ct, int mydim, int cdim, class Traits = │ │ │ │ │ +MultiLinearGeometryTraits< ct > > │ │ │ │ │ +524 class CachedMultiLinearGeometry │ │ │ │ │ + 525 : public MultiLinearGeometry< ct, mydim, cdim, Traits > │ │ │ │ │ + 526 { │ │ │ │ │ + 527 typedef CachedMultiLinearGeometry<_ct,_mydim,_cdim,_Traits_> This; │ │ │ │ │ + 528 typedef MultiLinearGeometry<_ct,_mydim,_cdim,_Traits_> Base; │ │ │ │ │ + 529 │ │ │ │ │ + 530 protected: │ │ │ │ │ +531 typedef typename Base::MatrixHelper MatrixHelper; │ │ │ │ │ + 532 │ │ │ │ │ + 533 public: │ │ │ │ │ +534 typedef typename Base::ReferenceElement ReferenceElement; │ │ │ │ │ + 535 │ │ │ │ │ +536 typedef typename Base::ctype ctype; │ │ │ │ │ + 537 │ │ │ │ │ + 538 using Base::mydimension; │ │ │ │ │ + 539 using Base::coorddimension; │ │ │ │ │ + 540 │ │ │ │ │ +541 typedef typename Base::LocalCoordinate LocalCoordinate; │ │ │ │ │ +542 typedef typename Base::GlobalCoordinate GlobalCoordinate; │ │ │ │ │ +543 typedef typename Base::Volume Volume; │ │ │ │ │ + 544 │ │ │ │ │ +545 typedef typename Base::JacobianTransposed JacobianTransposed; │ │ │ │ │ +546 typedef typename Base::JacobianInverseTransposed JacobianInverseTransposed; │ │ │ │ │ +547 typedef typename Base::Jacobian Jacobian; │ │ │ │ │ +548 typedef typename Base::JacobianInverse JacobianInverse; │ │ │ │ │ + 549 │ │ │ │ │ + 550 template< class CornerStorage > │ │ │ │ │ +551 CachedMultiLinearGeometry ( const ReferenceElement &referenceElement, const │ │ │ │ │ +CornerStorage &cornerStorage ) │ │ │ │ │ + 552 : Base( referenceElement, cornerStorage ), │ │ │ │ │ + 553 affine_( Base::affine( jacobianTransposed_ ) ), │ │ │ │ │ + 554 jacobianInverseTransposedComputed_( false ), │ │ │ │ │ + 555 integrationElementComputed_( false ) │ │ │ │ │ + 556 {} │ │ │ │ │ + 557 │ │ │ │ │ + 558 template< class CornerStorage > │ │ │ │ │ +559 CachedMultiLinearGeometry ( Dune::GeometryType gt, const CornerStorage │ │ │ │ │ +&cornerStorage ) │ │ │ │ │ + 560 : Base( gt, cornerStorage ), │ │ │ │ │ + 561 affine_( Base::affine( jacobianTransposed_ ) ), │ │ │ │ │ + 562 jacobianInverseTransposedComputed_( false ), │ │ │ │ │ + 563 integrationElementComputed_( false ) │ │ │ │ │ + 564 {} │ │ │ │ │ + 565 │ │ │ │ │ +567 bool affine () const { return affine_; } │ │ │ │ │ + 568 │ │ │ │ │ + 569 using Base::corner; │ │ │ │ │ + 570 │ │ │ │ │ +572 GlobalCoordinate center () const { return global( refElement().position( 0, │ │ │ │ │ +0 ) ); } │ │ │ │ │ + 573 │ │ │ │ │ +580 GlobalCoordinate global ( const LocalCoordinate &local ) const │ │ │ │ │ + 581 { │ │ │ │ │ + 582 if( affine() ) │ │ │ │ │ + 583 { │ │ │ │ │ + 584 GlobalCoordinate global( corner( 0 ) ); │ │ │ │ │ + 585 jacobianTransposed_.umtv( local, global ); │ │ │ │ │ + 586 return global; │ │ │ │ │ + 587 } │ │ │ │ │ + 588 else │ │ │ │ │ + 589 return Base::global( local ); │ │ │ │ │ + 590 } │ │ │ │ │ + 591 │ │ │ │ │ +604 LocalCoordinate local ( const GlobalCoordinate &global ) const │ │ │ │ │ + 605 { │ │ │ │ │ + 606 if( affine() ) │ │ │ │ │ + 607 { │ │ │ │ │ + 608 LocalCoordinate local; │ │ │ │ │ + 609 if( jacobianInverseTransposedComputed_ ) │ │ │ │ │ + 610 jacobianInverseTransposed_.mtv( global - corner( 0 ), local ); │ │ │ │ │ + 611 else │ │ │ │ │ + 612 MatrixHelper::template xTRightInvA< mydimension, coorddimension > │ │ │ │ │ +( jacobianTransposed_, global - corner( 0 ), local ); │ │ │ │ │ + 613 return local; │ │ │ │ │ + 614 } │ │ │ │ │ + 615 else │ │ │ │ │ + 616 return Base::local( global ); │ │ │ │ │ + 617 } │ │ │ │ │ + 618 │ │ │ │ │ +633 ctype integrationElement ( const LocalCoordinate &local ) const │ │ │ │ │ + 634 { │ │ │ │ │ + 635 if( affine() ) │ │ │ │ │ + 636 { │ │ │ │ │ + 637 if( !integrationElementComputed_ ) │ │ │ │ │ + 638 { │ │ │ │ │ + 639 jacobianInverseTransposed_.setupDeterminant( jacobianTransposed_ ); │ │ │ │ │ + 640 integrationElementComputed_ = true; │ │ │ │ │ + 641 } │ │ │ │ │ + 642 return jacobianInverseTransposed_.detInv(); │ │ │ │ │ + 643 } │ │ │ │ │ + 644 else │ │ │ │ │ + 645 return Base::integrationElement( local ); │ │ │ │ │ + 646 } │ │ │ │ │ + 647 │ │ │ │ │ +649 Volume volume () const │ │ │ │ │ + 650 { │ │ │ │ │ + 651 if( affine() ) │ │ │ │ │ + 652 return integrationElement( refElement().position( 0, 0 ) ) * refElement │ │ │ │ │ +().volume(); │ │ │ │ │ + 653 else │ │ │ │ │ + 654 return Base::volume(); │ │ │ │ │ + 655 } │ │ │ │ │ + 656 │ │ │ │ │ +666 JacobianTransposed jacobianTransposed ( const LocalCoordinate &local ) │ │ │ │ │ +const │ │ │ │ │ + 667 { │ │ │ │ │ + 668 if( affine() ) │ │ │ │ │ + 669 return jacobianTransposed_; │ │ │ │ │ + 670 else │ │ │ │ │ + 671 return Base::jacobianTransposed( local ); │ │ │ │ │ + 672 } │ │ │ │ │ + 673 │ │ │ │ │ +680 JacobianInverseTransposed jacobianInverseTransposed ( const LocalCoordinate │ │ │ │ │ +&local ) const │ │ │ │ │ + 681 { │ │ │ │ │ + 682 if( affine() ) │ │ │ │ │ + 683 { │ │ │ │ │ + 684 if( !jacobianInverseTransposedComputed_ ) │ │ │ │ │ + 685 { │ │ │ │ │ + 686 jacobianInverseTransposed_.setup( jacobianTransposed_ ); │ │ │ │ │ + 687 jacobianInverseTransposedComputed_ = true; │ │ │ │ │ + 688 integrationElementComputed_ = true; │ │ │ │ │ + 689 } │ │ │ │ │ + 690 return jacobianInverseTransposed_; │ │ │ │ │ + 691 } │ │ │ │ │ + 692 else │ │ │ │ │ + 693 return Base::jacobianInverseTransposed( local ); │ │ │ │ │ + 694 } │ │ │ │ │ + 695 │ │ │ │ │ +702 Jacobian jacobian (const LocalCoordinate &local) const │ │ │ │ │ + 703 { │ │ │ │ │ + 704 return jacobianTransposed(local).transposed(); │ │ │ │ │ + 705 } │ │ │ │ │ + 706 │ │ │ │ │ +713 JacobianInverse jacobianInverse (const LocalCoordinate &local) const │ │ │ │ │ + 714 { │ │ │ │ │ + 715 return jacobianInverseTransposed(local).transposed(); │ │ │ │ │ + 716 } │ │ │ │ │ + 717 │ │ │ │ │ + 718 protected: │ │ │ │ │ + 719 using Base::refElement; │ │ │ │ │ + 720 │ │ │ │ │ + 721 private: │ │ │ │ │ + 722 mutable JacobianTransposed jacobianTransposed_; │ │ │ │ │ + 723 mutable JacobianInverseTransposed jacobianInverseTransposed_; │ │ │ │ │ + 724 │ │ │ │ │ + 725 mutable bool affine_ : 1; │ │ │ │ │ + 726 │ │ │ │ │ + 727 mutable bool jacobianInverseTransposedComputed_ : 1; │ │ │ │ │ + 728 mutable bool integrationElementComputed_ : 1; │ │ │ │ │ + 729 }; │ │ │ │ │ + 730 │ │ │ │ │ + 731 │ │ │ │ │ + 732 │ │ │ │ │ + 733 // Implementation of MultiLinearGeometry │ │ │ │ │ + 734 // ------------------------------------- │ │ │ │ │ + 735 │ │ │ │ │ + 736 template< class ct, int mydim, int cdim, class Traits > │ │ │ │ │ + 737 inline typename MultiLinearGeometry< ct, mydim, cdim, Traits >:: │ │ │ │ │ +JacobianInverseTransposed │ │ │ │ │ +738 MultiLinearGeometry<_ct,_mydim,_cdim,_Traits_>::jacobianInverseTransposed │ │ │ │ │ +( const LocalCoordinate &local ) const │ │ │ │ │ + 739 { │ │ │ │ │ + 740 JacobianInverseTransposed jit; │ │ │ │ │ + 741 jit.setup( jacobianTransposed( local ) ); │ │ │ │ │ + 742 return jit; │ │ │ │ │ + 743 } │ │ │ │ │ + 744 │ │ │ │ │ + 745 │ │ │ │ │ + 746 template< class ct, int mydim, int cdim, class Traits > │ │ │ │ │ + 747 template< bool add, int dim, class CornerIterator > │ │ │ │ │ + 748 inline void MultiLinearGeometry<_ct,_mydim,_cdim,_Traits_> │ │ │ │ │ +749::global ( TopologyId topologyId, std::integral_constant< int, dim >, │ │ │ │ │ + 750 CornerIterator &cit, const ctype &df, const LocalCoordinate &x, │ │ │ │ │ + 751 const ctype &rf, GlobalCoordinate &y ) │ │ │ │ │ + 752 { │ │ │ │ │ + 753 const ctype xn = df*x[ dim-1 ]; │ │ │ │ │ + 754 const ctype cxn = ctype( 1 ) - xn; │ │ │ │ │ + 755 │ │ │ │ │ + 756 if( Impl::isPrism( toUnsignedInt(topologyId), mydimension, mydimension-dim │ │ │ │ │ +) ) │ │ │ │ │ + 757 { │ │ │ │ │ + 758 // apply (1-xn) times mapping for bottom │ │ │ │ │ + 759 global< add >( topologyId, std::integral_constant< int, dim-1 >(), cit, │ │ │ │ │ +df, x, rf*cxn, y ); │ │ │ │ │ + 760 // apply xn times mapping for top │ │ │ │ │ + 761 global< true >( topologyId, std::integral_constant< int, dim-1 >(), cit, │ │ │ │ │ +df, x, rf*xn, y ); │ │ │ │ │ + 762 } │ │ │ │ │ + 763 else │ │ │ │ │ + 764 { │ │ │ │ │ + 765 assert( Impl::isPyramid( toUnsignedInt(topologyId), mydimension, │ │ │ │ │ +mydimension-dim ) ); │ │ │ │ │ + 766 // apply (1-xn) times mapping for bottom (with argument x/(1-xn)) │ │ │ │ │ + 767 if( cxn > Traits::tolerance() || cxn < -Traits::tolerance() ) │ │ │ │ │ + 768 global< add >( topologyId, std::integral_constant< int, dim-1 >(), cit, │ │ │ │ │ +df/cxn, x, rf*cxn, y ); │ │ │ │ │ + 769 else │ │ │ │ │ + 770 global< add >( topologyId, std::integral_constant< int, dim-1 >(), cit, │ │ │ │ │ +df, x, ctype( 0 ), y ); │ │ │ │ │ + 771 // apply xn times the tip │ │ │ │ │ + 772 y.axpy( rf*xn, *cit ); │ │ │ │ │ + 773 ++cit; │ │ │ │ │ + 774 } │ │ │ │ │ + 775 } │ │ │ │ │ + 776 │ │ │ │ │ + 777 template< class ct, int mydim, int cdim, class Traits > │ │ │ │ │ + 778 template< bool add, class CornerIterator > │ │ │ │ │ + 779 inline void MultiLinearGeometry<_ct,_mydim,_cdim,_Traits_> │ │ │ │ │ +780::global ( TopologyId, std::integral_constant< int, 0 >, │ │ │ │ │ + 781 CornerIterator &cit, const ctype &, const LocalCoordinate &, │ │ │ │ │ + 782 const ctype &rf, GlobalCoordinate &y ) │ │ │ │ │ + 783 { │ │ │ │ │ + 784 const GlobalCoordinate &origin = *cit; │ │ │ │ │ + 785 ++cit; │ │ │ │ │ + 786 for( int i = 0; i < coorddimension; ++i ) │ │ │ │ │ + 787 y[ i ] = (add ? y[ i ] + rf*origin[ i ] : rf*origin[ i ]); │ │ │ │ │ + 788 } │ │ │ │ │ + 789 │ │ │ │ │ + 790 │ │ │ │ │ + 791 template< class ct, int mydim, int cdim, class Traits > │ │ │ │ │ + 792 template< bool add, int rows, int dim, class CornerIterator > │ │ │ │ │ + 793 inline void MultiLinearGeometry<_ct,_mydim,_cdim,_Traits_> │ │ │ │ │ +794::jacobianTransposed ( TopologyId topologyId, std::integral_constant< int, │ │ │ │ │ +dim >, │ │ │ │ │ + 795 CornerIterator &cit, const ctype &df, const LocalCoordinate &x, │ │ │ │ │ + 796 const ctype &rf, FieldMatrix< ctype, rows, cdim > &jt ) │ │ │ │ │ + 797 { │ │ │ │ │ + 798 assert( rows >= dim ); │ │ │ │ │ + 799 │ │ │ │ │ + 800 const ctype xn = df*x[ dim-1 ]; │ │ │ │ │ + 801 const ctype cxn = ctype( 1 ) - xn; │ │ │ │ │ + 802 │ │ │ │ │ + 803 auto cit2( cit ); │ │ │ │ │ + 804 if( Impl::isPrism( toUnsignedInt(topologyId), mydimension, mydimension-dim │ │ │ │ │ +) ) │ │ │ │ │ + 805 { │ │ │ │ │ + 806 // apply (1-xn) times Jacobian for bottom │ │ │ │ │ + 807 jacobianTransposed< add >( topologyId, std::integral_constant< int, dim- │ │ │ │ │ +1 >(), cit2, df, x, rf*cxn, jt ); │ │ │ │ │ + 808 // apply xn times Jacobian for top │ │ │ │ │ + 809 jacobianTransposed< true >( topologyId, std::integral_constant< int, dim- │ │ │ │ │ +1 >(), cit2, df, x, rf*xn, jt ); │ │ │ │ │ + 810 // compute last row as difference between top value and bottom value │ │ │ │ │ + 811 global< add >( topologyId, std::integral_constant< int, dim-1 >(), cit, │ │ │ │ │ +df, x, -rf, jt[ dim-1 ] ); │ │ │ │ │ + 812 global< true >( topologyId, std::integral_constant< int, dim-1 >(), cit, │ │ │ │ │ +df, x, rf, jt[ dim-1 ] ); │ │ │ │ │ + 813 } │ │ │ │ │ + 814 else │ │ │ │ │ + 815 { │ │ │ │ │ + 816 assert( Impl::isPyramid( toUnsignedInt(topologyId), mydimension, │ │ │ │ │ +mydimension-dim ) ); │ │ │ │ │ + 817 /* │ │ │ │ │ + 818 * In the pyramid case, we need a transformation Tb: B -> R^n for the │ │ │ │ │ + 819 * base B \subset R^{n-1}. The pyramid transformation is then defined as │ │ │ │ │ + 820 * T: P \subset R^n -> R^n │ │ │ │ │ + 821 * (x, xn) |-> (1-xn) Tb(x*) + xn t (x \in R^{n-1}, xn \in R) │ │ │ │ │ + 822 * with the tip of the pyramid mapped to t and x* = x/(1-xn) │ │ │ │ │ + 823 * the projection of (x,xn) onto the base. │ │ │ │ │ + 824 * │ │ │ │ │ + 825 * For the Jacobi matrix DT we get │ │ │ │ │ + 826 * DT = ( A | b ) │ │ │ │ │ + 827 * with A = DTb(x*) (n x n-1 matrix) │ │ │ │ │ + 828 * and b = dT/dxn (n-dim column vector). │ │ │ │ │ + 829 * Furthermore │ │ │ │ │ + 830 * b = -Tb(x*) + t + \sum_i dTb/dx_i(x^*) x_i/(1-xn) │ │ │ │ │ + 831 * │ │ │ │ │ + 832 * Note that both A and b are not defined in the pyramid tip (x=0, xn=1)! │ │ │ │ │ + 833 * Indeed for B the unit square, Tb mapping B to the quadrilateral given │ │ │ │ │ + 834 * by the vertices (0,0,0), (2,0,0), (0,1,0), (1,1,0) and t=(0,0,1), we get │ │ │ │ │ + 835 * │ │ │ │ │ + 836 * T(x,y,xn) = ( x(2-y/(1-xn)), y, xn ) │ │ │ │ │ + 837 * / 2-y/(1-xn) -x 0 \ │ │ │ │ │ + 838 * DT(x,y,xn) = | 0 1 0 | │ │ │ │ │ + 839 * \ 0 0 1 / │ │ │ │ │ + 840 * which is not continuous for xn -> 1, choose for example │ │ │ │ │ + 841 * x=0, y=1-xn, xn -> 1 --> DT -> diag(1,1,1) │ │ │ │ │ + 842 * x=1-xn, y=0, xn -> 1 --> DT -> diag(2,1,1) │ │ │ │ │ + 843 * │ │ │ │ │ + 844 * However, for Tb affine-linear, Tb(y) = My + y0, DTb = M: │ │ │ │ │ + 845 * A = M │ │ │ │ │ + 846 * b = -M x* - y0 + t + \sum_i M_i x_i/(1-xn) │ │ │ │ │ + 847 * = -M x* - y0 + t + M x* │ │ │ │ │ + 848 * = -y0 + t │ │ │ │ │ + 849 * which is continuous for xn -> 1. Note that this b is also given by │ │ │ │ │ + 850 * b = -Tb(0) + t + \sum_i dTb/dx_i(0) x_i/1 │ │ │ │ │ + 851 * that is replacing x* by 1 and 1-xn by 1 in the formular above. │ │ │ │ │ + 852 * │ │ │ │ │ + 853 * For xn -> 1, we can thus set x*=0, "1-xn"=1 (or anything != 0) and get │ │ │ │ │ + 854 * the right result in case Tb is affine-linear. │ │ │ │ │ + 855 */ │ │ │ │ │ + 856 │ │ │ │ │ + 857 /* The second case effectively results in x* = 0 */ │ │ │ │ │ + 858 ctype dfcxn = (cxn > Traits::tolerance() || cxn < -Traits::tolerance()) ? │ │ │ │ │ +ctype(df / cxn) : ctype(0); │ │ │ │ │ + 859 │ │ │ │ │ + 860 // initialize last row │ │ │ │ │ + 861 // b = -Tb(x*) │ │ │ │ │ + 862 // (b = -Tb(0) = -y0 in case xn -> 1 and Tb affine-linear) │ │ │ │ │ + 863 global< add >( topologyId, std::integral_constant< int, dim-1 >(), cit, │ │ │ │ │ +dfcxn, x, -rf, jt[ dim-1 ] ); │ │ │ │ │ + 864 // b += t │ │ │ │ │ + 865 jt[ dim-1 ].axpy( rf, *cit ); │ │ │ │ │ + 866 ++cit; │ │ │ │ │ + 867 // apply Jacobian for bottom (with argument x/(1-xn)) and correct last row │ │ │ │ │ + 868 if( add ) │ │ │ │ │ + 869 { │ │ │ │ │ + 870 FieldMatrix< ctype, dim-1, coorddimension > jt2; │ │ │ │ │ + 871 // jt2 = dTb/dx_i(x*) │ │ │ │ │ + 872 jacobianTransposed< false >( topologyId, std::integral_constant< int, dim- │ │ │ │ │ +1 >(), cit2, dfcxn, x, rf, jt2 ); │ │ │ │ │ + 873 // A = dTb/dx_i(x*) (jt[j], j=0..dim-1) │ │ │ │ │ + 874 // b += \sum_i dTb/dx_i(x*) x_i/(1-xn) (jt[dim-1]) │ │ │ │ │ + 875 // (b += 0 in case xn -> 1) │ │ │ │ │ + 876 for( int j = 0; j < dim-1; ++j ) │ │ │ │ │ + 877 { │ │ │ │ │ + 878 jt[ j ] += jt2[ j ]; │ │ │ │ │ + 879 jt[ dim-1 ].axpy( dfcxn*x[ j ], jt2[ j ] ); │ │ │ │ │ + 880 } │ │ │ │ │ + 881 } │ │ │ │ │ + 882 else │ │ │ │ │ + 883 { │ │ │ │ │ + 884 // jt = dTb/dx_i(x*) │ │ │ │ │ + 885 jacobianTransposed< false >( topologyId, std::integral_constant< int, dim- │ │ │ │ │ +1 >(), cit2, dfcxn, x, rf, jt ); │ │ │ │ │ + 886 // b += \sum_i dTb/dx_i(x*) x_i/(1-xn) │ │ │ │ │ + 887 for( int j = 0; j < dim-1; ++j ) │ │ │ │ │ + 888 jt[ dim-1 ].axpy( dfcxn*x[ j ], jt[ j ] ); │ │ │ │ │ + 889 } │ │ │ │ │ + 890 } │ │ │ │ │ + 891 } │ │ │ │ │ + 892 │ │ │ │ │ + 893 template< class ct, int mydim, int cdim, class Traits > │ │ │ │ │ + 894 template< bool add, int rows, class CornerIterator > │ │ │ │ │ + 895 inline void MultiLinearGeometry<_ct,_mydim,_cdim,_Traits_> │ │ │ │ │ +896::jacobianTransposed ( TopologyId, std::integral_constant< int, 0 >, │ │ │ │ │ + 897 CornerIterator &cit, const ctype &, const LocalCoordinate &, │ │ │ │ │ + 898 const ctype &, FieldMatrix< ctype, rows, cdim > & ) │ │ │ │ │ + 899 { │ │ │ │ │ + 900 ++cit; │ │ │ │ │ + 901 } │ │ │ │ │ + 902 │ │ │ │ │ + 903 │ │ │ │ │ + 904 │ │ │ │ │ + 905 template< class ct, int mydim, int cdim, class Traits > │ │ │ │ │ + 906 template< int dim, class CornerIterator > │ │ │ │ │ + 907 inline bool MultiLinearGeometry<_ct,_mydim,_cdim,_Traits_> │ │ │ │ │ +908::affine ( TopologyId topologyId, std::integral_constant< int, dim >, │ │ │ │ │ +CornerIterator &cit, JacobianTransposed &jt ) │ │ │ │ │ + 909 { │ │ │ │ │ + 910 const GlobalCoordinate &orgBottom = *cit; │ │ │ │ │ + 911 if( !affine( topologyId, std::integral_constant< int, dim-1 >(), cit, jt ) │ │ │ │ │ +) │ │ │ │ │ + 912 return false; │ │ │ │ │ + 913 const GlobalCoordinate &orgTop = *cit; │ │ │ │ │ + 914 │ │ │ │ │ + 915 if( Impl::isPrism( toUnsignedInt(topologyId), mydimension, mydimension-dim │ │ │ │ │ +) ) │ │ │ │ │ + 916 { │ │ │ │ │ + 917 JacobianTransposed jtTop; │ │ │ │ │ + 918 if( !affine( topologyId, std::integral_constant< int, dim-1 >(), cit, │ │ │ │ │ +jtTop ) ) │ │ │ │ │ + 919 return false; │ │ │ │ │ + 920 │ │ │ │ │ + 921 // check whether both jacobians are identical │ │ │ │ │ + 922 ctype norm( 0 ); │ │ │ │ │ + 923 for( int i = 0; i < dim-1; ++i ) │ │ │ │ │ + 924 norm += (jtTop[ i ] - jt[ i ]).two_norm2(); │ │ │ │ │ + 925 if( norm >= Traits::tolerance() ) │ │ │ │ │ + 926 return false; │ │ │ │ │ + 927 } │ │ │ │ │ + 928 else │ │ │ │ │ + 929 ++cit; │ │ │ │ │ + 930 jt[ dim-1 ] = orgTop - orgBottom; │ │ │ │ │ + 931 return true; │ │ │ │ │ + 932 } │ │ │ │ │ + 933 │ │ │ │ │ + 934 template< class ct, int mydim, int cdim, class Traits > │ │ │ │ │ + 935 template< class CornerIterator > │ │ │ │ │ + 936 inline bool MultiLinearGeometry<_ct,_mydim,_cdim,_Traits_> │ │ │ │ │ +937::affine ( TopologyId, std::integral_constant< int, 0 >, CornerIterator │ │ │ │ │ +&cit, JacobianTransposed & ) │ │ │ │ │ + 938 { │ │ │ │ │ + 939 ++cit; │ │ │ │ │ + 940 return true; │ │ │ │ │ + 941 } │ │ │ │ │ + 942 │ │ │ │ │ + 943} // namespace Dune │ │ │ │ │ + 944 │ │ │ │ │ + 945#endif // #ifndef DUNE_GEOMETRY_MULTILINEARGEOMETRY_HH │ │ │ │ │ +referenceelements.hh │ │ │ │ │ +affinegeometry.hh │ │ │ │ │ +An implementation of the Geometry interface for affine geometries. │ │ │ │ │ type.hh │ │ │ │ │ A unique label for each type of element that can occur in a grid. │ │ │ │ │ -Dune::GeometryTypes::line │ │ │ │ │ -constexpr GeometryType line │ │ │ │ │ -GeometryType representing a line. │ │ │ │ │ -Definition: type.hh:512 │ │ │ │ │ -Dune::GeometryTypes::prism │ │ │ │ │ -constexpr GeometryType prism │ │ │ │ │ -GeometryType representing a 3D prism. │ │ │ │ │ -Definition: type.hh:542 │ │ │ │ │ -Dune::GeometryTypes::triangle │ │ │ │ │ -constexpr GeometryType triangle │ │ │ │ │ -GeometryType representing a triangle. │ │ │ │ │ -Definition: type.hh:518 │ │ │ │ │ -Dune::GeometryTypes::quadrilateral │ │ │ │ │ -constexpr GeometryType quadrilateral │ │ │ │ │ -GeometryType representing a quadrilateral (a square). │ │ │ │ │ -Definition: type.hh:524 │ │ │ │ │ -Dune::GeometryTypes::hexahedron │ │ │ │ │ -constexpr GeometryType hexahedron │ │ │ │ │ -GeometryType representing a hexahedron. │ │ │ │ │ -Definition: type.hh:548 │ │ │ │ │ -Dune::GeometryTypes::pyramid │ │ │ │ │ -constexpr GeometryType pyramid │ │ │ │ │ -GeometryType representing a 3D pyramid. │ │ │ │ │ -Definition: type.hh:536 │ │ │ │ │ -Dune::GeometryTypes::tetrahedron │ │ │ │ │ -constexpr GeometryType tetrahedron │ │ │ │ │ -GeometryType representing a tetrahedron. │ │ │ │ │ -Definition: type.hh:530 │ │ │ │ │ -Dune::GeometryTypes::vertex │ │ │ │ │ -constexpr GeometryType vertex │ │ │ │ │ -GeometryType representing a vertex. │ │ │ │ │ -Definition: type.hh:506 │ │ │ │ │ Dune │ │ │ │ │ Definition: affinegeometry.hh:21 │ │ │ │ │ -Dune::geometryTypeFromVertexCount │ │ │ │ │ -GeometryType geometryTypeFromVertexCount(unsigned int dim, unsigned int │ │ │ │ │ -vertices) │ │ │ │ │ -Utitlity function to construct the correct geometry type given the dimension │ │ │ │ │ -and the number of vertic... │ │ │ │ │ -Definition: typefromvertexcount.hh:17 │ │ │ │ │ +Dune::Geo::ReferenceElements │ │ │ │ │ +Class providing access to the singletons of the reference elements. │ │ │ │ │ +Definition: referenceelements.hh:170 │ │ │ │ │ +Dune::Geo::ReferenceElements::ReferenceElement │ │ │ │ │ +typename Container::ReferenceElement ReferenceElement │ │ │ │ │ +The reference element type. │ │ │ │ │ +Definition: referenceelements.hh:188 │ │ │ │ │ +Dune::MultiLinearGeometryTraits │ │ │ │ │ +default traits class for MultiLinearGeometry │ │ │ │ │ +Definition: multilineargeometry.hh:39 │ │ │ │ │ +Dune::MultiLinearGeometryTraits::MatrixHelper │ │ │ │ │ +Impl::FieldMatrixHelper< ct > MatrixHelper │ │ │ │ │ +helper structure containing some matrix routines │ │ │ │ │ +Definition: multilineargeometry.hh:58 │ │ │ │ │ +Dune::MultiLinearGeometryTraits::tolerance │ │ │ │ │ +static ct tolerance() │ │ │ │ │ +tolerance to numerical algorithms │ │ │ │ │ +Definition: multilineargeometry.hh:61 │ │ │ │ │ +Dune::MultiLinearGeometryTraits::CornerStorage │ │ │ │ │ +template specifying the storage for the corners │ │ │ │ │ +Definition: multilineargeometry.hh:129 │ │ │ │ │ +Dune::MultiLinearGeometryTraits::CornerStorage::Type │ │ │ │ │ +std::vector< FieldVector< ct, cdim > > Type │ │ │ │ │ +Definition: multilineargeometry.hh:130 │ │ │ │ │ +Dune::MultiLinearGeometryTraits::hasSingleGeometryType │ │ │ │ │ +will there be only one geometry type for a dimension? │ │ │ │ │ +Definition: multilineargeometry.hh:148 │ │ │ │ │ +Dune::MultiLinearGeometryTraits::hasSingleGeometryType::topologyId │ │ │ │ │ +static const unsigned int topologyId │ │ │ │ │ +Definition: multilineargeometry.hh:150 │ │ │ │ │ +Dune::MultiLinearGeometryTraits::hasSingleGeometryType::v │ │ │ │ │ +static const bool v │ │ │ │ │ +Definition: multilineargeometry.hh:149 │ │ │ │ │ +Dune::MultiLinearGeometry │ │ │ │ │ +generic geometry implementation based on corner coordinates │ │ │ │ │ +Definition: multilineargeometry.hh:181 │ │ │ │ │ +Dune::MultiLinearGeometry::global │ │ │ │ │ +static void global(TopologyId topologyId, std::integral_constant< int, dim >, │ │ │ │ │ +CornerIterator &cit, const ctype &df, const LocalCoordinate &x, const ctype │ │ │ │ │ +&rf, GlobalCoordinate &y) │ │ │ │ │ +Definition: multilineargeometry.hh:749 │ │ │ │ │ +Dune::MultiLinearGeometry::mydimension │ │ │ │ │ +static const int mydimension │ │ │ │ │ +geometry dimension │ │ │ │ │ +Definition: multilineargeometry.hh:189 │ │ │ │ │ +Dune::MultiLinearGeometry::type │ │ │ │ │ +Dune::GeometryType type() const │ │ │ │ │ +obtain the name of the reference element │ │ │ │ │ +Definition: multilineargeometry.hh:269 │ │ │ │ │ +Dune::MultiLinearGeometry::MatrixHelper │ │ │ │ │ +Traits::MatrixHelper MatrixHelper │ │ │ │ │ +Definition: multilineargeometry.hh:225 │ │ │ │ │ +Dune::MultiLinearGeometry::GlobalCoordinate │ │ │ │ │ +FieldVector< ctype, coorddimension > GlobalCoordinate │ │ │ │ │ +type of global coordinates │ │ │ │ │ +Definition: multilineargeometry.hh:196 │ │ │ │ │ +Dune::MultiLinearGeometry::jacobianTransposed │ │ │ │ │ +static void jacobianTransposed(TopologyId topologyId, std::integral_constant< │ │ │ │ │ +int, 0 >, CornerIterator &cit, const ctype &df, const LocalCoordinate &x, const │ │ │ │ │ +ctype &rf, FieldMatrix< ctype, rows, cdim > &jt) │ │ │ │ │ +Definition: multilineargeometry.hh:896 │ │ │ │ │ +Dune::MultiLinearGeometry::jacobianTransposed │ │ │ │ │ +JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const │ │ │ │ │ +obtain the transposed of the Jacobian │ │ │ │ │ +Definition: multilineargeometry.hh:377 │ │ │ │ │ +Dune::MultiLinearGeometry::refElement │ │ │ │ │ +ReferenceElement refElement() const │ │ │ │ │ +Definition: multilineargeometry.hh:425 │ │ │ │ │ +Dune::MultiLinearGeometry::global │ │ │ │ │ +GlobalCoordinate global(const LocalCoordinate &local) const │ │ │ │ │ +evaluate the mapping │ │ │ │ │ +Definition: multilineargeometry.hh:290 │ │ │ │ │ +Dune::MultiLinearGeometry::center │ │ │ │ │ +GlobalCoordinate center() const │ │ │ │ │ +obtain the centroid of the mapping's image │ │ │ │ │ +Definition: multilineargeometry.hh:282 │ │ │ │ │ +Dune::MultiLinearGeometry::corner │ │ │ │ │ +GlobalCoordinate corner(int i) const │ │ │ │ │ +obtain coordinates of the i-th corner │ │ │ │ │ +Definition: multilineargeometry.hh:275 │ │ │ │ │ +Dune::MultiLinearGeometry::ReferenceElements │ │ │ │ │ +Dune::ReferenceElements< ctype, mydimension > ReferenceElements │ │ │ │ │ +Definition: multilineargeometry.hh:214 │ │ │ │ │ +Dune::MultiLinearGeometry::ctype │ │ │ │ │ +ct ctype │ │ │ │ │ +coordinate type │ │ │ │ │ +Definition: multilineargeometry.hh:186 │ │ │ │ │ +Dune::MultiLinearGeometry::jacobianTransposed │ │ │ │ │ +static void jacobianTransposed(TopologyId topologyId, std::integral_constant< │ │ │ │ │ +int, dim >, CornerIterator &cit, const ctype &df, const LocalCoordinate &x, │ │ │ │ │ +const ctype &rf, FieldMatrix< ctype, rows, cdim > &jt) │ │ │ │ │ +Definition: multilineargeometry.hh:794 │ │ │ │ │ +Dune::MultiLinearGeometry::coorddimension │ │ │ │ │ +static const int coorddimension │ │ │ │ │ +coordinate dimension │ │ │ │ │ +Definition: multilineargeometry.hh:191 │ │ │ │ │ +Dune::MultiLinearGeometry::corners │ │ │ │ │ +int corners() const │ │ │ │ │ +obtain number of corners of the corresponding reference element │ │ │ │ │ +Definition: multilineargeometry.hh:272 │ │ │ │ │ +Dune::MultiLinearGeometry::topologyId │ │ │ │ │ +TopologyId topologyId() const │ │ │ │ │ +Definition: multilineargeometry.hh:430 │ │ │ │ │ +Dune::MultiLinearGeometry::referenceElement │ │ │ │ │ +friend ReferenceElement referenceElement(const MultiLinearGeometry &geometry) │ │ │ │ │ +Definition: multilineargeometry.hh:395 │ │ │ │ │ +Dune::MultiLinearGeometry::global │ │ │ │ │ +static void global(TopologyId topologyId, std::integral_constant< int, 0 >, │ │ │ │ │ +CornerIterator &cit, const ctype &df, const LocalCoordinate &x, const ctype │ │ │ │ │ +&rf, GlobalCoordinate &y) │ │ │ │ │ +Definition: multilineargeometry.hh:780 │ │ │ │ │ +Dune::MultiLinearGeometry::volume │ │ │ │ │ +Volume volume() const │ │ │ │ │ +obtain the volume of the mapping's image │ │ │ │ │ +Definition: multilineargeometry.hh:363 │ │ │ │ │ +Dune::MultiLinearGeometry::LocalCoordinate │ │ │ │ │ +FieldVector< ctype, mydimension > LocalCoordinate │ │ │ │ │ +type of local coordinates │ │ │ │ │ +Definition: multilineargeometry.hh:194 │ │ │ │ │ +Dune::MultiLinearGeometry::MultiLinearGeometry │ │ │ │ │ +MultiLinearGeometry(const ReferenceElement &refElement, const Corners &corners) │ │ │ │ │ +constructor │ │ │ │ │ +Definition: multilineargeometry.hh:239 │ │ │ │ │ +Dune::MultiLinearGeometry::affine │ │ │ │ │ +static bool affine(TopologyId topologyId, std::integral_constant< int, 0 >, │ │ │ │ │ +CornerIterator &cit, JacobianTransposed &jt) │ │ │ │ │ +Definition: multilineargeometry.hh:937 │ │ │ │ │ +Dune::MultiLinearGeometry::TopologyId │ │ │ │ │ +std::conditional< hasSingleGeometryType, std::integral_constant< unsignedint, │ │ │ │ │ +Traits::templatehasSingleGeometryType< mydimension >::topologyId >, unsignedint │ │ │ │ │ +>::type TopologyId │ │ │ │ │ +Definition: multilineargeometry.hh:226 │ │ │ │ │ +Dune::MultiLinearGeometry::Volume │ │ │ │ │ +ctype Volume │ │ │ │ │ +type of volume │ │ │ │ │ +Definition: multilineargeometry.hh:198 │ │ │ │ │ +Dune::MultiLinearGeometry::affine │ │ │ │ │ +static bool affine(TopologyId topologyId, std::integral_constant< int, dim >, │ │ │ │ │ +CornerIterator &cit, JacobianTransposed &jt) │ │ │ │ │ +Definition: multilineargeometry.hh:908 │ │ │ │ │ +Dune::MultiLinearGeometry::jacobianInverse │ │ │ │ │ +JacobianInverse jacobianInverse(const LocalCoordinate &local) const │ │ │ │ │ +Obtain the Jacobian's inverse. │ │ │ │ │ +Definition: multilineargeometry.hh:418 │ │ │ │ │ +Dune::MultiLinearGeometry::MultiLinearGeometry │ │ │ │ │ +MultiLinearGeometry(Dune::GeometryType gt, const Corners &corners) │ │ │ │ │ +constructor │ │ │ │ │ +Definition: multilineargeometry.hh:255 │ │ │ │ │ +Dune::MultiLinearGeometry::JacobianTransposed │ │ │ │ │ +FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed │ │ │ │ │ +type of jacobian transposed │ │ │ │ │ +Definition: multilineargeometry.hh:201 │ │ │ │ │ +Dune::MultiLinearGeometry::ReferenceElement │ │ │ │ │ +ReferenceElements::ReferenceElement ReferenceElement │ │ │ │ │ +type of reference element │ │ │ │ │ +Definition: multilineargeometry.hh:219 │ │ │ │ │ +Dune::MultiLinearGeometry::jacobianInverseTransposed │ │ │ │ │ +JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate │ │ │ │ │ +&local) const │ │ │ │ │ +obtain the transposed of the Jacobian's inverse │ │ │ │ │ +Definition: multilineargeometry.hh:738 │ │ │ │ │ +Dune::MultiLinearGeometry::Jacobian │ │ │ │ │ +FieldMatrix< ctype, coorddimension, mydimension > Jacobian │ │ │ │ │ +Type for the Jacobian matrix. │ │ │ │ │ +Definition: multilineargeometry.hh:207 │ │ │ │ │ +Dune::MultiLinearGeometry::affine │ │ │ │ │ +bool affine() const │ │ │ │ │ +is this mapping affine? │ │ │ │ │ +Definition: multilineargeometry.hh:262 │ │ │ │ │ +Dune::MultiLinearGeometry::JacobianInverse │ │ │ │ │ +FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse │ │ │ │ │ +Type for the inverse Jacobian matrix. │ │ │ │ │ +Definition: multilineargeometry.hh:210 │ │ │ │ │ +Dune::MultiLinearGeometry::affine │ │ │ │ │ +bool affine(JacobianTransposed &jacobianT) const │ │ │ │ │ +Definition: multilineargeometry.hh:458 │ │ │ │ │ +Dune::MultiLinearGeometry::integrationElement │ │ │ │ │ +Volume integrationElement(const LocalCoordinate &local) const │ │ │ │ │ +obtain the integration element │ │ │ │ │ +Definition: multilineargeometry.hh:350 │ │ │ │ │ +Dune::MultiLinearGeometry::jacobian │ │ │ │ │ +Jacobian jacobian(const LocalCoordinate &local) const │ │ │ │ │ +Obtain the Jacobian. │ │ │ │ │ +Definition: multilineargeometry.hh:407 │ │ │ │ │ +Dune::MultiLinearGeometry::JacobianInverseTransposed │ │ │ │ │ +Definition: multilineargeometry.hh:488 │ │ │ │ │ +Dune::MultiLinearGeometry::JacobianInverseTransposed::setup │ │ │ │ │ +void setup(const JacobianTransposed &jt) │ │ │ │ │ +Definition: multilineargeometry.hh:492 │ │ │ │ │ +Dune::MultiLinearGeometry::JacobianInverseTransposed::det │ │ │ │ │ +ctype det() const │ │ │ │ │ +Definition: multilineargeometry.hh:502 │ │ │ │ │ +Dune::MultiLinearGeometry::JacobianInverseTransposed::detInv │ │ │ │ │ +ctype detInv() const │ │ │ │ │ +Definition: multilineargeometry.hh:503 │ │ │ │ │ +Dune::MultiLinearGeometry::JacobianInverseTransposed::setupDeterminant │ │ │ │ │ +void setupDeterminant(const JacobianTransposed &jt) │ │ │ │ │ +Definition: multilineargeometry.hh:497 │ │ │ │ │ +Dune::CachedMultiLinearGeometry │ │ │ │ │ +Implement a MultiLinearGeometry with additional caching. │ │ │ │ │ +Definition: multilineargeometry.hh:526 │ │ │ │ │ +Dune::CachedMultiLinearGeometry::global │ │ │ │ │ +GlobalCoordinate global(const LocalCoordinate &local) const │ │ │ │ │ +evaluate the mapping │ │ │ │ │ +Definition: multilineargeometry.hh:580 │ │ │ │ │ +Dune::CachedMultiLinearGeometry::ReferenceElement │ │ │ │ │ +Base::ReferenceElement ReferenceElement │ │ │ │ │ +Definition: multilineargeometry.hh:534 │ │ │ │ │ +Dune::CachedMultiLinearGeometry::affine │ │ │ │ │ +bool affine() const │ │ │ │ │ +is this mapping affine? │ │ │ │ │ +Definition: multilineargeometry.hh:567 │ │ │ │ │ +Dune::CachedMultiLinearGeometry::CachedMultiLinearGeometry │ │ │ │ │ +CachedMultiLinearGeometry(const ReferenceElement &referenceElement, const │ │ │ │ │ +CornerStorage &cornerStorage) │ │ │ │ │ +Definition: multilineargeometry.hh:551 │ │ │ │ │ +Dune::CachedMultiLinearGeometry::refElement │ │ │ │ │ +ReferenceElement refElement() const │ │ │ │ │ +Definition: multilineargeometry.hh:425 │ │ │ │ │ +Dune::CachedMultiLinearGeometry::MatrixHelper │ │ │ │ │ +Base::MatrixHelper MatrixHelper │ │ │ │ │ +Definition: multilineargeometry.hh:531 │ │ │ │ │ +Dune::CachedMultiLinearGeometry::LocalCoordinate │ │ │ │ │ +Base::LocalCoordinate LocalCoordinate │ │ │ │ │ +Definition: multilineargeometry.hh:541 │ │ │ │ │ +Dune::CachedMultiLinearGeometry::jacobianInverse │ │ │ │ │ +JacobianInverse jacobianInverse(const LocalCoordinate &local) const │ │ │ │ │ +Obtain the Jacobian's inverse. │ │ │ │ │ +Definition: multilineargeometry.hh:713 │ │ │ │ │ +Dune::CachedMultiLinearGeometry::jacobianTransposed │ │ │ │ │ +JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const │ │ │ │ │ +obtain the transposed of the Jacobian │ │ │ │ │ +Definition: multilineargeometry.hh:666 │ │ │ │ │ +Dune::CachedMultiLinearGeometry::corner │ │ │ │ │ +GlobalCoordinate corner(int i) const │ │ │ │ │ +obtain coordinates of the i-th corner │ │ │ │ │ +Definition: multilineargeometry.hh:275 │ │ │ │ │ +Dune::CachedMultiLinearGeometry::volume │ │ │ │ │ +Volume volume() const │ │ │ │ │ +obtain the volume of the mapping's image │ │ │ │ │ +Definition: multilineargeometry.hh:649 │ │ │ │ │ +Dune::CachedMultiLinearGeometry::CachedMultiLinearGeometry │ │ │ │ │ +CachedMultiLinearGeometry(Dune::GeometryType gt, const CornerStorage │ │ │ │ │ +&cornerStorage) │ │ │ │ │ +Definition: multilineargeometry.hh:559 │ │ │ │ │ +Dune::CachedMultiLinearGeometry::integrationElement │ │ │ │ │ +ctype integrationElement(const LocalCoordinate &local) const │ │ │ │ │ +obtain the integration element │ │ │ │ │ +Definition: multilineargeometry.hh:633 │ │ │ │ │ +Dune::CachedMultiLinearGeometry::ctype │ │ │ │ │ +Base::ctype ctype │ │ │ │ │ +Definition: multilineargeometry.hh:536 │ │ │ │ │ +Dune::CachedMultiLinearGeometry::jacobian │ │ │ │ │ +Jacobian jacobian(const LocalCoordinate &local) const │ │ │ │ │ +Obtain the Jacobian. │ │ │ │ │ +Definition: multilineargeometry.hh:702 │ │ │ │ │ +Dune::CachedMultiLinearGeometry::JacobianInverseTransposed │ │ │ │ │ +Base::JacobianInverseTransposed JacobianInverseTransposed │ │ │ │ │ +Definition: multilineargeometry.hh:546 │ │ │ │ │ +Dune::CachedMultiLinearGeometry::JacobianTransposed │ │ │ │ │ +Base::JacobianTransposed JacobianTransposed │ │ │ │ │ +Definition: multilineargeometry.hh:545 │ │ │ │ │ +Dune::CachedMultiLinearGeometry::JacobianInverse │ │ │ │ │ +Base::JacobianInverse JacobianInverse │ │ │ │ │ +Definition: multilineargeometry.hh:548 │ │ │ │ │ +Dune::CachedMultiLinearGeometry::Jacobian │ │ │ │ │ +Base::Jacobian Jacobian │ │ │ │ │ +Definition: multilineargeometry.hh:547 │ │ │ │ │ +Dune::CachedMultiLinearGeometry::Volume │ │ │ │ │ +Base::Volume Volume │ │ │ │ │ +Definition: multilineargeometry.hh:543 │ │ │ │ │ +Dune::CachedMultiLinearGeometry::GlobalCoordinate │ │ │ │ │ +Base::GlobalCoordinate GlobalCoordinate │ │ │ │ │ +Definition: multilineargeometry.hh:542 │ │ │ │ │ +Dune::CachedMultiLinearGeometry::center │ │ │ │ │ +GlobalCoordinate center() const │ │ │ │ │ +obtain the centroid of the mapping's image │ │ │ │ │ +Definition: multilineargeometry.hh:572 │ │ │ │ │ +Dune::CachedMultiLinearGeometry::jacobianInverseTransposed │ │ │ │ │ +JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate │ │ │ │ │ +&local) const │ │ │ │ │ +obtain the transposed of the Jacobian's inverse │ │ │ │ │ +Definition: multilineargeometry.hh:680 │ │ │ │ │ Dune::GeometryType │ │ │ │ │ Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ Definition: type.hh:125 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00218.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: multilineargeometry.hh File Reference │ │ │ │ +dune-geometry: type.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -64,57 +64,100 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
multilineargeometry.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions | │ │ │ │ +Variables
│ │ │ │ +
type.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ + │ │ │ │ +

A unique label for each type of element that can occur in a grid. │ │ │ │ +More...

│ │ │ │
#include <cassert>
│ │ │ │ -#include <functional>
│ │ │ │ -#include <iterator>
│ │ │ │ -#include <limits>
│ │ │ │ -#include <vector>
│ │ │ │ -#include <dune/common/fmatrix.hh>
│ │ │ │ -#include <dune/common/fvector.hh>
│ │ │ │ +#include <string>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/common/keywords.hh>
│ │ │ │ #include <dune/common/typetraits.hh>
│ │ │ │ -#include <dune/geometry/affinegeometry.hh>
│ │ │ │ -#include <dune/geometry/referenceelements.hh>
│ │ │ │ -#include <dune/geometry/type.hh>
│ │ │ │ +#include <dune/common/unused.hh>
│ │ │ │ +#include <dune/geometry/deprecated_topology.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Classes

struct  Dune::MultiLinearGeometryTraits< ct >
 default traits class for MultiLinearGeometry More...
 
struct  Dune::MultiLinearGeometryTraits< ct >::CornerStorage< mydim, cdim >
 template specifying the storage for the corners More...
 
struct  Dune::MultiLinearGeometryTraits< ct >::hasSingleGeometryType< dim >
 will there be only one geometry type for a dimension? More...
 
class  Dune::MultiLinearGeometry< ct, mydim, cdim, Traits >
 generic geometry implementation based on corner coordinates More...
 
class  Dune::MultiLinearGeometry< ct, mydim, cdim, Traits >::JacobianInverseTransposed
 
class  Dune::CachedMultiLinearGeometry< ct, mydim, cdim, Traits >
 Implement a MultiLinearGeometry with additional caching. More...
class  Dune::GeometryType
 Unique label for each type of entities that can occur in DUNE grids. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::GeometryTypes
 Predefined GeometryTypes for common geometries.
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Functions

std::ostream & Dune::operator<< (std::ostream &s, const GeometryType &a)
 Prints the type to an output stream. More...
 
constexpr GeometryType Dune::GeometryTypes::simplex (unsigned int dim)
 Returns a GeometryType representing a simplex of dimension dim. More...
 
constexpr GeometryType Dune::GeometryTypes::cube (unsigned int dim)
 Returns a GeometryType representing a hypercube of dimension dim. More...
 
constexpr GeometryType Dune::GeometryTypes::none (unsigned int dim)
 Returns a GeometryType representing a singular of dimension dim. More...
 
constexpr GeometryType Dune::GeometryTypes::conicalExtension (const GeometryType &gt)
 Return GeometryType of a conical construction with gt as base
│ │ │ │ + More...
 
constexpr GeometryType Dune::GeometryTypes::prismaticExtension (const GeometryType &gt)
 Return GeometryType of a prismatic construction with gt as base
│ │ │ │ + More...
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Variables

constexpr GeometryType Dune::GeometryTypes::vertex = GeometryType(0,0,false)
 GeometryType representing a vertex. More...
 
constexpr GeometryType Dune::GeometryTypes::line = GeometryType(0,1,false)
 GeometryType representing a line. More...
 
constexpr GeometryType Dune::GeometryTypes::triangle = simplex(2)
 GeometryType representing a triangle. More...
 
constexpr GeometryType Dune::GeometryTypes::quadrilateral = cube(2)
 GeometryType representing a quadrilateral (a square). More...
 
constexpr GeometryType Dune::GeometryTypes::tetrahedron = simplex(3)
 GeometryType representing a tetrahedron. More...
 
constexpr GeometryType Dune::GeometryTypes::pyramid = GeometryType(0b0011,3,false)
 GeometryType representing a 3D pyramid. More...
 
constexpr GeometryType Dune::GeometryTypes::prism = GeometryType(0b0101,3,false)
 GeometryType representing a 3D prism. More...
 
constexpr GeometryType Dune::GeometryTypes::hexahedron = cube(3)
 GeometryType representing a hexahedron. More...
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

A unique label for each type of element that can occur in a grid.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,46 +4,92 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ -Classes | Namespaces │ │ │ │ │ -multilineargeometry.hh File Reference │ │ │ │ │ +Classes | Namespaces | Functions | Variables │ │ │ │ │ +type.hh File Reference │ │ │ │ │ +A unique label for each type of element that can occur in a grid. More... │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -struct  Dune::MultiLinearGeometryTraits<_ct_> │ │ │ │ │ -  default traits class for MultiLinearGeometry More... │ │ │ │ │ +class  Dune::GeometryType │ │ │ │ │ +  Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ + More... │ │ │ │ │   │ │ │ │ │ -struct  Dune::MultiLinearGeometryTraits<_ct_>::CornerStorage<_mydim,_cdim_> │ │ │ │ │ -  template specifying the storage for the corners More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::MultiLinearGeometryTraits<_ct_>::hasSingleGeometryType<_dim_> │ │ │ │ │ -  will there be only one geometry type for a dimension? More... │ │ │ │ │ -  │ │ │ │ │ - class  Dune::MultiLinearGeometry<_ct,_mydim,_cdim,_Traits_> │ │ │ │ │ -  generic geometry implementation based on corner coordinates More... │ │ │ │ │ + Namespaces │ │ │ │ │ +namespace  Dune │ │ │ │ │   │ │ │ │ │ - class  Dune::MultiLinearGeometry<_ct,_mydim,_cdim,_Traits_>:: │ │ │ │ │ - JacobianInverseTransposed │ │ │ │ │ +namespace  Dune::GeometryTypes │ │ │ │ │ +  Predefined GeometryTypes for common geometries. │ │ │ │ │   │ │ │ │ │ - class  Dune::CachedMultiLinearGeometry<_ct,_mydim,_cdim,_Traits_> │ │ │ │ │ -  Implement a MultiLinearGeometry with additional caching. More... │ │ │ │ │ + Functions │ │ │ │ │ + std::ostream & Dune::operator<< (std::ostream &s, const GeometryType │ │ │ │ │ + &a) │ │ │ │ │ +  Prints the type to an output stream. More... │ │ │ │ │ +  │ │ │ │ │ +constexpr GeometryType Dune::GeometryTypes::simplex (unsigned int dim) │ │ │ │ │ +  Returns a GeometryType representing a simplex of │ │ │ │ │ + dimension dim. More... │ │ │ │ │ +  │ │ │ │ │ +constexpr GeometryType Dune::GeometryTypes::cube (unsigned int dim) │ │ │ │ │ +  Returns a GeometryType representing a hypercube of │ │ │ │ │ + dimension dim. More... │ │ │ │ │ +  │ │ │ │ │ +constexpr GeometryType Dune::GeometryTypes::none (unsigned int dim) │ │ │ │ │ +  Returns a GeometryType representing a singular of │ │ │ │ │ + dimension dim. More... │ │ │ │ │ +  │ │ │ │ │ +constexpr GeometryType Dune::GeometryTypes::conicalExtension (const │ │ │ │ │ + GeometryType >) │ │ │ │ │ + Return GeometryType of a conical construction with gt │ │ │ │ │ +  as base │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ +constexpr GeometryType Dune::GeometryTypes::prismaticExtension (const │ │ │ │ │ + GeometryType >) │ │ │ │ │ + Return GeometryType of a prismatic construction with gt │ │ │ │ │ +  as base │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ + Variables │ │ │ │ │ +constexpr GeometryType Dune::GeometryTypes::vertex = GeometryType(0,0,false) │ │ │ │ │ +  GeometryType representing a vertex. More... │ │ │ │ │ +  │ │ │ │ │ +constexpr GeometryType Dune::GeometryTypes::line = GeometryType(0,1,false) │ │ │ │ │ +  GeometryType representing a line. More... │ │ │ │ │ +  │ │ │ │ │ +constexpr GeometryType Dune::GeometryTypes::triangle = simplex(2) │ │ │ │ │ +  GeometryType representing a triangle. More... │ │ │ │ │ +  │ │ │ │ │ +constexpr GeometryType Dune::GeometryTypes::quadrilateral = cube(2) │ │ │ │ │ +  GeometryType representing a quadrilateral (a square). │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ +constexpr GeometryType Dune::GeometryTypes::tetrahedron = simplex(3) │ │ │ │ │ +  GeometryType representing a tetrahedron. More... │ │ │ │ │ +  │ │ │ │ │ +constexpr GeometryType Dune::GeometryTypes::pyramid = GeometryType │ │ │ │ │ + (0b0011,3,false) │ │ │ │ │ +  GeometryType representing a 3D pyramid. More... │ │ │ │ │ +  │ │ │ │ │ +constexpr GeometryType Dune::GeometryTypes::prism = GeometryType │ │ │ │ │ + (0b0101,3,false) │ │ │ │ │ +  GeometryType representing a 3D prism. More... │ │ │ │ │   │ │ │ │ │ - Namespaces │ │ │ │ │ -namespace  Dune │ │ │ │ │ +constexpr GeometryType Dune::GeometryTypes::hexahedron = cube(3) │ │ │ │ │ +  GeometryType representing a hexahedron. More... │ │ │ │ │   │ │ │ │ │ +***** Detailed Description ***** │ │ │ │ │ +A unique label for each type of element that can occur in a grid. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00218_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: multilineargeometry.hh Source File │ │ │ │ +dune-geometry: type.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,744 +62,446 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
multilineargeometry.hh
│ │ │ │ +
type.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │
2// vi: set et ts=4 sw=2 sts=2:
│ │ │ │
3// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
5#ifndef DUNE_GEOMETRY_MULTILINEARGEOMETRY_HH
│ │ │ │ -
6#define DUNE_GEOMETRY_MULTILINEARGEOMETRY_HH
│ │ │ │ +
5#ifndef DUNE_GEOMETRY_TYPE_HH
│ │ │ │ +
6#define DUNE_GEOMETRY_TYPE_HH
│ │ │ │
7
│ │ │ │ -
8#include <cassert>
│ │ │ │ -
9#include <functional>
│ │ │ │ -
10#include <iterator>
│ │ │ │ -
11#include <limits>
│ │ │ │ -
12#include <vector>
│ │ │ │ +
12#include <cassert>
│ │ │ │
13
│ │ │ │ -
14#include <dune/common/fmatrix.hh>
│ │ │ │ -
15#include <dune/common/fvector.hh>
│ │ │ │ -
16#include <dune/common/typetraits.hh>
│ │ │ │ -
17
│ │ │ │ - │ │ │ │ - │ │ │ │ -
20#include <dune/geometry/type.hh>
│ │ │ │ +
14#include <string>
│ │ │ │ +
15#include <type_traits>
│ │ │ │ +
16
│ │ │ │ +
17#include <dune/common/exceptions.hh>
│ │ │ │ +
18#include <dune/common/keywords.hh>
│ │ │ │ +
19#include <dune/common/typetraits.hh>
│ │ │ │ +
20#include <dune/common/unused.hh>
│ │ │ │
21
│ │ │ │
22namespace Dune
│ │ │ │
23{
│ │ │ │
24
│ │ │ │ -
25 // MultiLinearGeometryTraits
│ │ │ │ -
26 // -------------------------
│ │ │ │ +
25 namespace Impl
│ │ │ │ +
26 {
│ │ │ │
27
│ │ │ │ -
37 template< class ct >
│ │ │ │ - │ │ │ │ -
39 {
│ │ │ │ -
58 typedef Impl::FieldMatrixHelper< ct > MatrixHelper;
│ │ │ │ -
59
│ │ │ │ -
61 static ct tolerance () { return ct( 16 ) * std::numeric_limits< ct >::epsilon(); }
│ │ │ │ -
62
│ │ │ │ -
127 template< int mydim, int cdim >
│ │ │ │ - │ │ │ │ -
129 {
│ │ │ │ -
130 typedef std::vector< FieldVector< ct, cdim > > Type;
│ │ │ │ -
131 };
│ │ │ │ -
132
│ │ │ │ -
146 template< int dim >
│ │ │ │ - │ │ │ │ -
148 {
│ │ │ │ -
149 static const bool v = false;
│ │ │ │ -
150 static const unsigned int topologyId = ~0u;
│ │ │ │ -
151 };
│ │ │ │ -
152 };
│ │ │ │ -
153
│ │ │ │ -
154
│ │ │ │ -
155
│ │ │ │ -
156 // MultiLinearGeometry
│ │ │ │ -
157 // -------------------
│ │ │ │ -
158
│ │ │ │ -
179 template< class ct, int mydim, int cdim, class Traits = MultiLinearGeometryTraits< ct > >
│ │ │ │ - │ │ │ │ -
181 {
│ │ │ │ - │ │ │ │ -
183
│ │ │ │ -
184 public:
│ │ │ │ -
186 typedef ct ctype;
│ │ │ │ -
187
│ │ │ │ -
189 static const int mydimension= mydim;
│ │ │ │ -
191 static const int coorddimension = cdim;
│ │ │ │ -
192
│ │ │ │ -
194 typedef FieldVector< ctype, mydimension > LocalCoordinate;
│ │ │ │ -
196 typedef FieldVector< ctype, coorddimension > GlobalCoordinate;
│ │ │ │ -
198 typedef ctype Volume;
│ │ │ │ -
199
│ │ │ │ -
201 typedef FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed;
│ │ │ │ -
202
│ │ │ │ - │ │ │ │ -
205
│ │ │ │ -
207 typedef FieldMatrix< ctype, coorddimension, mydimension > Jacobian;
│ │ │ │ +
28 enum TopologyConstruction { pyramidConstruction = 0, prismConstruction = 1 };
│ │ │ │ +
29
│ │ │ │ +
30 // Dynamic Topology Properties
│ │ │ │ +
31 // ---------------------------
│ │ │ │ +
32
│ │ │ │ +
41 inline static unsigned int numTopologies ( int dim ) noexcept
│ │ │ │ +
42 {
│ │ │ │ +
43 return (1u << dim);
│ │ │ │ +
44 }
│ │ │ │ +
45
│ │ │ │ +
57 inline bool static isPyramid ( unsigned int topologyId, int dim, int codim = 0 ) noexcept
│ │ │ │ +
58 {
│ │ │ │ +
59 assert( (dim > 0) && (topologyId < numTopologies( dim )) );
│ │ │ │ +
60 assert( (0 <= codim) && (codim < dim) );
│ │ │ │ +
61 return (((topologyId & ~1) & (1u << (dim-codim-1))) == 0);
│ │ │ │ +
62 }
│ │ │ │ +
63
│ │ │ │ +
75 inline static bool isPrism ( unsigned int topologyId, int dim, int codim = 0 ) noexcept
│ │ │ │ +
76 {
│ │ │ │ +
77 assert( (dim > 0) && (topologyId < numTopologies( dim )) );
│ │ │ │ +
78 assert( (0 <= codim) && (codim < dim) );
│ │ │ │ +
79 return (( (topologyId | 1) & (1u << (dim-codim-1))) != 0);
│ │ │ │ +
80 }
│ │ │ │ +
81
│ │ │ │ +
89 inline static unsigned int baseTopologyId ( unsigned int topologyId, int dim, int codim = 1 ) noexcept
│ │ │ │ +
90 {
│ │ │ │ +
91 assert( (dim >= 0) && (topologyId < numTopologies( dim )) );
│ │ │ │ +
92 assert( (0 <= codim) && (codim <= dim) );
│ │ │ │ +
93 return topologyId & ((1u << (dim-codim)) - 1);
│ │ │ │ +
94 }
│ │ │ │ +
95
│ │ │ │ +
96 } // namespace Impl
│ │ │ │ +
97
│ │ │ │ +
98// the Topology classes are deprecated and will be removed for the 2.8.
│ │ │ │ +
99// Temporarily a header 'deprecated_topology.hh' is provided which will be removed after the 2.9 release.
│ │ │ │ +
100#if __GNUC__ >= 7
│ │ │ │ +
101# pragma GCC diagnostic push
│ │ │ │ +
102# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
│ │ │ │ +
103#endif
│ │ │ │ + │ │ │ │ +
105#if __GNUC__ >= 7
│ │ │ │ +
106# pragma GCC diagnostic pop
│ │ │ │ +
107#endif
│ │ │ │ +
108
│ │ │ │ +
109 // GeometryType
│ │ │ │ +
110 // -------------
│ │ │ │ +
111
│ │ │ │ + │ │ │ │ +
125 {
│ │ │ │ +
126 public:
│ │ │ │ +
127
│ │ │ │ +
130 enum
│ │ │ │ +
131 BasicType {
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
137 none
│ │ │ │ +
138 };
│ │ │ │ +
139
│ │ │ │ +
140 private:
│ │ │ │ +
141
│ │ │ │ +
143 unsigned char dim_;
│ │ │ │ +
144
│ │ │ │ +
146 bool none_;
│ │ │ │ +
147
│ │ │ │ +
149 unsigned int topologyId_;
│ │ │ │ +
150
│ │ │ │ +
151 // Internal type used for the Id. The exact nature of this type is kept
│ │ │ │ +
152 // as an implementation detail on purpose. We use a scoped enum here because scoped enums
│ │ │ │ +
153 // can be used as template parameters, but are not implicitly converted to other integral
│ │ │ │ +
154 // types by the compiler. That way, we avoid unfortunate implicit conversion chains, e.g.
│ │ │ │ +
155 // people trying to work with GlobalGeometryTypeIndex, but forgetting to actually call
│ │ │ │ +
156 // GlobalGeometryTypeIndex::index(gt) and just using gt directly.
│ │ │ │ +
157 enum class IdType : std::uint64_t
│ │ │ │ +
158 {};
│ │ │ │ +
159
│ │ │ │ +
160 public:
│ │ │ │ +
161
│ │ │ │ +
192 using Id = IdType;
│ │ │ │ +
193
│ │ │ │ +
201 constexpr operator Id() const
│ │ │ │ +
202 {
│ │ │ │ +
203 // recreate the exact storage layout that this class is using, making conversion
│ │ │ │ +
204 // extremely cheap
│ │ │ │ +
205 std::uint64_t id = dim_ | (std::uint64_t(none_) << 8) | (std::uint64_t(topologyId_) << 32);
│ │ │ │ +
206 return static_cast<Id>(id);
│ │ │ │ +
207 }
│ │ │ │
208
│ │ │ │ -
210 typedef FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse;
│ │ │ │ -
211
│ │ │ │ -
212 protected:
│ │ │ │ -
213
│ │ │ │ - │ │ │ │ -
215
│ │ │ │ -
216 public:
│ │ │ │ -
217
│ │ │ │ - │ │ │ │ -
220
│ │ │ │ -
221 private:
│ │ │ │ -
222 static const bool hasSingleGeometryType = Traits::template hasSingleGeometryType< mydimension >::v;
│ │ │ │ -
223
│ │ │ │ -
224 protected:
│ │ │ │ -
225 typedef typename Traits::MatrixHelper MatrixHelper;
│ │ │ │ -
226 typedef typename std::conditional< hasSingleGeometryType, std::integral_constant< unsigned int, Traits::template hasSingleGeometryType< mydimension >::topologyId >, unsigned int >::type TopologyId;
│ │ │ │ -
227
│ │ │ │ -
228 public:
│ │ │ │ -
238 template< class Corners >
│ │ │ │ - │ │ │ │ -
240 const Corners &corners )
│ │ │ │ -
241 : refElement_( refElement ),
│ │ │ │ -
242 corners_( corners )
│ │ │ │ -
243 {}
│ │ │ │ -
244
│ │ │ │ -
254 template< class Corners >
│ │ │ │ - │ │ │ │ -
256 const Corners &corners )
│ │ │ │ -
257 : refElement_( ReferenceElements::general( gt ) ),
│ │ │ │ -
258 corners_( corners )
│ │ │ │ -
259 {}
│ │ │ │ -
260
│ │ │ │ -
262 bool affine () const
│ │ │ │ -
263 {
│ │ │ │ - │ │ │ │ -
265 return affine( jt );
│ │ │ │ -
266 }
│ │ │ │ -
267
│ │ │ │ -
269 Dune::GeometryType type () const { return GeometryType( toUnsignedInt(topologyId()), mydimension ); }
│ │ │ │ -
270
│ │ │ │ -
272 int corners () const { return refElement().size( mydimension ); }
│ │ │ │ -
273
│ │ │ │ -
275 GlobalCoordinate corner ( int i ) const
│ │ │ │ -
276 {
│ │ │ │ -
277 assert( (i >= 0) && (i < corners()) );
│ │ │ │ -
278 return std::cref(corners_).get()[ i ];
│ │ │ │ -
279 }
│ │ │ │ -
280
│ │ │ │ -
282 GlobalCoordinate center () const { return global( refElement().position( 0, 0 ) ); }
│ │ │ │ +
221 constexpr Id toId() const
│ │ │ │ +
222 {
│ │ │ │ +
223 return static_cast<Id>(*this);
│ │ │ │ +
224 }
│ │ │ │ +
225
│ │ │ │ +
233 constexpr GeometryType(Id id)
│ │ │ │ +
234 : dim_(static_cast<std::uint64_t>(id) & 0xFF)
│ │ │ │ +
235 , none_(static_cast<std::uint64_t>(id) & 0x100)
│ │ │ │ +
236 , topologyId_(static_cast<std::uint64_t>(id) >> 32)
│ │ │ │ +
237 {}
│ │ │ │ +
238
│ │ │ │ +
241
│ │ │ │ +
243 constexpr GeometryType ()
│ │ │ │ +
244 : dim_(0), none_(true), topologyId_(0)
│ │ │ │ +
245 {}
│ │ │ │ +
246
│ │ │ │ +
253 constexpr GeometryType(unsigned int topologyId, unsigned int dim, bool isNone)
│ │ │ │ +
254 : dim_(dim), none_(isNone), topologyId_(topologyId)
│ │ │ │ +
255 {}
│ │ │ │ +
256
│ │ │ │ +
262 constexpr GeometryType(unsigned int topologyId, unsigned int dim)
│ │ │ │ +
263 : dim_(dim), none_(false), topologyId_(topologyId)
│ │ │ │ +
264 {}
│ │ │ │ +
265
│ │ │ │ +
276 template<class TopologyType,
│ │ │ │ +
277 class = std::void_t<decltype(TopologyType::dimension), decltype(TopologyType::id)>>
│ │ │ │ +
278 explicit GeometryType(TopologyType t)
│ │ │ │ +
279 : dim_(TopologyType::dimension), none_(false), topologyId_(TopologyType::id)
│ │ │ │ +
280 {
│ │ │ │ +
281 DUNE_UNUSED_PARAMETER(t);
│ │ │ │ +
282 }
│ │ │ │
283
│ │ │ │ - │ │ │ │ -
291 {
│ │ │ │ -
292 using std::begin;
│ │ │ │ +
290 constexpr bool isVertex() const {
│ │ │ │ +
291 return dim_==0;
│ │ │ │ +
292 }
│ │ │ │
293
│ │ │ │ -
294 auto cit = begin(std::cref(corners_).get());
│ │ │ │ - │ │ │ │ -
296 global< false >( topologyId(), std::integral_constant< int, mydimension >(), cit, ctype( 1 ), local, ctype( 1 ), y );
│ │ │ │ -
297 return y;
│ │ │ │ -
298 }
│ │ │ │ -
299
│ │ │ │ -
312 LocalCoordinate local ( const GlobalCoordinate &globalCoord ) const
│ │ │ │ -
313 {
│ │ │ │ -
314 const ctype tolerance = Traits::tolerance();
│ │ │ │ -
315 LocalCoordinate x = refElement().position( 0, 0 );
│ │ │ │ - │ │ │ │ -
317 const bool affineMapping = this->affine();
│ │ │ │ -
318 do
│ │ │ │ -
319 {
│ │ │ │ -
320 // Newton's method: DF^n dx^n = F^n, x^{n+1} -= dx^n
│ │ │ │ -
321 const GlobalCoordinate dglobal = (*this).global( x ) - globalCoord;
│ │ │ │ -
322 const bool invertible =
│ │ │ │ -
323 MatrixHelper::template xTRightInvA< mydimension, coorddimension >( jacobianTransposed( x ), dglobal, dx );
│ │ │ │ -
324 if( ! invertible )
│ │ │ │ -
325 return LocalCoordinate( std::numeric_limits< ctype > :: max() );
│ │ │ │ -
326
│ │ │ │ -
327 // update x with correction
│ │ │ │ -
328 x -= dx;
│ │ │ │ -
329
│ │ │ │ -
330 // for affine mappings only one iteration is needed
│ │ │ │ -
331 if ( affineMapping ) break;
│ │ │ │ -
332 } while( dx.two_norm2() > tolerance );
│ │ │ │ -
333 return x;
│ │ │ │ -
334 }
│ │ │ │ -
335
│ │ │ │ - │ │ │ │ -
351 {
│ │ │ │ -
352 return MatrixHelper::template sqrtDetAAT< mydimension, coorddimension >( jacobianTransposed( local ) );
│ │ │ │ -
353 }
│ │ │ │ -
354
│ │ │ │ -
363 Volume volume () const
│ │ │ │ -
364 {
│ │ │ │ -
365 return integrationElement( refElement().position( 0, 0 ) ) * refElement().volume();
│ │ │ │ -
366 }
│ │ │ │ -
367
│ │ │ │ - │ │ │ │ -
378 {
│ │ │ │ -
379 using std::begin;
│ │ │ │ -
380
│ │ │ │ - │ │ │ │ -
382 auto cit = begin(std::cref(corners_).get());
│ │ │ │ -
383 jacobianTransposed< false >( topologyId(), std::integral_constant< int, mydimension >(), cit, ctype( 1 ), local, ctype( 1 ), jt );
│ │ │ │ -
384 return jt;
│ │ │ │ -
385 }
│ │ │ │ -
386
│ │ │ │ -
393 JacobianInverseTransposed jacobianInverseTransposed ( const LocalCoordinate &local ) const;
│ │ │ │ -
394
│ │ │ │ - │ │ │ │ -
396 {
│ │ │ │ -
397 return geometry.refElement();
│ │ │ │ -
398 }
│ │ │ │ -
399
│ │ │ │ -
400
│ │ │ │ -
407 Jacobian jacobian (const LocalCoordinate &local) const
│ │ │ │ -
408 {
│ │ │ │ -
409 return jacobianTransposed(local).transposed();
│ │ │ │ -
410 }
│ │ │ │ -
411
│ │ │ │ - │ │ │ │ -
419 {
│ │ │ │ -
420 return jacobianInverseTransposed(local).transposed();
│ │ │ │ -
421 }
│ │ │ │ -
422
│ │ │ │ -
423 protected:
│ │ │ │ -
424
│ │ │ │ - │ │ │ │ -
426 {
│ │ │ │ -
427 return refElement_;
│ │ │ │ -
428 }
│ │ │ │ -
429
│ │ │ │ - │ │ │ │ -
431 {
│ │ │ │ -
432 return topologyId( std::integral_constant< bool, hasSingleGeometryType >() );
│ │ │ │ -
433 }
│ │ │ │ -
434
│ │ │ │ -
435 template< bool add, int dim, class CornerIterator >
│ │ │ │ -
436 static void global ( TopologyId topologyId, std::integral_constant< int, dim >,
│ │ │ │ -
437 CornerIterator &cit, const ctype &df, const LocalCoordinate &x,
│ │ │ │ -
438 const ctype &rf, GlobalCoordinate &y );
│ │ │ │ -
439 template< bool add, class CornerIterator >
│ │ │ │ -
440 static void global ( TopologyId topologyId, std::integral_constant< int, 0 >,
│ │ │ │ -
441 CornerIterator &cit, const ctype &df, const LocalCoordinate &x,
│ │ │ │ -
442 const ctype &rf, GlobalCoordinate &y );
│ │ │ │ -
443
│ │ │ │ -
444 template< bool add, int rows, int dim, class CornerIterator >
│ │ │ │ -
445 static void jacobianTransposed ( TopologyId topologyId, std::integral_constant< int, dim >,
│ │ │ │ -
446 CornerIterator &cit, const ctype &df, const LocalCoordinate &x,
│ │ │ │ -
447 const ctype &rf, FieldMatrix< ctype, rows, cdim > &jt );
│ │ │ │ -
448 template< bool add, int rows, class CornerIterator >
│ │ │ │ -
449 static void jacobianTransposed ( TopologyId topologyId, std::integral_constant< int, 0 >,
│ │ │ │ -
450 CornerIterator &cit, const ctype &df, const LocalCoordinate &x,
│ │ │ │ -
451 const ctype &rf, FieldMatrix< ctype, rows, cdim > &jt );
│ │ │ │ -
452
│ │ │ │ -
453 template< int dim, class CornerIterator >
│ │ │ │ -
454 static bool affine ( TopologyId topologyId, std::integral_constant< int, dim >, CornerIterator &cit, JacobianTransposed &jt );
│ │ │ │ -
455 template< class CornerIterator >
│ │ │ │ -
456 static bool affine ( TopologyId topologyId, std::integral_constant< int, 0 >, CornerIterator &cit, JacobianTransposed &jt );
│ │ │ │ -
457
│ │ │ │ -
458 bool affine ( JacobianTransposed &jacobianT ) const
│ │ │ │ -
459 {
│ │ │ │ -
460 using std::begin;
│ │ │ │ -
461
│ │ │ │ -
462 auto cit = begin(std::cref(corners_).get());
│ │ │ │ -
463 return affine( topologyId(), std::integral_constant< int, mydimension >(), cit, jacobianT );
│ │ │ │ -
464 }
│ │ │ │ -
465
│ │ │ │ -
466 private:
│ │ │ │ -
467 // The following methods are needed to convert the return type of topologyId to
│ │ │ │ -
468 // unsigned int with g++-4.4. It has problems casting integral_constant to the
│ │ │ │ -
469 // integral type.
│ │ │ │ -
470 static unsigned int toUnsignedInt(unsigned int i) { return i; }
│ │ │ │ -
471 template<unsigned int v>
│ │ │ │ -
472 static unsigned int toUnsignedInt(std::integral_constant<unsigned int,v> ) { return v; }
│ │ │ │ -
473 TopologyId topologyId ( std::integral_constant< bool, true > ) const { return TopologyId(); }
│ │ │ │ -
474 unsigned int topologyId ( std::integral_constant< bool, false > ) const { return refElement().type().id(); }
│ │ │ │ -
475
│ │ │ │ -
476 ReferenceElement refElement_;
│ │ │ │ -
477 typename Traits::template CornerStorage< mydimension, coorddimension >::Type corners_;
│ │ │ │ -
478 };
│ │ │ │ -
479
│ │ │ │ -
480
│ │ │ │ -
481
│ │ │ │ -
482 // MultiLinearGeometry::JacobianInverseTransposed
│ │ │ │ -
483 // ----------------------------------------------
│ │ │ │ -
484
│ │ │ │ -
485 template< class ct, int mydim, int cdim, class Traits >
│ │ │ │ -
486 class MultiLinearGeometry< ct, mydim, cdim, Traits >::JacobianInverseTransposed
│ │ │ │ -
487 : public FieldMatrix< ctype, coorddimension, mydimension >
│ │ │ │ -
488 {
│ │ │ │ -
489 typedef FieldMatrix< ctype, coorddimension, mydimension > Base;
│ │ │ │ -
490
│ │ │ │ -
491 public:
│ │ │ │ -
492 void setup ( const JacobianTransposed &jt )
│ │ │ │ -
493 {
│ │ │ │ -
494 detInv_ = MatrixHelper::template rightInvA< mydimension, coorddimension >( jt, static_cast< Base & >( *this ) );
│ │ │ │ -
495 }
│ │ │ │ -
496
│ │ │ │ - │ │ │ │ -
498 {
│ │ │ │ -
499 detInv_ = MatrixHelper::template sqrtDetAAT< mydimension, coorddimension >( jt );
│ │ │ │ -
500 }
│ │ │ │ +
295 constexpr bool isLine() const {
│ │ │ │ +
296 return dim_==1;
│ │ │ │ +
297 }
│ │ │ │ +
298
│ │ │ │ +
300 constexpr bool isTriangle() const {
│ │ │ │ +
301 return ! none_ && dim_==2 && (topologyId_ | 1) == 0b0001;
│ │ │ │ +
302 }
│ │ │ │ +
303
│ │ │ │ +
305 constexpr bool isQuadrilateral() const {
│ │ │ │ +
306 return ! none_ && dim_==2 && (topologyId_ | 1) == 0b0011;
│ │ │ │ +
307 }
│ │ │ │ +
308
│ │ │ │ +
310 constexpr bool isTetrahedron() const {
│ │ │ │ +
311 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0001;
│ │ │ │ +
312 }
│ │ │ │ +
313
│ │ │ │ +
315 constexpr bool isPyramid() const {
│ │ │ │ +
316 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0011;
│ │ │ │ +
317 }
│ │ │ │ +
318
│ │ │ │ +
320 constexpr bool isPrism() const {
│ │ │ │ +
321 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0101;
│ │ │ │ +
322 }
│ │ │ │ +
323
│ │ │ │ +
325 constexpr bool isHexahedron() const {
│ │ │ │ +
326 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0111;
│ │ │ │ +
327 }
│ │ │ │ +
328
│ │ │ │ +
330 constexpr bool isSimplex() const {
│ │ │ │ +
331 return ! none_ && (topologyId_ | 1) == 1;
│ │ │ │ +
332 }
│ │ │ │ +
333
│ │ │ │ +
335 constexpr bool isCube() const {
│ │ │ │ +
336 return ! none_ && ((topologyId_ ^ ((1 << dim_)-1)) >> 1 == 0);
│ │ │ │ +
337 }
│ │ │ │ +
338
│ │ │ │ +
340 constexpr bool isConical() const {
│ │ │ │ +
341 return ! none_ && (((topologyId_ & ~1) & (1u << (dim_-1))) == 0);
│ │ │ │ +
342 }
│ │ │ │ +
343
│ │ │ │ +
348 constexpr bool isConical(const int& step) const {
│ │ │ │ +
349 return ! none_ && (((topologyId_ & ~1) & (1u << step)) == 0);
│ │ │ │ +
350 }
│ │ │ │ +
351
│ │ │ │ +
353 constexpr bool isPrismatic() const {
│ │ │ │ +
354 return ! none_ && (( (topologyId_ | 1) & (1u << (dim_-1))) != 0);
│ │ │ │ +
355 }
│ │ │ │ +
356
│ │ │ │ +
361 constexpr bool isPrismatic(const int& step) const {
│ │ │ │ +
362 return ! none_ && (( (topologyId_ | 1) & (1u << step)) != 0);
│ │ │ │ +
363 }
│ │ │ │ +
364
│ │ │ │ +
366 constexpr bool isNone() const {
│ │ │ │ +
367 return none_;
│ │ │ │ +
368 }
│ │ │ │ +
369
│ │ │ │ +
371 constexpr unsigned int dim() const {
│ │ │ │ +
372 return dim_;
│ │ │ │ +
373 }
│ │ │ │ +
374
│ │ │ │ +
376 constexpr unsigned int id() const {
│ │ │ │ +
377 return topologyId_;
│ │ │ │ +
378 }
│ │ │ │ +
379
│ │ │ │ +
387 constexpr bool operator==(const GeometryType& other) const {
│ │ │ │ +
388 return ( ( none_ == other.none_ )
│ │ │ │ +
389 && ( ( none_ == true )
│ │ │ │ +
390 || ( ( dim_ == other.dim_ )
│ │ │ │ +
391 && ( (topologyId_ >> 1) == (other.topologyId_ >> 1) )
│ │ │ │ +
392 )
│ │ │ │ +
393 )
│ │ │ │ +
394 );
│ │ │ │ +
395 }
│ │ │ │ +
396
│ │ │ │ +
398 constexpr bool operator!=(const GeometryType& other) const {
│ │ │ │ +
399 return ! ((*this)==other);
│ │ │ │ +
400 }
│ │ │ │ +
401
│ │ │ │ +
403 constexpr bool operator < (const GeometryType& other) const {
│ │ │ │ +
404 return ( ( none_ < other.none_ )
│ │ │ │ +
405 || ( !( other.none_ < none_ )
│ │ │ │ +
406 && ( ( dim_ < other.dim_ )
│ │ │ │ +
407 || ( (other.dim_ == dim_)
│ │ │ │ +
408 && ((topologyId_ >> 1) < (other.topologyId_ >> 1) )
│ │ │ │ +
409 )
│ │ │ │ +
410 )
│ │ │ │ +
411 )
│ │ │ │ +
412 );
│ │ │ │ +
413 }
│ │ │ │ +
414
│ │ │ │ +
417 };
│ │ │ │ +
418
│ │ │ │ +
420 inline std::ostream& operator<< (std::ostream& s, const GeometryType& a)
│ │ │ │ +
421 {
│ │ │ │ +
422 if (a.isSimplex())
│ │ │ │ +
423 {
│ │ │ │ +
424 s << "(simplex, " << a.dim() << ")";
│ │ │ │ +
425 return s;
│ │ │ │ +
426 }
│ │ │ │ +
427 if (a.isCube())
│ │ │ │ +
428 {
│ │ │ │ +
429 s << "(cube, " << a.dim() << ")";
│ │ │ │ +
430 return s;
│ │ │ │ +
431 }
│ │ │ │ +
432 if (a.isPyramid())
│ │ │ │ +
433 {
│ │ │ │ +
434 s << "(pyramid, 3)";
│ │ │ │ +
435 return s;
│ │ │ │ +
436 }
│ │ │ │ +
437 if (a.isPrism())
│ │ │ │ +
438 {
│ │ │ │ +
439 s << "(prism, 3)";
│ │ │ │ +
440 return s;
│ │ │ │ +
441 }
│ │ │ │ +
442 if (a.isNone())
│ │ │ │ +
443 {
│ │ │ │ +
444 s << "(none, " << a.dim() << ")";
│ │ │ │ +
445 return s;
│ │ │ │ +
446 }
│ │ │ │ +
447 s << "(other [" << a.id() << "], " << a.dim() << ")";
│ │ │ │ +
448 return s;
│ │ │ │ +
449 }
│ │ │ │ +
450
│ │ │ │ +
451
│ │ │ │ +
453
│ │ │ │ +
457 namespace GeometryTypes {
│ │ │ │ +
458
│ │ │ │ +
460
│ │ │ │ +
463 inline constexpr GeometryType simplex(unsigned int dim)
│ │ │ │ +
464 {
│ │ │ │ +
465 return GeometryType(0,dim,false);
│ │ │ │ +
466 }
│ │ │ │ +
467
│ │ │ │ +
469
│ │ │ │ +
472 inline constexpr GeometryType cube(unsigned int dim)
│ │ │ │ +
473 {
│ │ │ │ +
474 return GeometryType(((dim>1) ? ((1 << dim) - 1) : 0),dim,false);
│ │ │ │ +
475 }
│ │ │ │ +
476
│ │ │ │ +
478
│ │ │ │ +
481 inline constexpr GeometryType none(unsigned int dim)
│ │ │ │ +
482 {
│ │ │ │ +
483 return GeometryType(0,dim,true);
│ │ │ │ +
484 }
│ │ │ │ +
485
│ │ │ │ +
487 inline constexpr GeometryType conicalExtension(const GeometryType& gt)
│ │ │ │ +
488 {
│ │ │ │ +
489 return GeometryType(gt.id(), gt.dim()+1, gt.isNone());
│ │ │ │ +
490 }
│ │ │ │ +
491
│ │ │ │ +
493 inline constexpr GeometryType prismaticExtension(const GeometryType& gt)
│ │ │ │ +
494 {
│ │ │ │ +
495 return GeometryType(gt.id() | ((1 << gt.dim())), gt.dim()+1, gt.isNone());
│ │ │ │ +
496 }
│ │ │ │ +
497
│ │ │ │ +
498#ifndef __cpp_inline_variables
│ │ │ │ +
499 namespace {
│ │ │ │ +
500#endif
│ │ │ │
501
│ │ │ │ -
502 ctype det () const { return ctype( 1 ) / detInv_; }
│ │ │ │ -
503 ctype detInv () const { return detInv_; }
│ │ │ │ -
504
│ │ │ │ -
505 private:
│ │ │ │ -
506 ctype detInv_;
│ │ │ │ -
507 };
│ │ │ │ -
508
│ │ │ │ +
503
│ │ │ │ +
506 DUNE_INLINE_VARIABLE constexpr GeometryType vertex = GeometryType(0,0,false);
│ │ │ │ +
507
│ │ │ │
509
│ │ │ │ -
510
│ │ │ │ -
523 template< class ct, int mydim, int cdim, class Traits = MultiLinearGeometryTraits< ct > >
│ │ │ │ - │ │ │ │ -
525 : public MultiLinearGeometry< ct, mydim, cdim, Traits >
│ │ │ │ -
526 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
529
│ │ │ │ -
530 protected:
│ │ │ │ - │ │ │ │ -
532
│ │ │ │ -
533 public:
│ │ │ │ - │ │ │ │ -
535
│ │ │ │ -
536 typedef typename Base::ctype ctype;
│ │ │ │ +
512 DUNE_INLINE_VARIABLE constexpr GeometryType line = GeometryType(0,1,false);
│ │ │ │ +
513
│ │ │ │ +
515
│ │ │ │ +
518 DUNE_INLINE_VARIABLE constexpr GeometryType triangle = simplex(2);
│ │ │ │ +
519
│ │ │ │ +
521
│ │ │ │ +
524 DUNE_INLINE_VARIABLE constexpr GeometryType quadrilateral = cube(2);
│ │ │ │ +
525
│ │ │ │ +
527
│ │ │ │ +
530 DUNE_INLINE_VARIABLE constexpr GeometryType tetrahedron = simplex(3);
│ │ │ │ +
531
│ │ │ │ +
533
│ │ │ │ +
536 DUNE_INLINE_VARIABLE constexpr GeometryType pyramid = GeometryType(0b0011,3,false);
│ │ │ │
537
│ │ │ │ -
538 using Base::mydimension;
│ │ │ │ - │ │ │ │ -
540
│ │ │ │ - │ │ │ │ - │ │ │ │ -
543 typedef typename Base::Volume Volume;
│ │ │ │ -
544
│ │ │ │ - │ │ │ │ - │ │ │ │ -
547 typedef typename Base::Jacobian Jacobian;
│ │ │ │ - │ │ │ │ +
539
│ │ │ │ +
542 DUNE_INLINE_VARIABLE constexpr GeometryType prism = GeometryType(0b0101,3,false);
│ │ │ │ +
543
│ │ │ │ +
545
│ │ │ │ +
548 DUNE_INLINE_VARIABLE constexpr GeometryType hexahedron = cube(3);
│ │ │ │
549
│ │ │ │ -
550 template< class CornerStorage >
│ │ │ │ -
551 CachedMultiLinearGeometry ( const ReferenceElement &referenceElement, const CornerStorage &cornerStorage )
│ │ │ │ -
552 : Base( referenceElement, cornerStorage ),
│ │ │ │ -
553 affine_( Base::affine( jacobianTransposed_ ) ),
│ │ │ │ -
554 jacobianInverseTransposedComputed_( false ),
│ │ │ │ -
555 integrationElementComputed_( false )
│ │ │ │ -
556 {}
│ │ │ │ -
557
│ │ │ │ -
558 template< class CornerStorage >
│ │ │ │ -
559 CachedMultiLinearGeometry ( Dune::GeometryType gt, const CornerStorage &cornerStorage )
│ │ │ │ -
560 : Base( gt, cornerStorage ),
│ │ │ │ -
561 affine_( Base::affine( jacobianTransposed_ ) ),
│ │ │ │ -
562 jacobianInverseTransposedComputed_( false ),
│ │ │ │ -
563 integrationElementComputed_( false )
│ │ │ │ -
564 {}
│ │ │ │ -
565
│ │ │ │ -
567 bool affine () const { return affine_; }
│ │ │ │ -
568
│ │ │ │ -
569 using Base::corner;
│ │ │ │ -
570
│ │ │ │ -
572 GlobalCoordinate center () const { return global( refElement().position( 0, 0 ) ); }
│ │ │ │ -
573
│ │ │ │ - │ │ │ │ -
581 {
│ │ │ │ -
582 if( affine() )
│ │ │ │ -
583 {
│ │ │ │ - │ │ │ │ -
585 jacobianTransposed_.umtv( local, global );
│ │ │ │ -
586 return global;
│ │ │ │ -
587 }
│ │ │ │ -
588 else
│ │ │ │ -
589 return Base::global( local );
│ │ │ │ -
590 }
│ │ │ │ -
591
│ │ │ │ - │ │ │ │ -
605 {
│ │ │ │ -
606 if( affine() )
│ │ │ │ -
607 {
│ │ │ │ -
608 LocalCoordinate local;
│ │ │ │ -
609 if( jacobianInverseTransposedComputed_ )
│ │ │ │ -
610 jacobianInverseTransposed_.mtv( global - corner( 0 ), local );
│ │ │ │ -
611 else
│ │ │ │ -
612 MatrixHelper::template xTRightInvA< mydimension, coorddimension >( jacobianTransposed_, global - corner( 0 ), local );
│ │ │ │ -
613 return local;
│ │ │ │ -
614 }
│ │ │ │ -
615 else
│ │ │ │ -
616 return Base::local( global );
│ │ │ │ -
617 }
│ │ │ │ -
618
│ │ │ │ - │ │ │ │ -
634 {
│ │ │ │ -
635 if( affine() )
│ │ │ │ -
636 {
│ │ │ │ -
637 if( !integrationElementComputed_ )
│ │ │ │ -
638 {
│ │ │ │ -
639 jacobianInverseTransposed_.setupDeterminant( jacobianTransposed_ );
│ │ │ │ -
640 integrationElementComputed_ = true;
│ │ │ │ -
641 }
│ │ │ │ -
642 return jacobianInverseTransposed_.detInv();
│ │ │ │ -
643 }
│ │ │ │ -
644 else
│ │ │ │ -
645 return Base::integrationElement( local );
│ │ │ │ -
646 }
│ │ │ │ -
647
│ │ │ │ -
649 Volume volume () const
│ │ │ │ -
650 {
│ │ │ │ -
651 if( affine() )
│ │ │ │ -
652 return integrationElement( refElement().position( 0, 0 ) ) * refElement().volume();
│ │ │ │ -
653 else
│ │ │ │ -
654 return Base::volume();
│ │ │ │ -
655 }
│ │ │ │ -
656
│ │ │ │ - │ │ │ │ -
667 {
│ │ │ │ -
668 if( affine() )
│ │ │ │ -
669 return jacobianTransposed_;
│ │ │ │ -
670 else
│ │ │ │ -
671 return Base::jacobianTransposed( local );
│ │ │ │ -
672 }
│ │ │ │ -
673
│ │ │ │ - │ │ │ │ -
681 {
│ │ │ │ -
682 if( affine() )
│ │ │ │ -
683 {
│ │ │ │ -
684 if( !jacobianInverseTransposedComputed_ )
│ │ │ │ -
685 {
│ │ │ │ -
686 jacobianInverseTransposed_.setup( jacobianTransposed_ );
│ │ │ │ -
687 jacobianInverseTransposedComputed_ = true;
│ │ │ │ -
688 integrationElementComputed_ = true;
│ │ │ │ -
689 }
│ │ │ │ -
690 return jacobianInverseTransposed_;
│ │ │ │ -
691 }
│ │ │ │ -
692 else
│ │ │ │ -
693 return Base::jacobianInverseTransposed( local );
│ │ │ │ -
694 }
│ │ │ │ -
695
│ │ │ │ -
702 Jacobian jacobian (const LocalCoordinate &local) const
│ │ │ │ -
703 {
│ │ │ │ -
704 return jacobianTransposed(local).transposed();
│ │ │ │ -
705 }
│ │ │ │ -
706
│ │ │ │ - │ │ │ │ -
714 {
│ │ │ │ -
715 return jacobianInverseTransposed(local).transposed();
│ │ │ │ -
716 }
│ │ │ │ -
717
│ │ │ │ -
718 protected:
│ │ │ │ -
719 using Base::refElement;
│ │ │ │ -
720
│ │ │ │ -
721 private:
│ │ │ │ -
722 mutable JacobianTransposed jacobianTransposed_;
│ │ │ │ -
723 mutable JacobianInverseTransposed jacobianInverseTransposed_;
│ │ │ │ -
724
│ │ │ │ -
725 mutable bool affine_ : 1;
│ │ │ │ -
726
│ │ │ │ -
727 mutable bool jacobianInverseTransposedComputed_ : 1;
│ │ │ │ -
728 mutable bool integrationElementComputed_ : 1;
│ │ │ │ -
729 };
│ │ │ │ -
730
│ │ │ │ -
731
│ │ │ │ -
732
│ │ │ │ -
733 // Implementation of MultiLinearGeometry
│ │ │ │ -
734 // -------------------------------------
│ │ │ │ -
735
│ │ │ │ -
736 template< class ct, int mydim, int cdim, class Traits >
│ │ │ │ -
737 inline typename MultiLinearGeometry< ct, mydim, cdim, Traits >::JacobianInverseTransposed
│ │ │ │ - │ │ │ │ -
739 {
│ │ │ │ - │ │ │ │ -
741 jit.setup( jacobianTransposed( local ) );
│ │ │ │ -
742 return jit;
│ │ │ │ -
743 }
│ │ │ │ -
744
│ │ │ │ -
745
│ │ │ │ -
746 template< class ct, int mydim, int cdim, class Traits >
│ │ │ │ -
747 template< bool add, int dim, class CornerIterator >
│ │ │ │ - │ │ │ │ -
749 ::global ( TopologyId topologyId, std::integral_constant< int, dim >,
│ │ │ │ -
750 CornerIterator &cit, const ctype &df, const LocalCoordinate &x,
│ │ │ │ -
751 const ctype &rf, GlobalCoordinate &y )
│ │ │ │ -
752 {
│ │ │ │ -
753 const ctype xn = df*x[ dim-1 ];
│ │ │ │ -
754 const ctype cxn = ctype( 1 ) - xn;
│ │ │ │ -
755
│ │ │ │ -
756 if( Impl::isPrism( toUnsignedInt(topologyId), mydimension, mydimension-dim ) )
│ │ │ │ -
757 {
│ │ │ │ -
758 // apply (1-xn) times mapping for bottom
│ │ │ │ -
759 global< add >( topologyId, std::integral_constant< int, dim-1 >(), cit, df, x, rf*cxn, y );
│ │ │ │ -
760 // apply xn times mapping for top
│ │ │ │ -
761 global< true >( topologyId, std::integral_constant< int, dim-1 >(), cit, df, x, rf*xn, y );
│ │ │ │ -
762 }
│ │ │ │ -
763 else
│ │ │ │ -
764 {
│ │ │ │ -
765 assert( Impl::isPyramid( toUnsignedInt(topologyId), mydimension, mydimension-dim ) );
│ │ │ │ -
766 // apply (1-xn) times mapping for bottom (with argument x/(1-xn))
│ │ │ │ -
767 if( cxn > Traits::tolerance() || cxn < -Traits::tolerance() )
│ │ │ │ -
768 global< add >( topologyId, std::integral_constant< int, dim-1 >(), cit, df/cxn, x, rf*cxn, y );
│ │ │ │ -
769 else
│ │ │ │ -
770 global< add >( topologyId, std::integral_constant< int, dim-1 >(), cit, df, x, ctype( 0 ), y );
│ │ │ │ -
771 // apply xn times the tip
│ │ │ │ -
772 y.axpy( rf*xn, *cit );
│ │ │ │ -
773 ++cit;
│ │ │ │ -
774 }
│ │ │ │ -
775 }
│ │ │ │ -
776
│ │ │ │ -
777 template< class ct, int mydim, int cdim, class Traits >
│ │ │ │ -
778 template< bool add, class CornerIterator >
│ │ │ │ - │ │ │ │ -
780 ::global ( TopologyId, std::integral_constant< int, 0 >,
│ │ │ │ -
781 CornerIterator &cit, const ctype &, const LocalCoordinate &,
│ │ │ │ -
782 const ctype &rf, GlobalCoordinate &y )
│ │ │ │ -
783 {
│ │ │ │ -
784 const GlobalCoordinate &origin = *cit;
│ │ │ │ -
785 ++cit;
│ │ │ │ -
786 for( int i = 0; i < coorddimension; ++i )
│ │ │ │ -
787 y[ i ] = (add ? y[ i ] + rf*origin[ i ] : rf*origin[ i ]);
│ │ │ │ -
788 }
│ │ │ │ -
789
│ │ │ │ -
790
│ │ │ │ -
791 template< class ct, int mydim, int cdim, class Traits >
│ │ │ │ -
792 template< bool add, int rows, int dim, class CornerIterator >
│ │ │ │ - │ │ │ │ -
794 ::jacobianTransposed ( TopologyId topologyId, std::integral_constant< int, dim >,
│ │ │ │ -
795 CornerIterator &cit, const ctype &df, const LocalCoordinate &x,
│ │ │ │ -
796 const ctype &rf, FieldMatrix< ctype, rows, cdim > &jt )
│ │ │ │ -
797 {
│ │ │ │ -
798 assert( rows >= dim );
│ │ │ │ -
799
│ │ │ │ -
800 const ctype xn = df*x[ dim-1 ];
│ │ │ │ -
801 const ctype cxn = ctype( 1 ) - xn;
│ │ │ │ -
802
│ │ │ │ -
803 auto cit2( cit );
│ │ │ │ -
804 if( Impl::isPrism( toUnsignedInt(topologyId), mydimension, mydimension-dim ) )
│ │ │ │ -
805 {
│ │ │ │ -
806 // apply (1-xn) times Jacobian for bottom
│ │ │ │ -
807 jacobianTransposed< add >( topologyId, std::integral_constant< int, dim-1 >(), cit2, df, x, rf*cxn, jt );
│ │ │ │ -
808 // apply xn times Jacobian for top
│ │ │ │ -
809 jacobianTransposed< true >( topologyId, std::integral_constant< int, dim-1 >(), cit2, df, x, rf*xn, jt );
│ │ │ │ -
810 // compute last row as difference between top value and bottom value
│ │ │ │ -
811 global< add >( topologyId, std::integral_constant< int, dim-1 >(), cit, df, x, -rf, jt[ dim-1 ] );
│ │ │ │ -
812 global< true >( topologyId, std::integral_constant< int, dim-1 >(), cit, df, x, rf, jt[ dim-1 ] );
│ │ │ │ -
813 }
│ │ │ │ -
814 else
│ │ │ │ -
815 {
│ │ │ │ -
816 assert( Impl::isPyramid( toUnsignedInt(topologyId), mydimension, mydimension-dim ) );
│ │ │ │ -
817 /*
│ │ │ │ -
818 * In the pyramid case, we need a transformation Tb: B -> R^n for the
│ │ │ │ -
819 * base B \subset R^{n-1}. The pyramid transformation is then defined as
│ │ │ │ -
820 * T: P \subset R^n -> R^n
│ │ │ │ -
821 * (x, xn) |-> (1-xn) Tb(x*) + xn t (x \in R^{n-1}, xn \in R)
│ │ │ │ -
822 * with the tip of the pyramid mapped to t and x* = x/(1-xn)
│ │ │ │ -
823 * the projection of (x,xn) onto the base.
│ │ │ │ -
824 *
│ │ │ │ -
825 * For the Jacobi matrix DT we get
│ │ │ │ -
826 * DT = ( A | b )
│ │ │ │ -
827 * with A = DTb(x*) (n x n-1 matrix)
│ │ │ │ -
828 * and b = dT/dxn (n-dim column vector).
│ │ │ │ -
829 * Furthermore
│ │ │ │ -
830 * b = -Tb(x*) + t + \sum_i dTb/dx_i(x^*) x_i/(1-xn)
│ │ │ │ -
831 *
│ │ │ │ -
832 * Note that both A and b are not defined in the pyramid tip (x=0, xn=1)!
│ │ │ │ -
833 * Indeed for B the unit square, Tb mapping B to the quadrilateral given
│ │ │ │ -
834 * by the vertices (0,0,0), (2,0,0), (0,1,0), (1,1,0) and t=(0,0,1), we get
│ │ │ │ -
835 *
│ │ │ │ -
836 * T(x,y,xn) = ( x(2-y/(1-xn)), y, xn )
│ │ │ │ -
837 * / 2-y/(1-xn) -x 0 \
│ │ │ │ -
838 * DT(x,y,xn) = | 0 1 0 |
│ │ │ │ -
839 * \ 0 0 1 /
│ │ │ │ -
840 * which is not continuous for xn -> 1, choose for example
│ │ │ │ -
841 * x=0, y=1-xn, xn -> 1 --> DT -> diag(1,1,1)
│ │ │ │ -
842 * x=1-xn, y=0, xn -> 1 --> DT -> diag(2,1,1)
│ │ │ │ -
843 *
│ │ │ │ -
844 * However, for Tb affine-linear, Tb(y) = My + y0, DTb = M:
│ │ │ │ -
845 * A = M
│ │ │ │ -
846 * b = -M x* - y0 + t + \sum_i M_i x_i/(1-xn)
│ │ │ │ -
847 * = -M x* - y0 + t + M x*
│ │ │ │ -
848 * = -y0 + t
│ │ │ │ -
849 * which is continuous for xn -> 1. Note that this b is also given by
│ │ │ │ -
850 * b = -Tb(0) + t + \sum_i dTb/dx_i(0) x_i/1
│ │ │ │ -
851 * that is replacing x* by 1 and 1-xn by 1 in the formular above.
│ │ │ │ -
852 *
│ │ │ │ -
853 * For xn -> 1, we can thus set x*=0, "1-xn"=1 (or anything != 0) and get
│ │ │ │ -
854 * the right result in case Tb is affine-linear.
│ │ │ │ -
855 */
│ │ │ │ -
856
│ │ │ │ -
857 /* The second case effectively results in x* = 0 */
│ │ │ │ -
858 ctype dfcxn = (cxn > Traits::tolerance() || cxn < -Traits::tolerance()) ? ctype(df / cxn) : ctype(0);
│ │ │ │ -
859
│ │ │ │ -
860 // initialize last row
│ │ │ │ -
861 // b = -Tb(x*)
│ │ │ │ -
862 // (b = -Tb(0) = -y0 in case xn -> 1 and Tb affine-linear)
│ │ │ │ -
863 global< add >( topologyId, std::integral_constant< int, dim-1 >(), cit, dfcxn, x, -rf, jt[ dim-1 ] );
│ │ │ │ -
864 // b += t
│ │ │ │ -
865 jt[ dim-1 ].axpy( rf, *cit );
│ │ │ │ -
866 ++cit;
│ │ │ │ -
867 // apply Jacobian for bottom (with argument x/(1-xn)) and correct last row
│ │ │ │ -
868 if( add )
│ │ │ │ -
869 {
│ │ │ │ -
870 FieldMatrix< ctype, dim-1, coorddimension > jt2;
│ │ │ │ -
871 // jt2 = dTb/dx_i(x*)
│ │ │ │ -
872 jacobianTransposed< false >( topologyId, std::integral_constant< int, dim-1 >(), cit2, dfcxn, x, rf, jt2 );
│ │ │ │ -
873 // A = dTb/dx_i(x*) (jt[j], j=0..dim-1)
│ │ │ │ -
874 // b += \sum_i dTb/dx_i(x*) x_i/(1-xn) (jt[dim-1])
│ │ │ │ -
875 // (b += 0 in case xn -> 1)
│ │ │ │ -
876 for( int j = 0; j < dim-1; ++j )
│ │ │ │ -
877 {
│ │ │ │ -
878 jt[ j ] += jt2[ j ];
│ │ │ │ -
879 jt[ dim-1 ].axpy( dfcxn*x[ j ], jt2[ j ] );
│ │ │ │ -
880 }
│ │ │ │ -
881 }
│ │ │ │ -
882 else
│ │ │ │ -
883 {
│ │ │ │ -
884 // jt = dTb/dx_i(x*)
│ │ │ │ -
885 jacobianTransposed< false >( topologyId, std::integral_constant< int, dim-1 >(), cit2, dfcxn, x, rf, jt );
│ │ │ │ -
886 // b += \sum_i dTb/dx_i(x*) x_i/(1-xn)
│ │ │ │ -
887 for( int j = 0; j < dim-1; ++j )
│ │ │ │ -
888 jt[ dim-1 ].axpy( dfcxn*x[ j ], jt[ j ] );
│ │ │ │ -
889 }
│ │ │ │ -
890 }
│ │ │ │ -
891 }
│ │ │ │ -
892
│ │ │ │ -
893 template< class ct, int mydim, int cdim, class Traits >
│ │ │ │ -
894 template< bool add, int rows, class CornerIterator >
│ │ │ │ - │ │ │ │ -
896 ::jacobianTransposed ( TopologyId, std::integral_constant< int, 0 >,
│ │ │ │ -
897 CornerIterator &cit, const ctype &, const LocalCoordinate &,
│ │ │ │ -
898 const ctype &, FieldMatrix< ctype, rows, cdim > & )
│ │ │ │ -
899 {
│ │ │ │ -
900 ++cit;
│ │ │ │ -
901 }
│ │ │ │ -
902
│ │ │ │ -
903
│ │ │ │ -
904
│ │ │ │ -
905 template< class ct, int mydim, int cdim, class Traits >
│ │ │ │ -
906 template< int dim, class CornerIterator >
│ │ │ │ - │ │ │ │ -
908 ::affine ( TopologyId topologyId, std::integral_constant< int, dim >, CornerIterator &cit, JacobianTransposed &jt )
│ │ │ │ -
909 {
│ │ │ │ -
910 const GlobalCoordinate &orgBottom = *cit;
│ │ │ │ -
911 if( !affine( topologyId, std::integral_constant< int, dim-1 >(), cit, jt ) )
│ │ │ │ -
912 return false;
│ │ │ │ -
913 const GlobalCoordinate &orgTop = *cit;
│ │ │ │ -
914
│ │ │ │ -
915 if( Impl::isPrism( toUnsignedInt(topologyId), mydimension, mydimension-dim ) )
│ │ │ │ -
916 {
│ │ │ │ -
917 JacobianTransposed jtTop;
│ │ │ │ -
918 if( !affine( topologyId, std::integral_constant< int, dim-1 >(), cit, jtTop ) )
│ │ │ │ -
919 return false;
│ │ │ │ -
920
│ │ │ │ -
921 // check whether both jacobians are identical
│ │ │ │ -
922 ctype norm( 0 );
│ │ │ │ -
923 for( int i = 0; i < dim-1; ++i )
│ │ │ │ -
924 norm += (jtTop[ i ] - jt[ i ]).two_norm2();
│ │ │ │ -
925 if( norm >= Traits::tolerance() )
│ │ │ │ -
926 return false;
│ │ │ │ -
927 }
│ │ │ │ -
928 else
│ │ │ │ -
929 ++cit;
│ │ │ │ -
930 jt[ dim-1 ] = orgTop - orgBottom;
│ │ │ │ -
931 return true;
│ │ │ │ -
932 }
│ │ │ │ -
933
│ │ │ │ -
934 template< class ct, int mydim, int cdim, class Traits >
│ │ │ │ -
935 template< class CornerIterator >
│ │ │ │ - │ │ │ │ -
937 ::affine ( TopologyId, std::integral_constant< int, 0 >, CornerIterator &cit, JacobianTransposed & )
│ │ │ │ -
938 {
│ │ │ │ -
939 ++cit;
│ │ │ │ -
940 return true;
│ │ │ │ -
941 }
│ │ │ │ -
942
│ │ │ │ -
943} // namespace Dune
│ │ │ │ -
944
│ │ │ │ -
945#endif // #ifndef DUNE_GEOMETRY_MULTILINEARGEOMETRY_HH
│ │ │ │ -
An implementation of the Geometry interface for affine geometries.
│ │ │ │ -
A unique label for each type of element that can occur in a grid.
│ │ │ │ - │ │ │ │ +
550#ifndef __cpp_inline_variables
│ │ │ │ +
551 }
│ │ │ │ +
552#endif
│ │ │ │ +
553
│ │ │ │ +
554 }
│ │ │ │ +
555
│ │ │ │ +
556 namespace Impl
│ │ │ │ +
557 {
│ │ │ │ +
558
│ │ │ │ +
560 inline constexpr GeometryType getBase(const GeometryType& gt) {
│ │ │ │ +
561 return GeometryType(gt.id() & ((1 << (gt.dim()-1))-1), gt.dim()-1, gt.isNone());
│ │ │ │ +
562 }
│ │ │ │ +
563
│ │ │ │ +
564
│ │ │ │ +
565 // IfGeometryType
│ │ │ │ +
566 // ----------
│ │ │ │ +
567
│ │ │ │ +
568 template< template< GeometryType::Id > class Operation, int dim, GeometryType::Id geometryId = GeometryTypes::vertex >
│ │ │ │ +
569 struct IfGeometryType
│ │ │ │ +
570 {
│ │ │ │ +
571 static constexpr GeometryType geometry = geometryId;
│ │ │ │ +
572 template< class... Args >
│ │ │ │ +
573 static auto apply ( GeometryType gt, Args &&... args )
│ │ │ │ +
574 {
│ │ │ │ +
575 GeometryType lowerGeometry(gt.id() >>1 , gt.dim()-1, gt.isNone());
│ │ │ │ +
576
│ │ │ │ +
577 if( gt.id() & 1 )
│ │ │ │ +
578 return IfGeometryType< Operation, dim-1, GeometryTypes::prismaticExtension(geometry).toId() >::apply( lowerGeometry, std::forward< Args >( args )... );
│ │ │ │ +
579 else
│ │ │ │ +
580 return IfGeometryType< Operation, dim-1, GeometryTypes::conicalExtension(geometry).toId() >::apply( lowerGeometry, std::forward< Args >( args )... );
│ │ │ │ +
581 }
│ │ │ │ +
582 };
│ │ │ │ +
583
│ │ │ │ +
584 template< template< GeometryType::Id > class Operation, GeometryType::Id geometryId >
│ │ │ │ +
585 struct IfGeometryType< Operation, 0, geometryId>
│ │ │ │ +
586 {
│ │ │ │ +
587 template< class... Args >
│ │ │ │ +
588 static auto apply ([[maybe_unused]] GeometryType gt, Args &&... args )
│ │ │ │ +
589 {
│ │ │ │ +
590 return Operation< geometryId >::apply( std::forward< Args >( args )... );
│ │ │ │ +
591 }
│ │ │ │ +
592 };
│ │ │ │ +
593 } // namespace Impl
│ │ │ │ +
594} // namespace Dune
│ │ │ │ +
595
│ │ │ │ +
596#endif // DUNE_GEOMETRY_TYPE_HH
│ │ │ │ + │ │ │ │ +
constexpr GeometryType line
GeometryType representing a line.
Definition: type.hh:512
│ │ │ │ +
constexpr GeometryType cube(unsigned int dim)
Returns a GeometryType representing a hypercube of dimension dim.
Definition: type.hh:472
│ │ │ │ +
constexpr GeometryType prism
GeometryType representing a 3D prism.
Definition: type.hh:542
│ │ │ │ +
constexpr GeometryType triangle
GeometryType representing a triangle.
Definition: type.hh:518
│ │ │ │ +
constexpr GeometryType quadrilateral
GeometryType representing a quadrilateral (a square).
Definition: type.hh:524
│ │ │ │ +
constexpr GeometryType hexahedron
GeometryType representing a hexahedron.
Definition: type.hh:548
│ │ │ │ +
constexpr GeometryType pyramid
GeometryType representing a 3D pyramid.
Definition: type.hh:536
│ │ │ │ +
constexpr GeometryType tetrahedron
GeometryType representing a tetrahedron.
Definition: type.hh:530
│ │ │ │ +
constexpr GeometryType none(unsigned int dim)
Returns a GeometryType representing a singular of dimension dim.
Definition: type.hh:481
│ │ │ │ +
constexpr GeometryType simplex(unsigned int dim)
Returns a GeometryType representing a simplex of dimension dim.
Definition: type.hh:463
│ │ │ │ +
constexpr GeometryType vertex
GeometryType representing a vertex.
Definition: type.hh:506
│ │ │ │
Definition: affinegeometry.hh:21
│ │ │ │ -
Class providing access to the singletons of the reference elements.
Definition: referenceelements.hh:170
│ │ │ │ -
typename Container::ReferenceElement ReferenceElement
The reference element type.
Definition: referenceelements.hh:188
│ │ │ │ -
default traits class for MultiLinearGeometry
Definition: multilineargeometry.hh:39
│ │ │ │ -
Impl::FieldMatrixHelper< ct > MatrixHelper
helper structure containing some matrix routines
Definition: multilineargeometry.hh:58
│ │ │ │ -
static ct tolerance()
tolerance to numerical algorithms
Definition: multilineargeometry.hh:61
│ │ │ │ -
template specifying the storage for the corners
Definition: multilineargeometry.hh:129
│ │ │ │ -
std::vector< FieldVector< ct, cdim > > Type
Definition: multilineargeometry.hh:130
│ │ │ │ -
will there be only one geometry type for a dimension?
Definition: multilineargeometry.hh:148
│ │ │ │ -
static const unsigned int topologyId
Definition: multilineargeometry.hh:150
│ │ │ │ -
static const bool v
Definition: multilineargeometry.hh:149
│ │ │ │ -
generic geometry implementation based on corner coordinates
Definition: multilineargeometry.hh:181
│ │ │ │ -
static void global(TopologyId topologyId, std::integral_constant< int, dim >, CornerIterator &cit, const ctype &df, const LocalCoordinate &x, const ctype &rf, GlobalCoordinate &y)
Definition: multilineargeometry.hh:749
│ │ │ │ -
static const int mydimension
geometry dimension
Definition: multilineargeometry.hh:189
│ │ │ │ -
Dune::GeometryType type() const
obtain the name of the reference element
Definition: multilineargeometry.hh:269
│ │ │ │ -
Traits::MatrixHelper MatrixHelper
Definition: multilineargeometry.hh:225
│ │ │ │ -
FieldVector< ctype, coorddimension > GlobalCoordinate
type of global coordinates
Definition: multilineargeometry.hh:196
│ │ │ │ -
static void jacobianTransposed(TopologyId topologyId, std::integral_constant< int, 0 >, CornerIterator &cit, const ctype &df, const LocalCoordinate &x, const ctype &rf, FieldMatrix< ctype, rows, cdim > &jt)
Definition: multilineargeometry.hh:896
│ │ │ │ -
JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const
obtain the transposed of the Jacobian
Definition: multilineargeometry.hh:377
│ │ │ │ -
ReferenceElement refElement() const
Definition: multilineargeometry.hh:425
│ │ │ │ -
GlobalCoordinate global(const LocalCoordinate &local) const
evaluate the mapping
Definition: multilineargeometry.hh:290
│ │ │ │ -
GlobalCoordinate center() const
obtain the centroid of the mapping's image
Definition: multilineargeometry.hh:282
│ │ │ │ -
GlobalCoordinate corner(int i) const
obtain coordinates of the i-th corner
Definition: multilineargeometry.hh:275
│ │ │ │ -
Dune::ReferenceElements< ctype, mydimension > ReferenceElements
Definition: multilineargeometry.hh:214
│ │ │ │ -
ct ctype
coordinate type
Definition: multilineargeometry.hh:186
│ │ │ │ -
static void jacobianTransposed(TopologyId topologyId, std::integral_constant< int, dim >, CornerIterator &cit, const ctype &df, const LocalCoordinate &x, const ctype &rf, FieldMatrix< ctype, rows, cdim > &jt)
Definition: multilineargeometry.hh:794
│ │ │ │ -
static const int coorddimension
coordinate dimension
Definition: multilineargeometry.hh:191
│ │ │ │ -
int corners() const
obtain number of corners of the corresponding reference element
Definition: multilineargeometry.hh:272
│ │ │ │ -
TopologyId topologyId() const
Definition: multilineargeometry.hh:430
│ │ │ │ -
friend ReferenceElement referenceElement(const MultiLinearGeometry &geometry)
Definition: multilineargeometry.hh:395
│ │ │ │ -
static void global(TopologyId topologyId, std::integral_constant< int, 0 >, CornerIterator &cit, const ctype &df, const LocalCoordinate &x, const ctype &rf, GlobalCoordinate &y)
Definition: multilineargeometry.hh:780
│ │ │ │ -
Volume volume() const
obtain the volume of the mapping's image
Definition: multilineargeometry.hh:363
│ │ │ │ -
FieldVector< ctype, mydimension > LocalCoordinate
type of local coordinates
Definition: multilineargeometry.hh:194
│ │ │ │ -
MultiLinearGeometry(const ReferenceElement &refElement, const Corners &corners)
constructor
Definition: multilineargeometry.hh:239
│ │ │ │ -
static bool affine(TopologyId topologyId, std::integral_constant< int, 0 >, CornerIterator &cit, JacobianTransposed &jt)
Definition: multilineargeometry.hh:937
│ │ │ │ -
std::conditional< hasSingleGeometryType, std::integral_constant< unsignedint, Traits::templatehasSingleGeometryType< mydimension >::topologyId >, unsignedint >::type TopologyId
Definition: multilineargeometry.hh:226
│ │ │ │ -
ctype Volume
type of volume
Definition: multilineargeometry.hh:198
│ │ │ │ -
static bool affine(TopologyId topologyId, std::integral_constant< int, dim >, CornerIterator &cit, JacobianTransposed &jt)
Definition: multilineargeometry.hh:908
│ │ │ │ -
JacobianInverse jacobianInverse(const LocalCoordinate &local) const
Obtain the Jacobian's inverse.
Definition: multilineargeometry.hh:418
│ │ │ │ -
MultiLinearGeometry(Dune::GeometryType gt, const Corners &corners)
constructor
Definition: multilineargeometry.hh:255
│ │ │ │ -
FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed
type of jacobian transposed
Definition: multilineargeometry.hh:201
│ │ │ │ -
ReferenceElements::ReferenceElement ReferenceElement
type of reference element
Definition: multilineargeometry.hh:219
│ │ │ │ -
JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate &local) const
obtain the transposed of the Jacobian's inverse
Definition: multilineargeometry.hh:738
│ │ │ │ -
FieldMatrix< ctype, coorddimension, mydimension > Jacobian
Type for the Jacobian matrix.
Definition: multilineargeometry.hh:207
│ │ │ │ -
bool affine() const
is this mapping affine?
Definition: multilineargeometry.hh:262
│ │ │ │ -
FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse
Type for the inverse Jacobian matrix.
Definition: multilineargeometry.hh:210
│ │ │ │ -
bool affine(JacobianTransposed &jacobianT) const
Definition: multilineargeometry.hh:458
│ │ │ │ -
Volume integrationElement(const LocalCoordinate &local) const
obtain the integration element
Definition: multilineargeometry.hh:350
│ │ │ │ -
Jacobian jacobian(const LocalCoordinate &local) const
Obtain the Jacobian.
Definition: multilineargeometry.hh:407
│ │ │ │ -
Definition: multilineargeometry.hh:488
│ │ │ │ -
void setup(const JacobianTransposed &jt)
Definition: multilineargeometry.hh:492
│ │ │ │ -
ctype det() const
Definition: multilineargeometry.hh:502
│ │ │ │ -
ctype detInv() const
Definition: multilineargeometry.hh:503
│ │ │ │ -
void setupDeterminant(const JacobianTransposed &jt)
Definition: multilineargeometry.hh:497
│ │ │ │ -
Implement a MultiLinearGeometry with additional caching.
Definition: multilineargeometry.hh:526
│ │ │ │ -
GlobalCoordinate global(const LocalCoordinate &local) const
evaluate the mapping
Definition: multilineargeometry.hh:580
│ │ │ │ -
Base::ReferenceElement ReferenceElement
Definition: multilineargeometry.hh:534
│ │ │ │ -
bool affine() const
is this mapping affine?
Definition: multilineargeometry.hh:567
│ │ │ │ -
CachedMultiLinearGeometry(const ReferenceElement &referenceElement, const CornerStorage &cornerStorage)
Definition: multilineargeometry.hh:551
│ │ │ │ -
ReferenceElement refElement() const
Definition: multilineargeometry.hh:425
│ │ │ │ -
Base::MatrixHelper MatrixHelper
Definition: multilineargeometry.hh:531
│ │ │ │ -
Base::LocalCoordinate LocalCoordinate
Definition: multilineargeometry.hh:541
│ │ │ │ -
JacobianInverse jacobianInverse(const LocalCoordinate &local) const
Obtain the Jacobian's inverse.
Definition: multilineargeometry.hh:713
│ │ │ │ -
JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const
obtain the transposed of the Jacobian
Definition: multilineargeometry.hh:666
│ │ │ │ -
GlobalCoordinate corner(int i) const
obtain coordinates of the i-th corner
Definition: multilineargeometry.hh:275
│ │ │ │ -
Volume volume() const
obtain the volume of the mapping's image
Definition: multilineargeometry.hh:649
│ │ │ │ -
CachedMultiLinearGeometry(Dune::GeometryType gt, const CornerStorage &cornerStorage)
Definition: multilineargeometry.hh:559
│ │ │ │ -
ctype integrationElement(const LocalCoordinate &local) const
obtain the integration element
Definition: multilineargeometry.hh:633
│ │ │ │ -
Base::ctype ctype
Definition: multilineargeometry.hh:536
│ │ │ │ -
Jacobian jacobian(const LocalCoordinate &local) const
Obtain the Jacobian.
Definition: multilineargeometry.hh:702
│ │ │ │ -
Base::JacobianInverseTransposed JacobianInverseTransposed
Definition: multilineargeometry.hh:546
│ │ │ │ -
Base::JacobianTransposed JacobianTransposed
Definition: multilineargeometry.hh:545
│ │ │ │ -
Base::JacobianInverse JacobianInverse
Definition: multilineargeometry.hh:548
│ │ │ │ -
Base::Jacobian Jacobian
Definition: multilineargeometry.hh:547
│ │ │ │ -
Base::Volume Volume
Definition: multilineargeometry.hh:543
│ │ │ │ -
Base::GlobalCoordinate GlobalCoordinate
Definition: multilineargeometry.hh:542
│ │ │ │ -
GlobalCoordinate center() const
obtain the centroid of the mapping's image
Definition: multilineargeometry.hh:572
│ │ │ │ -
JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate &local) const
obtain the transposed of the Jacobian's inverse
Definition: multilineargeometry.hh:680
│ │ │ │ +
std::ostream & operator<<(std::ostream &s, const GeometryType &a)
Prints the type to an output stream.
Definition: type.hh:420
│ │ │ │ +
constexpr GeometryType prismaticExtension(const GeometryType &gt)
Return GeometryType of a prismatic construction with gt as base
Definition: type.hh:493
│ │ │ │ +
constexpr GeometryType conicalExtension(const GeometryType &gt)
Return GeometryType of a conical construction with gt as base
Definition: type.hh:487
│ │ │ │
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:125
│ │ │ │ +
constexpr GeometryType(unsigned int topologyId, unsigned int dim)
Constructor, using the topologyId (integer) and the dimension.
Definition: type.hh:262
│ │ │ │ +
constexpr bool operator<(const GeometryType &other) const
less-than operation for use with maps
Definition: type.hh:403
│ │ │ │ +
constexpr bool operator!=(const GeometryType &other) const
Check for inequality.
Definition: type.hh:398
│ │ │ │ +
constexpr bool isPyramid() const
Return true if entity is a pyramid.
Definition: type.hh:315
│ │ │ │ +
constexpr bool isTetrahedron() const
Return true if entity is a tetrahedron.
Definition: type.hh:310
│ │ │ │ +
constexpr bool isPrism() const
Return true if entity is a prism.
Definition: type.hh:320
│ │ │ │ +
constexpr bool isVertex() const
Return true if entity is a vertex.
Definition: type.hh:290
│ │ │ │ +
constexpr bool operator==(const GeometryType &other) const
Check for equality. This method knows that in dimension 0 and 1 all BasicTypes are equal.
Definition: type.hh:387
│ │ │ │ +
constexpr Id toId() const
Create an Id representation of this GeometryType.
Definition: type.hh:221
│ │ │ │ +
constexpr bool isConical(const int &step) const
Return true if entity was constructed with a conical product in the chosen step.
Definition: type.hh:348
│ │ │ │ +
constexpr unsigned int dim() const
Return dimension of the type.
Definition: type.hh:371
│ │ │ │ +
constexpr bool isPrismatic(const int &step) const
Return true if entity was constructed with a prismatic product in the chosen step.
Definition: type.hh:361
│ │ │ │ +
constexpr bool isTriangle() const
Return true if entity is a triangle.
Definition: type.hh:300
│ │ │ │ +
GeometryType(TopologyType t)
Constructor from static TopologyType class.
Definition: type.hh:278
│ │ │ │ +
constexpr GeometryType(unsigned int topologyId, unsigned int dim, bool isNone)
Constructor, using the topologyId (integer), the dimension and a flag for type none.
Definition: type.hh:253
│ │ │ │ +
BasicType
Each entity can be tagged by one of these basic types plus its space dimension.
Definition: type.hh:131
│ │ │ │ +
@ cube
Cube element in any nonnegative dimension.
Definition: type.hh:133
│ │ │ │ +
@ simplex
Simplicial element in any nonnegative dimension.
Definition: type.hh:132
│ │ │ │ +
@ pyramid
Four sided pyramid in three dimensions.
Definition: type.hh:134
│ │ │ │ +
@ extended
Other, more general topology, representable as topologyId.
Definition: type.hh:136
│ │ │ │ +
@ none
Even more general topology, cannot be specified by a topologyId. Two GeometryTypes with 'none' type a...
Definition: type.hh:137
│ │ │ │ +
@ prism
Prism element in three dimensions.
Definition: type.hh:135
│ │ │ │ +
constexpr GeometryType(Id id)
Reconstruct a Geometry type from a GeometryType::Id.
Definition: type.hh:233
│ │ │ │ +
constexpr bool isCube() const
Return true if entity is a cube of any dimension.
Definition: type.hh:335
│ │ │ │ +
constexpr GeometryType()
Default constructor, not initializing anything.
Definition: type.hh:243
│ │ │ │ +
constexpr bool isConical() const
Return true if entity was constructed with a conical product in the last step.
Definition: type.hh:340
│ │ │ │ +
constexpr bool isLine() const
Return true if entity is a line segment.
Definition: type.hh:295
│ │ │ │ +
constexpr bool isQuadrilateral() const
Return true if entity is a quadrilateral.
Definition: type.hh:305
│ │ │ │ +
constexpr bool isPrismatic() const
Return true if entity was constructed with a prismatic product in the last step.
Definition: type.hh:353
│ │ │ │ +
constexpr unsigned int id() const
Return the topology id of the type.
Definition: type.hh:376
│ │ │ │ +
constexpr bool isNone() const
Return true if entity is a singular of any dimension.
Definition: type.hh:366
│ │ │ │ +
constexpr bool isHexahedron() const
Return true if entity is a hexahedron.
Definition: type.hh:325
│ │ │ │ +
constexpr bool isSimplex() const
Return true if entity is a simplex of any dimension.
Definition: type.hh:330
│ │ │ │ +
IdType Id
An integral id representing a GeometryType.
Definition: type.hh:192
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,1016 +4,617 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ -multilineargeometry.hh │ │ │ │ │ +type.hh │ │ │ │ │ Go_to_the_documentation_of_this_file. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ - 5#ifndef DUNE_GEOMETRY_MULTILINEARGEOMETRY_HH │ │ │ │ │ - 6#define DUNE_GEOMETRY_MULTILINEARGEOMETRY_HH │ │ │ │ │ + 5#ifndef DUNE_GEOMETRY_TYPE_HH │ │ │ │ │ + 6#define DUNE_GEOMETRY_TYPE_HH │ │ │ │ │ 7 │ │ │ │ │ - 8#include │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ + 12#include │ │ │ │ │ 13 │ │ │ │ │ - 14#include │ │ │ │ │ - 15#include │ │ │ │ │ - 16#include │ │ │ │ │ - 17 │ │ │ │ │ - 18#include │ │ │ │ │ - 19#include │ │ │ │ │ - 20#include │ │ │ │ │ + 14#include │ │ │ │ │ + 15#include │ │ │ │ │ + 16 │ │ │ │ │ + 17#include │ │ │ │ │ + 18#include │ │ │ │ │ + 19#include │ │ │ │ │ + 20#include │ │ │ │ │ 21 │ │ │ │ │ 22namespace Dune │ │ │ │ │ 23{ │ │ │ │ │ 24 │ │ │ │ │ - 25 // MultiLinearGeometryTraits │ │ │ │ │ - 26 // ------------------------- │ │ │ │ │ + 25 namespace Impl │ │ │ │ │ + 26 { │ │ │ │ │ 27 │ │ │ │ │ - 37 template< class ct > │ │ │ │ │ -38 struct MultiLinearGeometryTraits │ │ │ │ │ - 39 { │ │ │ │ │ -58 typedef Impl::FieldMatrixHelper< ct > MatrixHelper; │ │ │ │ │ - 59 │ │ │ │ │ -61 static ct tolerance () { return ct( 16 ) * std::numeric_limits< ct >:: │ │ │ │ │ -epsilon(); } │ │ │ │ │ - 62 │ │ │ │ │ - 127 template< int mydim, int cdim > │ │ │ │ │ -128 struct CornerStorage │ │ │ │ │ - 129 { │ │ │ │ │ -130 typedef std::vector< FieldVector< ct, cdim > > Type; │ │ │ │ │ - 131 }; │ │ │ │ │ - 132 │ │ │ │ │ - 146 template< int dim > │ │ │ │ │ -147 struct hasSingleGeometryType │ │ │ │ │ - 148 { │ │ │ │ │ -149 static const bool v = false; │ │ │ │ │ -150 static const unsigned int topologyId = ~0u; │ │ │ │ │ - 151 }; │ │ │ │ │ - 152 }; │ │ │ │ │ - 153 │ │ │ │ │ - 154 │ │ │ │ │ - 155 │ │ │ │ │ - 156 // MultiLinearGeometry │ │ │ │ │ - 157 // ------------------- │ │ │ │ │ - 158 │ │ │ │ │ - 179 template< class ct, int mydim, int cdim, class Traits = │ │ │ │ │ -MultiLinearGeometryTraits< ct > > │ │ │ │ │ -180 class MultiLinearGeometry │ │ │ │ │ - 181 { │ │ │ │ │ - 182 typedef MultiLinearGeometry<_ct,_mydim,_cdim,_Traits_> This; │ │ │ │ │ - 183 │ │ │ │ │ - 184 public: │ │ │ │ │ -186 typedef ct ctype; │ │ │ │ │ - 187 │ │ │ │ │ -189 static const int mydimension= mydim; │ │ │ │ │ -191 static const int coorddimension = cdim; │ │ │ │ │ - 192 │ │ │ │ │ -194 typedef FieldVector< ctype, mydimension > LocalCoordinate; │ │ │ │ │ -196 typedef FieldVector< ctype, coorddimension > GlobalCoordinate; │ │ │ │ │ -198 typedef ctype Volume; │ │ │ │ │ - 199 │ │ │ │ │ -201 typedef FieldMatrix< ctype, mydimension, coorddimension > │ │ │ │ │ -JacobianTransposed; │ │ │ │ │ - 202 │ │ │ │ │ - 204 class JacobianInverseTransposed; │ │ │ │ │ - 205 │ │ │ │ │ -207 typedef FieldMatrix< ctype, coorddimension, mydimension > Jacobian; │ │ │ │ │ + 28 enum TopologyConstruction { pyramidConstruction = 0, prismConstruction = 1 │ │ │ │ │ +}; │ │ │ │ │ + 29 │ │ │ │ │ + 30 // Dynamic Topology Properties │ │ │ │ │ + 31 // --------------------------- │ │ │ │ │ + 32 │ │ │ │ │ + 41 inline static unsigned int numTopologies ( int dim ) noexcept │ │ │ │ │ + 42 { │ │ │ │ │ + 43 return (1u << dim); │ │ │ │ │ + 44 } │ │ │ │ │ + 45 │ │ │ │ │ + 57 inline bool static isPyramid ( unsigned int topologyId, int dim, int codim │ │ │ │ │ += 0 ) noexcept │ │ │ │ │ + 58 { │ │ │ │ │ + 59 assert( (dim > 0) && (topologyId < numTopologies( dim )) ); │ │ │ │ │ + 60 assert( (0 <= codim) && (codim < dim) ); │ │ │ │ │ + 61 return (((topologyId & ~1) & (1u << (dim-codim-1))) == 0); │ │ │ │ │ + 62 } │ │ │ │ │ + 63 │ │ │ │ │ + 75 inline static bool isPrism ( unsigned int topologyId, int dim, int codim = │ │ │ │ │ +0 ) noexcept │ │ │ │ │ + 76 { │ │ │ │ │ + 77 assert( (dim > 0) && (topologyId < numTopologies( dim )) ); │ │ │ │ │ + 78 assert( (0 <= codim) && (codim < dim) ); │ │ │ │ │ + 79 return (( (topologyId | 1) & (1u << (dim-codim-1))) != 0); │ │ │ │ │ + 80 } │ │ │ │ │ + 81 │ │ │ │ │ + 89 inline static unsigned int baseTopologyId ( unsigned int topologyId, int │ │ │ │ │ +dim, int codim = 1 ) noexcept │ │ │ │ │ + 90 { │ │ │ │ │ + 91 assert( (dim >= 0) && (topologyId < numTopologies( dim )) ); │ │ │ │ │ + 92 assert( (0 <= codim) && (codim <= dim) ); │ │ │ │ │ + 93 return topologyId & ((1u << (dim-codim)) - 1); │ │ │ │ │ + 94 } │ │ │ │ │ + 95 │ │ │ │ │ + 96 } // namespace Impl │ │ │ │ │ + 97 │ │ │ │ │ + 98// the Topology classes are deprecated and will be removed for the 2.8. │ │ │ │ │ + 99// Temporarily a header 'deprecated_topology.hh' is provided which will be │ │ │ │ │ +removed after the 2.9 release. │ │ │ │ │ + 100#if __GNUC__ >= 7 │ │ │ │ │ + 101# pragma GCC diagnostic push │ │ │ │ │ + 102# pragma GCC diagnostic ignored "-Wdeprecated-declarations" │ │ │ │ │ + 103#endif │ │ │ │ │ + 104#include │ │ │ │ │ + 105#if __GNUC__ >= 7 │ │ │ │ │ + 106# pragma GCC diagnostic pop │ │ │ │ │ + 107#endif │ │ │ │ │ + 108 │ │ │ │ │ + 109 // GeometryType │ │ │ │ │ + 110 // ------------- │ │ │ │ │ + 111 │ │ │ │ │ +124 class GeometryType │ │ │ │ │ + 125 { │ │ │ │ │ + 126 public: │ │ │ │ │ + 127 │ │ │ │ │ +130 enum │ │ │ │ │ + 131 BasicType { │ │ │ │ │ +132 simplex, │ │ │ │ │ +133 cube, │ │ │ │ │ +134 pyramid, │ │ │ │ │ +135 prism, │ │ │ │ │ +136 extended, │ │ │ │ │ + 137 none │ │ │ │ │ +138 }; │ │ │ │ │ + 139 │ │ │ │ │ + 140 private: │ │ │ │ │ + 141 │ │ │ │ │ + 143 unsigned char dim_; │ │ │ │ │ + 144 │ │ │ │ │ + 146 bool none_; │ │ │ │ │ + 147 │ │ │ │ │ + 149 unsigned int topologyId_; │ │ │ │ │ + 150 │ │ │ │ │ + 151 // Internal type used for the Id. The exact nature of this type is kept │ │ │ │ │ + 152 // as an implementation detail on purpose. We use a scoped enum here │ │ │ │ │ +because scoped enums │ │ │ │ │ + 153 // can be used as template parameters, but are not implicitly converted to │ │ │ │ │ +other integral │ │ │ │ │ + 154 // types by the compiler. That way, we avoid unfortunate implicit │ │ │ │ │ +conversion chains, e.g. │ │ │ │ │ + 155 // people trying to work with GlobalGeometryTypeIndex, but forgetting to │ │ │ │ │ +actually call │ │ │ │ │ + 156 // GlobalGeometryTypeIndex::index(gt) and just using gt directly. │ │ │ │ │ + 157 enum class IdType : std::uint64_t │ │ │ │ │ + 158 {}; │ │ │ │ │ + 159 │ │ │ │ │ + 160 public: │ │ │ │ │ + 161 │ │ │ │ │ +192 using Id = IdType; │ │ │ │ │ + 193 │ │ │ │ │ +201 constexpr operator Id() const │ │ │ │ │ + 202 { │ │ │ │ │ + 203 // recreate the exact storage layout that this class is using, making │ │ │ │ │ +conversion │ │ │ │ │ + 204 // extremely cheap │ │ │ │ │ + 205 std::uint64_t id = dim_ | (std::uint64_t(none_) << 8) | (std::uint64_t │ │ │ │ │ +(topologyId_) << 32); │ │ │ │ │ + 206 return static_cast(id); │ │ │ │ │ + 207 } │ │ │ │ │ 208 │ │ │ │ │ -210 typedef FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse; │ │ │ │ │ - 211 │ │ │ │ │ - 212 protected: │ │ │ │ │ - 213 │ │ │ │ │ -214 typedef Dune::ReferenceElements<_ctype,_mydimension_> ReferenceElements; │ │ │ │ │ - 215 │ │ │ │ │ - 216 public: │ │ │ │ │ - 217 │ │ │ │ │ -219 typedef typename ReferenceElements::ReferenceElement ReferenceElement; │ │ │ │ │ - 220 │ │ │ │ │ - 221 private: │ │ │ │ │ - 222 static const bool hasSingleGeometryType = Traits::template │ │ │ │ │ -hasSingleGeometryType< mydimension >::v; │ │ │ │ │ - 223 │ │ │ │ │ - 224 protected: │ │ │ │ │ -225 typedef typename Traits::MatrixHelper MatrixHelper; │ │ │ │ │ -226 typedef typename std::conditional< hasSingleGeometryType, std:: │ │ │ │ │ -integral_constant< unsigned int, Traits::template hasSingleGeometryType< │ │ │ │ │ -mydimension >::topologyId >, unsigned int >::type TopologyId; │ │ │ │ │ - 227 │ │ │ │ │ - 228 public: │ │ │ │ │ - 238 template< class Corners > │ │ │ │ │ -239 MultiLinearGeometry ( const ReferenceElement &refElement, │ │ │ │ │ - 240 const Corners &corners ) │ │ │ │ │ - 241 : refElement_( refElement ), │ │ │ │ │ - 242 corners_( corners ) │ │ │ │ │ - 243 {} │ │ │ │ │ - 244 │ │ │ │ │ - 254 template< class Corners > │ │ │ │ │ -255 MultiLinearGeometry ( Dune::GeometryType gt, │ │ │ │ │ - 256 const Corners &corners ) │ │ │ │ │ - 257 : refElement_( ReferenceElements::general( gt ) ), │ │ │ │ │ - 258 corners_( corners ) │ │ │ │ │ - 259 {} │ │ │ │ │ - 260 │ │ │ │ │ -262 bool affine () const │ │ │ │ │ - 263 { │ │ │ │ │ - 264 JacobianTransposed jt; │ │ │ │ │ - 265 return affine( jt ); │ │ │ │ │ - 266 } │ │ │ │ │ - 267 │ │ │ │ │ -269 Dune::GeometryType type () const { return GeometryType( toUnsignedInt │ │ │ │ │ -(topologyId()), mydimension ); } │ │ │ │ │ - 270 │ │ │ │ │ -272 int corners () const { return refElement().size( mydimension ); } │ │ │ │ │ - 273 │ │ │ │ │ -275 GlobalCoordinate corner ( int i ) const │ │ │ │ │ - 276 { │ │ │ │ │ - 277 assert( (i >= 0) && (i < corners()) ); │ │ │ │ │ - 278 return std::cref(corners_).get()[ i ]; │ │ │ │ │ - 279 } │ │ │ │ │ - 280 │ │ │ │ │ -282 GlobalCoordinate center () const { return global( refElement().position( 0, │ │ │ │ │ -0 ) ); } │ │ │ │ │ +221 constexpr Id toId() const │ │ │ │ │ + 222 { │ │ │ │ │ + 223 return static_cast(*this); │ │ │ │ │ + 224 } │ │ │ │ │ + 225 │ │ │ │ │ +233 constexpr GeometryType(Id id) │ │ │ │ │ + 234 : dim_(static_cast(id) & 0xFF) │ │ │ │ │ + 235 , none_(static_cast(id) & 0x100) │ │ │ │ │ + 236 , topologyId_(static_cast(id) >> 32) │ │ │ │ │ + 237 {} │ │ │ │ │ + 238 │ │ │ │ │ + 241 │ │ │ │ │ +243 constexpr GeometryType () │ │ │ │ │ + 244 : dim_(0), none_(true), topologyId_(0) │ │ │ │ │ + 245 {} │ │ │ │ │ + 246 │ │ │ │ │ +253 constexpr GeometryType(unsigned int topologyId, unsigned int dim, bool │ │ │ │ │ +isNone) │ │ │ │ │ + 254 : dim_(dim), none_(isNone), topologyId_(topologyId) │ │ │ │ │ + 255 {} │ │ │ │ │ + 256 │ │ │ │ │ +262 constexpr GeometryType(unsigned int topologyId, unsigned int dim) │ │ │ │ │ + 263 : dim_(dim), none_(false), topologyId_(topologyId) │ │ │ │ │ + 264 {} │ │ │ │ │ + 265 │ │ │ │ │ + 276 template> │ │ │ │ │ +278 explicit GeometryType(TopologyType t) │ │ │ │ │ + 279 : dim_(TopologyType::dimension), none_(false), topologyId_(TopologyType:: │ │ │ │ │ +id) │ │ │ │ │ + 280 { │ │ │ │ │ + 281 DUNE_UNUSED_PARAMETER(t); │ │ │ │ │ + 282 } │ │ │ │ │ 283 │ │ │ │ │ -290 GlobalCoordinate global ( const LocalCoordinate &local ) const │ │ │ │ │ - 291 { │ │ │ │ │ - 292 using std::begin; │ │ │ │ │ +290 constexpr bool isVertex() const { │ │ │ │ │ + 291 return dim_==0; │ │ │ │ │ + 292 } │ │ │ │ │ 293 │ │ │ │ │ - 294 auto cit = begin(std::cref(corners_).get()); │ │ │ │ │ - 295 GlobalCoordinate y; │ │ │ │ │ - 296 global< false >( topologyId(), std::integral_constant< int, mydimension > │ │ │ │ │ -(), cit, ctype( 1 ), local, ctype( 1 ), y ); │ │ │ │ │ - 297 return y; │ │ │ │ │ - 298 } │ │ │ │ │ - 299 │ │ │ │ │ -312 LocalCoordinate local ( const GlobalCoordinate &globalCoord ) const │ │ │ │ │ - 313 { │ │ │ │ │ - 314 const ctype tolerance = Traits::tolerance(); │ │ │ │ │ - 315 LocalCoordinate x = refElement().position( 0, 0 ); │ │ │ │ │ - 316 LocalCoordinate dx; │ │ │ │ │ - 317 const bool affineMapping = this->affine(); │ │ │ │ │ - 318 do │ │ │ │ │ - 319 { │ │ │ │ │ - 320 // Newton's method: DF^n dx^n = F^n, x^{n+1} -= dx^n │ │ │ │ │ - 321 const GlobalCoordinate dglobal = (*this).global( x ) - globalCoord; │ │ │ │ │ - 322 const bool invertible = │ │ │ │ │ - 323 MatrixHelper::template xTRightInvA< mydimension, coorddimension > │ │ │ │ │ -( jacobianTransposed( x ), dglobal, dx ); │ │ │ │ │ - 324 if( ! invertible ) │ │ │ │ │ - 325 return LocalCoordinate( std::numeric_limits< ctype > :: max() ); │ │ │ │ │ - 326 │ │ │ │ │ - 327 // update x with correction │ │ │ │ │ - 328 x -= dx; │ │ │ │ │ - 329 │ │ │ │ │ - 330 // for affine mappings only one iteration is needed │ │ │ │ │ - 331 if ( affineMapping ) break; │ │ │ │ │ - 332 } while( dx.two_norm2() > tolerance ); │ │ │ │ │ - 333 return x; │ │ │ │ │ - 334 } │ │ │ │ │ - 335 │ │ │ │ │ -350 Volume integrationElement ( const LocalCoordinate &local ) const │ │ │ │ │ - 351 { │ │ │ │ │ - 352 return MatrixHelper::template sqrtDetAAT< mydimension, coorddimension > │ │ │ │ │ -( jacobianTransposed( local ) ); │ │ │ │ │ - 353 } │ │ │ │ │ - 354 │ │ │ │ │ -363 Volume volume () const │ │ │ │ │ - 364 { │ │ │ │ │ - 365 return integrationElement( refElement().position( 0, 0 ) ) * refElement │ │ │ │ │ -().volume(); │ │ │ │ │ - 366 } │ │ │ │ │ - 367 │ │ │ │ │ -377 JacobianTransposed jacobianTransposed ( const LocalCoordinate &local ) │ │ │ │ │ -const │ │ │ │ │ - 378 { │ │ │ │ │ - 379 using std::begin; │ │ │ │ │ - 380 │ │ │ │ │ - 381 JacobianTransposed jt; │ │ │ │ │ - 382 auto cit = begin(std::cref(corners_).get()); │ │ │ │ │ - 383 jacobianTransposed< false >( topologyId(), std::integral_constant< int, │ │ │ │ │ -mydimension >(), cit, ctype( 1 ), local, ctype( 1 ), jt ); │ │ │ │ │ - 384 return jt; │ │ │ │ │ - 385 } │ │ │ │ │ - 386 │ │ │ │ │ -393 JacobianInverseTransposed jacobianInverseTransposed ( const LocalCoordinate │ │ │ │ │ -&local ) const; │ │ │ │ │ - 394 │ │ │ │ │ -395 friend ReferenceElement referenceElement ( const MultiLinearGeometry │ │ │ │ │ -&geometry ) │ │ │ │ │ - 396 { │ │ │ │ │ - 397 return geometry.refElement(); │ │ │ │ │ - 398 } │ │ │ │ │ - 399 │ │ │ │ │ - 400 │ │ │ │ │ -407 Jacobian jacobian (const LocalCoordinate &local) const │ │ │ │ │ - 408 { │ │ │ │ │ - 409 return jacobianTransposed(local).transposed(); │ │ │ │ │ - 410 } │ │ │ │ │ - 411 │ │ │ │ │ -418 JacobianInverse jacobianInverse (const LocalCoordinate &local) const │ │ │ │ │ - 419 { │ │ │ │ │ - 420 return jacobianInverseTransposed(local).transposed(); │ │ │ │ │ - 421 } │ │ │ │ │ - 422 │ │ │ │ │ - 423 protected: │ │ │ │ │ - 424 │ │ │ │ │ -425 ReferenceElement refElement () const │ │ │ │ │ - 426 { │ │ │ │ │ - 427 return refElement_; │ │ │ │ │ - 428 } │ │ │ │ │ - 429 │ │ │ │ │ -430 TopologyId topologyId () const │ │ │ │ │ - 431 { │ │ │ │ │ - 432 return topologyId( std::integral_constant< bool, hasSingleGeometryType >() │ │ │ │ │ -); │ │ │ │ │ - 433 } │ │ │ │ │ - 434 │ │ │ │ │ - 435 template< bool add, int dim, class CornerIterator > │ │ │ │ │ -436 static void global ( TopologyId topologyId, std::integral_constant< int, │ │ │ │ │ -dim >, │ │ │ │ │ - 437 CornerIterator &cit, const ctype &df, const LocalCoordinate &x, │ │ │ │ │ - 438 const ctype &rf, GlobalCoordinate &y ); │ │ │ │ │ - 439 template< bool add, class CornerIterator > │ │ │ │ │ -440 static void global ( TopologyId topologyId, std::integral_constant< int, 0 │ │ │ │ │ ->, │ │ │ │ │ - 441 CornerIterator &cit, const ctype &df, const LocalCoordinate &x, │ │ │ │ │ - 442 const ctype &rf, GlobalCoordinate &y ); │ │ │ │ │ - 443 │ │ │ │ │ - 444 template< bool add, int rows, int dim, class CornerIterator > │ │ │ │ │ -445 static void jacobianTransposed ( TopologyId topologyId, std:: │ │ │ │ │ -integral_constant< int, dim >, │ │ │ │ │ - 446 CornerIterator &cit, const ctype &df, const LocalCoordinate &x, │ │ │ │ │ - 447 const ctype &rf, FieldMatrix< ctype, rows, cdim > &jt ); │ │ │ │ │ - 448 template< bool add, int rows, class CornerIterator > │ │ │ │ │ -449 static void jacobianTransposed ( TopologyId topologyId, std:: │ │ │ │ │ -integral_constant< int, 0 >, │ │ │ │ │ - 450 CornerIterator &cit, const ctype &df, const LocalCoordinate &x, │ │ │ │ │ - 451 const ctype &rf, FieldMatrix< ctype, rows, cdim > &jt ); │ │ │ │ │ - 452 │ │ │ │ │ - 453 template< int dim, class CornerIterator > │ │ │ │ │ -454 static bool affine ( TopologyId topologyId, std::integral_constant< int, │ │ │ │ │ -dim >, CornerIterator &cit, JacobianTransposed &jt ); │ │ │ │ │ - 455 template< class CornerIterator > │ │ │ │ │ -456 static bool affine ( TopologyId topologyId, std::integral_constant< int, 0 │ │ │ │ │ ->, CornerIterator &cit, JacobianTransposed &jt ); │ │ │ │ │ - 457 │ │ │ │ │ -458 bool affine ( JacobianTransposed &jacobianT ) const │ │ │ │ │ - 459 { │ │ │ │ │ - 460 using std::begin; │ │ │ │ │ - 461 │ │ │ │ │ - 462 auto cit = begin(std::cref(corners_).get()); │ │ │ │ │ - 463 return affine( topologyId(), std::integral_constant< int, mydimension >(), │ │ │ │ │ -cit, jacobianT ); │ │ │ │ │ - 464 } │ │ │ │ │ - 465 │ │ │ │ │ - 466 private: │ │ │ │ │ - 467 // The following methods are needed to convert the return type of │ │ │ │ │ -topologyId to │ │ │ │ │ - 468 // unsigned int with g++-4.4. It has problems casting integral_constant to │ │ │ │ │ -the │ │ │ │ │ - 469 // integral type. │ │ │ │ │ - 470 static unsigned int toUnsignedInt(unsigned int i) { return i; } │ │ │ │ │ - 471 template │ │ │ │ │ - 472 static unsigned int toUnsignedInt(std::integral_constant ) │ │ │ │ │ -{ return v; } │ │ │ │ │ - 473 TopologyId topologyId ( std::integral_constant< bool, true > ) const │ │ │ │ │ -{ return TopologyId(); } │ │ │ │ │ - 474 unsigned int topologyId ( std::integral_constant< bool, false > ) const │ │ │ │ │ -{ return refElement().type().id(); } │ │ │ │ │ - 475 │ │ │ │ │ - 476 ReferenceElement refElement_; │ │ │ │ │ - 477 typename Traits::template CornerStorage< mydimension, coorddimension >:: │ │ │ │ │ -Type corners_; │ │ │ │ │ - 478 }; │ │ │ │ │ - 479 │ │ │ │ │ - 480 │ │ │ │ │ - 481 │ │ │ │ │ - 482 // MultiLinearGeometry::JacobianInverseTransposed │ │ │ │ │ - 483 // ---------------------------------------------- │ │ │ │ │ - 484 │ │ │ │ │ - 485 template< class ct, int mydim, int cdim, class Traits > │ │ │ │ │ -486 class MultiLinearGeometry< ct, mydim, cdim, Traits >:: │ │ │ │ │ -JacobianInverseTransposed │ │ │ │ │ - 487 : public FieldMatrix< ctype, coorddimension, mydimension > │ │ │ │ │ +295 constexpr bool isLine() const { │ │ │ │ │ + 296 return dim_==1; │ │ │ │ │ + 297 } │ │ │ │ │ + 298 │ │ │ │ │ +300 constexpr bool isTriangle() const { │ │ │ │ │ + 301 return ! none_ && dim_==2 && (topologyId_ | 1) == 0b0001; │ │ │ │ │ + 302 } │ │ │ │ │ + 303 │ │ │ │ │ +305 constexpr bool isQuadrilateral() const { │ │ │ │ │ + 306 return ! none_ && dim_==2 && (topologyId_ | 1) == 0b0011; │ │ │ │ │ + 307 } │ │ │ │ │ + 308 │ │ │ │ │ +310 constexpr bool isTetrahedron() const { │ │ │ │ │ + 311 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0001; │ │ │ │ │ + 312 } │ │ │ │ │ + 313 │ │ │ │ │ +315 constexpr bool isPyramid() const { │ │ │ │ │ + 316 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0011; │ │ │ │ │ + 317 } │ │ │ │ │ + 318 │ │ │ │ │ +320 constexpr bool isPrism() const { │ │ │ │ │ + 321 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0101; │ │ │ │ │ + 322 } │ │ │ │ │ + 323 │ │ │ │ │ +325 constexpr bool isHexahedron() const { │ │ │ │ │ + 326 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0111; │ │ │ │ │ + 327 } │ │ │ │ │ + 328 │ │ │ │ │ +330 constexpr bool isSimplex() const { │ │ │ │ │ + 331 return ! none_ && (topologyId_ | 1) == 1; │ │ │ │ │ + 332 } │ │ │ │ │ + 333 │ │ │ │ │ +335 constexpr bool isCube() const { │ │ │ │ │ + 336 return ! none_ && ((topologyId_ ^ ((1 << dim_)-1)) >> 1 == 0); │ │ │ │ │ + 337 } │ │ │ │ │ + 338 │ │ │ │ │ +340 constexpr bool isConical() const { │ │ │ │ │ + 341 return ! none_ && (((topologyId_ & ~1) & (1u << (dim_-1))) == 0); │ │ │ │ │ + 342 } │ │ │ │ │ + 343 │ │ │ │ │ +348 constexpr bool isConical(const int& step) const { │ │ │ │ │ + 349 return ! none_ && (((topologyId_ & ~1) & (1u << step)) == 0); │ │ │ │ │ + 350 } │ │ │ │ │ + 351 │ │ │ │ │ +353 constexpr bool isPrismatic() const { │ │ │ │ │ + 354 return ! none_ && (( (topologyId_ | 1) & (1u << (dim_-1))) != 0); │ │ │ │ │ + 355 } │ │ │ │ │ + 356 │ │ │ │ │ +361 constexpr bool isPrismatic(const int& step) const { │ │ │ │ │ + 362 return ! none_ && (( (topologyId_ | 1) & (1u << step)) != 0); │ │ │ │ │ + 363 } │ │ │ │ │ + 364 │ │ │ │ │ +366 constexpr bool isNone() const { │ │ │ │ │ + 367 return none_; │ │ │ │ │ + 368 } │ │ │ │ │ + 369 │ │ │ │ │ +371 constexpr unsigned int dim() const { │ │ │ │ │ + 372 return dim_; │ │ │ │ │ + 373 } │ │ │ │ │ + 374 │ │ │ │ │ +376 constexpr unsigned int id() const { │ │ │ │ │ + 377 return topologyId_; │ │ │ │ │ + 378 } │ │ │ │ │ + 379 │ │ │ │ │ +387 constexpr bool operator==(const GeometryType& other) const { │ │ │ │ │ + 388 return ( ( none_ == other.none_ ) │ │ │ │ │ + 389 && ( ( none_ == true ) │ │ │ │ │ + 390 || ( ( dim_ == other.dim_ ) │ │ │ │ │ + 391 && ( (topologyId_ >> 1) == (other.topologyId_ >> 1) ) │ │ │ │ │ + 392 ) │ │ │ │ │ + 393 ) │ │ │ │ │ + 394 ); │ │ │ │ │ + 395 } │ │ │ │ │ + 396 │ │ │ │ │ +398 constexpr bool operator!=(const GeometryType& other) const { │ │ │ │ │ + 399 return ! ((*this)==other); │ │ │ │ │ + 400 } │ │ │ │ │ + 401 │ │ │ │ │ +403 constexpr bool operator_<(const GeometryType& other) const { │ │ │ │ │ + 404 return ( ( none_ < other.none_ ) │ │ │ │ │ + 405 || ( !( other.none_ < none_ ) │ │ │ │ │ + 406 && ( ( dim_ < other.dim_ ) │ │ │ │ │ + 407 || ( (other.dim_ == dim_) │ │ │ │ │ + 408 && ((topologyId_ >> 1) < (other.topologyId_ >> 1) ) │ │ │ │ │ + 409 ) │ │ │ │ │ + 410 ) │ │ │ │ │ + 411 ) │ │ │ │ │ + 412 ); │ │ │ │ │ + 413 } │ │ │ │ │ + 414 │ │ │ │ │ + 417 }; │ │ │ │ │ + 418 │ │ │ │ │ +420 inline std::ostream& operator<<(std::ostream& s, const GeometryType& a) │ │ │ │ │ + 421 { │ │ │ │ │ + 422 if (a.isSimplex()) │ │ │ │ │ + 423 { │ │ │ │ │ + 424 s << "(simplex, " << a.dim() << ")"; │ │ │ │ │ + 425 return s; │ │ │ │ │ + 426 } │ │ │ │ │ + 427 if (a.isCube()) │ │ │ │ │ + 428 { │ │ │ │ │ + 429 s << "(cube, " << a.dim() << ")"; │ │ │ │ │ + 430 return s; │ │ │ │ │ + 431 } │ │ │ │ │ + 432 if (a.isPyramid()) │ │ │ │ │ + 433 { │ │ │ │ │ + 434 s << "(pyramid, 3)"; │ │ │ │ │ + 435 return s; │ │ │ │ │ + 436 } │ │ │ │ │ + 437 if (a.isPrism()) │ │ │ │ │ + 438 { │ │ │ │ │ + 439 s << "(prism, 3)"; │ │ │ │ │ + 440 return s; │ │ │ │ │ + 441 } │ │ │ │ │ + 442 if (a.isNone()) │ │ │ │ │ + 443 { │ │ │ │ │ + 444 s << "(none, " << a.dim() << ")"; │ │ │ │ │ + 445 return s; │ │ │ │ │ + 446 } │ │ │ │ │ + 447 s << "(other [" << a.id() << "], " << a.dim() << ")"; │ │ │ │ │ + 448 return s; │ │ │ │ │ + 449 } │ │ │ │ │ + 450 │ │ │ │ │ + 451 │ │ │ │ │ + 453 │ │ │ │ │ +457 namespace GeometryTypes { │ │ │ │ │ + 458 │ │ │ │ │ + 460 │ │ │ │ │ +463 inline constexpr GeometryType simplex(unsigned int dim) │ │ │ │ │ + 464 { │ │ │ │ │ + 465 return GeometryType(0,dim,false); │ │ │ │ │ + 466 } │ │ │ │ │ + 467 │ │ │ │ │ + 469 │ │ │ │ │ +472 inline constexpr GeometryType cube(unsigned int dim) │ │ │ │ │ + 473 { │ │ │ │ │ + 474 return GeometryType(((dim>1) ? ((1 << dim) - 1) : 0),dim,false); │ │ │ │ │ + 475 } │ │ │ │ │ + 476 │ │ │ │ │ + 478 │ │ │ │ │ +481 inline constexpr GeometryType none(unsigned int dim) │ │ │ │ │ + 482 { │ │ │ │ │ + 483 return GeometryType(0,dim,true); │ │ │ │ │ + 484 } │ │ │ │ │ + 485 │ │ │ │ │ +487 inline constexpr GeometryType conicalExtension(const GeometryType& gt) │ │ │ │ │ 488 { │ │ │ │ │ - 489 typedef FieldMatrix< ctype, coorddimension, mydimension > Base; │ │ │ │ │ - 490 │ │ │ │ │ - 491 public: │ │ │ │ │ -492 void setup ( const JacobianTransposed &jt ) │ │ │ │ │ - 493 { │ │ │ │ │ - 494 detInv_ = MatrixHelper::template rightInvA< mydimension, coorddimension > │ │ │ │ │ -( jt, static_cast< Base & >( *this ) ); │ │ │ │ │ - 495 } │ │ │ │ │ - 496 │ │ │ │ │ -497 void setupDeterminant ( const JacobianTransposed &jt ) │ │ │ │ │ - 498 { │ │ │ │ │ - 499 detInv_ = MatrixHelper::template sqrtDetAAT< mydimension, coorddimension > │ │ │ │ │ -( jt ); │ │ │ │ │ - 500 } │ │ │ │ │ + 489 return GeometryType(gt.id(), gt.dim()+1, gt.isNone()); │ │ │ │ │ + 490 } │ │ │ │ │ + 491 │ │ │ │ │ +493 inline constexpr GeometryType prismaticExtension(const GeometryType& gt) │ │ │ │ │ + 494 { │ │ │ │ │ + 495 return GeometryType(gt.id() | ((1 << gt.dim())), gt.dim()+1, gt.isNone()); │ │ │ │ │ + 496 } │ │ │ │ │ + 497 │ │ │ │ │ + 498#ifndef __cpp_inline_variables │ │ │ │ │ + 499 namespace { │ │ │ │ │ + 500#endif │ │ │ │ │ 501 │ │ │ │ │ -502 ctype det () const { return ctype( 1 ) / detInv_; } │ │ │ │ │ -503 ctype detInv () const { return detInv_; } │ │ │ │ │ - 504 │ │ │ │ │ - 505 private: │ │ │ │ │ - 506 ctype detInv_; │ │ │ │ │ - 507 }; │ │ │ │ │ - 508 │ │ │ │ │ + 503 │ │ │ │ │ +506 DUNE_INLINE_VARIABLE constexpr GeometryType vertex = GeometryType │ │ │ │ │ +(0,0,false); │ │ │ │ │ + 507 │ │ │ │ │ 509 │ │ │ │ │ - 510 │ │ │ │ │ - 523 template< class ct, int mydim, int cdim, class Traits = │ │ │ │ │ -MultiLinearGeometryTraits< ct > > │ │ │ │ │ -524 class CachedMultiLinearGeometry │ │ │ │ │ - 525 : public MultiLinearGeometry< ct, mydim, cdim, Traits > │ │ │ │ │ - 526 { │ │ │ │ │ - 527 typedef CachedMultiLinearGeometry<_ct,_mydim,_cdim,_Traits_> This; │ │ │ │ │ - 528 typedef MultiLinearGeometry<_ct,_mydim,_cdim,_Traits_> Base; │ │ │ │ │ - 529 │ │ │ │ │ - 530 protected: │ │ │ │ │ -531 typedef typename Base::MatrixHelper MatrixHelper; │ │ │ │ │ - 532 │ │ │ │ │ - 533 public: │ │ │ │ │ -534 typedef typename Base::ReferenceElement ReferenceElement; │ │ │ │ │ - 535 │ │ │ │ │ -536 typedef typename Base::ctype ctype; │ │ │ │ │ +512 DUNE_INLINE_VARIABLE constexpr GeometryType line = GeometryType(0,1,false); │ │ │ │ │ + 513 │ │ │ │ │ + 515 │ │ │ │ │ +518 DUNE_INLINE_VARIABLE constexpr GeometryType triangle = simplex(2); │ │ │ │ │ + 519 │ │ │ │ │ + 521 │ │ │ │ │ +524 DUNE_INLINE_VARIABLE constexpr GeometryType quadrilateral = cube(2); │ │ │ │ │ + 525 │ │ │ │ │ + 527 │ │ │ │ │ +530 DUNE_INLINE_VARIABLE constexpr GeometryType tetrahedron = simplex(3); │ │ │ │ │ + 531 │ │ │ │ │ + 533 │ │ │ │ │ +536 DUNE_INLINE_VARIABLE constexpr GeometryType pyramid = GeometryType │ │ │ │ │ +(0b0011,3,false); │ │ │ │ │ 537 │ │ │ │ │ - 538 using Base::mydimension; │ │ │ │ │ - 539 using Base::coorddimension; │ │ │ │ │ - 540 │ │ │ │ │ -541 typedef typename Base::LocalCoordinate LocalCoordinate; │ │ │ │ │ -542 typedef typename Base::GlobalCoordinate GlobalCoordinate; │ │ │ │ │ -543 typedef typename Base::Volume Volume; │ │ │ │ │ - 544 │ │ │ │ │ -545 typedef typename Base::JacobianTransposed JacobianTransposed; │ │ │ │ │ -546 typedef typename Base::JacobianInverseTransposed JacobianInverseTransposed; │ │ │ │ │ -547 typedef typename Base::Jacobian Jacobian; │ │ │ │ │ -548 typedef typename Base::JacobianInverse JacobianInverse; │ │ │ │ │ + 539 │ │ │ │ │ +542 DUNE_INLINE_VARIABLE constexpr GeometryType prism = GeometryType │ │ │ │ │ +(0b0101,3,false); │ │ │ │ │ + 543 │ │ │ │ │ + 545 │ │ │ │ │ +548 DUNE_INLINE_VARIABLE constexpr GeometryType hexahedron = cube(3); │ │ │ │ │ 549 │ │ │ │ │ - 550 template< class CornerStorage > │ │ │ │ │ -551 CachedMultiLinearGeometry ( const ReferenceElement &referenceElement, const │ │ │ │ │ -CornerStorage &cornerStorage ) │ │ │ │ │ - 552 : Base( referenceElement, cornerStorage ), │ │ │ │ │ - 553 affine_( Base::affine( jacobianTransposed_ ) ), │ │ │ │ │ - 554 jacobianInverseTransposedComputed_( false ), │ │ │ │ │ - 555 integrationElementComputed_( false ) │ │ │ │ │ - 556 {} │ │ │ │ │ - 557 │ │ │ │ │ - 558 template< class CornerStorage > │ │ │ │ │ -559 CachedMultiLinearGeometry ( Dune::GeometryType gt, const CornerStorage │ │ │ │ │ -&cornerStorage ) │ │ │ │ │ - 560 : Base( gt, cornerStorage ), │ │ │ │ │ - 561 affine_( Base::affine( jacobianTransposed_ ) ), │ │ │ │ │ - 562 jacobianInverseTransposedComputed_( false ), │ │ │ │ │ - 563 integrationElementComputed_( false ) │ │ │ │ │ - 564 {} │ │ │ │ │ - 565 │ │ │ │ │ -567 bool affine () const { return affine_; } │ │ │ │ │ - 568 │ │ │ │ │ - 569 using Base::corner; │ │ │ │ │ - 570 │ │ │ │ │ -572 GlobalCoordinate center () const { return global( refElement().position( 0, │ │ │ │ │ -0 ) ); } │ │ │ │ │ - 573 │ │ │ │ │ -580 GlobalCoordinate global ( const LocalCoordinate &local ) const │ │ │ │ │ - 581 { │ │ │ │ │ - 582 if( affine() ) │ │ │ │ │ - 583 { │ │ │ │ │ - 584 GlobalCoordinate global( corner( 0 ) ); │ │ │ │ │ - 585 jacobianTransposed_.umtv( local, global ); │ │ │ │ │ - 586 return global; │ │ │ │ │ - 587 } │ │ │ │ │ - 588 else │ │ │ │ │ - 589 return Base::global( local ); │ │ │ │ │ - 590 } │ │ │ │ │ - 591 │ │ │ │ │ -604 LocalCoordinate local ( const GlobalCoordinate &global ) const │ │ │ │ │ - 605 { │ │ │ │ │ - 606 if( affine() ) │ │ │ │ │ - 607 { │ │ │ │ │ - 608 LocalCoordinate local; │ │ │ │ │ - 609 if( jacobianInverseTransposedComputed_ ) │ │ │ │ │ - 610 jacobianInverseTransposed_.mtv( global - corner( 0 ), local ); │ │ │ │ │ - 611 else │ │ │ │ │ - 612 MatrixHelper::template xTRightInvA< mydimension, coorddimension > │ │ │ │ │ -( jacobianTransposed_, global - corner( 0 ), local ); │ │ │ │ │ - 613 return local; │ │ │ │ │ - 614 } │ │ │ │ │ - 615 else │ │ │ │ │ - 616 return Base::local( global ); │ │ │ │ │ - 617 } │ │ │ │ │ - 618 │ │ │ │ │ -633 ctype integrationElement ( const LocalCoordinate &local ) const │ │ │ │ │ - 634 { │ │ │ │ │ - 635 if( affine() ) │ │ │ │ │ - 636 { │ │ │ │ │ - 637 if( !integrationElementComputed_ ) │ │ │ │ │ - 638 { │ │ │ │ │ - 639 jacobianInverseTransposed_.setupDeterminant( jacobianTransposed_ ); │ │ │ │ │ - 640 integrationElementComputed_ = true; │ │ │ │ │ - 641 } │ │ │ │ │ - 642 return jacobianInverseTransposed_.detInv(); │ │ │ │ │ - 643 } │ │ │ │ │ - 644 else │ │ │ │ │ - 645 return Base::integrationElement( local ); │ │ │ │ │ - 646 } │ │ │ │ │ - 647 │ │ │ │ │ -649 Volume volume () const │ │ │ │ │ - 650 { │ │ │ │ │ - 651 if( affine() ) │ │ │ │ │ - 652 return integrationElement( refElement().position( 0, 0 ) ) * refElement │ │ │ │ │ -().volume(); │ │ │ │ │ - 653 else │ │ │ │ │ - 654 return Base::volume(); │ │ │ │ │ - 655 } │ │ │ │ │ - 656 │ │ │ │ │ -666 JacobianTransposed jacobianTransposed ( const LocalCoordinate &local ) │ │ │ │ │ -const │ │ │ │ │ - 667 { │ │ │ │ │ - 668 if( affine() ) │ │ │ │ │ - 669 return jacobianTransposed_; │ │ │ │ │ - 670 else │ │ │ │ │ - 671 return Base::jacobianTransposed( local ); │ │ │ │ │ - 672 } │ │ │ │ │ - 673 │ │ │ │ │ -680 JacobianInverseTransposed jacobianInverseTransposed ( const LocalCoordinate │ │ │ │ │ -&local ) const │ │ │ │ │ - 681 { │ │ │ │ │ - 682 if( affine() ) │ │ │ │ │ - 683 { │ │ │ │ │ - 684 if( !jacobianInverseTransposedComputed_ ) │ │ │ │ │ - 685 { │ │ │ │ │ - 686 jacobianInverseTransposed_.setup( jacobianTransposed_ ); │ │ │ │ │ - 687 jacobianInverseTransposedComputed_ = true; │ │ │ │ │ - 688 integrationElementComputed_ = true; │ │ │ │ │ - 689 } │ │ │ │ │ - 690 return jacobianInverseTransposed_; │ │ │ │ │ - 691 } │ │ │ │ │ - 692 else │ │ │ │ │ - 693 return Base::jacobianInverseTransposed( local ); │ │ │ │ │ - 694 } │ │ │ │ │ - 695 │ │ │ │ │ -702 Jacobian jacobian (const LocalCoordinate &local) const │ │ │ │ │ - 703 { │ │ │ │ │ - 704 return jacobianTransposed(local).transposed(); │ │ │ │ │ - 705 } │ │ │ │ │ - 706 │ │ │ │ │ -713 JacobianInverse jacobianInverse (const LocalCoordinate &local) const │ │ │ │ │ - 714 { │ │ │ │ │ - 715 return jacobianInverseTransposed(local).transposed(); │ │ │ │ │ - 716 } │ │ │ │ │ - 717 │ │ │ │ │ - 718 protected: │ │ │ │ │ - 719 using Base::refElement; │ │ │ │ │ - 720 │ │ │ │ │ - 721 private: │ │ │ │ │ - 722 mutable JacobianTransposed jacobianTransposed_; │ │ │ │ │ - 723 mutable JacobianInverseTransposed jacobianInverseTransposed_; │ │ │ │ │ - 724 │ │ │ │ │ - 725 mutable bool affine_ : 1; │ │ │ │ │ - 726 │ │ │ │ │ - 727 mutable bool jacobianInverseTransposedComputed_ : 1; │ │ │ │ │ - 728 mutable bool integrationElementComputed_ : 1; │ │ │ │ │ - 729 }; │ │ │ │ │ - 730 │ │ │ │ │ - 731 │ │ │ │ │ - 732 │ │ │ │ │ - 733 // Implementation of MultiLinearGeometry │ │ │ │ │ - 734 // ------------------------------------- │ │ │ │ │ - 735 │ │ │ │ │ - 736 template< class ct, int mydim, int cdim, class Traits > │ │ │ │ │ - 737 inline typename MultiLinearGeometry< ct, mydim, cdim, Traits >:: │ │ │ │ │ -JacobianInverseTransposed │ │ │ │ │ -738 MultiLinearGeometry<_ct,_mydim,_cdim,_Traits_>::jacobianInverseTransposed │ │ │ │ │ -( const LocalCoordinate &local ) const │ │ │ │ │ - 739 { │ │ │ │ │ - 740 JacobianInverseTransposed jit; │ │ │ │ │ - 741 jit.setup( jacobianTransposed( local ) ); │ │ │ │ │ - 742 return jit; │ │ │ │ │ - 743 } │ │ │ │ │ - 744 │ │ │ │ │ - 745 │ │ │ │ │ - 746 template< class ct, int mydim, int cdim, class Traits > │ │ │ │ │ - 747 template< bool add, int dim, class CornerIterator > │ │ │ │ │ - 748 inline void MultiLinearGeometry<_ct,_mydim,_cdim,_Traits_> │ │ │ │ │ -749::global ( TopologyId topologyId, std::integral_constant< int, dim >, │ │ │ │ │ - 750 CornerIterator &cit, const ctype &df, const LocalCoordinate &x, │ │ │ │ │ - 751 const ctype &rf, GlobalCoordinate &y ) │ │ │ │ │ - 752 { │ │ │ │ │ - 753 const ctype xn = df*x[ dim-1 ]; │ │ │ │ │ - 754 const ctype cxn = ctype( 1 ) - xn; │ │ │ │ │ - 755 │ │ │ │ │ - 756 if( Impl::isPrism( toUnsignedInt(topologyId), mydimension, mydimension-dim │ │ │ │ │ -) ) │ │ │ │ │ - 757 { │ │ │ │ │ - 758 // apply (1-xn) times mapping for bottom │ │ │ │ │ - 759 global< add >( topologyId, std::integral_constant< int, dim-1 >(), cit, │ │ │ │ │ -df, x, rf*cxn, y ); │ │ │ │ │ - 760 // apply xn times mapping for top │ │ │ │ │ - 761 global< true >( topologyId, std::integral_constant< int, dim-1 >(), cit, │ │ │ │ │ -df, x, rf*xn, y ); │ │ │ │ │ - 762 } │ │ │ │ │ - 763 else │ │ │ │ │ - 764 { │ │ │ │ │ - 765 assert( Impl::isPyramid( toUnsignedInt(topologyId), mydimension, │ │ │ │ │ -mydimension-dim ) ); │ │ │ │ │ - 766 // apply (1-xn) times mapping for bottom (with argument x/(1-xn)) │ │ │ │ │ - 767 if( cxn > Traits::tolerance() || cxn < -Traits::tolerance() ) │ │ │ │ │ - 768 global< add >( topologyId, std::integral_constant< int, dim-1 >(), cit, │ │ │ │ │ -df/cxn, x, rf*cxn, y ); │ │ │ │ │ - 769 else │ │ │ │ │ - 770 global< add >( topologyId, std::integral_constant< int, dim-1 >(), cit, │ │ │ │ │ -df, x, ctype( 0 ), y ); │ │ │ │ │ - 771 // apply xn times the tip │ │ │ │ │ - 772 y.axpy( rf*xn, *cit ); │ │ │ │ │ - 773 ++cit; │ │ │ │ │ - 774 } │ │ │ │ │ - 775 } │ │ │ │ │ - 776 │ │ │ │ │ - 777 template< class ct, int mydim, int cdim, class Traits > │ │ │ │ │ - 778 template< bool add, class CornerIterator > │ │ │ │ │ - 779 inline void MultiLinearGeometry<_ct,_mydim,_cdim,_Traits_> │ │ │ │ │ -780::global ( TopologyId, std::integral_constant< int, 0 >, │ │ │ │ │ - 781 CornerIterator &cit, const ctype &, const LocalCoordinate &, │ │ │ │ │ - 782 const ctype &rf, GlobalCoordinate &y ) │ │ │ │ │ - 783 { │ │ │ │ │ - 784 const GlobalCoordinate &origin = *cit; │ │ │ │ │ - 785 ++cit; │ │ │ │ │ - 786 for( int i = 0; i < coorddimension; ++i ) │ │ │ │ │ - 787 y[ i ] = (add ? y[ i ] + rf*origin[ i ] : rf*origin[ i ]); │ │ │ │ │ - 788 } │ │ │ │ │ - 789 │ │ │ │ │ - 790 │ │ │ │ │ - 791 template< class ct, int mydim, int cdim, class Traits > │ │ │ │ │ - 792 template< bool add, int rows, int dim, class CornerIterator > │ │ │ │ │ - 793 inline void MultiLinearGeometry<_ct,_mydim,_cdim,_Traits_> │ │ │ │ │ -794::jacobianTransposed ( TopologyId topologyId, std::integral_constant< int, │ │ │ │ │ -dim >, │ │ │ │ │ - 795 CornerIterator &cit, const ctype &df, const LocalCoordinate &x, │ │ │ │ │ - 796 const ctype &rf, FieldMatrix< ctype, rows, cdim > &jt ) │ │ │ │ │ - 797 { │ │ │ │ │ - 798 assert( rows >= dim ); │ │ │ │ │ - 799 │ │ │ │ │ - 800 const ctype xn = df*x[ dim-1 ]; │ │ │ │ │ - 801 const ctype cxn = ctype( 1 ) - xn; │ │ │ │ │ - 802 │ │ │ │ │ - 803 auto cit2( cit ); │ │ │ │ │ - 804 if( Impl::isPrism( toUnsignedInt(topologyId), mydimension, mydimension-dim │ │ │ │ │ -) ) │ │ │ │ │ - 805 { │ │ │ │ │ - 806 // apply (1-xn) times Jacobian for bottom │ │ │ │ │ - 807 jacobianTransposed< add >( topologyId, std::integral_constant< int, dim- │ │ │ │ │ -1 >(), cit2, df, x, rf*cxn, jt ); │ │ │ │ │ - 808 // apply xn times Jacobian for top │ │ │ │ │ - 809 jacobianTransposed< true >( topologyId, std::integral_constant< int, dim- │ │ │ │ │ -1 >(), cit2, df, x, rf*xn, jt ); │ │ │ │ │ - 810 // compute last row as difference between top value and bottom value │ │ │ │ │ - 811 global< add >( topologyId, std::integral_constant< int, dim-1 >(), cit, │ │ │ │ │ -df, x, -rf, jt[ dim-1 ] ); │ │ │ │ │ - 812 global< true >( topologyId, std::integral_constant< int, dim-1 >(), cit, │ │ │ │ │ -df, x, rf, jt[ dim-1 ] ); │ │ │ │ │ - 813 } │ │ │ │ │ - 814 else │ │ │ │ │ - 815 { │ │ │ │ │ - 816 assert( Impl::isPyramid( toUnsignedInt(topologyId), mydimension, │ │ │ │ │ -mydimension-dim ) ); │ │ │ │ │ - 817 /* │ │ │ │ │ - 818 * In the pyramid case, we need a transformation Tb: B -> R^n for the │ │ │ │ │ - 819 * base B \subset R^{n-1}. The pyramid transformation is then defined as │ │ │ │ │ - 820 * T: P \subset R^n -> R^n │ │ │ │ │ - 821 * (x, xn) |-> (1-xn) Tb(x*) + xn t (x \in R^{n-1}, xn \in R) │ │ │ │ │ - 822 * with the tip of the pyramid mapped to t and x* = x/(1-xn) │ │ │ │ │ - 823 * the projection of (x,xn) onto the base. │ │ │ │ │ - 824 * │ │ │ │ │ - 825 * For the Jacobi matrix DT we get │ │ │ │ │ - 826 * DT = ( A | b ) │ │ │ │ │ - 827 * with A = DTb(x*) (n x n-1 matrix) │ │ │ │ │ - 828 * and b = dT/dxn (n-dim column vector). │ │ │ │ │ - 829 * Furthermore │ │ │ │ │ - 830 * b = -Tb(x*) + t + \sum_i dTb/dx_i(x^*) x_i/(1-xn) │ │ │ │ │ - 831 * │ │ │ │ │ - 832 * Note that both A and b are not defined in the pyramid tip (x=0, xn=1)! │ │ │ │ │ - 833 * Indeed for B the unit square, Tb mapping B to the quadrilateral given │ │ │ │ │ - 834 * by the vertices (0,0,0), (2,0,0), (0,1,0), (1,1,0) and t=(0,0,1), we get │ │ │ │ │ - 835 * │ │ │ │ │ - 836 * T(x,y,xn) = ( x(2-y/(1-xn)), y, xn ) │ │ │ │ │ - 837 * / 2-y/(1-xn) -x 0 \ │ │ │ │ │ - 838 * DT(x,y,xn) = | 0 1 0 | │ │ │ │ │ - 839 * \ 0 0 1 / │ │ │ │ │ - 840 * which is not continuous for xn -> 1, choose for example │ │ │ │ │ - 841 * x=0, y=1-xn, xn -> 1 --> DT -> diag(1,1,1) │ │ │ │ │ - 842 * x=1-xn, y=0, xn -> 1 --> DT -> diag(2,1,1) │ │ │ │ │ - 843 * │ │ │ │ │ - 844 * However, for Tb affine-linear, Tb(y) = My + y0, DTb = M: │ │ │ │ │ - 845 * A = M │ │ │ │ │ - 846 * b = -M x* - y0 + t + \sum_i M_i x_i/(1-xn) │ │ │ │ │ - 847 * = -M x* - y0 + t + M x* │ │ │ │ │ - 848 * = -y0 + t │ │ │ │ │ - 849 * which is continuous for xn -> 1. Note that this b is also given by │ │ │ │ │ - 850 * b = -Tb(0) + t + \sum_i dTb/dx_i(0) x_i/1 │ │ │ │ │ - 851 * that is replacing x* by 1 and 1-xn by 1 in the formular above. │ │ │ │ │ - 852 * │ │ │ │ │ - 853 * For xn -> 1, we can thus set x*=0, "1-xn"=1 (or anything != 0) and get │ │ │ │ │ - 854 * the right result in case Tb is affine-linear. │ │ │ │ │ - 855 */ │ │ │ │ │ - 856 │ │ │ │ │ - 857 /* The second case effectively results in x* = 0 */ │ │ │ │ │ - 858 ctype dfcxn = (cxn > Traits::tolerance() || cxn < -Traits::tolerance()) ? │ │ │ │ │ -ctype(df / cxn) : ctype(0); │ │ │ │ │ - 859 │ │ │ │ │ - 860 // initialize last row │ │ │ │ │ - 861 // b = -Tb(x*) │ │ │ │ │ - 862 // (b = -Tb(0) = -y0 in case xn -> 1 and Tb affine-linear) │ │ │ │ │ - 863 global< add >( topologyId, std::integral_constant< int, dim-1 >(), cit, │ │ │ │ │ -dfcxn, x, -rf, jt[ dim-1 ] ); │ │ │ │ │ - 864 // b += t │ │ │ │ │ - 865 jt[ dim-1 ].axpy( rf, *cit ); │ │ │ │ │ - 866 ++cit; │ │ │ │ │ - 867 // apply Jacobian for bottom (with argument x/(1-xn)) and correct last row │ │ │ │ │ - 868 if( add ) │ │ │ │ │ - 869 { │ │ │ │ │ - 870 FieldMatrix< ctype, dim-1, coorddimension > jt2; │ │ │ │ │ - 871 // jt2 = dTb/dx_i(x*) │ │ │ │ │ - 872 jacobianTransposed< false >( topologyId, std::integral_constant< int, dim- │ │ │ │ │ -1 >(), cit2, dfcxn, x, rf, jt2 ); │ │ │ │ │ - 873 // A = dTb/dx_i(x*) (jt[j], j=0..dim-1) │ │ │ │ │ - 874 // b += \sum_i dTb/dx_i(x*) x_i/(1-xn) (jt[dim-1]) │ │ │ │ │ - 875 // (b += 0 in case xn -> 1) │ │ │ │ │ - 876 for( int j = 0; j < dim-1; ++j ) │ │ │ │ │ - 877 { │ │ │ │ │ - 878 jt[ j ] += jt2[ j ]; │ │ │ │ │ - 879 jt[ dim-1 ].axpy( dfcxn*x[ j ], jt2[ j ] ); │ │ │ │ │ - 880 } │ │ │ │ │ - 881 } │ │ │ │ │ - 882 else │ │ │ │ │ - 883 { │ │ │ │ │ - 884 // jt = dTb/dx_i(x*) │ │ │ │ │ - 885 jacobianTransposed< false >( topologyId, std::integral_constant< int, dim- │ │ │ │ │ -1 >(), cit2, dfcxn, x, rf, jt ); │ │ │ │ │ - 886 // b += \sum_i dTb/dx_i(x*) x_i/(1-xn) │ │ │ │ │ - 887 for( int j = 0; j < dim-1; ++j ) │ │ │ │ │ - 888 jt[ dim-1 ].axpy( dfcxn*x[ j ], jt[ j ] ); │ │ │ │ │ - 889 } │ │ │ │ │ - 890 } │ │ │ │ │ - 891 } │ │ │ │ │ - 892 │ │ │ │ │ - 893 template< class ct, int mydim, int cdim, class Traits > │ │ │ │ │ - 894 template< bool add, int rows, class CornerIterator > │ │ │ │ │ - 895 inline void MultiLinearGeometry<_ct,_mydim,_cdim,_Traits_> │ │ │ │ │ -896::jacobianTransposed ( TopologyId, std::integral_constant< int, 0 >, │ │ │ │ │ - 897 CornerIterator &cit, const ctype &, const LocalCoordinate &, │ │ │ │ │ - 898 const ctype &, FieldMatrix< ctype, rows, cdim > & ) │ │ │ │ │ - 899 { │ │ │ │ │ - 900 ++cit; │ │ │ │ │ - 901 } │ │ │ │ │ - 902 │ │ │ │ │ - 903 │ │ │ │ │ - 904 │ │ │ │ │ - 905 template< class ct, int mydim, int cdim, class Traits > │ │ │ │ │ - 906 template< int dim, class CornerIterator > │ │ │ │ │ - 907 inline bool MultiLinearGeometry<_ct,_mydim,_cdim,_Traits_> │ │ │ │ │ -908::affine ( TopologyId topologyId, std::integral_constant< int, dim >, │ │ │ │ │ -CornerIterator &cit, JacobianTransposed &jt ) │ │ │ │ │ - 909 { │ │ │ │ │ - 910 const GlobalCoordinate &orgBottom = *cit; │ │ │ │ │ - 911 if( !affine( topologyId, std::integral_constant< int, dim-1 >(), cit, jt ) │ │ │ │ │ -) │ │ │ │ │ - 912 return false; │ │ │ │ │ - 913 const GlobalCoordinate &orgTop = *cit; │ │ │ │ │ - 914 │ │ │ │ │ - 915 if( Impl::isPrism( toUnsignedInt(topologyId), mydimension, mydimension-dim │ │ │ │ │ -) ) │ │ │ │ │ - 916 { │ │ │ │ │ - 917 JacobianTransposed jtTop; │ │ │ │ │ - 918 if( !affine( topologyId, std::integral_constant< int, dim-1 >(), cit, │ │ │ │ │ -jtTop ) ) │ │ │ │ │ - 919 return false; │ │ │ │ │ - 920 │ │ │ │ │ - 921 // check whether both jacobians are identical │ │ │ │ │ - 922 ctype norm( 0 ); │ │ │ │ │ - 923 for( int i = 0; i < dim-1; ++i ) │ │ │ │ │ - 924 norm += (jtTop[ i ] - jt[ i ]).two_norm2(); │ │ │ │ │ - 925 if( norm >= Traits::tolerance() ) │ │ │ │ │ - 926 return false; │ │ │ │ │ - 927 } │ │ │ │ │ - 928 else │ │ │ │ │ - 929 ++cit; │ │ │ │ │ - 930 jt[ dim-1 ] = orgTop - orgBottom; │ │ │ │ │ - 931 return true; │ │ │ │ │ - 932 } │ │ │ │ │ - 933 │ │ │ │ │ - 934 template< class ct, int mydim, int cdim, class Traits > │ │ │ │ │ - 935 template< class CornerIterator > │ │ │ │ │ - 936 inline bool MultiLinearGeometry<_ct,_mydim,_cdim,_Traits_> │ │ │ │ │ -937::affine ( TopologyId, std::integral_constant< int, 0 >, CornerIterator │ │ │ │ │ -&cit, JacobianTransposed & ) │ │ │ │ │ - 938 { │ │ │ │ │ - 939 ++cit; │ │ │ │ │ - 940 return true; │ │ │ │ │ - 941 } │ │ │ │ │ - 942 │ │ │ │ │ - 943} // namespace Dune │ │ │ │ │ - 944 │ │ │ │ │ - 945#endif // #ifndef DUNE_GEOMETRY_MULTILINEARGEOMETRY_HH │ │ │ │ │ -affinegeometry.hh │ │ │ │ │ -An implementation of the Geometry interface for affine geometries. │ │ │ │ │ -type.hh │ │ │ │ │ -A unique label for each type of element that can occur in a grid. │ │ │ │ │ -referenceelements.hh │ │ │ │ │ + 550#ifndef __cpp_inline_variables │ │ │ │ │ + 551 } │ │ │ │ │ + 552#endif │ │ │ │ │ + 553 │ │ │ │ │ + 554 } │ │ │ │ │ + 555 │ │ │ │ │ + 556 namespace Impl │ │ │ │ │ + 557 { │ │ │ │ │ + 558 │ │ │ │ │ + 560 inline constexpr GeometryType getBase(const GeometryType& gt) { │ │ │ │ │ + 561 return GeometryType(gt.id() & ((1 << (gt.dim()-1))-1), gt.dim()-1, │ │ │ │ │ +gt.isNone()); │ │ │ │ │ + 562 } │ │ │ │ │ + 563 │ │ │ │ │ + 564 │ │ │ │ │ + 565 // IfGeometryType │ │ │ │ │ + 566 // ---------- │ │ │ │ │ + 567 │ │ │ │ │ + 568 template< template< GeometryType::Id > class Operation, int dim, │ │ │ │ │ +GeometryType::Id geometryId = GeometryTypes::vertex > │ │ │ │ │ + 569 struct IfGeometryType │ │ │ │ │ + 570 { │ │ │ │ │ + 571 static constexpr GeometryType geometry = geometryId; │ │ │ │ │ + 572 template< class... Args > │ │ │ │ │ + 573 static auto apply ( GeometryType gt, Args &&... args ) │ │ │ │ │ + 574 { │ │ │ │ │ + 575 GeometryType lowerGeometry(gt.id() >>1 , gt.dim()-1, gt.isNone()); │ │ │ │ │ + 576 │ │ │ │ │ + 577 if( gt.id() & 1 ) │ │ │ │ │ + 578 return IfGeometryType< Operation, dim-1, GeometryTypes::prismaticExtension │ │ │ │ │ +(geometry).toId() >::apply( lowerGeometry, std::forward< Args >( args )... ); │ │ │ │ │ + 579 else │ │ │ │ │ + 580 return IfGeometryType< Operation, dim-1, GeometryTypes::conicalExtension │ │ │ │ │ +(geometry).toId() >::apply( lowerGeometry, std::forward< Args >( args )... ); │ │ │ │ │ + 581 } │ │ │ │ │ + 582 }; │ │ │ │ │ + 583 │ │ │ │ │ + 584 template< template< GeometryType::Id > class Operation, GeometryType::Id │ │ │ │ │ +geometryId > │ │ │ │ │ + 585 struct IfGeometryType< Operation, 0, geometryId> │ │ │ │ │ + 586 { │ │ │ │ │ + 587 template< class... Args > │ │ │ │ │ + 588 static auto apply ([[maybe_unused]] GeometryType gt, Args &&... args ) │ │ │ │ │ + 589 { │ │ │ │ │ + 590 return Operation< geometryId >::apply( std::forward< Args >( args )... ); │ │ │ │ │ + 591 } │ │ │ │ │ + 592 }; │ │ │ │ │ + 593 } // namespace Impl │ │ │ │ │ + 594} // namespace Dune │ │ │ │ │ + 595 │ │ │ │ │ + 596#endif // DUNE_GEOMETRY_TYPE_HH │ │ │ │ │ +deprecated_topology.hh │ │ │ │ │ +Dune::GeometryTypes::line │ │ │ │ │ +constexpr GeometryType line │ │ │ │ │ +GeometryType representing a line. │ │ │ │ │ +Definition: type.hh:512 │ │ │ │ │ +Dune::GeometryTypes::cube │ │ │ │ │ +constexpr GeometryType cube(unsigned int dim) │ │ │ │ │ +Returns a GeometryType representing a hypercube of dimension dim. │ │ │ │ │ +Definition: type.hh:472 │ │ │ │ │ +Dune::GeometryTypes::prism │ │ │ │ │ +constexpr GeometryType prism │ │ │ │ │ +GeometryType representing a 3D prism. │ │ │ │ │ +Definition: type.hh:542 │ │ │ │ │ +Dune::GeometryTypes::triangle │ │ │ │ │ +constexpr GeometryType triangle │ │ │ │ │ +GeometryType representing a triangle. │ │ │ │ │ +Definition: type.hh:518 │ │ │ │ │ +Dune::GeometryTypes::quadrilateral │ │ │ │ │ +constexpr GeometryType quadrilateral │ │ │ │ │ +GeometryType representing a quadrilateral (a square). │ │ │ │ │ +Definition: type.hh:524 │ │ │ │ │ +Dune::GeometryTypes::hexahedron │ │ │ │ │ +constexpr GeometryType hexahedron │ │ │ │ │ +GeometryType representing a hexahedron. │ │ │ │ │ +Definition: type.hh:548 │ │ │ │ │ +Dune::GeometryTypes::pyramid │ │ │ │ │ +constexpr GeometryType pyramid │ │ │ │ │ +GeometryType representing a 3D pyramid. │ │ │ │ │ +Definition: type.hh:536 │ │ │ │ │ +Dune::GeometryTypes::tetrahedron │ │ │ │ │ +constexpr GeometryType tetrahedron │ │ │ │ │ +GeometryType representing a tetrahedron. │ │ │ │ │ +Definition: type.hh:530 │ │ │ │ │ +Dune::GeometryTypes::none │ │ │ │ │ +constexpr GeometryType none(unsigned int dim) │ │ │ │ │ +Returns a GeometryType representing a singular of dimension dim. │ │ │ │ │ +Definition: type.hh:481 │ │ │ │ │ +Dune::GeometryTypes::simplex │ │ │ │ │ +constexpr GeometryType simplex(unsigned int dim) │ │ │ │ │ +Returns a GeometryType representing a simplex of dimension dim. │ │ │ │ │ +Definition: type.hh:463 │ │ │ │ │ +Dune::GeometryTypes::vertex │ │ │ │ │ +constexpr GeometryType vertex │ │ │ │ │ +GeometryType representing a vertex. │ │ │ │ │ +Definition: type.hh:506 │ │ │ │ │ Dune │ │ │ │ │ Definition: affinegeometry.hh:21 │ │ │ │ │ -Dune::Geo::ReferenceElements │ │ │ │ │ -Class providing access to the singletons of the reference elements. │ │ │ │ │ -Definition: referenceelements.hh:170 │ │ │ │ │ -Dune::Geo::ReferenceElements::ReferenceElement │ │ │ │ │ -typename Container::ReferenceElement ReferenceElement │ │ │ │ │ -The reference element type. │ │ │ │ │ -Definition: referenceelements.hh:188 │ │ │ │ │ -Dune::MultiLinearGeometryTraits │ │ │ │ │ -default traits class for MultiLinearGeometry │ │ │ │ │ -Definition: multilineargeometry.hh:39 │ │ │ │ │ -Dune::MultiLinearGeometryTraits::MatrixHelper │ │ │ │ │ -Impl::FieldMatrixHelper< ct > MatrixHelper │ │ │ │ │ -helper structure containing some matrix routines │ │ │ │ │ -Definition: multilineargeometry.hh:58 │ │ │ │ │ -Dune::MultiLinearGeometryTraits::tolerance │ │ │ │ │ -static ct tolerance() │ │ │ │ │ -tolerance to numerical algorithms │ │ │ │ │ -Definition: multilineargeometry.hh:61 │ │ │ │ │ -Dune::MultiLinearGeometryTraits::CornerStorage │ │ │ │ │ -template specifying the storage for the corners │ │ │ │ │ -Definition: multilineargeometry.hh:129 │ │ │ │ │ -Dune::MultiLinearGeometryTraits::CornerStorage::Type │ │ │ │ │ -std::vector< FieldVector< ct, cdim > > Type │ │ │ │ │ -Definition: multilineargeometry.hh:130 │ │ │ │ │ -Dune::MultiLinearGeometryTraits::hasSingleGeometryType │ │ │ │ │ -will there be only one geometry type for a dimension? │ │ │ │ │ -Definition: multilineargeometry.hh:148 │ │ │ │ │ -Dune::MultiLinearGeometryTraits::hasSingleGeometryType::topologyId │ │ │ │ │ -static const unsigned int topologyId │ │ │ │ │ -Definition: multilineargeometry.hh:150 │ │ │ │ │ -Dune::MultiLinearGeometryTraits::hasSingleGeometryType::v │ │ │ │ │ -static const bool v │ │ │ │ │ -Definition: multilineargeometry.hh:149 │ │ │ │ │ -Dune::MultiLinearGeometry │ │ │ │ │ -generic geometry implementation based on corner coordinates │ │ │ │ │ -Definition: multilineargeometry.hh:181 │ │ │ │ │ -Dune::MultiLinearGeometry::global │ │ │ │ │ -static void global(TopologyId topologyId, std::integral_constant< int, dim >, │ │ │ │ │ -CornerIterator &cit, const ctype &df, const LocalCoordinate &x, const ctype │ │ │ │ │ -&rf, GlobalCoordinate &y) │ │ │ │ │ -Definition: multilineargeometry.hh:749 │ │ │ │ │ -Dune::MultiLinearGeometry::mydimension │ │ │ │ │ -static const int mydimension │ │ │ │ │ -geometry dimension │ │ │ │ │ -Definition: multilineargeometry.hh:189 │ │ │ │ │ -Dune::MultiLinearGeometry::type │ │ │ │ │ -Dune::GeometryType type() const │ │ │ │ │ -obtain the name of the reference element │ │ │ │ │ -Definition: multilineargeometry.hh:269 │ │ │ │ │ -Dune::MultiLinearGeometry::MatrixHelper │ │ │ │ │ -Traits::MatrixHelper MatrixHelper │ │ │ │ │ -Definition: multilineargeometry.hh:225 │ │ │ │ │ -Dune::MultiLinearGeometry::GlobalCoordinate │ │ │ │ │ -FieldVector< ctype, coorddimension > GlobalCoordinate │ │ │ │ │ -type of global coordinates │ │ │ │ │ -Definition: multilineargeometry.hh:196 │ │ │ │ │ -Dune::MultiLinearGeometry::jacobianTransposed │ │ │ │ │ -static void jacobianTransposed(TopologyId topologyId, std::integral_constant< │ │ │ │ │ -int, 0 >, CornerIterator &cit, const ctype &df, const LocalCoordinate &x, const │ │ │ │ │ -ctype &rf, FieldMatrix< ctype, rows, cdim > &jt) │ │ │ │ │ -Definition: multilineargeometry.hh:896 │ │ │ │ │ -Dune::MultiLinearGeometry::jacobianTransposed │ │ │ │ │ -JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const │ │ │ │ │ -obtain the transposed of the Jacobian │ │ │ │ │ -Definition: multilineargeometry.hh:377 │ │ │ │ │ -Dune::MultiLinearGeometry::refElement │ │ │ │ │ -ReferenceElement refElement() const │ │ │ │ │ -Definition: multilineargeometry.hh:425 │ │ │ │ │ -Dune::MultiLinearGeometry::global │ │ │ │ │ -GlobalCoordinate global(const LocalCoordinate &local) const │ │ │ │ │ -evaluate the mapping │ │ │ │ │ -Definition: multilineargeometry.hh:290 │ │ │ │ │ -Dune::MultiLinearGeometry::center │ │ │ │ │ -GlobalCoordinate center() const │ │ │ │ │ -obtain the centroid of the mapping's image │ │ │ │ │ -Definition: multilineargeometry.hh:282 │ │ │ │ │ -Dune::MultiLinearGeometry::corner │ │ │ │ │ -GlobalCoordinate corner(int i) const │ │ │ │ │ -obtain coordinates of the i-th corner │ │ │ │ │ -Definition: multilineargeometry.hh:275 │ │ │ │ │ -Dune::MultiLinearGeometry::ReferenceElements │ │ │ │ │ -Dune::ReferenceElements< ctype, mydimension > ReferenceElements │ │ │ │ │ -Definition: multilineargeometry.hh:214 │ │ │ │ │ -Dune::MultiLinearGeometry::ctype │ │ │ │ │ -ct ctype │ │ │ │ │ -coordinate type │ │ │ │ │ -Definition: multilineargeometry.hh:186 │ │ │ │ │ -Dune::MultiLinearGeometry::jacobianTransposed │ │ │ │ │ -static void jacobianTransposed(TopologyId topologyId, std::integral_constant< │ │ │ │ │ -int, dim >, CornerIterator &cit, const ctype &df, const LocalCoordinate &x, │ │ │ │ │ -const ctype &rf, FieldMatrix< ctype, rows, cdim > &jt) │ │ │ │ │ -Definition: multilineargeometry.hh:794 │ │ │ │ │ -Dune::MultiLinearGeometry::coorddimension │ │ │ │ │ -static const int coorddimension │ │ │ │ │ -coordinate dimension │ │ │ │ │ -Definition: multilineargeometry.hh:191 │ │ │ │ │ -Dune::MultiLinearGeometry::corners │ │ │ │ │ -int corners() const │ │ │ │ │ -obtain number of corners of the corresponding reference element │ │ │ │ │ -Definition: multilineargeometry.hh:272 │ │ │ │ │ -Dune::MultiLinearGeometry::topologyId │ │ │ │ │ -TopologyId topologyId() const │ │ │ │ │ -Definition: multilineargeometry.hh:430 │ │ │ │ │ -Dune::MultiLinearGeometry::referenceElement │ │ │ │ │ -friend ReferenceElement referenceElement(const MultiLinearGeometry &geometry) │ │ │ │ │ -Definition: multilineargeometry.hh:395 │ │ │ │ │ -Dune::MultiLinearGeometry::global │ │ │ │ │ -static void global(TopologyId topologyId, std::integral_constant< int, 0 >, │ │ │ │ │ -CornerIterator &cit, const ctype &df, const LocalCoordinate &x, const ctype │ │ │ │ │ -&rf, GlobalCoordinate &y) │ │ │ │ │ -Definition: multilineargeometry.hh:780 │ │ │ │ │ -Dune::MultiLinearGeometry::volume │ │ │ │ │ -Volume volume() const │ │ │ │ │ -obtain the volume of the mapping's image │ │ │ │ │ -Definition: multilineargeometry.hh:363 │ │ │ │ │ -Dune::MultiLinearGeometry::LocalCoordinate │ │ │ │ │ -FieldVector< ctype, mydimension > LocalCoordinate │ │ │ │ │ -type of local coordinates │ │ │ │ │ -Definition: multilineargeometry.hh:194 │ │ │ │ │ -Dune::MultiLinearGeometry::MultiLinearGeometry │ │ │ │ │ -MultiLinearGeometry(const ReferenceElement &refElement, const Corners &corners) │ │ │ │ │ -constructor │ │ │ │ │ -Definition: multilineargeometry.hh:239 │ │ │ │ │ -Dune::MultiLinearGeometry::affine │ │ │ │ │ -static bool affine(TopologyId topologyId, std::integral_constant< int, 0 >, │ │ │ │ │ -CornerIterator &cit, JacobianTransposed &jt) │ │ │ │ │ -Definition: multilineargeometry.hh:937 │ │ │ │ │ -Dune::MultiLinearGeometry::TopologyId │ │ │ │ │ -std::conditional< hasSingleGeometryType, std::integral_constant< unsignedint, │ │ │ │ │ -Traits::templatehasSingleGeometryType< mydimension >::topologyId >, unsignedint │ │ │ │ │ ->::type TopologyId │ │ │ │ │ -Definition: multilineargeometry.hh:226 │ │ │ │ │ -Dune::MultiLinearGeometry::Volume │ │ │ │ │ -ctype Volume │ │ │ │ │ -type of volume │ │ │ │ │ -Definition: multilineargeometry.hh:198 │ │ │ │ │ -Dune::MultiLinearGeometry::affine │ │ │ │ │ -static bool affine(TopologyId topologyId, std::integral_constant< int, dim >, │ │ │ │ │ -CornerIterator &cit, JacobianTransposed &jt) │ │ │ │ │ -Definition: multilineargeometry.hh:908 │ │ │ │ │ -Dune::MultiLinearGeometry::jacobianInverse │ │ │ │ │ -JacobianInverse jacobianInverse(const LocalCoordinate &local) const │ │ │ │ │ -Obtain the Jacobian's inverse. │ │ │ │ │ -Definition: multilineargeometry.hh:418 │ │ │ │ │ -Dune::MultiLinearGeometry::MultiLinearGeometry │ │ │ │ │ -MultiLinearGeometry(Dune::GeometryType gt, const Corners &corners) │ │ │ │ │ -constructor │ │ │ │ │ -Definition: multilineargeometry.hh:255 │ │ │ │ │ -Dune::MultiLinearGeometry::JacobianTransposed │ │ │ │ │ -FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed │ │ │ │ │ -type of jacobian transposed │ │ │ │ │ -Definition: multilineargeometry.hh:201 │ │ │ │ │ -Dune::MultiLinearGeometry::ReferenceElement │ │ │ │ │ -ReferenceElements::ReferenceElement ReferenceElement │ │ │ │ │ -type of reference element │ │ │ │ │ -Definition: multilineargeometry.hh:219 │ │ │ │ │ -Dune::MultiLinearGeometry::jacobianInverseTransposed │ │ │ │ │ -JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate │ │ │ │ │ -&local) const │ │ │ │ │ -obtain the transposed of the Jacobian's inverse │ │ │ │ │ -Definition: multilineargeometry.hh:738 │ │ │ │ │ -Dune::MultiLinearGeometry::Jacobian │ │ │ │ │ -FieldMatrix< ctype, coorddimension, mydimension > Jacobian │ │ │ │ │ -Type for the Jacobian matrix. │ │ │ │ │ -Definition: multilineargeometry.hh:207 │ │ │ │ │ -Dune::MultiLinearGeometry::affine │ │ │ │ │ -bool affine() const │ │ │ │ │ -is this mapping affine? │ │ │ │ │ -Definition: multilineargeometry.hh:262 │ │ │ │ │ -Dune::MultiLinearGeometry::JacobianInverse │ │ │ │ │ -FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse │ │ │ │ │ -Type for the inverse Jacobian matrix. │ │ │ │ │ -Definition: multilineargeometry.hh:210 │ │ │ │ │ -Dune::MultiLinearGeometry::affine │ │ │ │ │ -bool affine(JacobianTransposed &jacobianT) const │ │ │ │ │ -Definition: multilineargeometry.hh:458 │ │ │ │ │ -Dune::MultiLinearGeometry::integrationElement │ │ │ │ │ -Volume integrationElement(const LocalCoordinate &local) const │ │ │ │ │ -obtain the integration element │ │ │ │ │ -Definition: multilineargeometry.hh:350 │ │ │ │ │ -Dune::MultiLinearGeometry::jacobian │ │ │ │ │ -Jacobian jacobian(const LocalCoordinate &local) const │ │ │ │ │ -Obtain the Jacobian. │ │ │ │ │ -Definition: multilineargeometry.hh:407 │ │ │ │ │ -Dune::MultiLinearGeometry::JacobianInverseTransposed │ │ │ │ │ -Definition: multilineargeometry.hh:488 │ │ │ │ │ -Dune::MultiLinearGeometry::JacobianInverseTransposed::setup │ │ │ │ │ -void setup(const JacobianTransposed &jt) │ │ │ │ │ -Definition: multilineargeometry.hh:492 │ │ │ │ │ -Dune::MultiLinearGeometry::JacobianInverseTransposed::det │ │ │ │ │ -ctype det() const │ │ │ │ │ -Definition: multilineargeometry.hh:502 │ │ │ │ │ -Dune::MultiLinearGeometry::JacobianInverseTransposed::detInv │ │ │ │ │ -ctype detInv() const │ │ │ │ │ -Definition: multilineargeometry.hh:503 │ │ │ │ │ -Dune::MultiLinearGeometry::JacobianInverseTransposed::setupDeterminant │ │ │ │ │ -void setupDeterminant(const JacobianTransposed &jt) │ │ │ │ │ -Definition: multilineargeometry.hh:497 │ │ │ │ │ -Dune::CachedMultiLinearGeometry │ │ │ │ │ -Implement a MultiLinearGeometry with additional caching. │ │ │ │ │ -Definition: multilineargeometry.hh:526 │ │ │ │ │ -Dune::CachedMultiLinearGeometry::global │ │ │ │ │ -GlobalCoordinate global(const LocalCoordinate &local) const │ │ │ │ │ -evaluate the mapping │ │ │ │ │ -Definition: multilineargeometry.hh:580 │ │ │ │ │ -Dune::CachedMultiLinearGeometry::ReferenceElement │ │ │ │ │ -Base::ReferenceElement ReferenceElement │ │ │ │ │ -Definition: multilineargeometry.hh:534 │ │ │ │ │ -Dune::CachedMultiLinearGeometry::affine │ │ │ │ │ -bool affine() const │ │ │ │ │ -is this mapping affine? │ │ │ │ │ -Definition: multilineargeometry.hh:567 │ │ │ │ │ -Dune::CachedMultiLinearGeometry::CachedMultiLinearGeometry │ │ │ │ │ -CachedMultiLinearGeometry(const ReferenceElement &referenceElement, const │ │ │ │ │ -CornerStorage &cornerStorage) │ │ │ │ │ -Definition: multilineargeometry.hh:551 │ │ │ │ │ -Dune::CachedMultiLinearGeometry::refElement │ │ │ │ │ -ReferenceElement refElement() const │ │ │ │ │ -Definition: multilineargeometry.hh:425 │ │ │ │ │ -Dune::CachedMultiLinearGeometry::MatrixHelper │ │ │ │ │ -Base::MatrixHelper MatrixHelper │ │ │ │ │ -Definition: multilineargeometry.hh:531 │ │ │ │ │ -Dune::CachedMultiLinearGeometry::LocalCoordinate │ │ │ │ │ -Base::LocalCoordinate LocalCoordinate │ │ │ │ │ -Definition: multilineargeometry.hh:541 │ │ │ │ │ -Dune::CachedMultiLinearGeometry::jacobianInverse │ │ │ │ │ -JacobianInverse jacobianInverse(const LocalCoordinate &local) const │ │ │ │ │ -Obtain the Jacobian's inverse. │ │ │ │ │ -Definition: multilineargeometry.hh:713 │ │ │ │ │ -Dune::CachedMultiLinearGeometry::jacobianTransposed │ │ │ │ │ -JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const │ │ │ │ │ -obtain the transposed of the Jacobian │ │ │ │ │ -Definition: multilineargeometry.hh:666 │ │ │ │ │ -Dune::CachedMultiLinearGeometry::corner │ │ │ │ │ -GlobalCoordinate corner(int i) const │ │ │ │ │ -obtain coordinates of the i-th corner │ │ │ │ │ -Definition: multilineargeometry.hh:275 │ │ │ │ │ -Dune::CachedMultiLinearGeometry::volume │ │ │ │ │ -Volume volume() const │ │ │ │ │ -obtain the volume of the mapping's image │ │ │ │ │ -Definition: multilineargeometry.hh:649 │ │ │ │ │ -Dune::CachedMultiLinearGeometry::CachedMultiLinearGeometry │ │ │ │ │ -CachedMultiLinearGeometry(Dune::GeometryType gt, const CornerStorage │ │ │ │ │ -&cornerStorage) │ │ │ │ │ -Definition: multilineargeometry.hh:559 │ │ │ │ │ -Dune::CachedMultiLinearGeometry::integrationElement │ │ │ │ │ -ctype integrationElement(const LocalCoordinate &local) const │ │ │ │ │ -obtain the integration element │ │ │ │ │ -Definition: multilineargeometry.hh:633 │ │ │ │ │ -Dune::CachedMultiLinearGeometry::ctype │ │ │ │ │ -Base::ctype ctype │ │ │ │ │ -Definition: multilineargeometry.hh:536 │ │ │ │ │ -Dune::CachedMultiLinearGeometry::jacobian │ │ │ │ │ -Jacobian jacobian(const LocalCoordinate &local) const │ │ │ │ │ -Obtain the Jacobian. │ │ │ │ │ -Definition: multilineargeometry.hh:702 │ │ │ │ │ -Dune::CachedMultiLinearGeometry::JacobianInverseTransposed │ │ │ │ │ -Base::JacobianInverseTransposed JacobianInverseTransposed │ │ │ │ │ -Definition: multilineargeometry.hh:546 │ │ │ │ │ -Dune::CachedMultiLinearGeometry::JacobianTransposed │ │ │ │ │ -Base::JacobianTransposed JacobianTransposed │ │ │ │ │ -Definition: multilineargeometry.hh:545 │ │ │ │ │ -Dune::CachedMultiLinearGeometry::JacobianInverse │ │ │ │ │ -Base::JacobianInverse JacobianInverse │ │ │ │ │ -Definition: multilineargeometry.hh:548 │ │ │ │ │ -Dune::CachedMultiLinearGeometry::Jacobian │ │ │ │ │ -Base::Jacobian Jacobian │ │ │ │ │ -Definition: multilineargeometry.hh:547 │ │ │ │ │ -Dune::CachedMultiLinearGeometry::Volume │ │ │ │ │ -Base::Volume Volume │ │ │ │ │ -Definition: multilineargeometry.hh:543 │ │ │ │ │ -Dune::CachedMultiLinearGeometry::GlobalCoordinate │ │ │ │ │ -Base::GlobalCoordinate GlobalCoordinate │ │ │ │ │ -Definition: multilineargeometry.hh:542 │ │ │ │ │ -Dune::CachedMultiLinearGeometry::center │ │ │ │ │ -GlobalCoordinate center() const │ │ │ │ │ -obtain the centroid of the mapping's image │ │ │ │ │ -Definition: multilineargeometry.hh:572 │ │ │ │ │ -Dune::CachedMultiLinearGeometry::jacobianInverseTransposed │ │ │ │ │ -JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate │ │ │ │ │ -&local) const │ │ │ │ │ -obtain the transposed of the Jacobian's inverse │ │ │ │ │ -Definition: multilineargeometry.hh:680 │ │ │ │ │ +Dune::operator<< │ │ │ │ │ +std::ostream & operator<<(std::ostream &s, const GeometryType &a) │ │ │ │ │ +Prints the type to an output stream. │ │ │ │ │ +Definition: type.hh:420 │ │ │ │ │ +Dune::GeometryTypes::prismaticExtension │ │ │ │ │ +constexpr GeometryType prismaticExtension(const GeometryType >) │ │ │ │ │ +Return GeometryType of a prismatic construction with gt as base │ │ │ │ │ +Definition: type.hh:493 │ │ │ │ │ +Dune::GeometryTypes::conicalExtension │ │ │ │ │ +constexpr GeometryType conicalExtension(const GeometryType >) │ │ │ │ │ +Return GeometryType of a conical construction with gt as base │ │ │ │ │ +Definition: type.hh:487 │ │ │ │ │ Dune::GeometryType │ │ │ │ │ Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ Definition: type.hh:125 │ │ │ │ │ +Dune::GeometryType::GeometryType │ │ │ │ │ +constexpr GeometryType(unsigned int topologyId, unsigned int dim) │ │ │ │ │ +Constructor, using the topologyId (integer) and the dimension. │ │ │ │ │ +Definition: type.hh:262 │ │ │ │ │ +Dune::GeometryType::operator< │ │ │ │ │ +constexpr bool operator<(const GeometryType &other) const │ │ │ │ │ +less-than operation for use with maps │ │ │ │ │ +Definition: type.hh:403 │ │ │ │ │ +Dune::GeometryType::operator!= │ │ │ │ │ +constexpr bool operator!=(const GeometryType &other) const │ │ │ │ │ +Check for inequality. │ │ │ │ │ +Definition: type.hh:398 │ │ │ │ │ +Dune::GeometryType::isPyramid │ │ │ │ │ +constexpr bool isPyramid() const │ │ │ │ │ +Return true if entity is a pyramid. │ │ │ │ │ +Definition: type.hh:315 │ │ │ │ │ +Dune::GeometryType::isTetrahedron │ │ │ │ │ +constexpr bool isTetrahedron() const │ │ │ │ │ +Return true if entity is a tetrahedron. │ │ │ │ │ +Definition: type.hh:310 │ │ │ │ │ +Dune::GeometryType::isPrism │ │ │ │ │ +constexpr bool isPrism() const │ │ │ │ │ +Return true if entity is a prism. │ │ │ │ │ +Definition: type.hh:320 │ │ │ │ │ +Dune::GeometryType::isVertex │ │ │ │ │ +constexpr bool isVertex() const │ │ │ │ │ +Return true if entity is a vertex. │ │ │ │ │ +Definition: type.hh:290 │ │ │ │ │ +Dune::GeometryType::operator== │ │ │ │ │ +constexpr bool operator==(const GeometryType &other) const │ │ │ │ │ +Check for equality. This method knows that in dimension 0 and 1 all BasicTypes │ │ │ │ │ +are equal. │ │ │ │ │ +Definition: type.hh:387 │ │ │ │ │ +Dune::GeometryType::toId │ │ │ │ │ +constexpr Id toId() const │ │ │ │ │ +Create an Id representation of this GeometryType. │ │ │ │ │ +Definition: type.hh:221 │ │ │ │ │ +Dune::GeometryType::isConical │ │ │ │ │ +constexpr bool isConical(const int &step) const │ │ │ │ │ +Return true if entity was constructed with a conical product in the chosen │ │ │ │ │ +step. │ │ │ │ │ +Definition: type.hh:348 │ │ │ │ │ +Dune::GeometryType::dim │ │ │ │ │ +constexpr unsigned int dim() const │ │ │ │ │ +Return dimension of the type. │ │ │ │ │ +Definition: type.hh:371 │ │ │ │ │ +Dune::GeometryType::isPrismatic │ │ │ │ │ +constexpr bool isPrismatic(const int &step) const │ │ │ │ │ +Return true if entity was constructed with a prismatic product in the chosen │ │ │ │ │ +step. │ │ │ │ │ +Definition: type.hh:361 │ │ │ │ │ +Dune::GeometryType::isTriangle │ │ │ │ │ +constexpr bool isTriangle() const │ │ │ │ │ +Return true if entity is a triangle. │ │ │ │ │ +Definition: type.hh:300 │ │ │ │ │ +Dune::GeometryType::GeometryType │ │ │ │ │ +GeometryType(TopologyType t) │ │ │ │ │ +Constructor from static TopologyType class. │ │ │ │ │ +Definition: type.hh:278 │ │ │ │ │ +Dune::GeometryType::GeometryType │ │ │ │ │ +constexpr GeometryType(unsigned int topologyId, unsigned int dim, bool isNone) │ │ │ │ │ +Constructor, using the topologyId (integer), the dimension and a flag for type │ │ │ │ │ +none. │ │ │ │ │ +Definition: type.hh:253 │ │ │ │ │ +Dune::GeometryType::BasicType │ │ │ │ │ +BasicType │ │ │ │ │ +Each entity can be tagged by one of these basic types plus its space dimension. │ │ │ │ │ +Definition: type.hh:131 │ │ │ │ │ +Dune::GeometryType::cube │ │ │ │ │ +@ cube │ │ │ │ │ +Cube element in any nonnegative dimension. │ │ │ │ │ +Definition: type.hh:133 │ │ │ │ │ +Dune::GeometryType::simplex │ │ │ │ │ +@ simplex │ │ │ │ │ +Simplicial element in any nonnegative dimension. │ │ │ │ │ +Definition: type.hh:132 │ │ │ │ │ +Dune::GeometryType::pyramid │ │ │ │ │ +@ pyramid │ │ │ │ │ +Four sided pyramid in three dimensions. │ │ │ │ │ +Definition: type.hh:134 │ │ │ │ │ +Dune::GeometryType::extended │ │ │ │ │ +@ extended │ │ │ │ │ +Other, more general topology, representable as topologyId. │ │ │ │ │ +Definition: type.hh:136 │ │ │ │ │ +Dune::GeometryType::none │ │ │ │ │ +@ none │ │ │ │ │ +Even more general topology, cannot be specified by a topologyId. Two │ │ │ │ │ +GeometryTypes with 'none' type a... │ │ │ │ │ +Definition: type.hh:137 │ │ │ │ │ +Dune::GeometryType::prism │ │ │ │ │ +@ prism │ │ │ │ │ +Prism element in three dimensions. │ │ │ │ │ +Definition: type.hh:135 │ │ │ │ │ +Dune::GeometryType::GeometryType │ │ │ │ │ +constexpr GeometryType(Id id) │ │ │ │ │ +Reconstruct a Geometry type from a GeometryType::Id. │ │ │ │ │ +Definition: type.hh:233 │ │ │ │ │ +Dune::GeometryType::isCube │ │ │ │ │ +constexpr bool isCube() const │ │ │ │ │ +Return true if entity is a cube of any dimension. │ │ │ │ │ +Definition: type.hh:335 │ │ │ │ │ +Dune::GeometryType::GeometryType │ │ │ │ │ +constexpr GeometryType() │ │ │ │ │ +Default constructor, not initializing anything. │ │ │ │ │ +Definition: type.hh:243 │ │ │ │ │ +Dune::GeometryType::isConical │ │ │ │ │ +constexpr bool isConical() const │ │ │ │ │ +Return true if entity was constructed with a conical product in the last step. │ │ │ │ │ +Definition: type.hh:340 │ │ │ │ │ +Dune::GeometryType::isLine │ │ │ │ │ +constexpr bool isLine() const │ │ │ │ │ +Return true if entity is a line segment. │ │ │ │ │ +Definition: type.hh:295 │ │ │ │ │ +Dune::GeometryType::isQuadrilateral │ │ │ │ │ +constexpr bool isQuadrilateral() const │ │ │ │ │ +Return true if entity is a quadrilateral. │ │ │ │ │ +Definition: type.hh:305 │ │ │ │ │ +Dune::GeometryType::isPrismatic │ │ │ │ │ +constexpr bool isPrismatic() const │ │ │ │ │ +Return true if entity was constructed with a prismatic product in the last │ │ │ │ │ +step. │ │ │ │ │ +Definition: type.hh:353 │ │ │ │ │ +Dune::GeometryType::id │ │ │ │ │ +constexpr unsigned int id() const │ │ │ │ │ +Return the topology id of the type. │ │ │ │ │ +Definition: type.hh:376 │ │ │ │ │ +Dune::GeometryType::isNone │ │ │ │ │ +constexpr bool isNone() const │ │ │ │ │ +Return true if entity is a singular of any dimension. │ │ │ │ │ +Definition: type.hh:366 │ │ │ │ │ +Dune::GeometryType::isHexahedron │ │ │ │ │ +constexpr bool isHexahedron() const │ │ │ │ │ +Return true if entity is a hexahedron. │ │ │ │ │ +Definition: type.hh:325 │ │ │ │ │ +Dune::GeometryType::isSimplex │ │ │ │ │ +constexpr bool isSimplex() const │ │ │ │ │ +Return true if entity is a simplex of any dimension. │ │ │ │ │ +Definition: type.hh:330 │ │ │ │ │ +Dune::GeometryType::Id │ │ │ │ │ +IdType Id │ │ │ │ │ +An integral id representing a GeometryType. │ │ │ │ │ +Definition: type.hh:192 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00221.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: typeindex.hh File Reference │ │ │ │ +dune-geometry: virtualrefinement.cc File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -64,44 +64,94 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
typeindex.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Macros | │ │ │ │ +Functions
│ │ │ │ +
virtualrefinement.cc File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

Helper classes to provide indices for geometrytypes for use in a vector. │ │ │ │ +

This file contains the virtual wrapper around refinement. │ │ │ │ More...

│ │ │ │ -
#include <cstddef>
│ │ │ │ -#include <dune/common/indices.hh>
│ │ │ │ -#include <dune/common/hybridutilities.hh>
│ │ │ │ -#include "type.hh"
│ │ │ │ -
│ │ │ │ -

Go to the source code of this file.

│ │ │ │ - │ │ │ │ +
#include <cassert>
│ │ │ │ +#include <typeinfo>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/common/fvector.hh>
│ │ │ │ +#include <dune/common/iteratorfacades.hh>
│ │ │ │ +#include "type.hh"
│ │ │ │ +#include "refinement.hh"
│ │ │ │ +
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Classes

class  Dune::LocalGeometryTypeIndex
 Compute per-dimension indices for geometry types. More...
class  Dune::VirtualRefinementSubEntityIteratorSpecial< dimension, CoordType, dimension >
 
class  Dune::VirtualRefinementSubEntityIteratorSpecial< dimension, CoordType, 0 >
 
class  Dune::VirtualRefinement< dimension, CoordType >::Codim< codimension >
 
class  Dune::VirtualRefinementSubEntityIteratorBackSpecial< dimension, CoordType, dimension >
 
class  Dune::VirtualRefinementSubEntityIteratorBackSpecial< dimension, CoordType, 0 >
 
class  Dune::VirtualRefinement< dimension, CoordType >::SubEntityIteratorBack< dimension, CoordType >
 
class  Dune::VirtualRefinementImp< topologyId, CoordType, coerceToId, dimension >
 
class  Dune::VirtualRefinementImpSubEntityIteratorBackSpecial< topologyId, CoordType, coerceToId, dimension, dimension >
 
class  Dune::VirtualRefinementImpSubEntityIteratorBackSpecial< topologyId, CoordType, coerceToId, dimension, 0 >
 
class  Dune::GlobalGeometryTypeIndex
 Compute indices for geometry types, taking the dimension into account. More...
class  Dune::VirtualRefinementImp< topologyId, CoordType, coerceToId, dimension >::SubEntityIteratorBack< codimension >
 
class  Dune::RefinementBuilder< dimension, CoordType >
 
class  Dune::RefinementBuilder< 1, CoordType >
 
class  Dune::RefinementBuilder< 3, CoordType >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Macros

#define DUNE_GEOMETRY_VIRTUALREFINEMENT_CC
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

template<int dimension, class CoordType >
VirtualRefinement< dimension, CoordType > & Dune::buildRefinement (GeometryType geometryType, GeometryType coerceTo)
 return a reference to the VirtualRefinement according to the parameters More...
 
│ │ │ │

Detailed Description

│ │ │ │ -

Helper classes to provide indices for geometrytypes for use in a vector.

│ │ │ │ -
│ │ │ │ +

This file contains the virtual wrapper around refinement.

│ │ │ │ +

Macro Definition Documentation

│ │ │ │ + │ │ │ │ +

◆ DUNE_GEOMETRY_VIRTUALREFINEMENT_CC

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_GEOMETRY_VIRTUALREFINEMENT_CC
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,32 +4,75 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ -Classes | Namespaces │ │ │ │ │ -typeindex.hh File Reference │ │ │ │ │ -Helper classes to provide indices for geometrytypes for use in a vector. │ │ │ │ │ -More... │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces | Macros | Functions │ │ │ │ │ +virtualrefinement.cc File Reference │ │ │ │ │ +This file contains the virtual wrapper around refinement. More... │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include "type.hh" │ │ │ │ │ -Go_to_the_source_code_of_this_file. │ │ │ │ │ +#include "refinement.hh" │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::LocalGeometryTypeIndex │ │ │ │ │ -  Compute per-dimension indices for geometry types. More... │ │ │ │ │ +class  Dune::VirtualRefinementSubEntityIteratorSpecial<_dimension,_CoordType, │ │ │ │ │ + dimension_> │ │ │ │ │   │ │ │ │ │ -class  Dune::GlobalGeometryTypeIndex │ │ │ │ │ -  Compute indices for geometry types, taking the dimension into account. │ │ │ │ │ - More... │ │ │ │ │ +class  Dune::VirtualRefinementSubEntityIteratorSpecial<_dimension,_CoordType, │ │ │ │ │ + 0_> │ │ │ │ │ +  │ │ │ │ │ +class  Dune::VirtualRefinement<_dimension,_CoordType_>::Codim<_codimension_> │ │ │ │ │ +  │ │ │ │ │ +class  Dune::VirtualRefinementSubEntityIteratorBackSpecial<_dimension, │ │ │ │ │ + CoordType,_dimension_> │ │ │ │ │ +  │ │ │ │ │ +class  Dune::VirtualRefinementSubEntityIteratorBackSpecial<_dimension, │ │ │ │ │ + CoordType,_0_> │ │ │ │ │ +  │ │ │ │ │ +class  Dune::VirtualRefinement<_dimension,_CoordType_>::SubEntityIteratorBack< │ │ │ │ │ + dimension,_CoordType_> │ │ │ │ │ +  │ │ │ │ │ +class  Dune::VirtualRefinementImp<_topologyId,_CoordType,_coerceToId, │ │ │ │ │ + dimension_> │ │ │ │ │ +  │ │ │ │ │ +class  Dune::VirtualRefinementImpSubEntityIteratorBackSpecial<_topologyId, │ │ │ │ │ + CoordType,_coerceToId,_dimension,_dimension_> │ │ │ │ │ +  │ │ │ │ │ +class  Dune::VirtualRefinementImpSubEntityIteratorBackSpecial<_topologyId, │ │ │ │ │ + CoordType,_coerceToId,_dimension,_0_> │ │ │ │ │ +  │ │ │ │ │ +class  Dune::VirtualRefinementImp<_topologyId,_CoordType,_coerceToId, │ │ │ │ │ + dimension_>::SubEntityIteratorBack<_codimension_> │ │ │ │ │ +  │ │ │ │ │ +class  Dune::RefinementBuilder<_dimension,_CoordType_> │ │ │ │ │ +  │ │ │ │ │ +class  Dune::RefinementBuilder<_1,_CoordType_> │ │ │ │ │ +  │ │ │ │ │ +class  Dune::RefinementBuilder<_3,_CoordType_> │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ + Macros │ │ │ │ │ +#define DUNE_GEOMETRY_VIRTUALREFINEMENT_CC │ │ │ │ │ +  │ │ │ │ │ + Functions │ │ │ │ │ +template │ │ │ │ │ +VirtualRefinement< dimension, CoordType > Dune::buildRefinement (GeometryType │ │ │ │ │ + & geometryType, GeometryType coerceTo) │ │ │ │ │ + return a reference to the │ │ │ │ │ +  VirtualRefinement according to the │ │ │ │ │ + parameters More... │ │ │ │ │ +  │ │ │ │ │ ***** Detailed Description ***** │ │ │ │ │ -Helper classes to provide indices for geometrytypes for use in a vector. │ │ │ │ │ +This file contains the virtual wrapper around refinement. │ │ │ │ │ +***** Macro Definition Documentation ***** │ │ │ │ │ +***** ◆ DUNE_GEOMETRY_VIRTUALREFINEMENT_CC ***** │ │ │ │ │ +#define DUNE_GEOMETRY_VIRTUALREFINEMENT_CC │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00224.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: dimension.hh File Reference │ │ │ │ +dune-geometry: simplex.cc File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,42 +58,109 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
dimension.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Macros
│ │ │ │ +
simplex.cc File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <type_traits>
│ │ │ │ -
│ │ │ │ -

Go to the source code of this file.

│ │ │ │ - │ │ │ │ + │ │ │ │ +

This file contains the Refinement implementation for simplices (triangles, tetrahedrons...) │ │ │ │ +More...

│ │ │ │ +
#include <algorithm>
│ │ │ │ +#include <dune/common/fvector.hh>
│ │ │ │ +#include <dune/common/math.hh>
│ │ │ │ +#include <dune/geometry/multilineargeometry.hh>
│ │ │ │ +#include <dune/geometry/referenceelements.hh>
│ │ │ │ +#include <dune/geometry/type.hh>
│ │ │ │ +#include "base.cc"
│ │ │ │ +
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Classes

struct  Dune::Dim< dim >
 Static tag representing a dimension. More...
class  Dune::RefinementImp::Simplex::RefinementImp< dimension_, CoordType >
 
struct  Dune::RefinementImp::Simplex::RefinementImp< dimension_, CoordType >::Codim< codimension >
 
class  Dune::RefinementImp::Simplex::RefinementIteratorSpecial< dimension, CoordType, dimension >
 
struct  Dune::Codim< codim >
 Static tag representing a codimension. More...
class  Dune::RefinementImp::Simplex::RefinementIteratorSpecial< dimension, CoordType, 0 >
 
class  Dune::RefinementImp::Simplex::RefinementImp< dimension_, CoordType >::Codim< codimension >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::RefinementImp
 This namespace contains the implementation of Refinement.
 
namespace  Dune::RefinementImp::Simplex
 This namespace contains the Refinement implementation for simplices (triangles, tetrahedrons...)
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Macros

#define DUNE_GRID_COMMON_REFINEMENT_SIMPLEX_CC
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

Utilities
int Dune::RefinementImp::Simplex::factorial (int n)
 Calculate n! More...
 
int Dune::RefinementImp::Simplex::binomial (int upper, int lower)
 calculate $\left({upper}\atop{lower}\right)$ More...
 
template<int dimension>
int Dune::RefinementImp::Simplex::pointIndex (const FieldVector< int, dimension > &point)
 calculate the index of a given gridpoint within a Kuhn0 simplex More...
 
template<int n>
FieldVector< int, n > Dune::RefinementImp::Simplex::getPermutation (int m)
 Calculate permutation from it's index. More...
 
template<int dimension, class CoordType >
FieldVector< CoordType, dimension > Dune::RefinementImp::Simplex::referenceToKuhn (FieldVector< CoordType, dimension > point, const FieldVector< int, dimension > &kuhn)
 Map from the reference simplex to some Kuhn simplex. More...
 
template<int dimension, class CoordType >
FieldVector< CoordType, dimension > Dune::RefinementImp::Simplex::kuhnToReference (FieldVector< CoordType, dimension > point, const FieldVector< int, dimension > &kuhn)
 Map from some Kuhn simplex to the reference simplex. More...
 
│ │ │ │ +

Detailed Description

│ │ │ │ +

This file contains the Refinement implementation for simplices (triangles, tetrahedrons...)

│ │ │ │ +

See Refinement implementation for simplices.

│ │ │ │ +

Macro Definition Documentation

│ │ │ │ + │ │ │ │ +

◆ DUNE_GRID_COMMON_REFINEMENT_SIMPLEX_CC

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_GRID_COMMON_REFINEMENT_SIMPLEX_CC
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,24 +4,97 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ -Classes | Namespaces │ │ │ │ │ -dimension.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -Go_to_the_source_code_of_this_file. │ │ │ │ │ + * refinement │ │ │ │ │ +Classes | Namespaces | Macros │ │ │ │ │ +simplex.cc File Reference │ │ │ │ │ +This file contains the Refinement implementation for simplices (triangles, │ │ │ │ │ +tetrahedrons...) More... │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "base.cc" │ │ │ │ │ Classes │ │ │ │ │ -struct  Dune::Dim<_dim_> │ │ │ │ │ -  Static tag representing a dimension. More... │ │ │ │ │ + class  Dune::RefinementImp::Simplex::RefinementImp<_dimension_,_CoordType_> │ │ │ │ │   │ │ │ │ │ -struct  Dune::Codim<_codim_> │ │ │ │ │ -  Static tag representing a codimension. More... │ │ │ │ │ +struct  Dune::RefinementImp::Simplex::RefinementImp<_dimension_,_CoordType_>:: │ │ │ │ │ + Codim<_codimension_> │ │ │ │ │ +  │ │ │ │ │ + class  Dune::RefinementImp::Simplex::RefinementIteratorSpecial<_dimension, │ │ │ │ │ + CoordType,_dimension_> │ │ │ │ │ +  │ │ │ │ │ + class  Dune::RefinementImp::Simplex::RefinementIteratorSpecial<_dimension, │ │ │ │ │ + CoordType,_0_> │ │ │ │ │ +  │ │ │ │ │ + class  Dune::RefinementImp::Simplex::RefinementImp<_dimension_,_CoordType_>:: │ │ │ │ │ + Codim<_codimension_> │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ +namespace  Dune::RefinementImp │ │ │ │ │ +  This namespace contains the implementation of Refinement. │ │ │ │ │ +  │ │ │ │ │ +namespace  Dune::RefinementImp::Simplex │ │ │ │ │ +  This namespace contains the Refinement implementation for simplices │ │ │ │ │ + (triangles, tetrahedrons...) │ │ │ │ │ +  │ │ │ │ │ + Macros │ │ │ │ │ +#define DUNE_GRID_COMMON_REFINEMENT_SIMPLEX_CC │ │ │ │ │ +  │ │ │ │ │ + Functions │ │ │ │ │ +Utilities │ │ │ │ │ + int Dune::RefinementImp::Simplex::factorial │ │ │ │ │ + (int n) │ │ │ │ │ +  Calculate n! More... │ │ │ │ │ +  │ │ │ │ │ + int Dune::RefinementImp::Simplex::binomial │ │ │ │ │ + (int upper, int lower) │ │ │ │ │ +  calculate [$\left({upper}\atop │ │ │ │ │ + {lower}\right)$] More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + int Dune::RefinementImp::Simplex::pointIndex │ │ │ │ │ + (const FieldVector< int, dimension > │ │ │ │ │ + &point) │ │ │ │ │ +  calculate the index of a given gridpoint │ │ │ │ │ + within a Kuhn0 simplex More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + FieldVector< int, n > Dune::RefinementImp::Simplex:: │ │ │ │ │ + getPermutation (int m) │ │ │ │ │ +  Calculate permutation from it's index. │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +FieldVector< CoordType, dimension > Dune::RefinementImp::Simplex:: │ │ │ │ │ + referenceToKuhn (FieldVector< CoordType, │ │ │ │ │ + dimension > point, const FieldVector< int, │ │ │ │ │ + dimension > &kuhn) │ │ │ │ │ +  Map from the reference simplex to some │ │ │ │ │ + Kuhn simplex. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +FieldVector< CoordType, dimension > Dune::RefinementImp::Simplex:: │ │ │ │ │ + kuhnToReference (FieldVector< CoordType, │ │ │ │ │ + dimension > point, const FieldVector< int, │ │ │ │ │ + dimension > &kuhn) │ │ │ │ │ +  Map from some Kuhn simplex to the │ │ │ │ │ + reference simplex. More... │ │ │ │ │ +  │ │ │ │ │ +***** Detailed Description ***** │ │ │ │ │ +This file contains the Refinement implementation for simplices (triangles, │ │ │ │ │ +tetrahedrons...) │ │ │ │ │ +See Refinement_implementation_for_simplices. │ │ │ │ │ +***** Macro Definition Documentation ***** │ │ │ │ │ +***** ◆ DUNE_GRID_COMMON_REFINEMENT_SIMPLEX_CC ***** │ │ │ │ │ +#define DUNE_GRID_COMMON_REFINEMENT_SIMPLEX_CC │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00227.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: virtualrefinement.hh File Reference │ │ │ │ +dune-geometry: base.cc File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,59 +58,85 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ +Macros | │ │ │ │ Functions
│ │ │ │ -
virtualrefinement.hh File Reference
│ │ │ │ +
base.cc File Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

This file contains the virtual wrapper around refinement. │ │ │ │ +

This file contains the parts independent of a particular Refinement implementation. │ │ │ │ More...

│ │ │ │ -
#include <vector>
│ │ │ │ -#include <dune/common/fvector.hh>
│ │ │ │ -#include "refinement.hh"
│ │ │ │ -#include "type.hh"
│ │ │ │ -#include "virtualrefinement.cc"
│ │ │ │ -
│ │ │ │ -

Go to the source code of this file.

│ │ │ │ - │ │ │ │ +
#include <dune/geometry/type.hh>
│ │ │ │ +
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Classes

class  Dune::VirtualRefinement< dimension, CoordType >
 VirtualRefinement base class. More...
struct  Dune::RefinementImp::Traits< topologyId, CoordType, coerceToId, dimension, Dummy >
 Mapping from geometryType, CoordType and coerceTo to a particular Refinement implementation. More...
 
class  Dune::RefinementIntervals
 Holds the number of refined intervals per axis needed for virtual and static refinement. More...
 
class  Dune::StaticRefinement< topologyId, CoordType, coerceToId, dimension_ >
 Wrap each Refinement implementation to get a consistent interface. More...
 
struct  Dune::VirtualRefinement< dimension, CoordType >::Codim< codimension >
 codim database of VirtualRefinement More...
struct  Dune::StaticRefinement< topologyId, CoordType, coerceToId, dimension_ >::Codim< codimension >
 The Codim struct inherited from the Refinement implementation. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::RefinementImp
 This namespace contains the implementation of Refinement.
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Macros

#define DUNE_GEOMETRY_REFINEMENT_BASE_CC
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<int dimension, class CoordType >
VirtualRefinement< dimension, CoordType > & Dune::buildRefinement (GeometryType geometryType, GeometryType coerceTo)
 return a reference to the VirtualRefinement according to the parameters More...
 
RefinementIntervals Dune::refinementIntervals (int intervals)
 Creates a RefinementIntervals object. More...
 
RefinementIntervals Dune::refinementLevels (int levels)
 Creates a RefinementIntervals object. More...
 
│ │ │ │

Detailed Description

│ │ │ │ -

This file contains the virtual wrapper around refinement.

│ │ │ │ -
│ │ │ │ +

This file contains the parts independent of a particular Refinement implementation.

│ │ │ │ +

Macro Definition Documentation

│ │ │ │ + │ │ │ │ +

◆ DUNE_GEOMETRY_REFINEMENT_BASE_CC

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_GEOMETRY_REFINEMENT_BASE_CC
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,39 +4,57 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ -Classes | Namespaces | Functions │ │ │ │ │ -virtualrefinement.hh File Reference │ │ │ │ │ -This file contains the virtual wrapper around refinement. More... │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "refinement.hh" │ │ │ │ │ -#include "type.hh" │ │ │ │ │ -#include "virtualrefinement.cc" │ │ │ │ │ -Go_to_the_source_code_of_this_file. │ │ │ │ │ + * refinement │ │ │ │ │ +Classes | Namespaces | Macros | Functions │ │ │ │ │ +base.cc File Reference │ │ │ │ │ +This file contains the parts independent of a particular Refinement │ │ │ │ │ +implementation. More... │ │ │ │ │ +#include │ │ │ │ │ Classes │ │ │ │ │ - class  Dune::VirtualRefinement<_dimension,_CoordType_> │ │ │ │ │ -  VirtualRefinement base class. More... │ │ │ │ │ +struct  Dune::RefinementImp::Traits<_topologyId,_CoordType,_coerceToId, │ │ │ │ │ + dimension,_Dummy_> │ │ │ │ │ +  Mapping from geometryType, CoordType and coerceTo to a particular │ │ │ │ │ + Refinement implementation. More... │ │ │ │ │   │ │ │ │ │ -struct  Dune::VirtualRefinement<_dimension,_CoordType_>::Codim<_codimension_> │ │ │ │ │ -  codim database of VirtualRefinement More... │ │ │ │ │ + class  Dune::RefinementIntervals │ │ │ │ │ +  Holds the number of refined intervals per axis needed for virtual and │ │ │ │ │ + static refinement. More... │ │ │ │ │ +  │ │ │ │ │ + class  Dune::StaticRefinement<_topologyId,_CoordType,_coerceToId,_dimension_ │ │ │ │ │ + > │ │ │ │ │ +  Wrap each Refinement implementation to get a consistent interface. │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::StaticRefinement<_topologyId,_CoordType,_coerceToId,_dimension_ │ │ │ │ │ + >::Codim<_codimension_> │ │ │ │ │ +  The Codim struct inherited from the Refinement implementation. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ +namespace  Dune::RefinementImp │ │ │ │ │ +  This namespace contains the implementation of Refinement. │ │ │ │ │ +  │ │ │ │ │ + Macros │ │ │ │ │ +#define DUNE_GEOMETRY_REFINEMENT_BASE_CC │ │ │ │ │ +  │ │ │ │ │ Functions │ │ │ │ │ -template │ │ │ │ │ -VirtualRefinement< dimension, CoordType > Dune::buildRefinement (GeometryType │ │ │ │ │ - & geometryType, GeometryType coerceTo) │ │ │ │ │ - return a reference to the │ │ │ │ │ -  VirtualRefinement according to the │ │ │ │ │ - parameters More... │ │ │ │ │ +RefinementIntervals Dune::refinementIntervals (int intervals) │ │ │ │ │ +  Creates a RefinementIntervals object. More... │ │ │ │ │ +  │ │ │ │ │ +RefinementIntervals Dune::refinementLevels (int levels) │ │ │ │ │ +  Creates a RefinementIntervals object. More... │ │ │ │ │   │ │ │ │ │ ***** Detailed Description ***** │ │ │ │ │ -This file contains the virtual wrapper around refinement. │ │ │ │ │ +This file contains the parts independent of a particular Refinement │ │ │ │ │ +implementation. │ │ │ │ │ +***** Macro Definition Documentation ***** │ │ │ │ │ +***** ◆ DUNE_GEOMETRY_REFINEMENT_BASE_CC ***** │ │ │ │ │ +#define DUNE_GEOMETRY_REFINEMENT_BASE_CC │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00230.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: deprecated_topology.hh File Reference │ │ │ │ +dune-geometry: pyramidtriangulation.cc File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,23 +58,84 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
deprecated_topology.hh File Reference
│ │ │ │ +
│ │ │ │ +Classes | │ │ │ │ +Namespaces | │ │ │ │ +Macros | │ │ │ │ +Functions
│ │ │ │ +
pyramidtriangulation.cc File Reference
│ │ │ │
│ │ │ │
│ │ │ │ +
#include <dune/common/fvector.hh>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │ +#include <dune/geometry/referenceelements.hh>
│ │ │ │ +#include <dune/geometry/type.hh>
│ │ │ │ +#include "base.cc"
│ │ │ │ +#include "simplex.cc"
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Classes

class  Dune::RefinementImp::PyramidTriangulation::RefinementImp< dimension_, CoordType >
 Implementation of the refinement of a pyramid into simplices. More...
 
struct  Dune::RefinementImp::PyramidTriangulation::RefinementImp< dimension_, CoordType >::Codim< codimension >
 
class  Dune::RefinementImp::PyramidTriangulation::RefinementIteratorSpecial< dimension, CoordType, dimension >
 
class  Dune::RefinementImp::PyramidTriangulation::RefinementIteratorSpecial< dimension, CoordType, 0 >
 
class  Dune::RefinementImp::PyramidTriangulation::RefinementImp< dimension_, CoordType >::Codim< codimension >
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Namespaces

namespace  Dune
 
namespace  Dune::RefinementImp
 This namespace contains the implementation of Refinement.
 
namespace  Dune::RefinementImp::PyramidTriangulation
 This namespace contains the Refinement implementation for triangulating pyramids (GeometryType::pyramid -> GeometryType::simplex)
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Macros

#define DUNE_GEOMETRY_REFINEMENT_PYRAMIDTRIANGULATION_CC
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Functions

template<int dimension, class CoordType >
FieldVector< CoordType, dimension > Dune::RefinementImp::PyramidTriangulation::transformCoordinate (FieldVector< CoordType, dimension > point)
 
│ │ │ │ +

Macro Definition Documentation

│ │ │ │ + │ │ │ │ +

◆ DUNE_GEOMETRY_REFINEMENT_PYRAMIDTRIANGULATION_CC

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_GEOMETRY_REFINEMENT_PYRAMIDTRIANGULATION_CC
│ │ │ │ +
│ │ │ │ │ │ │ │ -

Go to the source code of this file.

│ │ │ │ +
│ │ │ │ +
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,12 +4,60 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ -deprecated_topology.hh File Reference │ │ │ │ │ -Go_to_the_source_code_of_this_file. │ │ │ │ │ + * refinement │ │ │ │ │ +Classes | Namespaces | Macros | Functions │ │ │ │ │ +pyramidtriangulation.cc File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "base.cc" │ │ │ │ │ +#include "simplex.cc" │ │ │ │ │ + Classes │ │ │ │ │ + class  Dune::RefinementImp::PyramidTriangulation::RefinementImp<_dimension_, │ │ │ │ │ + CoordType_> │ │ │ │ │ +  Implementation of the refinement of a pyramid into simplices. More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::RefinementImp::PyramidTriangulation::RefinementImp<_dimension_, │ │ │ │ │ + CoordType_>::Codim<_codimension_> │ │ │ │ │ +  │ │ │ │ │ + class  Dune::RefinementImp::PyramidTriangulation::RefinementIteratorSpecial< │ │ │ │ │ + dimension,_CoordType,_dimension_> │ │ │ │ │ +  │ │ │ │ │ + class  Dune::RefinementImp::PyramidTriangulation::RefinementIteratorSpecial< │ │ │ │ │ + dimension,_CoordType,_0_> │ │ │ │ │ +  │ │ │ │ │ + class  Dune::RefinementImp::PyramidTriangulation::RefinementImp<_dimension_, │ │ │ │ │ + CoordType_>::Codim<_codimension_> │ │ │ │ │ +  │ │ │ │ │ + Namespaces │ │ │ │ │ +namespace  Dune │ │ │ │ │ +  │ │ │ │ │ +namespace  Dune::RefinementImp │ │ │ │ │ +  This namespace contains the implementation of Refinement. │ │ │ │ │ +  │ │ │ │ │ +namespace  Dune::RefinementImp::PyramidTriangulation │ │ │ │ │ + This namespace contains the Refinement implementation for │ │ │ │ │ +  triangulating pyramids (GeometryType::pyramid -> GeometryType:: │ │ │ │ │ + simplex) │ │ │ │ │ +  │ │ │ │ │ + Macros │ │ │ │ │ +#define DUNE_GEOMETRY_REFINEMENT_PYRAMIDTRIANGULATION_CC │ │ │ │ │ +  │ │ │ │ │ + Functions │ │ │ │ │ +template │ │ │ │ │ +FieldVector< CoordType, dimension > Dune::RefinementImp:: │ │ │ │ │ + PyramidTriangulation::transformCoordinate │ │ │ │ │ + (FieldVector< CoordType, dimension > │ │ │ │ │ + point) │ │ │ │ │ +  │ │ │ │ │ +***** Macro Definition Documentation ***** │ │ │ │ │ +***** ◆ DUNE_GEOMETRY_REFINEMENT_PYRAMIDTRIANGULATION_CC ***** │ │ │ │ │ +#define DUNE_GEOMETRY_REFINEMENT_PYRAMIDTRIANGULATION_CC │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00233.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: virtualrefinement.cc File Reference │ │ │ │ +dune-geometry: hcube.cc File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,94 +58,80 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ -Macros | │ │ │ │ -Functions
│ │ │ │ -
virtualrefinement.cc File Reference
│ │ │ │ +Macros
│ │ │ │ +
hcube.cc File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

This file contains the virtual wrapper around refinement. │ │ │ │ +

This file contains the Refinement implementation for hypercubes (quadrilaterals, hexahedrons, etc.). │ │ │ │ More...

│ │ │ │
#include <cassert>
│ │ │ │ -#include <typeinfo>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ #include <dune/common/fvector.hh>
│ │ │ │ #include <dune/common/iteratorfacades.hh>
│ │ │ │ -#include "type.hh"
│ │ │ │ -#include "refinement.hh"
│ │ │ │ +#include <dune/geometry/referenceelements.hh>
│ │ │ │ +#include <dune/geometry/axisalignedcubegeometry.hh>
│ │ │ │ +#include "base.cc"
│ │ │ │
│ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Classes

class  Dune::VirtualRefinementSubEntityIteratorSpecial< dimension, CoordType, dimension >
class  Dune::RefinementImp::HCube::RefinementImp< dimension_, CoordType >
 Refinement implementation for hypercubes More...
 
class  Dune::VirtualRefinementSubEntityIteratorSpecial< dimension, CoordType, 0 >
struct  Dune::RefinementImp::HCube::RefinementImp< dimension_, CoordType >::Codim< codimension >
 
class  Dune::VirtualRefinement< dimension, CoordType >::Codim< codimension >
class  Dune::RefinementImp::HCube::RefinementSubEntityIteratorSpecial< dimension, CoordType, codimension >
 SubEntityIterator base class for hypercube refinement. More...
 
class  Dune::VirtualRefinementSubEntityIteratorBackSpecial< dimension, CoordType, dimension >
class  Dune::RefinementImp::HCube::RefinementSubEntityIteratorSpecial< dimension, CoordType, dimension >
 
class  Dune::VirtualRefinementSubEntityIteratorBackSpecial< dimension, CoordType, 0 >
class  Dune::RefinementImp::HCube::RefinementSubEntityIteratorSpecial< dimension, CoordType, 0 >
 
class  Dune::VirtualRefinement< dimension, CoordType >::SubEntityIteratorBack< dimension, CoordType >
 
class  Dune::VirtualRefinementImp< topologyId, CoordType, coerceToId, dimension >
 
class  Dune::VirtualRefinementImpSubEntityIteratorBackSpecial< topologyId, CoordType, coerceToId, dimension, dimension >
 
class  Dune::VirtualRefinementImpSubEntityIteratorBackSpecial< topologyId, CoordType, coerceToId, dimension, 0 >
 
class  Dune::VirtualRefinementImp< topologyId, CoordType, coerceToId, dimension >::SubEntityIteratorBack< codimension >
 
class  Dune::RefinementBuilder< dimension, CoordType >
 
class  Dune::RefinementBuilder< 1, CoordType >
 
class  Dune::RefinementBuilder< 3, CoordType >
class  Dune::RefinementImp::HCube::RefinementImp< dimension_, CoordType >::Codim< codimension >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::RefinementImp
 This namespace contains the implementation of Refinement.
 
namespace  Dune::RefinementImp::HCube
 This namespace contains the Refinement implementation for hypercubes (GeometryType::cube).
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ Macros

#define DUNE_GEOMETRY_VIRTUALREFINEMENT_CC
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Functions

template<int dimension, class CoordType >
VirtualRefinement< dimension, CoordType > & Dune::buildRefinement (GeometryType geometryType, GeometryType coerceTo)
 return a reference to the VirtualRefinement according to the parameters More...
 
#define DUNE_GEOMETRY_REFINEMENT_HCUBE_CC
 
│ │ │ │

Detailed Description

│ │ │ │ -

This file contains the virtual wrapper around refinement.

│ │ │ │ +

This file contains the Refinement implementation for hypercubes (quadrilaterals, hexahedrons, etc.).

│ │ │ │ +

See Refinement implementation for hypercubes.

│ │ │ │

Macro Definition Documentation

│ │ │ │ - │ │ │ │ -

◆ DUNE_GEOMETRY_VIRTUALREFINEMENT_CC

│ │ │ │ + │ │ │ │ +

◆ DUNE_GEOMETRY_REFINEMENT_HCUBE_CC

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │
#define DUNE_GEOMETRY_VIRTUALREFINEMENT_CC#define DUNE_GEOMETRY_REFINEMENT_HCUBE_CC
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,75 +4,61 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ -Classes | Namespaces | Macros | Functions │ │ │ │ │ -virtualrefinement.cc File Reference │ │ │ │ │ -This file contains the virtual wrapper around refinement. More... │ │ │ │ │ + * refinement │ │ │ │ │ +Classes | Namespaces | Macros │ │ │ │ │ +hcube.cc File Reference │ │ │ │ │ +This file contains the Refinement implementation for hypercubes │ │ │ │ │ +(quadrilaterals, hexahedrons, etc.). More... │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ #include │ │ │ │ │ #include │ │ │ │ │ -#include "type.hh" │ │ │ │ │ -#include "refinement.hh" │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "base.cc" │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::VirtualRefinementSubEntityIteratorSpecial<_dimension,_CoordType, │ │ │ │ │ - dimension_> │ │ │ │ │ + class  Dune::RefinementImp::HCube::RefinementImp<_dimension_,_CoordType_> │ │ │ │ │ +  Refinement implementation for hypercubes More... │ │ │ │ │   │ │ │ │ │ -class  Dune::VirtualRefinementSubEntityIteratorSpecial<_dimension,_CoordType, │ │ │ │ │ - 0_> │ │ │ │ │ +struct  Dune::RefinementImp::HCube::RefinementImp<_dimension_,_CoordType_>:: │ │ │ │ │ + Codim<_codimension_> │ │ │ │ │   │ │ │ │ │ -class  Dune::VirtualRefinement<_dimension,_CoordType_>::Codim<_codimension_> │ │ │ │ │ + class  Dune::RefinementImp::HCube::RefinementSubEntityIteratorSpecial< │ │ │ │ │ + dimension,_CoordType,_codimension_> │ │ │ │ │ +  SubEntityIterator base class for hypercube refinement. More... │ │ │ │ │   │ │ │ │ │ -class  Dune::VirtualRefinementSubEntityIteratorBackSpecial<_dimension, │ │ │ │ │ - CoordType,_dimension_> │ │ │ │ │ + class  Dune::RefinementImp::HCube::RefinementSubEntityIteratorSpecial< │ │ │ │ │ + dimension,_CoordType,_dimension_> │ │ │ │ │   │ │ │ │ │ -class  Dune::VirtualRefinementSubEntityIteratorBackSpecial<_dimension, │ │ │ │ │ - CoordType,_0_> │ │ │ │ │ + class  Dune::RefinementImp::HCube::RefinementSubEntityIteratorSpecial< │ │ │ │ │ + dimension,_CoordType,_0_> │ │ │ │ │   │ │ │ │ │ -class  Dune::VirtualRefinement<_dimension,_CoordType_>::SubEntityIteratorBack< │ │ │ │ │ - dimension,_CoordType_> │ │ │ │ │ -  │ │ │ │ │ -class  Dune::VirtualRefinementImp<_topologyId,_CoordType,_coerceToId, │ │ │ │ │ - dimension_> │ │ │ │ │ -  │ │ │ │ │ -class  Dune::VirtualRefinementImpSubEntityIteratorBackSpecial<_topologyId, │ │ │ │ │ - CoordType,_coerceToId,_dimension,_dimension_> │ │ │ │ │ -  │ │ │ │ │ -class  Dune::VirtualRefinementImpSubEntityIteratorBackSpecial<_topologyId, │ │ │ │ │ - CoordType,_coerceToId,_dimension,_0_> │ │ │ │ │ -  │ │ │ │ │ -class  Dune::VirtualRefinementImp<_topologyId,_CoordType,_coerceToId, │ │ │ │ │ - dimension_>::SubEntityIteratorBack<_codimension_> │ │ │ │ │ -  │ │ │ │ │ -class  Dune::RefinementBuilder<_dimension,_CoordType_> │ │ │ │ │ -  │ │ │ │ │ -class  Dune::RefinementBuilder<_1,_CoordType_> │ │ │ │ │ -  │ │ │ │ │ -class  Dune::RefinementBuilder<_3,_CoordType_> │ │ │ │ │ + class  Dune::RefinementImp::HCube::RefinementImp<_dimension_,_CoordType_>:: │ │ │ │ │ + Codim<_codimension_> │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ - Macros │ │ │ │ │ -#define DUNE_GEOMETRY_VIRTUALREFINEMENT_CC │ │ │ │ │ +namespace  Dune::RefinementImp │ │ │ │ │ +  This namespace contains the implementation of Refinement. │ │ │ │ │   │ │ │ │ │ - Functions │ │ │ │ │ -template │ │ │ │ │ -VirtualRefinement< dimension, CoordType > Dune::buildRefinement (GeometryType │ │ │ │ │ - & geometryType, GeometryType coerceTo) │ │ │ │ │ - return a reference to the │ │ │ │ │ -  VirtualRefinement according to the │ │ │ │ │ - parameters More... │ │ │ │ │ +namespace  Dune::RefinementImp::HCube │ │ │ │ │ +  This namespace contains the Refinement implementation for │ │ │ │ │ + hypercubes (GeometryType::cube). │ │ │ │ │ +  │ │ │ │ │ + Macros │ │ │ │ │ +#define DUNE_GEOMETRY_REFINEMENT_HCUBE_CC │ │ │ │ │   │ │ │ │ │ ***** Detailed Description ***** │ │ │ │ │ -This file contains the virtual wrapper around refinement. │ │ │ │ │ +This file contains the Refinement implementation for hypercubes │ │ │ │ │ +(quadrilaterals, hexahedrons, etc.). │ │ │ │ │ +See Refinement_implementation_for_hypercubes. │ │ │ │ │ ***** Macro Definition Documentation ***** │ │ │ │ │ -***** ◆ DUNE_GEOMETRY_VIRTUALREFINEMENT_CC ***** │ │ │ │ │ -#define DUNE_GEOMETRY_VIRTUALREFINEMENT_CC │ │ │ │ │ +***** ◆ DUNE_GEOMETRY_REFINEMENT_HCUBE_CC ***** │ │ │ │ │ +#define DUNE_GEOMETRY_REFINEMENT_HCUBE_CC │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00236.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: topologyfactory.hh File Reference │ │ │ │ +dune-geometry: prismtriangulation.cc File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,49 +58,84 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
topologyfactory.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Macros | │ │ │ │ +Functions
│ │ │ │ +
prismtriangulation.cc File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <cassert>
│ │ │ │ -#include <array>
│ │ │ │ -#include <map>
│ │ │ │ -#include <memory>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <vector>
│ │ │ │ -#include <dune/geometry/type.hh>
│ │ │ │ -#include <dune/geometry/typeindex.hh>
│ │ │ │ -
│ │ │ │ -

Go to the source code of this file.

│ │ │ │ - │ │ │ │ +
#include <dune/common/fvector.hh>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │ +#include <dune/geometry/referenceelements.hh>
│ │ │ │ +#include <dune/geometry/type.hh>
│ │ │ │ +#include "base.cc"
│ │ │ │ +#include "simplex.cc"
│ │ │ │ +
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Classes

struct  Dune::TopologyFactory< Traits >
 Provide a factory over the generic topologies. More...
class  Dune::RefinementImp::PrismTriangulation::RefinementImp< dimension_, CoordType >
 Implementation of the refinement of a prism into simplices. More...
 
struct  Dune::RefinementImp::PrismTriangulation::RefinementImp< dimension_, CoordType >::Codim< codimension >
 
class  Dune::RefinementImp::PrismTriangulation::RefinementIteratorSpecial< dimension, CoordType, dimension >
 
struct  Dune::TopologySingletonFactory< Factory >
 A wrapper for a TopologyFactory providing singleton storage. Same usage as TopologyFactory but with empty release method an internal storage. More...
class  Dune::RefinementImp::PrismTriangulation::RefinementIteratorSpecial< dimension, CoordType, 0 >
 
class  Dune::RefinementImp::PrismTriangulation::RefinementImp< dimension_, CoordType >::Codim< codimension >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::RefinementImp
 This namespace contains the implementation of Refinement.
 
namespace  Dune::RefinementImp::PrismTriangulation
 This namespace contains the Refinement implementation for triangulating prisms (GeometryType::prism -> GeometryType::simplex)
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Macros

#define DUNE_GEOMETRY_REFINEMENT_PRISMTRIANGULATION_CC
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

template<int dimension, class CoordType >
FieldVector< CoordType, dimension > Dune::RefinementImp::PrismTriangulation::transformCoordinate (FieldVector< CoordType, dimension > point)
 
│ │ │ │ +

Macro Definition Documentation

│ │ │ │ + │ │ │ │ +

◆ DUNE_GEOMETRY_REFINEMENT_PRISMTRIANGULATION_CC

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_GEOMETRY_REFINEMENT_PRISMTRIANGULATION_CC
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,33 +4,59 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ -Classes | Namespaces │ │ │ │ │ -topologyfactory.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * refinement │ │ │ │ │ +Classes | Namespaces | Macros | Functions │ │ │ │ │ +prismtriangulation.cc File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -Go_to_the_source_code_of_this_file. │ │ │ │ │ +#include "base.cc" │ │ │ │ │ +#include "simplex.cc" │ │ │ │ │ Classes │ │ │ │ │ -struct  Dune::TopologyFactory<_Traits_> │ │ │ │ │ -  Provide a factory over the generic topologies. More... │ │ │ │ │ + class  Dune::RefinementImp::PrismTriangulation::RefinementImp<_dimension_, │ │ │ │ │ + CoordType_> │ │ │ │ │ +  Implementation of the refinement of a prism into simplices. More... │ │ │ │ │   │ │ │ │ │ -struct  Dune::TopologySingletonFactory<_Factory_> │ │ │ │ │ - A wrapper for a TopologyFactory providing singleton storage. Same │ │ │ │ │ -  usage as TopologyFactory but with empty release method an internal │ │ │ │ │ - storage. More... │ │ │ │ │ +struct  Dune::RefinementImp::PrismTriangulation::RefinementImp<_dimension_, │ │ │ │ │ + CoordType_>::Codim<_codimension_> │ │ │ │ │ +  │ │ │ │ │ + class  Dune::RefinementImp::PrismTriangulation::RefinementIteratorSpecial< │ │ │ │ │ + dimension,_CoordType,_dimension_> │ │ │ │ │ +  │ │ │ │ │ + class  Dune::RefinementImp::PrismTriangulation::RefinementIteratorSpecial< │ │ │ │ │ + dimension,_CoordType,_0_> │ │ │ │ │ +  │ │ │ │ │ + class  Dune::RefinementImp::PrismTriangulation::RefinementImp<_dimension_, │ │ │ │ │ + CoordType_>::Codim<_codimension_> │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ +namespace  Dune::RefinementImp │ │ │ │ │ +  This namespace contains the implementation of Refinement. │ │ │ │ │ +  │ │ │ │ │ +namespace  Dune::RefinementImp::PrismTriangulation │ │ │ │ │ + This namespace contains the Refinement implementation for │ │ │ │ │ +  triangulating prisms (GeometryType::prism -> GeometryType::simplex) │ │ │ │ │ + │ │ │ │ │ +  │ │ │ │ │ + Macros │ │ │ │ │ +#define DUNE_GEOMETRY_REFINEMENT_PRISMTRIANGULATION_CC │ │ │ │ │ +  │ │ │ │ │ + Functions │ │ │ │ │ +template │ │ │ │ │ +FieldVector< CoordType, dimension > Dune::RefinementImp::PrismTriangulation:: │ │ │ │ │ + transformCoordinate (FieldVector< │ │ │ │ │ + CoordType, dimension > point) │ │ │ │ │ +  │ │ │ │ │ +***** Macro Definition Documentation ***** │ │ │ │ │ +***** ◆ DUNE_GEOMETRY_REFINEMENT_PRISMTRIANGULATION_CC ***** │ │ │ │ │ +#define DUNE_GEOMETRY_REFINEMENT_PRISMTRIANGULATION_CC │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00239.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: referenceelementimplementation.cc File Reference │ │ │ │ +dune-geometry: hcubetriangulation.cc File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,33 +58,80 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Namespaces
│ │ │ │ -
referenceelementimplementation.cc File Reference
│ │ │ │ +Classes | │ │ │ │ +Namespaces | │ │ │ │ +Macros
│ │ │ │ +
hcubetriangulation.cc File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <config.h>
│ │ │ │ -#include <dune/geometry/referenceelementimplementation.hh>
│ │ │ │ + │ │ │ │ +

This file contains the Refinement implementation for triangulating hypercubes (quadrilateral -> triangle, hexahedron -> tetrahedron) │ │ │ │ +More...

│ │ │ │ +
#include <dune/geometry/referenceelements.hh>
│ │ │ │ +#include <dune/geometry/type.hh>
│ │ │ │ +#include "base.cc"
│ │ │ │ +#include "simplex.cc"
│ │ │ │
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Classes

class  Dune::RefinementImp::HCubeTriangulation::RefinementImp< dimension_, CoordType >
 
struct  Dune::RefinementImp::HCubeTriangulation::RefinementImp< dimension_, CoordType >::Codim< codimension >
 
class  Dune::RefinementImp::HCubeTriangulation::RefinementIteratorSpecial< dimension, CoordType, dimension >
 
class  Dune::RefinementImp::HCubeTriangulation::RefinementIteratorSpecial< dimension, CoordType, 0 >
 
class  Dune::RefinementImp::HCubeTriangulation::RefinementImp< dimension_, CoordType >::Codim< codimension >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Geo
namespace  Dune::RefinementImp
 This namespace contains the implementation of Refinement.
 
namespace  Dune::RefinementImp::HCubeTriangulation
 This namespace contains the Refinement implementation for triangulating hypercubes (GeometryType::cube -> GeometryType::simplex)
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Macros

#define DUNE_GEOMETRY_REFINEMENT_HCUBETRIANGULATION_CC
 
│ │ │ │ +

Detailed Description

│ │ │ │ +

This file contains the Refinement implementation for triangulating hypercubes (quadrilateral -> triangle, hexahedron -> tetrahedron)

│ │ │ │ +

See Refinement implementation for triangulating hypercubes.

│ │ │ │ +

Macro Definition Documentation

│ │ │ │ + │ │ │ │ +

◆ DUNE_GEOMETRY_REFINEMENT_HCUBETRIANGULATION_CC

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_GEOMETRY_REFINEMENT_HCUBETRIANGULATION_CC
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,19 +4,56 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ -Namespaces │ │ │ │ │ -referenceelementimplementation.cc File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * refinement │ │ │ │ │ +Classes | Namespaces | Macros │ │ │ │ │ +hcubetriangulation.cc File Reference │ │ │ │ │ +This file contains the Refinement implementation for triangulating hypercubes │ │ │ │ │ +(quadrilateral -> triangle, hexahedron -> tetrahedron) More... │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "base.cc" │ │ │ │ │ +#include "simplex.cc" │ │ │ │ │ + Classes │ │ │ │ │ + class  Dune::RefinementImp::HCubeTriangulation::RefinementImp<_dimension_, │ │ │ │ │ + CoordType_> │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::RefinementImp::HCubeTriangulation::RefinementImp<_dimension_, │ │ │ │ │ + CoordType_>::Codim<_codimension_> │ │ │ │ │ +  │ │ │ │ │ + class  Dune::RefinementImp::HCubeTriangulation::RefinementIteratorSpecial< │ │ │ │ │ + dimension,_CoordType,_dimension_> │ │ │ │ │ +  │ │ │ │ │ + class  Dune::RefinementImp::HCubeTriangulation::RefinementIteratorSpecial< │ │ │ │ │ + dimension,_CoordType,_0_> │ │ │ │ │ +  │ │ │ │ │ + class  Dune::RefinementImp::HCubeTriangulation::RefinementImp<_dimension_, │ │ │ │ │ + CoordType_>::Codim<_codimension_> │ │ │ │ │ +  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   │ │ │ │ │ -namespace  Dune::Geo │ │ │ │ │ +namespace  Dune::RefinementImp │ │ │ │ │ +  This namespace contains the implementation of Refinement. │ │ │ │ │ +  │ │ │ │ │ +namespace  Dune::RefinementImp::HCubeTriangulation │ │ │ │ │ + This namespace contains the Refinement implementation for │ │ │ │ │ +  triangulating hypercubes (GeometryType::cube -> GeometryType:: │ │ │ │ │ + simplex) │ │ │ │ │ +  │ │ │ │ │ + Macros │ │ │ │ │ +#define DUNE_GEOMETRY_REFINEMENT_HCUBETRIANGULATION_CC │ │ │ │ │   │ │ │ │ │ +***** Detailed Description ***** │ │ │ │ │ +This file contains the Refinement implementation for triangulating hypercubes │ │ │ │ │ +(quadrilateral -> triangle, hexahedron -> tetrahedron) │ │ │ │ │ +See Refinement_implementation_for_triangulating_hypercubes. │ │ │ │ │ +***** Macro Definition Documentation ***** │ │ │ │ │ +***** ◆ DUNE_GEOMETRY_REFINEMENT_HCUBETRIANGULATION_CC ***** │ │ │ │ │ +#define DUNE_GEOMETRY_REFINEMENT_HCUBETRIANGULATION_CC │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00251.html │ │ │ │ @@ -198,15 +198,15 @@ │ │ │ │
{
│ │ │ │
typedef SquaringTheCircle::RefinementImp<CoordType> Imp;
│ │ │ │
};
│ │ │ │
}
│ │ │ │
constexpr GeometryType cube(unsigned int dim)
Returns a GeometryType representing a hypercube of dimension dim.
Definition: type.hh:472
│ │ │ │
This namespace contains the implementation of Refinement.
Definition: base.cc:29
│ │ │ │
If you implement a template class, you have to specialise struct RefinementImp::Traits for every possible combination of topologyId and coerceToId that your implementation supports. │ │ │ │ -
  • #include "refinement/squaringthecircle.cc" from refinement.hh.
  • │ │ │ │ +
  • #include "refinement/squaringthecircle.cc" from refinement.hh.
  • │ │ │ │ │ │ │ │

    This is enough to integrate your implementation into the Refinement system. You probably want to include it into VirtualRefinement also.

    │ │ │ │

    │ │ │ │ Namespaces

    │ │ │ │

    Function Documentation

    │ │ │ │ │ │ │ │

    ◆ refinementIntervals()

    │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00254.html │ │ │ │ @@ -390,16 +390,16 @@ │ │ │ │ ) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │

    Algorithm to reduce vertex order information.

    │ │ │ │ -
    │ │ │ │ - │ │ │ │ +
    │ │ │ │ + │ │ │ │
    Parameters
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
    inBeginStart of the range of ids to reduce.
    inEndEnd of the range of ids to reduce.
    outItStart of the sequence where to store the result.
    │ │ │ │
    │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01083.html │ │ │ │ @@ -75,15 +75,15 @@ │ │ │ │
    Dune::Geo::ReferenceElement< Implementation > Class Template Reference
    │ │ │ │
    │ │ │ │
    │ │ │ │ │ │ │ │

    This class provides access to geometric and topological properties of a reference element. │ │ │ │ More...

    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/referenceelement.hh>

    │ │ │ │ +

    #include <dune/geometry/referenceelement.hh>

    │ │ │ │
    │ │ │ │ Inheritance diagram for Dune::Geo::ReferenceElement< Implementation >:
    │ │ │ │
    │ │ │ │
    Inheritance graph
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -879,16 +879,16 @@ │ │ │ │
    │ │ │ │ │ │ │ │

    The dimension of the reference element.

    │ │ │ │ │ │ │ │
    │ │ │ │
    │ │ │ │
    The documentation for this class was generated from the following files: │ │ │ │
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01087.html │ │ │ │ @@ -75,15 +75,15 @@ │ │ │ │
    Inheritance graph
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01091.html │ │ │ │ @@ -74,15 +74,15 @@ │ │ │ │
    Dune::Geo::ReferenceElements< ctype_, dim > Struct Template Reference
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │

    Class providing access to the singletons of the reference elements. │ │ │ │ More...

    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/referenceelements.hh>

    │ │ │ │ +

    #include <dune/geometry/referenceelements.hh>

    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -382,16 +382,16 @@ │ │ │ │
    │ │ │ │ │ │ │ │

    The dimension of the contained reference elements.

    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this struct was generated from the following files: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01099.html │ │ │ │ @@ -74,15 +74,15 @@ │ │ │ │
    Dune::AffineGeometry< ct, mydim, cdim > Class Template Reference
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │

    Implementation of the Geometry interface for affine geometries. │ │ │ │ More...

    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/affinegeometry.hh>

    │ │ │ │ +

    #include <dune/geometry/affinegeometry.hh>

    │ │ │ │

    │ │ │ │ Public Types

    using ctype = ctype_
     The coordinate field type of the contained reference elements. More...
     
    using CoordinateField = ctype
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -988,15 +988,15 @@ │ │ │ │
    │ │ │ │ │ │ │ │

    Dimension of the geometry.

    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01103.html │ │ │ │ @@ -74,15 +74,15 @@ │ │ │ │
    Dune::AxisAlignedCubeGeometry< CoordType, dim, coorddim > Class Template Reference
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │

    A geometry implementation for axis-aligned hypercubes. │ │ │ │ More...

    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/axisalignedcubegeometry.hh>

    │ │ │ │ +

    #include <dune/geometry/axisalignedcubegeometry.hh>

    │ │ │ │

    │ │ │ │ Public Types

    typedef ct ctype
     Type used for coordinates. More...
     
    typedef FieldVector< ctype, mydimensionLocalCoordinate
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -893,15 +893,15 @@ │ │ │ │
    │ │ │ │ │ │ │ │

    Dimension of the cube element.

    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01159.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
    Dune::Dim< dim > Struct Template Reference
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │

    Static tag representing a dimension. │ │ │ │ More...

    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/dimension.hh>

    │ │ │ │ +

    #include <dune/geometry/dimension.hh>

    │ │ │ │
    │ │ │ │ Inheritance diagram for Dune::Dim< dim >:
    │ │ │ │
    │ │ │ │
    Inheritance graph
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -109,15 +109,15 @@ │ │ │ │ │ │ │ │

    │ │ │ │ Public Types

    typedef CoordType ctype
     Type used for single coordinate coefficients. More...
     
    typedef FieldVector< ctype, dim > LocalCoordinate
    │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01163.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
    Dune::Codim< codim > Struct Template Reference
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │

    Static tag representing a codimension. │ │ │ │ More...

    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/dimension.hh>

    │ │ │ │ +

    #include <dune/geometry/dimension.hh>

    │ │ │ │
    │ │ │ │ Inheritance diagram for Dune::Codim< codim >:
    │ │ │ │
    │ │ │ │
    Inheritance graph
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -112,15 +112,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │
    │ │ │ │
    The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01167.html │ │ │ │ @@ -75,15 +75,15 @@ │ │ │ │
    Dune::GeneralVertexOrder< dim, Index_ > Class Template Reference
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │

    Class providing information on the ordering of vertices. │ │ │ │ More...

    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/generalvertexorder.hh>

    │ │ │ │ +

    #include <dune/geometry/generalvertexorder.hh>

    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

    │ │ │ │ Classes

    class  iterator
     Iterate over the vertex indices of some sub-entity. More...
     
    │ │ │ │ @@ -410,15 +410,15 @@ │ │ │ │
    │ │ │ │ │ │ │ │

    export the dimension of the entity we provide information for

    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01171.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
    Dune::GeneralVertexOrder< dim, Index_ >::iterator Class Reference
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │

    Iterate over the vertex indices of some sub-entity. │ │ │ │ More...

    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/generalvertexorder.hh>

    │ │ │ │ +

    #include <dune/geometry/generalvertexorder.hh>

    │ │ │ │
    │ │ │ │ Inheritance diagram for Dune::GeneralVertexOrder< dim, Index_ >::iterator:
    │ │ │ │
    │ │ │ │
    Inheritance graph
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -333,15 +333,15 @@ │ │ │ │ │ │ │ │
    │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01175.html │ │ │ │ @@ -74,15 +74,15 @@ │ │ │ │
    Dune::MultiLinearGeometryTraits< ct > Struct Template Reference
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │

    default traits class for MultiLinearGeometry │ │ │ │ More...

    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/multilineargeometry.hh>

    │ │ │ │ +

    #include <dune/geometry/multilineargeometry.hh>

    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -169,15 +169,15 @@ │ │ │ │
    │ │ │ │ │ │ │ │

    tolerance to numerical algorithms

    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01179.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
    Dune::MultiLinearGeometryTraits< ct >::CornerStorage< mydim, cdim > Struct Template Reference
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │

    template specifying the storage for the corners │ │ │ │ More...

    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/multilineargeometry.hh>

    │ │ │ │ +

    #include <dune/geometry/multilineargeometry.hh>

    │ │ │ │

    │ │ │ │ Classes

    struct  CornerStorage
     template specifying the storage for the corners More...
     
    struct  hasSingleGeometryType
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

    │ │ │ │ Public Types

    typedef std::vector< FieldVector< ct, cdim > > Type
     
    │ │ │ │

    Detailed Description

    │ │ │ │ @@ -136,15 +136,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01183.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
    Dune::MultiLinearGeometryTraits< ct >::hasSingleGeometryType< dim > Struct Template Reference
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │

    will there be only one geometry type for a dimension? │ │ │ │ More...

    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/multilineargeometry.hh>

    │ │ │ │ +

    #include <dune/geometry/multilineargeometry.hh>

    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -144,15 +144,15 @@ │ │ │ │ │ │ │ │

    │ │ │ │ Static Public Attributes

    static const bool v = false
     
    static const unsigned int topologyId = ~0u
     
    │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01187.html │ │ │ │ @@ -78,15 +78,15 @@ │ │ │ │
    Dune::MultiLinearGeometry< ct, mydim, cdim, Traits > Class Template Reference
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │

    generic geometry implementation based on corner coordinates │ │ │ │ More...

    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/multilineargeometry.hh>

    │ │ │ │ +

    #include <dune/geometry/multilineargeometry.hh>

    │ │ │ │
    │ │ │ │ Inheritance diagram for Dune::MultiLinearGeometry< ct, mydim, cdim, Traits >:
    │ │ │ │
    │ │ │ │
    Inheritance graph
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -1512,15 +1512,15 @@ │ │ │ │
    │ │ │ │ │ │ │ │

    geometry dimension

    │ │ │ │ │ │ │ │
    │ │ │ │
    │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01191.html │ │ │ │ @@ -69,15 +69,15 @@ │ │ │ │
    │ │ │ │ Public Member Functions | │ │ │ │ List of all members
    │ │ │ │
    Dune::MultiLinearGeometry< ct, mydim, cdim, Traits >::JacobianInverseTransposed Class Reference
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/multilineargeometry.hh>

    │ │ │ │ +

    #include <dune/geometry/multilineargeometry.hh>

    │ │ │ │
    │ │ │ │ Inheritance diagram for Dune::MultiLinearGeometry< ct, mydim, cdim, Traits >::JacobianInverseTransposed:
    │ │ │ │
    │ │ │ │
    Inheritance graph
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -203,15 +203,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │
    │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01195.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │
    Dune::CachedMultiLinearGeometry< ct, mydim, cdim, Traits > Class Template Reference
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │

    Implement a MultiLinearGeometry with additional caching. │ │ │ │ More...

    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/multilineargeometry.hh>

    │ │ │ │ +

    #include <dune/geometry/multilineargeometry.hh>

    │ │ │ │
    │ │ │ │ Inheritance diagram for Dune::CachedMultiLinearGeometry< ct, mydim, cdim, Traits >:
    │ │ │ │
    │ │ │ │
    Inheritance graph
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -1430,15 +1430,15 @@ │ │ │ │
    │ │ │ │ │ │ │ │

    geometry dimension

    │ │ │ │ │ │ │ │
    │ │ │ │
    │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01199.html │ │ │ │ @@ -69,28 +69,28 @@ │ │ │ │
    Dune::QuadratureOrderOutOfRange Class Reference
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │

    Exception thrown if a desired QuadratureRule is not available, because the requested order is to high. │ │ │ │ More...

    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/quadraturerules.hh>

    │ │ │ │ +

    #include <dune/geometry/quadraturerules.hh>

    │ │ │ │
    │ │ │ │ Inheritance diagram for Dune::QuadratureOrderOutOfRange:
    │ │ │ │
    │ │ │ │
    Inheritance graph
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │

    Detailed Description

    │ │ │ │

    Exception thrown if a desired QuadratureRule is not available, because the requested order is to high.

    │ │ │ │

    The documentation for this class was generated from the following file: │ │ │ │
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01203.html │ │ │ │ @@ -75,15 +75,15 @@ │ │ │ │
    Dune::QuadraturePoint< ct, dim > Class Template Reference
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │

    Single evaluation point in a quadrature rule. │ │ │ │ More...

    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/quadraturerules.hh>

    │ │ │ │ +

    #include <dune/geometry/quadraturerules.hh>

    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -334,15 +334,15 @@ │ │ │ │ │ │ │ │

    │ │ │ │ Public Types

    typedef ct Field
     Number type used for coordinates and quadrature weights. More...
     
    typedef Dune::FieldVector< ct, dim > Vector
    │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01207.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │
    Dune::QuadratureRule< ct, dim > Class Template Reference
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │

    Abstract base class for quadrature rules. │ │ │ │ More...

    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/quadraturerules.hh>

    │ │ │ │ +

    #include <dune/geometry/quadraturerules.hh>

    │ │ │ │
    │ │ │ │ Inheritance diagram for Dune::QuadratureRule< ct, dim >:
    │ │ │ │
    │ │ │ │
    Inheritance graph
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -466,15 +466,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │
    │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01211.html │ │ │ │ @@ -71,21 +71,21 @@ │ │ │ │
    Dune::QuadratureRuleFactory< ctype, dim > Class Template Reference
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │

    Factory class for creation of quadrature rules, depending on GeometryType, order and QuadratureType. │ │ │ │ More...

    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/quadraturerules.hh>

    │ │ │ │ +

    #include <dune/geometry/quadraturerules.hh>

    │ │ │ │

    Detailed Description

    │ │ │ │
    template<typename ctype, int dim>
    │ │ │ │ class Dune::QuadratureRuleFactory< ctype, dim >

    Factory class for creation of quadrature rules, depending on GeometryType, order and QuadratureType.

    │ │ │ │

    The whole class is private and can only be accessed by the singleton container class QuadratureRules.

    │ │ │ │

    The documentation for this class was generated from the following file: │ │ │ │
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01215.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
    Dune::QuadratureRules< ctype, dim > Class Template Reference
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │

    A container for all quadrature rules of dimension dim │ │ │ │ More...

    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/quadraturerules.hh>

    │ │ │ │ +

    #include <dune/geometry/quadraturerules.hh>

    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -223,15 +223,15 @@ │ │ │ │
    │ │ │ │ │ │ │ │

    select the appropriate QuadratureRule for GeometryType t and order p

    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01219.html │ │ │ │ @@ -68,17 +68,17 @@ │ │ │ │
    │ │ │ │
    │ │ │ │ List of all members
    │ │ │ │
    Dune::QuadratureRuleFactory< ctype, 0 > Class Template Reference
    │ │ │ │
    │ │ │ │
    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/quadraturerules.hh>

    │ │ │ │ +

    #include <dune/geometry/quadraturerules.hh>

    │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01223.html │ │ │ │ @@ -68,17 +68,17 @@ │ │ │ │
    │ │ │ │
    │ │ │ │ List of all members
    │ │ │ │
    Dune::QuadratureRuleFactory< ctype, 1 > Class Template Reference
    │ │ │ │
    │ │ │ │
    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/quadraturerules.hh>

    │ │ │ │ +

    #include <dune/geometry/quadraturerules.hh>

    │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01227.html │ │ │ │ @@ -68,17 +68,17 @@ │ │ │ │
    │ │ │ │
    │ │ │ │ List of all members
    │ │ │ │
    Dune::QuadratureRuleFactory< ctype, 2 > Class Template Reference
    │ │ │ │
    │ │ │ │
    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/quadraturerules.hh>

    │ │ │ │ +

    #include <dune/geometry/quadraturerules.hh>

    │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01231.html │ │ │ │ @@ -68,17 +68,17 @@ │ │ │ │
    │ │ │ │
    │ │ │ │ List of all members
    │ │ │ │
    Dune::QuadratureRuleFactory< ctype, 3 > Class Template Reference
    │ │ │ │
    │ │ │ │
    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/quadraturerules.hh>

    │ │ │ │ +

    #include <dune/geometry/quadraturerules.hh>

    │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01239.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
    Dune::Geo::ReferenceElement< Implementation >::Codim< codim > Struct Template Reference
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │

    Collection of types depending on the codimension. │ │ │ │ More...

    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/referenceelement.hh>

    │ │ │ │ +

    #include <dune/geometry/referenceelement.hh>

    │ │ │ │

    │ │ │ │ Static Public Member Functions

    static unsigned maxOrder (const GeometryType &t, QuadratureType::Enum qt=QuadratureType::GaussLegendre)
     maximum quadrature order for given geometry type and quadrature type More...
     
    static const QuadratureRulerule (const GeometryType &t, int p, QuadratureType::Enum qt=QuadratureType::GaussLegendre)
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

    │ │ │ │ Public Types

    using Geometry = implementation-defined
     type of geometry embedding a subentity into the reference element More...
     
    │ │ │ │ @@ -106,15 +106,15 @@ │ │ │ │
    │ │ │ │ │ │ │ │

    type of geometry embedding a subentity into the reference element

    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01243.html │ │ │ │ @@ -89,15 +89,15 @@ │ │ │ │

    Each specialisation should contain a single member typedef Imp, e.g.:

    template<class CoordType>
    │ │ │ │
    struct Traits<sphereTopologyId, CoordType, Impl::CubeToplogy<2>::id, 2>
    │ │ │ │
    {
    │ │ │ │
    typedef SquaringTheCircle::Refinement Imp;
    │ │ │ │
    };
    │ │ │ │
    Mapping from geometryType, CoordType and coerceTo to a particular Refinement implementation.
    Definition: base.cc:70
    │ │ │ │

    The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01247.html │ │ │ │ @@ -136,15 +136,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01251.html │ │ │ │ @@ -453,15 +453,15 @@ │ │ │ │ │ │ │ │

    The IndexVector of the Refinement.

    │ │ │ │

    This is always a typedef to a FieldVector

    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01255.html │ │ │ │ @@ -111,15 +111,15 @@ │ │ │ │ │ │ │ │

    The SubEntityIterator for each codim.

    │ │ │ │

    This is some sort of type, not necessarily a typedef

    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
    The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01259.html │ │ │ │ @@ -405,15 +405,15 @@ │ │ │ │
    │ │ │ │ │ │ │ │

    Know your own dimension.

    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01263.html │ │ │ │ @@ -94,15 +94,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01267.html │ │ │ │ @@ -90,15 +90,15 @@ │ │ │ │ CoordTypeCoordinate type of the refined element │ │ │ │ codimensionCodimension of the iterator │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

    This is the base class for SubEntityIterators. We have to use this construct because RefinementImp<...>::codim<...> cannot be specialized without first specializing RefinementImp.

    │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01271.html │ │ │ │ @@ -151,15 +151,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01275.html │ │ │ │ @@ -187,15 +187,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01279.html │ │ │ │ @@ -256,15 +256,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01283.html │ │ │ │ @@ -75,15 +75,15 @@ │ │ │ │
    Inheritance graph
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01287.html │ │ │ │ @@ -388,15 +388,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01291.html │ │ │ │ @@ -94,15 +94,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01295.html │ │ │ │ @@ -433,15 +433,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01299.html │ │ │ │ @@ -491,15 +491,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01303.html │ │ │ │ @@ -187,15 +187,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01307.html │ │ │ │ @@ -75,15 +75,15 @@ │ │ │ │
    Inheritance graph
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01311.html │ │ │ │ @@ -395,15 +395,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01315.html │ │ │ │ @@ -94,15 +94,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01319.html │ │ │ │ @@ -433,15 +433,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01323.html │ │ │ │ @@ -469,15 +469,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01327.html │ │ │ │ @@ -187,15 +187,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01331.html │ │ │ │ @@ -75,15 +75,15 @@ │ │ │ │
    Inheritance graph
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01335.html │ │ │ │ @@ -395,15 +395,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01339.html │ │ │ │ @@ -94,15 +94,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01343.html │ │ │ │ @@ -433,15 +433,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01347.html │ │ │ │ @@ -469,15 +469,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01351.html │ │ │ │ @@ -187,15 +187,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01355.html │ │ │ │ @@ -388,15 +388,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01359.html │ │ │ │ @@ -94,15 +94,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01363.html │ │ │ │ @@ -75,15 +75,15 @@ │ │ │ │
    Inheritance graph
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01367.html │ │ │ │ @@ -365,15 +365,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01371.html │ │ │ │ @@ -481,15 +481,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01375.html │ │ │ │ @@ -143,15 +143,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01379.html │ │ │ │ @@ -74,15 +74,15 @@ │ │ │ │
    Dune::TopologyFactory< Traits > Struct Template Reference
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │

    Provide a factory over the generic topologies. │ │ │ │ More...

    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/topologyfactory.hh>

    │ │ │ │ +

    #include <dune/geometry/topologyfactory.hh>

    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -321,15 +321,15 @@ │ │ │ │ │ │ │ │

    │ │ │ │ Public Types

    typedef Traits::Key Key
     
    typedef Traits::Object Object
     
    │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01383.html │ │ │ │ @@ -75,15 +75,15 @@ │ │ │ │
    Dune::TopologySingletonFactory< Factory > Struct Template Reference
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │

    A wrapper for a TopologyFactory providing singleton storage. Same usage as TopologyFactory but with empty release method an internal storage. │ │ │ │ More...

    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/topologyfactory.hh>

    │ │ │ │ +

    #include <dune/geometry/topologyfactory.hh>

    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -305,15 +305,15 @@ │ │ │ │ │ │ │ │

    │ │ │ │ Public Types

    typedef Factory::Key Key
     
    typedef const Factory::Object Object
     
    │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01391.html │ │ │ │ @@ -73,15 +73,15 @@ │ │ │ │
    Dune::GeometryType Class Reference
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │

    Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ More...

    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/type.hh>

    │ │ │ │ +

    #include <dune/geometry/type.hh>

    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

    │ │ │ │ Public Types

    enum  BasicType {
    │ │ │ │   simplex │ │ │ │ , cube │ │ │ │ , pyramid │ │ │ │ @@ -1052,15 +1052,15 @@ │ │ │ │

    Create an Id representation of this GeometryType.

    │ │ │ │

    The returned Id encapsulates the whole information of this GeometryType into an enum suitable for being used as template parameter. The GeometryType can be reconstructed from the Id using GeometryType{id}.

    │ │ │ │

    This function was mainly introduced to support older GCC versions (<10.2). There the implicit conversion from GeometryType to Id failed if a pure r-value template argument based on a static class member was used. (See dune/geometry/test/test-geometrytype-id.cc)

    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01403.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
    Dune::LocalGeometryTypeIndex Class Reference
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │

    Compute per-dimension indices for geometry types. │ │ │ │ More...

    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/typeindex.hh>

    │ │ │ │ +

    #include <dune/geometry/typeindex.hh>

    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -186,15 +186,15 @@ │ │ │ │
    │ │ │ │ │ │ │ │

    compute the geometry type for the given local index and dimension

    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01407.html │ │ │ │ @@ -72,15 +72,15 @@ │ │ │ │
    Dune::GlobalGeometryTypeIndex Class Reference
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │

    Compute indices for geometry types, taking the dimension into account. │ │ │ │ More...

    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/typeindex.hh>

    │ │ │ │ +

    #include <dune/geometry/typeindex.hh>

    │ │ │ │

    │ │ │ │ Static Public Member Functions

    static constexpr std::size_t size (std::size_t dim)
     Compute total number of geometry types for the given dimension. More...
     
    static constexpr std::size_t index (const GeometryType &gt)
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -176,15 +176,15 @@ │ │ │ │ │ │ │ │

    Compute total number of geometry types up to and including the given dimension.

    │ │ │ │

    This includes irregular geometry types such as "None".

    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01411.html │ │ │ │ @@ -75,15 +75,15 @@ │ │ │ │
    Inheritance graph
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01415.html │ │ │ │ @@ -66,15 +66,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │
    Dune::VirtualRefinementSubEntityIteratorSpecial< dimension, CoordType, dimension > Class Template Reference
    │ │ │ │
    │ │ │ │
    │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01419.html │ │ │ │ @@ -151,15 +151,15 @@ │ │ │ │ │ │ │ │

    │ │ │ │ Static Public Member Functions

    static constexpr std::size_t offset (std::size_t dim)
     Compute the starting index for a given dimension including irregular geometry types. More...
     
    static constexpr std::size_t size (std::size_t maxdim)
    │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01423.html │ │ │ │ @@ -358,15 +358,15 @@ │ │ │ │
    │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01427.html │ │ │ │ @@ -75,15 +75,15 @@ │ │ │ │
    Inheritance graph
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01431.html │ │ │ │ @@ -103,15 +103,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01435.html │ │ │ │ @@ -174,15 +174,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01439.html │ │ │ │ @@ -336,15 +336,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01443.html │ │ │ │ @@ -568,15 +568,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01447.html │ │ │ │ @@ -321,15 +321,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01451.html │ │ │ │ @@ -75,15 +75,15 @@ │ │ │ │
    Inheritance graph
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01455.html │ │ │ │ @@ -75,15 +75,15 @@ │ │ │ │
    Inheritance graph
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01459.html │ │ │ │ @@ -196,15 +196,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01463.html │ │ │ │ @@ -114,15 +114,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01467.html │ │ │ │ @@ -114,15 +114,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01471.html │ │ │ │ @@ -114,15 +114,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01475.html │ │ │ │ @@ -75,15 +75,15 @@ │ │ │ │
    Dune::VirtualRefinement< dimension, CoordType > Class Template Referenceabstract
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │

    VirtualRefinement base class. │ │ │ │ More...

    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/virtualrefinement.hh>

    │ │ │ │ +

    #include <dune/geometry/virtualrefinement.hh>

    │ │ │ │
    │ │ │ │ Inheritance diagram for Dune::VirtualRefinement< dimension, CoordType >:
    │ │ │ │
    │ │ │ │
    Inheritance graph
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -599,16 +599,16 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │
    │ │ │ │
    The documentation for this class was generated from the following files: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01479.html │ │ │ │ @@ -69,21 +69,21 @@ │ │ │ │
    Dune::VirtualRefinement< dimension, CoordType >::Codim< codimension > Struct Template Reference
    │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │

    codim database of VirtualRefinement │ │ │ │ More...

    │ │ │ │ │ │ │ │ -

    #include <dune/geometry/virtualrefinement.hh>

    │ │ │ │ +

    #include <dune/geometry/virtualrefinement.hh>

    │ │ │ │

    Detailed Description

    │ │ │ │
    template<int dimension, class CoordType>
    │ │ │ │ template<int codimension>
    │ │ │ │ struct Dune::VirtualRefinement< dimension, CoordType >::Codim< codimension >

    codim database of VirtualRefinement

    │ │ │ │

    The documentation for this struct was generated from the following file: │ │ │ │
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/dir_000004_000006.html │ │ │ │ @@ -62,14 +62,14 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ -

    geometry → refinement Relation

    File in dune/geometryIncludes file in dune/geometry/refinement
    refinement.hhbase.cc
    refinement.hhhcube.cc
    refinement.hhhcubetriangulation.cc
    refinement.hhprismtriangulation.cc
    refinement.hhpyramidtriangulation.cc
    refinement.hhsimplex.cc
    │ │ │ │ +

    geometry → refinement Relation

    File in dune/geometryIncludes file in dune/geometry/refinement
    refinement.hhbase.cc
    refinement.hhhcube.cc
    refinement.hhhcubetriangulation.cc
    refinement.hhprismtriangulation.cc
    refinement.hhpyramidtriangulation.cc
    refinement.hhsimplex.cc
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/dir_18620fa9f137864b479f21357cfac10d.html │ │ │ │ @@ -87,54 +87,54 @@ │ │ │ │ directory  refinement │ │ │ │   │ │ │ │ directory  utility │ │ │ │   │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

    │ │ │ │ Files

    file  affinegeometry.hh [code]
     An implementation of the Geometry interface for affine geometries.
    file  affinegeometry.hh [code]
     An implementation of the Geometry interface for affine geometries.
     
    file  axisalignedcubegeometry.hh [code]
     A geometry implementation for axis-aligned hypercubes.
    file  axisalignedcubegeometry.hh [code]
     A geometry implementation for axis-aligned hypercubes.
     
    file  deprecated_topology.hh [code]
    file  deprecated_topology.hh [code]
     
    file  dimension.hh [code]
    file  dimension.hh [code]
     
    file  generalvertexorder.hh [code]
    file  generalvertexorder.hh [code]
     
    file  multilineargeometry.hh [code]
    file  multilineargeometry.hh [code]
     
    file  quadraturerules.hh [code]
    file  quadraturerules.hh [code]
     
    file  referenceelement.hh [code]
    file  referenceelement.hh [code]
     
    file  referenceelementimplementation.cc
    file  referenceelementimplementation.cc
     
    file  referenceelementimplementation.hh [code]
    file  referenceelementimplementation.hh [code]
     
    file  referenceelements.hh [code]
    file  referenceelements.hh [code]
     
    file  refinement.hh [code]
     This file simply includes all Refinement implementations so you don't have to do them separately.
    file  refinement.hh [code]
     This file simply includes all Refinement implementations so you don't have to do them separately.
     
    file  topologyfactory.hh [code]
    file  topologyfactory.hh [code]
     
    file  type.hh [code]
     A unique label for each type of element that can occur in a grid.
    file  type.hh [code]
     A unique label for each type of element that can occur in a grid.
     
    file  typeindex.hh [code]
     Helper classes to provide indices for geometrytypes for use in a vector.
    file  typeindex.hh [code]
     Helper classes to provide indices for geometrytypes for use in a vector.
     
    file  virtualrefinement.cc
     This file contains the virtual wrapper around refinement.
    file  virtualrefinement.cc
     This file contains the virtual wrapper around refinement.
     
    file  virtualrefinement.hh [code]
     This file contains the virtual wrapper around refinement.
    file  virtualrefinement.hh [code]
     This file contains the virtual wrapper around refinement.
     
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/dir_428ed1c935e77406fcbfdccd4ee3f7a2.html │ │ │ │ @@ -77,15 +77,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │

    │ │ │ │ Files

    file  typefromvertexcount.hh [code]
    file  typefromvertexcount.hh [code]
     
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/dir_b609f53bbb5e26b8e9292001c59476a3.html │ │ │ │ @@ -77,29 +77,29 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

    │ │ │ │ Files

    file  base.cc
     This file contains the parts independent of a particular Refinement implementation.
    file  base.cc
     This file contains the parts independent of a particular Refinement implementation.
     
    file  hcube.cc
     This file contains the Refinement implementation for hypercubes (quadrilaterals, hexahedrons, etc.).
    file  hcube.cc
     This file contains the Refinement implementation for hypercubes (quadrilaterals, hexahedrons, etc.).
     
    file  hcubetriangulation.cc
     This file contains the Refinement implementation for triangulating hypercubes (quadrilateral -> triangle, hexahedron -> tetrahedron)
    file  hcubetriangulation.cc
     This file contains the Refinement implementation for triangulating hypercubes (quadrilateral -> triangle, hexahedron -> tetrahedron)
     
    file  prismtriangulation.cc
    file  prismtriangulation.cc
     
    file  pyramidtriangulation.cc
    file  pyramidtriangulation.cc
     
    file  simplex.cc
     This file contains the Refinement implementation for simplices (triangles, tetrahedrons...)
    file  simplex.cc
     This file contains the Refinement implementation for simplices (triangles, tetrahedrons...)
     
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/dune-geometry.tag.gz │ │ │ │ ├── dune-geometry.tag │ │ │ │ │ ├── dune-geometry.tag │ │ │ │ │ │ @@ -1,108 +1,108 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ referenceelementspage.txt │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.9.0/doc/appl/refelements/ │ │ │ │ │ │ - a00041.html │ │ │ │ │ │ + a00080.html │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ mainpage.txt │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.9.0/doc/doxygen/ │ │ │ │ │ │ a00164.html │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ modules.txt │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.9.0/doc/doxygen/ │ │ │ │ │ │ a00167.html │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ affinegeometry.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.9.0/dune/geometry/ │ │ │ │ │ │ - a00170.html │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ + a00185.html │ │ │ │ │ │ + dune/geometry/type.hh │ │ │ │ │ │ Dune::AffineGeometry │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Geo │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ axisalignedcubegeometry.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.9.0/dune/geometry/ │ │ │ │ │ │ - a00191.html │ │ │ │ │ │ - dune/geometry/referenceelements.hh │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ + a00188.html │ │ │ │ │ │ + dune/geometry/referenceelements.hh │ │ │ │ │ │ + dune/geometry/type.hh │ │ │ │ │ │ Dune::AxisAlignedCubeGeometry │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ deprecated_topology.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.9.0/dune/geometry/ │ │ │ │ │ │ - a00230.html │ │ │ │ │ │ + a00203.html │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dimension.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.9.0/dune/geometry/ │ │ │ │ │ │ - a00224.html │ │ │ │ │ │ + a00197.html │ │ │ │ │ │ Dune::Dim │ │ │ │ │ │ Dune::Codim │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ generalvertexorder.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.9.0/dune/geometry/ │ │ │ │ │ │ - a00179.html │ │ │ │ │ │ - type.hh │ │ │ │ │ │ - dune/geometry/referenceelements.hh │ │ │ │ │ │ + a00200.html │ │ │ │ │ │ + type.hh │ │ │ │ │ │ + dune/geometry/referenceelements.hh │ │ │ │ │ │ Dune::GeneralVertexOrder │ │ │ │ │ │ Dune::GeneralVertexOrder::iterator │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ void │ │ │ │ │ │ reduceOrder │ │ │ │ │ │ a00254.html │ │ │ │ │ │ a77eece3229d82b929dcf4cde0cb2a855 │ │ │ │ │ │ (const InIterator &inBegin, const InIterator &inEnd, OutIterator outIt) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ multilineargeometry.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.9.0/dune/geometry/ │ │ │ │ │ │ - a00218.html │ │ │ │ │ │ - dune/geometry/affinegeometry.hh │ │ │ │ │ │ - dune/geometry/referenceelements.hh │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ + a00215.html │ │ │ │ │ │ + dune/geometry/affinegeometry.hh │ │ │ │ │ │ + dune/geometry/referenceelements.hh │ │ │ │ │ │ + dune/geometry/type.hh │ │ │ │ │ │ Dune::MultiLinearGeometryTraits │ │ │ │ │ │ Dune::MultiLinearGeometryTraits::CornerStorage │ │ │ │ │ │ Dune::MultiLinearGeometryTraits::hasSingleGeometryType │ │ │ │ │ │ Dune::MultiLinearGeometry │ │ │ │ │ │ Dune::MultiLinearGeometry::JacobianInverseTransposed │ │ │ │ │ │ Dune::CachedMultiLinearGeometry │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ quadraturerules.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.9.0/dune/geometry/ │ │ │ │ │ │ - a00212.html │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ - dune/geometry/typeindex.hh │ │ │ │ │ │ + a00182.html │ │ │ │ │ │ + dune/geometry/type.hh │ │ │ │ │ │ + dune/geometry/typeindex.hh │ │ │ │ │ │ Dune::QuadratureOrderOutOfRange │ │ │ │ │ │ Dune::QuadraturePoint │ │ │ │ │ │ Dune::QuadratureRule │ │ │ │ │ │ Dune::QuadratureRules │ │ │ │ │ │ Dune::QuadratureRuleFactory │ │ │ │ │ │ Dune::QuadratureRuleFactory< ctype, 0 > │ │ │ │ │ │ Dune::QuadratureRuleFactory< ctype, 1 > │ │ │ │ │ │ Dune::QuadratureRuleFactory< ctype, 2 > │ │ │ │ │ │ Dune::QuadratureRuleFactory< ctype, 3 > │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::QuadratureType │ │ │ │ │ │ │ │ │ │ │ │ #define │ │ │ │ │ │ DUNE_INCLUDING_IMPLEMENTATION │ │ │ │ │ │ - a00212.html │ │ │ │ │ │ + a00182.html │ │ │ │ │ │ a0aeda817d7161b7c1afd8dd15ff12f17 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ Enum │ │ │ │ │ │ a00258.html │ │ │ │ │ │ @@ -157,47 +157,47 @@ │ │ │ │ │ │ a7d0a250c55cc0a769535f8fb07731ac4a8deef24dca36adbc1426045c4567fbac │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ referenceelement.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.9.0/dune/geometry/ │ │ │ │ │ │ - a00185.html │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ + a00194.html │ │ │ │ │ │ + dune/geometry/type.hh │ │ │ │ │ │ Dune::Geo::ReferenceElement │ │ │ │ │ │ Dune::Geo::ReferenceElement::Codim │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Geo │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ referenceelementimplementation.cc │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.9.0/dune/geometry/ │ │ │ │ │ │ - a00239.html │ │ │ │ │ │ - dune/geometry/referenceelementimplementation.hh │ │ │ │ │ │ + a00179.html │ │ │ │ │ │ + dune/geometry/referenceelementimplementation.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Geo │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ referenceelementimplementation.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.9.0/dune/geometry/ │ │ │ │ │ │ - a00188.html │ │ │ │ │ │ - dune/geometry/referenceelement.hh │ │ │ │ │ │ - dune/geometry/affinegeometry.hh │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ + a00206.html │ │ │ │ │ │ + dune/geometry/referenceelement.hh │ │ │ │ │ │ + dune/geometry/affinegeometry.hh │ │ │ │ │ │ + dune/geometry/type.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Geo │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ referenceelements.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.9.0/dune/geometry/ │ │ │ │ │ │ - a00182.html │ │ │ │ │ │ - dune/geometry/dimension.hh │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ - dune/geometry/referenceelement.hh │ │ │ │ │ │ - dune/geometry/referenceelementimplementation.hh │ │ │ │ │ │ + a00176.html │ │ │ │ │ │ + dune/geometry/dimension.hh │ │ │ │ │ │ + dune/geometry/type.hh │ │ │ │ │ │ + dune/geometry/referenceelement.hh │ │ │ │ │ │ + dune/geometry/referenceelementimplementation.hh │ │ │ │ │ │ Dune::Geo::ReferenceElements │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Geo │ │ │ │ │ │ Dune::Transitional │ │ │ │ │ │ │ │ │ │ │ │ unspecified-type │ │ │ │ │ │ ReferenceElement │ │ │ │ │ │ @@ -233,37 +233,37 @@ │ │ │ │ │ │ ga3cd196de6f0922a1265f87bcded47b7a │ │ │ │ │ │ (const T &, const Dune::GeometryType &gt, Dune::Dim< dim >) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ refinement.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.9.0/dune/geometry/ │ │ │ │ │ │ - a00176.html │ │ │ │ │ │ - refinement/base.cc │ │ │ │ │ │ - refinement/hcube.cc │ │ │ │ │ │ - refinement/simplex.cc │ │ │ │ │ │ - refinement/hcubetriangulation.cc │ │ │ │ │ │ - refinement/prismtriangulation.cc │ │ │ │ │ │ - refinement/pyramidtriangulation.cc │ │ │ │ │ │ + a00170.html │ │ │ │ │ │ + refinement/base.cc │ │ │ │ │ │ + refinement/hcube.cc │ │ │ │ │ │ + refinement/simplex.cc │ │ │ │ │ │ + refinement/hcubetriangulation.cc │ │ │ │ │ │ + refinement/prismtriangulation.cc │ │ │ │ │ │ + refinement/pyramidtriangulation.cc │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ base.cc │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.9.0/dune/geometry/refinement/ │ │ │ │ │ │ - a00206.html │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ + a00227.html │ │ │ │ │ │ + dune/geometry/type.hh │ │ │ │ │ │ Dune::RefinementImp::Traits │ │ │ │ │ │ Dune::RefinementIntervals │ │ │ │ │ │ Dune::StaticRefinement │ │ │ │ │ │ Dune::StaticRefinement::Codim │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::RefinementImp │ │ │ │ │ │ │ │ │ │ │ │ #define │ │ │ │ │ │ DUNE_GEOMETRY_REFINEMENT_BASE_CC │ │ │ │ │ │ - a00206.html │ │ │ │ │ │ + a00227.html │ │ │ │ │ │ ab8232ef779e57c3676c54a73bd759f72 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ RefinementIntervals │ │ │ │ │ │ refinementIntervals │ │ │ │ │ │ a00251.html │ │ │ │ │ │ @@ -277,141 +277,141 @@ │ │ │ │ │ │ ga93defb58afad2ca665a30f98a30ecd3f │ │ │ │ │ │ (int levels) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ hcube.cc │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.9.0/dune/geometry/refinement/ │ │ │ │ │ │ - a00209.html │ │ │ │ │ │ - dune/geometry/referenceelements.hh │ │ │ │ │ │ - dune/geometry/axisalignedcubegeometry.hh │ │ │ │ │ │ - base.cc │ │ │ │ │ │ + a00233.html │ │ │ │ │ │ + dune/geometry/referenceelements.hh │ │ │ │ │ │ + dune/geometry/axisalignedcubegeometry.hh │ │ │ │ │ │ + base.cc │ │ │ │ │ │ Dune::RefinementImp::HCube::RefinementImp │ │ │ │ │ │ Dune::RefinementImp::HCube::RefinementImp::Codim │ │ │ │ │ │ Dune::RefinementImp::HCube::RefinementSubEntityIteratorSpecial │ │ │ │ │ │ Dune::RefinementImp::HCube::RefinementSubEntityIteratorSpecial< dimension, CoordType, dimension > │ │ │ │ │ │ Dune::RefinementImp::HCube::RefinementSubEntityIteratorSpecial< dimension, CoordType, 0 > │ │ │ │ │ │ Dune::RefinementImp::HCube::RefinementImp::Codim< codimension > │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::RefinementImp │ │ │ │ │ │ Dune::RefinementImp::HCube │ │ │ │ │ │ │ │ │ │ │ │ #define │ │ │ │ │ │ DUNE_GEOMETRY_REFINEMENT_HCUBE_CC │ │ │ │ │ │ - a00209.html │ │ │ │ │ │ + a00233.html │ │ │ │ │ │ a2be7a03e64dedaaa1cf5c7c8e2a9cf60 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ hcubetriangulation.cc │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.9.0/dune/geometry/refinement/ │ │ │ │ │ │ - a00194.html │ │ │ │ │ │ - dune/geometry/referenceelements.hh │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ - base.cc │ │ │ │ │ │ - simplex.cc │ │ │ │ │ │ + a00239.html │ │ │ │ │ │ + dune/geometry/referenceelements.hh │ │ │ │ │ │ + dune/geometry/type.hh │ │ │ │ │ │ + base.cc │ │ │ │ │ │ + simplex.cc │ │ │ │ │ │ Dune::RefinementImp::HCubeTriangulation::RefinementImp │ │ │ │ │ │ Dune::RefinementImp::HCubeTriangulation::RefinementImp::Codim │ │ │ │ │ │ Dune::RefinementImp::HCubeTriangulation::RefinementIteratorSpecial< dimension, CoordType, dimension > │ │ │ │ │ │ Dune::RefinementImp::HCubeTriangulation::RefinementIteratorSpecial< dimension, CoordType, 0 > │ │ │ │ │ │ Dune::RefinementImp::HCubeTriangulation::RefinementImp::Codim< codimension > │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::RefinementImp │ │ │ │ │ │ Dune::RefinementImp::HCubeTriangulation │ │ │ │ │ │ │ │ │ │ │ │ #define │ │ │ │ │ │ DUNE_GEOMETRY_REFINEMENT_HCUBETRIANGULATION_CC │ │ │ │ │ │ - a00194.html │ │ │ │ │ │ + a00239.html │ │ │ │ │ │ a3fe24de9b756cd18f014979a41cb0843 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ prismtriangulation.cc │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.9.0/dune/geometry/refinement/ │ │ │ │ │ │ - a00203.html │ │ │ │ │ │ - dune/geometry/referenceelements.hh │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ - base.cc │ │ │ │ │ │ - simplex.cc │ │ │ │ │ │ + a00236.html │ │ │ │ │ │ + dune/geometry/referenceelements.hh │ │ │ │ │ │ + dune/geometry/type.hh │ │ │ │ │ │ + base.cc │ │ │ │ │ │ + simplex.cc │ │ │ │ │ │ Dune::RefinementImp::PrismTriangulation::RefinementImp │ │ │ │ │ │ Dune::RefinementImp::PrismTriangulation::RefinementImp::Codim │ │ │ │ │ │ Dune::RefinementImp::PrismTriangulation::RefinementIteratorSpecial< dimension, CoordType, dimension > │ │ │ │ │ │ Dune::RefinementImp::PrismTriangulation::RefinementIteratorSpecial< dimension, CoordType, 0 > │ │ │ │ │ │ Dune::RefinementImp::PrismTriangulation::RefinementImp::Codim< codimension > │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::RefinementImp │ │ │ │ │ │ Dune::RefinementImp::PrismTriangulation │ │ │ │ │ │ │ │ │ │ │ │ #define │ │ │ │ │ │ DUNE_GEOMETRY_REFINEMENT_PRISMTRIANGULATION_CC │ │ │ │ │ │ - a00203.html │ │ │ │ │ │ + a00236.html │ │ │ │ │ │ ae56eb72b98f97f57cc224eb9b4394ef8 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ FieldVector< CoordType, dimension > │ │ │ │ │ │ transformCoordinate │ │ │ │ │ │ a00264.html │ │ │ │ │ │ af1da6e2739b0151f232dcecc95812162 │ │ │ │ │ │ (FieldVector< CoordType, dimension > point) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ pyramidtriangulation.cc │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.9.0/dune/geometry/refinement/ │ │ │ │ │ │ - a00197.html │ │ │ │ │ │ - dune/geometry/referenceelements.hh │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ - base.cc │ │ │ │ │ │ - simplex.cc │ │ │ │ │ │ + a00230.html │ │ │ │ │ │ + dune/geometry/referenceelements.hh │ │ │ │ │ │ + dune/geometry/type.hh │ │ │ │ │ │ + base.cc │ │ │ │ │ │ + simplex.cc │ │ │ │ │ │ Dune::RefinementImp::PyramidTriangulation::RefinementImp │ │ │ │ │ │ Dune::RefinementImp::PyramidTriangulation::RefinementImp::Codim │ │ │ │ │ │ Dune::RefinementImp::PyramidTriangulation::RefinementIteratorSpecial< dimension, CoordType, dimension > │ │ │ │ │ │ Dune::RefinementImp::PyramidTriangulation::RefinementIteratorSpecial< dimension, CoordType, 0 > │ │ │ │ │ │ Dune::RefinementImp::PyramidTriangulation::RefinementImp::Codim< codimension > │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::RefinementImp │ │ │ │ │ │ Dune::RefinementImp::PyramidTriangulation │ │ │ │ │ │ │ │ │ │ │ │ #define │ │ │ │ │ │ DUNE_GEOMETRY_REFINEMENT_PYRAMIDTRIANGULATION_CC │ │ │ │ │ │ - a00197.html │ │ │ │ │ │ + a00230.html │ │ │ │ │ │ a5f431ee98541c17b3d9aea2dbc726941 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ FieldVector< CoordType, dimension > │ │ │ │ │ │ transformCoordinate │ │ │ │ │ │ a00265.html │ │ │ │ │ │ a3c4d43135632c0bc83dca6491c2fd16c │ │ │ │ │ │ (FieldVector< CoordType, dimension > point) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ simplex.cc │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.9.0/dune/geometry/refinement/ │ │ │ │ │ │ - a00200.html │ │ │ │ │ │ - dune/geometry/multilineargeometry.hh │ │ │ │ │ │ - dune/geometry/referenceelements.hh │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ - base.cc │ │ │ │ │ │ + a00224.html │ │ │ │ │ │ + dune/geometry/multilineargeometry.hh │ │ │ │ │ │ + dune/geometry/referenceelements.hh │ │ │ │ │ │ + dune/geometry/type.hh │ │ │ │ │ │ + base.cc │ │ │ │ │ │ Dune::RefinementImp::Simplex::RefinementImp │ │ │ │ │ │ Dune::RefinementImp::Simplex::RefinementImp::Codim │ │ │ │ │ │ Dune::RefinementImp::Simplex::RefinementIteratorSpecial< dimension, CoordType, dimension > │ │ │ │ │ │ Dune::RefinementImp::Simplex::RefinementIteratorSpecial< dimension, CoordType, 0 > │ │ │ │ │ │ Dune::RefinementImp::Simplex::RefinementImp::Codim< codimension > │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::RefinementImp │ │ │ │ │ │ Dune::RefinementImp::Simplex │ │ │ │ │ │ │ │ │ │ │ │ #define │ │ │ │ │ │ DUNE_GRID_COMMON_REFINEMENT_SIMPLEX_CC │ │ │ │ │ │ - a00200.html │ │ │ │ │ │ + a00224.html │ │ │ │ │ │ a944407dc4f6f9a372b10b69bbb5a0792 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ int │ │ │ │ │ │ factorial │ │ │ │ │ │ a00266.html │ │ │ │ │ │ @@ -495,26 +495,26 @@ │ │ │ │ │ │ afd47205aa1691498b073d9681fb23f6d │ │ │ │ │ │ (FieldVector< CoordType, dimension > point, const FieldVector< int, dimension > &kuhn) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ topologyfactory.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.9.0/dune/geometry/ │ │ │ │ │ │ - a00236.html │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ - dune/geometry/typeindex.hh │ │ │ │ │ │ + a00173.html │ │ │ │ │ │ + dune/geometry/type.hh │ │ │ │ │ │ + dune/geometry/typeindex.hh │ │ │ │ │ │ Dune::TopologyFactory │ │ │ │ │ │ Dune::TopologySingletonFactory │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ type.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.9.0/dune/geometry/ │ │ │ │ │ │ - a00173.html │ │ │ │ │ │ - dune/geometry/deprecated_topology.hh │ │ │ │ │ │ + a00218.html │ │ │ │ │ │ + dune/geometry/deprecated_topology.hh │ │ │ │ │ │ Dune::GeometryType │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::GeometryTypes │ │ │ │ │ │ │ │ │ │ │ │ std::ostream & │ │ │ │ │ │ operator<< │ │ │ │ │ │ a00254.html │ │ │ │ │ │ @@ -612,40 +612,40 @@ │ │ │ │ │ │ gac55d64235c37884a8ca160ee4556294e │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ typeindex.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.9.0/dune/geometry/ │ │ │ │ │ │ - a00221.html │ │ │ │ │ │ - type.hh │ │ │ │ │ │ + a00212.html │ │ │ │ │ │ + type.hh │ │ │ │ │ │ Dune::LocalGeometryTypeIndex │ │ │ │ │ │ Dune::GlobalGeometryTypeIndex │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ typefromvertexcount.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.9.0/dune/geometry/utility/ │ │ │ │ │ │ - a00215.html │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ + a00191.html │ │ │ │ │ │ + dune/geometry/type.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ GeometryType │ │ │ │ │ │ geometryTypeFromVertexCount │ │ │ │ │ │ a00254.html │ │ │ │ │ │ a46da773c6f7d01077322c1064037e52f │ │ │ │ │ │ (unsigned int dim, unsigned int vertices) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ virtualrefinement.cc │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.9.0/dune/geometry/ │ │ │ │ │ │ - a00233.html │ │ │ │ │ │ - type.hh │ │ │ │ │ │ - refinement.hh │ │ │ │ │ │ + a00221.html │ │ │ │ │ │ + type.hh │ │ │ │ │ │ + refinement.hh │ │ │ │ │ │ Dune::VirtualRefinementSubEntityIteratorSpecial< dimension, CoordType, dimension > │ │ │ │ │ │ Dune::VirtualRefinementSubEntityIteratorSpecial< dimension, CoordType, 0 > │ │ │ │ │ │ Dune::VirtualRefinement::Codim< codimension > │ │ │ │ │ │ Dune::VirtualRefinementSubEntityIteratorBackSpecial< dimension, CoordType, dimension > │ │ │ │ │ │ Dune::VirtualRefinementSubEntityIteratorBackSpecial< dimension, CoordType, 0 > │ │ │ │ │ │ Dune::VirtualRefinement::SubEntityIteratorBack │ │ │ │ │ │ Dune::VirtualRefinementImp │ │ │ │ │ │ @@ -655,33 +655,33 @@ │ │ │ │ │ │ Dune::RefinementBuilder │ │ │ │ │ │ Dune::RefinementBuilder< 1, CoordType > │ │ │ │ │ │ Dune::RefinementBuilder< 3, CoordType > │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ #define │ │ │ │ │ │ DUNE_GEOMETRY_VIRTUALREFINEMENT_CC │ │ │ │ │ │ - a00233.html │ │ │ │ │ │ + a00221.html │ │ │ │ │ │ ac82d420bff6cce87d06ad71b4f1cb0c8 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ VirtualRefinement< dimension, CoordType > & │ │ │ │ │ │ buildRefinement │ │ │ │ │ │ a00254.html │ │ │ │ │ │ a73043181be4688f6cc83f1416cc176c6 │ │ │ │ │ │ (GeometryType geometryType, GeometryType coerceTo) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ virtualrefinement.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.9.0/dune/geometry/ │ │ │ │ │ │ - a00227.html │ │ │ │ │ │ - refinement.hh │ │ │ │ │ │ - type.hh │ │ │ │ │ │ - virtualrefinement.cc │ │ │ │ │ │ + a00209.html │ │ │ │ │ │ + refinement.hh │ │ │ │ │ │ + type.hh │ │ │ │ │ │ + virtualrefinement.cc │ │ │ │ │ │ Dune::VirtualRefinement │ │ │ │ │ │ Dune::VirtualRefinement::Codim │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ VirtualRefinement< dimension, CoordType > & │ │ │ │ │ │ buildRefinement │ │ │ │ │ │ a00254.html │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/files.html │ │ │ │ @@ -70,39 +70,39 @@ │ │ │ │   doc │ │ │ │   appl │ │ │ │  refelements │ │ │ │  doxygen │ │ │ │   dune │ │ │ │   geometry │ │ │ │   refinement │ │ │ │ - base.ccThis file contains the parts independent of a particular Refinement implementation │ │ │ │ - hcube.ccThis file contains the Refinement implementation for hypercubes (quadrilaterals, hexahedrons, etc.) │ │ │ │ - hcubetriangulation.ccThis file contains the Refinement implementation for triangulating hypercubes (quadrilateral -> triangle, hexahedron -> tetrahedron) │ │ │ │ - prismtriangulation.cc │ │ │ │ - pyramidtriangulation.cc │ │ │ │ - simplex.ccThis file contains the Refinement implementation for simplices (triangles, tetrahedrons...) │ │ │ │ + base.ccThis file contains the parts independent of a particular Refinement implementation │ │ │ │ + hcube.ccThis file contains the Refinement implementation for hypercubes (quadrilaterals, hexahedrons, etc.) │ │ │ │ + hcubetriangulation.ccThis file contains the Refinement implementation for triangulating hypercubes (quadrilateral -> triangle, hexahedron -> tetrahedron) │ │ │ │ + prismtriangulation.cc │ │ │ │ + pyramidtriangulation.cc │ │ │ │ + simplex.ccThis file contains the Refinement implementation for simplices (triangles, tetrahedrons...) │ │ │ │   utility │ │ │ │ - typefromvertexcount.hh │ │ │ │ - affinegeometry.hhAn implementation of the Geometry interface for affine geometries │ │ │ │ - axisalignedcubegeometry.hhA geometry implementation for axis-aligned hypercubes │ │ │ │ - deprecated_topology.hh │ │ │ │ - dimension.hh │ │ │ │ - generalvertexorder.hh │ │ │ │ - multilineargeometry.hh │ │ │ │ - quadraturerules.hh │ │ │ │ - referenceelement.hh │ │ │ │ - referenceelementimplementation.cc │ │ │ │ - referenceelementimplementation.hh │ │ │ │ - referenceelements.hh │ │ │ │ - refinement.hhThis file simply includes all Refinement implementations so you don't have to do them separately │ │ │ │ - topologyfactory.hh │ │ │ │ - type.hhA unique label for each type of element that can occur in a grid │ │ │ │ - typeindex.hhHelper classes to provide indices for geometrytypes for use in a vector │ │ │ │ - virtualrefinement.ccThis file contains the virtual wrapper around refinement │ │ │ │ - virtualrefinement.hhThis file contains the virtual wrapper around refinement │ │ │ │ + typefromvertexcount.hh │ │ │ │ + affinegeometry.hhAn implementation of the Geometry interface for affine geometries │ │ │ │ + axisalignedcubegeometry.hhA geometry implementation for axis-aligned hypercubes │ │ │ │ + deprecated_topology.hh │ │ │ │ + dimension.hh │ │ │ │ + generalvertexorder.hh │ │ │ │ + multilineargeometry.hh │ │ │ │ + quadraturerules.hh │ │ │ │ + referenceelement.hh │ │ │ │ + referenceelementimplementation.cc │ │ │ │ + referenceelementimplementation.hh │ │ │ │ + referenceelements.hh │ │ │ │ + refinement.hhThis file simply includes all Refinement implementations so you don't have to do them separately │ │ │ │ + topologyfactory.hh │ │ │ │ + type.hhA unique label for each type of element that can occur in a grid │ │ │ │ + typeindex.hhHelper classes to provide indices for geometrytypes for use in a vector │ │ │ │ + virtualrefinement.ccThis file contains the virtual wrapper around refinement │ │ │ │ + virtualrefinement.hhThis file contains the virtual wrapper around refinement │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/globals.html │ │ │ │ @@ -59,22 +59,22 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │
    Here is a list of all file members with links to the files they belong to:
    │ │ │ │
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/globals_defs.html │ │ │ │ @@ -59,22 +59,22 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │   │ │ │ │
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ --- ./usr/share/doc/libdune-geometry-doc/doxygen/a00041.html │ │ │ ├── +++ ./usr/share/doc/libdune-geometry-doc/doxygen/a00080.html │ │ │ │┄ Files identical despite different names │ │ │ │ --- ./usr/share/doc/libdune-geometry-doc/doxygen/a00179_source.html │ │ │ ├── +++ ./usr/share/doc/libdune-geometry-doc/doxygen/a00200_source.html │ │ │ │┄ Files 1% similar despite different names │ │ │ │ @@ -65,15 +65,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │
    generalvertexorder.hh
    │ │ │ │
    │ │ │ │
    │ │ │ │ -Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    │ │ │ │ +Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    │ │ │ │
    2// vi: set et ts=4 sw=2 sts=2:
    │ │ │ │
    3// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
    │ │ │ │
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    │ │ │ │
    5
    │ │ │ │
    6#ifndef DUNE_GEOMETRY_GENERALVERTEXORDER_HH
    │ │ │ │
    7#define DUNE_GEOMETRY_GENERALVERTEXORDER_HH
    │ │ │ │
    8
    │ │ │ │ @@ -81,16 +81,16 @@ │ │ │ │
    10#include <cassert>
    │ │ │ │
    11#include <cstddef>
    │ │ │ │
    12#include <iterator>
    │ │ │ │
    13#include <vector>
    │ │ │ │
    14
    │ │ │ │
    15#include <dune/common/iteratorfacades.hh>
    │ │ │ │
    16
    │ │ │ │ -
    17#include "type.hh"
    │ │ │ │ - │ │ │ │ +
    17#include "type.hh"
    │ │ │ │ + │ │ │ │
    19
    │ │ │ │
    20namespace Dune {
    │ │ │ │
    21
    │ │ │ │
    39 template<class InIterator, class OutIterator>
    │ │ │ │
    40 void reduceOrder(const InIterator& inBegin, const InIterator& inEnd,
    │ │ │ │
    41 OutIterator outIt)
    │ │ │ │
    42 {
    │ │ │ │ @@ -189,16 +189,16 @@ │ │ │ │
    180
    │ │ │ │
    182
    │ │ │ │ │ │ │ │
    188 };
    │ │ │ │
    189} // namespace Dune
    │ │ │ │
    190
    │ │ │ │
    191#endif // DUNE_GEOMETRY_GENERALVERTEXORDER_HH
    │ │ │ │ -
    A unique label for each type of element that can occur in a grid.
    │ │ │ │ - │ │ │ │ + │ │ │ │ +
    A unique label for each type of element that can occur in a grid.
    │ │ │ │
    constexpr GeometryType vertex
    GeometryType representing a vertex.
    Definition: type.hh:506
    │ │ │ │
    Definition: affinegeometry.hh:21
    │ │ │ │
    void reduceOrder(const InIterator &inBegin, const InIterator &inEnd, OutIterator outIt)
    Algorithm to reduce vertex order information.
    Definition: generalvertexorder.hh:40
    │ │ │ │
    @ size
    Definition: quadraturerules.hh:145
    │ │ │ │
    Class providing access to the singletons of the reference elements.
    Definition: referenceelements.hh:170
    │ │ │ │
    typename Container::ReferenceElement ReferenceElement
    The reference element type.
    Definition: referenceelements.hh:188
    │ │ │ │
    Class providing information on the ordering of vertices.
    Definition: generalvertexorder.hh:67
    │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -131,17 +131,17 @@ │ │ │ │ │ 180 │ │ │ │ │ 182 │ │ │ │ │ 187 iterator() { } │ │ │ │ │ 188 }; │ │ │ │ │ 189} // namespace Dune │ │ │ │ │ 190 │ │ │ │ │ 191#endif // DUNE_GEOMETRY_GENERALVERTEXORDER_HH │ │ │ │ │ +referenceelements.hh │ │ │ │ │ type.hh │ │ │ │ │ A unique label for each type of element that can occur in a grid. │ │ │ │ │ -referenceelements.hh │ │ │ │ │ Dune::GeometryTypes::vertex │ │ │ │ │ constexpr GeometryType vertex │ │ │ │ │ GeometryType representing a vertex. │ │ │ │ │ Definition: type.hh:506 │ │ │ │ │ Dune │ │ │ │ │ Definition: affinegeometry.hh:21 │ │ │ │ │ Dune::reduceOrder │ │ │ │ --- ./usr/share/doc/libdune-geometry-doc/doxygen/a00221_source.html │ │ │ ├── +++ ./usr/share/doc/libdune-geometry-doc/doxygen/a00209_source.html │ │ │ │┄ Files 20% similar despite different names │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: typeindex.hh Source File │ │ │ │ +dune-geometry: virtualrefinement.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,146 +62,129 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │
    │ │ │ │ -
    typeindex.hh
    │ │ │ │ +
    virtualrefinement.hh
    │ │ │ │
    │ │ │ │
    │ │ │ │ -Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    │ │ │ │ +Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    │ │ │ │
    2// vi: set et ts=4 sw=2 sts=2:
    │ │ │ │
    3// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
    │ │ │ │
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    │ │ │ │ -
    5#ifndef DUNE_GEOMETRY_TYPEINDEX_HH
    │ │ │ │ -
    6#define DUNE_GEOMETRY_TYPEINDEX_HH
    │ │ │ │ +
    5#ifndef DUNE_GEOMETRY_VIRTUALREFINEMENT_HH
    │ │ │ │ +
    6#define DUNE_GEOMETRY_VIRTUALREFINEMENT_HH
    │ │ │ │
    7
    │ │ │ │ -
    14#include <cstddef>
    │ │ │ │ -
    15
    │ │ │ │ -
    16#include <dune/common/indices.hh>
    │ │ │ │ -
    17#include <dune/common/hybridutilities.hh>
    │ │ │ │ -
    18
    │ │ │ │ -
    19#include "type.hh"
    │ │ │ │ -
    20
    │ │ │ │ -
    21namespace Dune
    │ │ │ │ -
    22{
    │ │ │ │ - │ │ │ │ -
    25 {
    │ │ │ │ -
    32 inline static constexpr std::size_t regular_size(std::size_t dim)
    │ │ │ │ -
    33 {
    │ │ │ │ -
    34 // The following expression is derived from the expression for
    │ │ │ │ -
    35 // GlobalGeometryTypeIndex::regular_offset(). Subtracting
    │ │ │ │ -
    36 // regular_offset(dim+1)-regular_offset(dim) we get:
    │ │ │ │ -
    37 //
    │ │ │ │ -
    38 // ((1 << dim+1) >> 1) - ((1 << dim) >> 1)
    │ │ │ │ -
    39 //
    │ │ │ │ -
    40 // We always have
    │ │ │ │ -
    41 //
    │ │ │ │ -
    42 // dim >= 0,
    │ │ │ │ -
    43 //
    │ │ │ │ -
    44 // so
    │ │ │ │ -
    45 //
    │ │ │ │ -
    46 // (1 << dim+1) >= 2 and (1 << dim+2) % 2 == 0.
    │ │ │ │ -
    47 //
    │ │ │ │ -
    48 // So if we apply a single right-shift to that, we will never lose any
    │ │ │ │ -
    49 // set bits, thus
    │ │ │ │ -
    50 //
    │ │ │ │ -
    51 // ((1 << dim+1) >> 1) == (1 << dim)
    │ │ │ │ -
    52 return (1 << dim) - ((1 << dim) >> 1);
    │ │ │ │ -
    53 }
    │ │ │ │ -
    54
    │ │ │ │ -
    55 public:
    │ │ │ │ -
    61 inline static constexpr std::size_t size(std::size_t dim)
    │ │ │ │ -
    62 {
    │ │ │ │ -
    63 // one for "none"
    │ │ │ │ -
    64 return regular_size(dim) + 1;
    │ │ │ │ -
    65 }
    │ │ │ │ -
    66
    │ │ │ │ -
    73 inline static constexpr std::size_t index(const GeometryType &gt)
    │ │ │ │ -
    74 {
    │ │ │ │ -
    75 return gt.isNone() ? regular_size(gt.dim()) : (gt.id() >> 1);
    │ │ │ │ -
    76 }
    │ │ │ │ -
    77
    │ │ │ │ -
    79 inline static constexpr GeometryType type(std::size_t dim, std::size_t index) {
    │ │ │ │ -
    80 return (index == regular_size(dim)) ?
    │ │ │ │ - │ │ │ │ -
    82 // the cast to unsigned makes sure this is interpreted as the topology
    │ │ │ │ -
    83 // ID constructor
    │ │ │ │ -
    84 GeometryType(static_cast< unsigned int >(index << 1), dim);
    │ │ │ │ -
    85 }
    │ │ │ │ -
    86 };
    │ │ │ │ -
    87
    │ │ │ │ - │ │ │ │ -
    90 {
    │ │ │ │ -
    98 inline static constexpr std::size_t regular_offset(std::size_t dim)
    │ │ │ │ -
    99 {
    │ │ │ │ -
    100 // The number of regular geometry types in a given dimension is
    │ │ │ │ -
    101 // 2^(dim-1). For dim==0 this would yield 1/2 geometry types (which is
    │ │ │ │ -
    102 // obviously bogus, dim==0 has one regular geometry type, the point).
    │ │ │ │ -
    103 // The following expression relies on 1 >> 1 == 0 to treat dim==0
    │ │ │ │ -
    104 // specially.
    │ │ │ │ -
    105 return (1 << dim) >> 1;
    │ │ │ │ -
    106 }
    │ │ │ │ -
    107
    │ │ │ │ -
    108 public:
    │ │ │ │ -
    113 inline static constexpr std::size_t offset(std::size_t dim)
    │ │ │ │ -
    114 {
    │ │ │ │ -
    115 // dim times "none"
    │ │ │ │ -
    116 return regular_offset(dim) + dim;
    │ │ │ │ -
    117 }
    │ │ │ │ -
    118
    │ │ │ │ -
    125 inline static constexpr std::size_t size(std::size_t maxdim)
    │ │ │ │ -
    126 {
    │ │ │ │ -
    127 return offset(maxdim+1);
    │ │ │ │ -
    128 }
    │ │ │ │ -
    129
    │ │ │ │ -
    138 inline static constexpr std::size_t index(const GeometryType &gt)
    │ │ │ │ -
    139 {
    │ │ │ │ -
    140 return offset(gt.dim()) + LocalGeometryTypeIndex::index(gt);
    │ │ │ │ -
    141 }
    │ │ │ │ -
    142 };
    │ │ │ │ -
    143
    │ │ │ │ -
    144 namespace Impl {
    │ │ │ │ -
    145
    │ │ │ │ -
    146 // Map a dynamic GeometryType to a static integral_constant<GeometryType::Id, ...>
    │ │ │ │ -
    147 template<int dim, class F>
    │ │ │ │ -
    148 static auto toGeometryTypeIdConstant(const GeometryType& gt, F&& f) {
    │ │ │ │ -
    149 // Transform LocalGeometryTypeIndex to GeometryType::Id
    │ │ │ │ -
    150 auto callWithId = [&](auto index) {
    │ │ │ │ -
    151 static constexpr auto id = LocalGeometryTypeIndex::type(dim, decltype(index)::value).toId();
    │ │ │ │ -
    152 return f(std::integral_constant<GeometryType::Id, id>{});
    │ │ │ │ -
    153 };
    │ │ │ │ -
    154 // switchCases needs a fallback to determine the return type.
    │ │ │ │ -
    155 auto fallBack = [&]() { return callWithId(Dune::Indices::_0); };
    │ │ │ │ -
    156 // Iterate over all _regular_ GeometryType indices for given dimension
    │ │ │ │ -
    157 auto allIndices = std::make_index_sequence<LocalGeometryTypeIndex::size(dim)-1>{};
    │ │ │ │ -
    158 return Dune::Hybrid::switchCases(allIndices, LocalGeometryTypeIndex::index(gt), callWithId, fallBack);
    │ │ │ │ -
    159 }
    │ │ │ │ -
    160
    │ │ │ │ -
    161 } // namespace Impl
    │ │ │ │ -
    162} // namespace Dune
    │ │ │ │ -
    163
    │ │ │ │ -
    164#endif // DUNE_GEOMETRY_TYPEINDEX_HH
    │ │ │ │ -
    A unique label for each type of element that can occur in a grid.
    │ │ │ │ -
    constexpr GeometryType none(unsigned int dim)
    Returns a GeometryType representing a singular of dimension dim.
    Definition: type.hh:481
    │ │ │ │ +
    268#include <vector>
    │ │ │ │ +
    269
    │ │ │ │ +
    270#include <dune/common/fvector.hh>
    │ │ │ │ +
    271
    │ │ │ │ +
    272#include "refinement.hh"
    │ │ │ │ +
    273#include "type.hh"
    │ │ │ │ +
    274
    │ │ │ │ +
    275namespace Dune
    │ │ │ │ +
    276{
    │ │ │ │ +
    277 // //////////////////////////////////////////
    │ │ │ │ +
    278 //
    │ │ │ │ +
    279 // The virtual base class and its iterators
    │ │ │ │ +
    280 //
    │ │ │ │ +
    281
    │ │ │ │ +
    282 //
    │ │ │ │ +
    283 // Refinement
    │ │ │ │ +
    284 //
    │ │ │ │ +
    285
    │ │ │ │ +
    292 template<int dimension, class CoordType>
    │ │ │ │ + │ │ │ │ +
    294 {
    │ │ │ │ +
    295 public:
    │ │ │ │ +
    296 template<int codimension>
    │ │ │ │ +
    297 struct Codim;
    │ │ │ │ + │ │ │ │ + │ │ │ │ +
    302
    │ │ │ │ +
    308 typedef FieldVector<CoordType, dimension> CoordVector;
    │ │ │ │ +
    314 typedef std::vector<int> IndexVector;
    │ │ │ │ +
    315
    │ │ │ │ +
    316 template<int codimension>
    │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
    320
    │ │ │ │ +
    326 virtual int nVertices(Dune::RefinementIntervals tag) const = 0;
    │ │ │ │ +
    327
    │ │ │ │ + │ │ │ │ +
    334
    │ │ │ │ + │ │ │ │ +
    341
    │ │ │ │ +
    347 virtual int nElements(Dune::RefinementIntervals tag) const = 0;
    │ │ │ │ +
    348
    │ │ │ │ + │ │ │ │ +
    355
    │ │ │ │ + │ │ │ │ +
    362
    │ │ │ │ + │ │ │ │ +
    365 {}
    │ │ │ │ +
    366
    │ │ │ │ +
    367 protected:
    │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
    372 };
    │ │ │ │ +
    373
    │ │ │ │ +
    375 template<int dimension, class CoordType>
    │ │ │ │ +
    376 template<int codimension>
    │ │ │ │ +
    377 struct VirtualRefinement<dimension, CoordType>::Codim
    │ │ │ │ +
    378 {
    │ │ │ │ +
    379 class SubEntityIterator;
    │ │ │ │ +
    380 };
    │ │ │ │ +
    381
    │ │ │ │ +
    382 // ////////////////////////
    │ │ │ │ +
    383 //
    │ │ │ │ +
    384 // The refinement builder
    │ │ │ │ +
    385 //
    │ │ │ │ +
    386
    │ │ │ │ +
    387 template<int dimension, class CoordType>
    │ │ │ │ + │ │ │ │ +
    389 buildRefinement(GeometryType geometryType, GeometryType coerceTo);
    │ │ │ │ +
    390
    │ │ │ │ +
    391} // namespace Dune
    │ │ │ │ +
    392
    │ │ │ │ +
    393#include "virtualrefinement.cc"
    │ │ │ │ +
    394
    │ │ │ │ +
    395#endif // DUNE_GEOMETRY_VIRTUALREFINEMENT_HH
    │ │ │ │ +
    This file simply includes all Refinement implementations so you don't have to do them separately.
    │ │ │ │ +
    A unique label for each type of element that can occur in a grid.
    │ │ │ │ +
    This file contains the virtual wrapper around refinement.
    │ │ │ │
    Definition: affinegeometry.hh:21
    │ │ │ │ +
    VirtualRefinement< dimension, CoordType > & buildRefinement(GeometryType geometryType, GeometryType coerceTo)
    return a reference to the VirtualRefinement according to the parameters
    Definition: virtualrefinement.cc:503
    │ │ │ │ +
    Holds the number of refined intervals per axis needed for virtual and static refinement.
    Definition: base.cc:94
    │ │ │ │
    Unique label for each type of entities that can occur in DUNE grids.
    Definition: type.hh:125
    │ │ │ │ -
    constexpr Id toId() const
    Create an Id representation of this GeometryType.
    Definition: type.hh:221
    │ │ │ │ -
    constexpr unsigned int dim() const
    Return dimension of the type.
    Definition: type.hh:371
    │ │ │ │ -
    constexpr unsigned int id() const
    Return the topology id of the type.
    Definition: type.hh:376
    │ │ │ │ -
    constexpr bool isNone() const
    Return true if entity is a singular of any dimension.
    Definition: type.hh:366
    │ │ │ │ -
    Compute per-dimension indices for geometry types.
    Definition: typeindex.hh:25
    │ │ │ │ -
    static constexpr std::size_t size(std::size_t dim)
    Compute total number of geometry types for the given dimension.
    Definition: typeindex.hh:61
    │ │ │ │ -
    static constexpr GeometryType type(std::size_t dim, std::size_t index)
    compute the geometry type for the given local index and dimension
    Definition: typeindex.hh:79
    │ │ │ │ -
    static constexpr std::size_t index(const GeometryType &gt)
    Compute the index for the given geometry type within its dimension.
    Definition: typeindex.hh:73
    │ │ │ │ -
    Compute indices for geometry types, taking the dimension into account.
    Definition: typeindex.hh:90
    │ │ │ │ -
    static constexpr std::size_t index(const GeometryType &gt)
    Compute the index for the given geometry type over all dimensions.
    Definition: typeindex.hh:138
    │ │ │ │ -
    static constexpr std::size_t offset(std::size_t dim)
    Compute the starting index for a given dimension including irregular geometry types.
    Definition: typeindex.hh:113
    │ │ │ │ -
    static constexpr std::size_t size(std::size_t maxdim)
    Compute total number of geometry types up to and including the given dimension.
    Definition: typeindex.hh:125
    │ │ │ │ +
    Definition: virtualrefinement.cc:231
    │ │ │ │ +
    VirtualRefinement base class.
    Definition: virtualrefinement.hh:294
    │ │ │ │ +
    SubEntityIteratorBack< dimension > VertexIteratorBack
    Definition: virtualrefinement.hh:318
    │ │ │ │ +
    virtual ElementIteratorBack * eEndBack(Dune::RefinementIntervals tag) const =0
    │ │ │ │ +
    VertexIterator vBegin(Dune::RefinementIntervals tag) const
    Get an VertexIterator.
    Definition: virtualrefinement.cc:38
    │ │ │ │ +
    ElementIterator eBegin(Dune::RefinementIntervals tag) const
    Get an ElementIterator.
    Definition: virtualrefinement.cc:54
    │ │ │ │ +
    virtual int nElements(Dune::RefinementIntervals tag) const =0
    Get the number of Elements.
    │ │ │ │ +
    ElementIterator eEnd(Dune::RefinementIntervals tag) const
    Get an ElementIterator.
    Definition: virtualrefinement.cc:62
    │ │ │ │ +
    Codim< 0 >::SubEntityIterator ElementIterator
    The ElementIterator of the VirtualRefinement.
    Definition: virtualrefinement.hh:301
    │ │ │ │ +
    virtual ~VirtualRefinement()
    Destructor.
    Definition: virtualrefinement.hh:364
    │ │ │ │ +
    VertexIterator vEnd(Dune::RefinementIntervals tag) const
    Get an VertexIterator.
    Definition: virtualrefinement.cc:46
    │ │ │ │ +
    FieldVector< CoordType, dimension > CoordVector
    The CoordVector of the VirtualRefinement.
    Definition: virtualrefinement.hh:308
    │ │ │ │ +
    virtual int nVertices(Dune::RefinementIntervals tag) const =0
    Get the number of Vertices.
    │ │ │ │ +
    std::vector< int > IndexVector
    The IndexVector of the VirtualRefinement.
    Definition: virtualrefinement.hh:314
    │ │ │ │ +
    Codim< dimension >::SubEntityIterator VertexIterator
    The VertexIterator of the VirtualRefinement.
    Definition: virtualrefinement.hh:299
    │ │ │ │ +
    virtual VertexIteratorBack * vEndBack(Dune::RefinementIntervals tag) const =0
    │ │ │ │ +
    SubEntityIteratorBack< 0 > ElementIteratorBack
    Definition: virtualrefinement.hh:319
    │ │ │ │ +
    virtual ElementIteratorBack * eBeginBack(Dune::RefinementIntervals tag) const =0
    │ │ │ │ +
    virtual VertexIteratorBack * vBeginBack(Dune::RefinementIntervals tag) const =0
    │ │ │ │ +
    codim database of VirtualRefinement
    Definition: virtualrefinement.hh:378
    │ │ │ │
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,189 +4,188 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ -typeindex.hh │ │ │ │ │ +virtualrefinement.hh │ │ │ │ │ Go_to_the_documentation_of_this_file. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ - 5#ifndef DUNE_GEOMETRY_TYPEINDEX_HH │ │ │ │ │ - 6#define DUNE_GEOMETRY_TYPEINDEX_HH │ │ │ │ │ + 5#ifndef DUNE_GEOMETRY_VIRTUALREFINEMENT_HH │ │ │ │ │ + 6#define DUNE_GEOMETRY_VIRTUALREFINEMENT_HH │ │ │ │ │ 7 │ │ │ │ │ - 14#include │ │ │ │ │ - 15 │ │ │ │ │ - 16#include │ │ │ │ │ - 17#include │ │ │ │ │ - 18 │ │ │ │ │ - 19#include "type.hh" │ │ │ │ │ - 20 │ │ │ │ │ - 21namespace Dune │ │ │ │ │ - 22{ │ │ │ │ │ -24 class LocalGeometryTypeIndex │ │ │ │ │ - 25 { │ │ │ │ │ - 32 inline static constexpr std::size_t regular_size(std::size_t dim) │ │ │ │ │ - 33 { │ │ │ │ │ - 34 // The following expression is derived from the expression for │ │ │ │ │ - 35 // GlobalGeometryTypeIndex::regular_offset(). Subtracting │ │ │ │ │ - 36 // regular_offset(dim+1)-regular_offset(dim) we get: │ │ │ │ │ - 37 // │ │ │ │ │ - 38 // ((1 << dim+1) >> 1) - ((1 << dim) >> 1) │ │ │ │ │ - 39 // │ │ │ │ │ - 40 // We always have │ │ │ │ │ - 41 // │ │ │ │ │ - 42 // dim >= 0, │ │ │ │ │ - 43 // │ │ │ │ │ - 44 // so │ │ │ │ │ - 45 // │ │ │ │ │ - 46 // (1 << dim+1) >= 2 and (1 << dim+2) % 2 == 0. │ │ │ │ │ - 47 // │ │ │ │ │ - 48 // So if we apply a single right-shift to that, we will never lose any │ │ │ │ │ - 49 // set bits, thus │ │ │ │ │ - 50 // │ │ │ │ │ - 51 // ((1 << dim+1) >> 1) == (1 << dim) │ │ │ │ │ - 52 return (1 << dim) - ((1 << dim) >> 1); │ │ │ │ │ - 53 } │ │ │ │ │ - 54 │ │ │ │ │ - 55 public: │ │ │ │ │ -61 inline static constexpr std::size_t size(std::size_t dim) │ │ │ │ │ - 62 { │ │ │ │ │ - 63 // one for "none" │ │ │ │ │ - 64 return regular_size(dim) + 1; │ │ │ │ │ - 65 } │ │ │ │ │ - 66 │ │ │ │ │ -73 inline static constexpr std::size_t index(const GeometryType >) │ │ │ │ │ - 74 { │ │ │ │ │ - 75 return gt.isNone() ? regular_size(gt.dim()) : (gt.id() >> 1); │ │ │ │ │ - 76 } │ │ │ │ │ - 77 │ │ │ │ │ -79 inline static constexpr GeometryType type(std::size_t dim, std::size_t │ │ │ │ │ -index) { │ │ │ │ │ - 80 return (index == regular_size(dim)) ? │ │ │ │ │ - 81 GeometryTypes::none(dim) : │ │ │ │ │ - 82 // the cast to unsigned makes sure this is interpreted as the topology │ │ │ │ │ - 83 // ID constructor │ │ │ │ │ - 84 GeometryType(static_cast< unsigned int >(index << 1), dim); │ │ │ │ │ - 85 } │ │ │ │ │ - 86 }; │ │ │ │ │ - 87 │ │ │ │ │ -89 class GlobalGeometryTypeIndex │ │ │ │ │ - 90 { │ │ │ │ │ - 98 inline static constexpr std::size_t regular_offset(std::size_t dim) │ │ │ │ │ - 99 { │ │ │ │ │ - 100 // The number of regular geometry types in a given dimension is │ │ │ │ │ - 101 // 2^(dim-1). For dim==0 this would yield 1/2 geometry types (which is │ │ │ │ │ - 102 // obviously bogus, dim==0 has one regular geometry type, the point). │ │ │ │ │ - 103 // The following expression relies on 1 >> 1 == 0 to treat dim==0 │ │ │ │ │ - 104 // specially. │ │ │ │ │ - 105 return (1 << dim) >> 1; │ │ │ │ │ - 106 } │ │ │ │ │ - 107 │ │ │ │ │ - 108 public: │ │ │ │ │ -113 inline static constexpr std::size_t offset(std::size_t dim) │ │ │ │ │ - 114 { │ │ │ │ │ - 115 // dim times "none" │ │ │ │ │ - 116 return regular_offset(dim) + dim; │ │ │ │ │ - 117 } │ │ │ │ │ - 118 │ │ │ │ │ -125 inline static constexpr std::size_t size(std::size_t maxdim) │ │ │ │ │ - 126 { │ │ │ │ │ - 127 return offset(maxdim+1); │ │ │ │ │ - 128 } │ │ │ │ │ - 129 │ │ │ │ │ -138 inline static constexpr std::size_t index(const GeometryType >) │ │ │ │ │ - 139 { │ │ │ │ │ - 140 return offset(gt.dim()) + LocalGeometryTypeIndex::index(gt); │ │ │ │ │ - 141 } │ │ │ │ │ - 142 }; │ │ │ │ │ - 143 │ │ │ │ │ - 144 namespace Impl { │ │ │ │ │ - 145 │ │ │ │ │ - 146 // Map a dynamic GeometryType to a static integral_constant │ │ │ │ │ - 147 template │ │ │ │ │ - 148 static auto toGeometryTypeIdConstant(const GeometryType& gt, F&& f) { │ │ │ │ │ - 149 // Transform LocalGeometryTypeIndex to GeometryType::Id │ │ │ │ │ - 150 auto callWithId = [&](auto index) { │ │ │ │ │ - 151 static constexpr auto id = LocalGeometryTypeIndex::type(dim, decltype │ │ │ │ │ -(index)::value).toId(); │ │ │ │ │ - 152 return f(std::integral_constant{}); │ │ │ │ │ - 153 }; │ │ │ │ │ - 154 // switchCases needs a fallback to determine the return type. │ │ │ │ │ - 155 auto fallBack = [&]() { return callWithId(Dune::Indices::_0); }; │ │ │ │ │ - 156 // Iterate over all _regular_ GeometryType indices for given dimension │ │ │ │ │ - 157 auto allIndices = std::make_index_sequence{}; │ │ │ │ │ - 158 return Dune::Hybrid::switchCases(allIndices, LocalGeometryTypeIndex::index │ │ │ │ │ -(gt), callWithId, fallBack); │ │ │ │ │ - 159 } │ │ │ │ │ - 160 │ │ │ │ │ - 161 } // namespace Impl │ │ │ │ │ - 162} // namespace Dune │ │ │ │ │ - 163 │ │ │ │ │ - 164#endif // DUNE_GEOMETRY_TYPEINDEX_HH │ │ │ │ │ + 268#include │ │ │ │ │ + 269 │ │ │ │ │ + 270#include │ │ │ │ │ + 271 │ │ │ │ │ + 272#include "refinement.hh" │ │ │ │ │ + 273#include "type.hh" │ │ │ │ │ + 274 │ │ │ │ │ + 275namespace Dune │ │ │ │ │ + 276{ │ │ │ │ │ + 277 // ////////////////////////////////////////// │ │ │ │ │ + 278 // │ │ │ │ │ + 279 // The virtual base class and its iterators │ │ │ │ │ + 280 // │ │ │ │ │ + 281 │ │ │ │ │ + 282 // │ │ │ │ │ + 283 // Refinement │ │ │ │ │ + 284 // │ │ │ │ │ + 285 │ │ │ │ │ + 292 template │ │ │ │ │ +293 class VirtualRefinement │ │ │ │ │ + 294 { │ │ │ │ │ + 295 public: │ │ │ │ │ + 296 template │ │ │ │ │ + 297 struct Codim; │ │ │ │ │ +299 typedef typename Codim::SubEntityIterator VertexIterator; │ │ │ │ │ +301 typedef typename Codim<0>::SubEntityIterator ElementIterator; │ │ │ │ │ + 302 │ │ │ │ │ +308 typedef FieldVector CoordVector; │ │ │ │ │ +314 typedef std::vector IndexVector; │ │ │ │ │ + 315 │ │ │ │ │ + 316 template │ │ │ │ │ + 317 class SubEntityIteratorBack; │ │ │ │ │ +318 typedef SubEntityIteratorBack VertexIteratorBack; │ │ │ │ │ +319 typedef SubEntityIteratorBack<0> ElementIteratorBack; │ │ │ │ │ + 320 │ │ │ │ │ +326 virtual int nVertices(Dune::RefinementIntervals tag) const = 0; │ │ │ │ │ + 327 │ │ │ │ │ + 333 VertexIterator vBegin(Dune::RefinementIntervals tag) const; │ │ │ │ │ + 334 │ │ │ │ │ + 340 VertexIterator vEnd(Dune::RefinementIntervals tag) const; │ │ │ │ │ + 341 │ │ │ │ │ +347 virtual int nElements(Dune::RefinementIntervals tag) const = 0; │ │ │ │ │ + 348 │ │ │ │ │ + 354 ElementIterator eBegin(Dune::RefinementIntervals tag) const; │ │ │ │ │ + 355 │ │ │ │ │ + 361 ElementIterator eEnd(Dune::RefinementIntervals tag) const; │ │ │ │ │ + 362 │ │ │ │ │ +364 virtual ~VirtualRefinement() │ │ │ │ │ + 365 {} │ │ │ │ │ + 366 │ │ │ │ │ + 367 protected: │ │ │ │ │ +368 virtual VertexIteratorBack *vBeginBack(Dune::RefinementIntervals tag) const │ │ │ │ │ += 0; │ │ │ │ │ +369 virtual VertexIteratorBack *vEndBack(Dune::RefinementIntervals tag) const = │ │ │ │ │ +0; │ │ │ │ │ +370 virtual ElementIteratorBack *eBeginBack(Dune::RefinementIntervals tag) │ │ │ │ │ +const = 0; │ │ │ │ │ +371 virtual ElementIteratorBack *eEndBack(Dune::RefinementIntervals tag) const │ │ │ │ │ += 0; │ │ │ │ │ + 372 }; │ │ │ │ │ + 373 │ │ │ │ │ + 375 template │ │ │ │ │ + 376 template │ │ │ │ │ +377 struct VirtualRefinement::Codim │ │ │ │ │ + 378 { │ │ │ │ │ + 379 class SubEntityIterator; │ │ │ │ │ + 380 }; │ │ │ │ │ + 381 │ │ │ │ │ + 382 // //////////////////////// │ │ │ │ │ + 383 // │ │ │ │ │ + 384 // The refinement builder │ │ │ │ │ + 385 // │ │ │ │ │ + 386 │ │ │ │ │ + 387 template │ │ │ │ │ + 388 VirtualRefinement & │ │ │ │ │ + 389 buildRefinement(GeometryType geometryType, GeometryType coerceTo); │ │ │ │ │ + 390 │ │ │ │ │ + 391} // namespace Dune │ │ │ │ │ + 392 │ │ │ │ │ + 393#include "virtualrefinement.cc" │ │ │ │ │ + 394 │ │ │ │ │ + 395#endif // DUNE_GEOMETRY_VIRTUALREFINEMENT_HH │ │ │ │ │ +refinement.hh │ │ │ │ │ +This file simply includes all Refinement implementations so you don't have to │ │ │ │ │ +do them separately. │ │ │ │ │ type.hh │ │ │ │ │ A unique label for each type of element that can occur in a grid. │ │ │ │ │ -Dune::GeometryTypes::none │ │ │ │ │ -constexpr GeometryType none(unsigned int dim) │ │ │ │ │ -Returns a GeometryType representing a singular of dimension dim. │ │ │ │ │ -Definition: type.hh:481 │ │ │ │ │ +virtualrefinement.cc │ │ │ │ │ +This file contains the virtual wrapper around refinement. │ │ │ │ │ Dune │ │ │ │ │ Definition: affinegeometry.hh:21 │ │ │ │ │ +Dune::buildRefinement │ │ │ │ │ +VirtualRefinement< dimension, CoordType > & buildRefinement(GeometryType │ │ │ │ │ +geometryType, GeometryType coerceTo) │ │ │ │ │ +return a reference to the VirtualRefinement according to the parameters │ │ │ │ │ +Definition: virtualrefinement.cc:503 │ │ │ │ │ +Dune::RefinementIntervals │ │ │ │ │ +Holds the number of refined intervals per axis needed for virtual and static │ │ │ │ │ +refinement. │ │ │ │ │ +Definition: base.cc:94 │ │ │ │ │ Dune::GeometryType │ │ │ │ │ Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ Definition: type.hh:125 │ │ │ │ │ -Dune::GeometryType::toId │ │ │ │ │ -constexpr Id toId() const │ │ │ │ │ -Create an Id representation of this GeometryType. │ │ │ │ │ -Definition: type.hh:221 │ │ │ │ │ -Dune::GeometryType::dim │ │ │ │ │ -constexpr unsigned int dim() const │ │ │ │ │ -Return dimension of the type. │ │ │ │ │ -Definition: type.hh:371 │ │ │ │ │ -Dune::GeometryType::id │ │ │ │ │ -constexpr unsigned int id() const │ │ │ │ │ -Return the topology id of the type. │ │ │ │ │ -Definition: type.hh:376 │ │ │ │ │ -Dune::GeometryType::isNone │ │ │ │ │ -constexpr bool isNone() const │ │ │ │ │ -Return true if entity is a singular of any dimension. │ │ │ │ │ -Definition: type.hh:366 │ │ │ │ │ -Dune::LocalGeometryTypeIndex │ │ │ │ │ -Compute per-dimension indices for geometry types. │ │ │ │ │ -Definition: typeindex.hh:25 │ │ │ │ │ -Dune::LocalGeometryTypeIndex::size │ │ │ │ │ -static constexpr std::size_t size(std::size_t dim) │ │ │ │ │ -Compute total number of geometry types for the given dimension. │ │ │ │ │ -Definition: typeindex.hh:61 │ │ │ │ │ -Dune::LocalGeometryTypeIndex::type │ │ │ │ │ -static constexpr GeometryType type(std::size_t dim, std::size_t index) │ │ │ │ │ -compute the geometry type for the given local index and dimension │ │ │ │ │ -Definition: typeindex.hh:79 │ │ │ │ │ -Dune::LocalGeometryTypeIndex::index │ │ │ │ │ -static constexpr std::size_t index(const GeometryType >) │ │ │ │ │ -Compute the index for the given geometry type within its dimension. │ │ │ │ │ -Definition: typeindex.hh:73 │ │ │ │ │ -Dune::GlobalGeometryTypeIndex │ │ │ │ │ -Compute indices for geometry types, taking the dimension into account. │ │ │ │ │ -Definition: typeindex.hh:90 │ │ │ │ │ -Dune::GlobalGeometryTypeIndex::index │ │ │ │ │ -static constexpr std::size_t index(const GeometryType >) │ │ │ │ │ -Compute the index for the given geometry type over all dimensions. │ │ │ │ │ -Definition: typeindex.hh:138 │ │ │ │ │ -Dune::GlobalGeometryTypeIndex::offset │ │ │ │ │ -static constexpr std::size_t offset(std::size_t dim) │ │ │ │ │ -Compute the starting index for a given dimension including irregular geometry │ │ │ │ │ -types. │ │ │ │ │ -Definition: typeindex.hh:113 │ │ │ │ │ -Dune::GlobalGeometryTypeIndex::size │ │ │ │ │ -static constexpr std::size_t size(std::size_t maxdim) │ │ │ │ │ -Compute total number of geometry types up to and including the given dimension. │ │ │ │ │ -Definition: typeindex.hh:125 │ │ │ │ │ +Dune::VirtualRefinement::SubEntityIteratorBack │ │ │ │ │ +Definition: virtualrefinement.cc:231 │ │ │ │ │ +Dune::VirtualRefinement │ │ │ │ │ +VirtualRefinement base class. │ │ │ │ │ +Definition: virtualrefinement.hh:294 │ │ │ │ │ +Dune::VirtualRefinement::VertexIteratorBack │ │ │ │ │ +SubEntityIteratorBack< dimension > VertexIteratorBack │ │ │ │ │ +Definition: virtualrefinement.hh:318 │ │ │ │ │ +Dune::VirtualRefinement::eEndBack │ │ │ │ │ +virtual ElementIteratorBack * eEndBack(Dune::RefinementIntervals tag) const =0 │ │ │ │ │ +Dune::VirtualRefinement::vBegin │ │ │ │ │ +VertexIterator vBegin(Dune::RefinementIntervals tag) const │ │ │ │ │ +Get an VertexIterator. │ │ │ │ │ +Definition: virtualrefinement.cc:38 │ │ │ │ │ +Dune::VirtualRefinement::eBegin │ │ │ │ │ +ElementIterator eBegin(Dune::RefinementIntervals tag) const │ │ │ │ │ +Get an ElementIterator. │ │ │ │ │ +Definition: virtualrefinement.cc:54 │ │ │ │ │ +Dune::VirtualRefinement::nElements │ │ │ │ │ +virtual int nElements(Dune::RefinementIntervals tag) const =0 │ │ │ │ │ +Get the number of Elements. │ │ │ │ │ +Dune::VirtualRefinement::eEnd │ │ │ │ │ +ElementIterator eEnd(Dune::RefinementIntervals tag) const │ │ │ │ │ +Get an ElementIterator. │ │ │ │ │ +Definition: virtualrefinement.cc:62 │ │ │ │ │ +Dune::VirtualRefinement::ElementIterator │ │ │ │ │ +Codim< 0 >::SubEntityIterator ElementIterator │ │ │ │ │ +The ElementIterator of the VirtualRefinement. │ │ │ │ │ +Definition: virtualrefinement.hh:301 │ │ │ │ │ +Dune::VirtualRefinement::~VirtualRefinement │ │ │ │ │ +virtual ~VirtualRefinement() │ │ │ │ │ +Destructor. │ │ │ │ │ +Definition: virtualrefinement.hh:364 │ │ │ │ │ +Dune::VirtualRefinement::vEnd │ │ │ │ │ +VertexIterator vEnd(Dune::RefinementIntervals tag) const │ │ │ │ │ +Get an VertexIterator. │ │ │ │ │ +Definition: virtualrefinement.cc:46 │ │ │ │ │ +Dune::VirtualRefinement::CoordVector │ │ │ │ │ +FieldVector< CoordType, dimension > CoordVector │ │ │ │ │ +The CoordVector of the VirtualRefinement. │ │ │ │ │ +Definition: virtualrefinement.hh:308 │ │ │ │ │ +Dune::VirtualRefinement::nVertices │ │ │ │ │ +virtual int nVertices(Dune::RefinementIntervals tag) const =0 │ │ │ │ │ +Get the number of Vertices. │ │ │ │ │ +Dune::VirtualRefinement::IndexVector │ │ │ │ │ +std::vector< int > IndexVector │ │ │ │ │ +The IndexVector of the VirtualRefinement. │ │ │ │ │ +Definition: virtualrefinement.hh:314 │ │ │ │ │ +Dune::VirtualRefinement::VertexIterator │ │ │ │ │ +Codim< dimension >::SubEntityIterator VertexIterator │ │ │ │ │ +The VertexIterator of the VirtualRefinement. │ │ │ │ │ +Definition: virtualrefinement.hh:299 │ │ │ │ │ +Dune::VirtualRefinement::vEndBack │ │ │ │ │ +virtual VertexIteratorBack * vEndBack(Dune::RefinementIntervals tag) const =0 │ │ │ │ │ +Dune::VirtualRefinement::ElementIteratorBack │ │ │ │ │ +SubEntityIteratorBack< 0 > ElementIteratorBack │ │ │ │ │ +Definition: virtualrefinement.hh:319 │ │ │ │ │ +Dune::VirtualRefinement::eBeginBack │ │ │ │ │ +virtual ElementIteratorBack * eBeginBack(Dune::RefinementIntervals tag) const │ │ │ │ │ +=0 │ │ │ │ │ +Dune::VirtualRefinement::vBeginBack │ │ │ │ │ +virtual VertexIteratorBack * vBeginBack(Dune::RefinementIntervals tag) const =0 │ │ │ │ │ +Dune::VirtualRefinement::Codim │ │ │ │ │ +codim database of VirtualRefinement │ │ │ │ │ +Definition: virtualrefinement.hh:378 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ │ --- ./usr/share/doc/libdune-geometry-doc/doxygen/a00224_source.html │ │ │ ├── +++ ./usr/share/doc/libdune-geometry-doc/doxygen/a00197_source.html │ │ │ │┄ Files 1% similar despite different names │ │ │ │ @@ -65,15 +65,15 @@ │ │ │ │ │ │ │ │
    │ │ │ │
    │ │ │ │
    │ │ │ │
    dimension.hh
    │ │ │ │
    │ │ │ │
    │ │ │ │ -Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    │ │ │ │ +Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    │ │ │ │
    2// vi: set et ts=4 sw=2 sts=2:
    │ │ │ │
    3// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
    │ │ │ │
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    │ │ │ │
    5#ifndef DUNE_GEOMETRY_DIMENSION_HH
    │ │ │ │
    6#define DUNE_GEOMETRY_DIMENSION_HH
    │ │ │ │
    7
    │ │ │ │
    8#include <type_traits>
    │ │ │ │ --- ./usr/share/doc/libdune-geometry-doc/doxygen/a00230_source.html │ │ │ ├── +++ ./usr/share/doc/libdune-geometry-doc/doxygen/a00203_source.html │ │ │ │┄ Files 0% similar despite different names │ │ │ │ @@ -65,15 +65,15 @@ │ │ │ │ │ │ │ │
    │ │ │ │
    │ │ │ │
    │ │ │ │
    deprecated_topology.hh
    │ │ │ │
    │ │ │ │
    │ │ │ │ -Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    │ │ │ │ +Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    │ │ │ │
    2// vi: set et ts=4 sw=2 sts=2:
    │ │ │ │
    3// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
    │ │ │ │
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    │ │ │ │
    5#ifndef DUNE_DEPRECATED_TOPOLOGY_HH
    │ │ │ │
    6#define DUNE_DEPRECATED_TOPOLOGY_HH
    │ │ │ │
    7
    │ │ │ │
    8 namespace Impl
    │ │ │ │ --- ./usr/share/doc/libdune-geometry-doc/doxygen/a00236_source.html │ │ │ ├── +++ ./usr/share/doc/libdune-geometry-doc/doxygen/a00194_source.html │ │ │ │┄ Files 18% similar despite different names │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: topologyfactory.hh Source File │ │ │ │ +dune-geometry: referenceelement.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,176 +62,224 @@ │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │
    │ │ │ │ -
    topologyfactory.hh
    │ │ │ │ +
    referenceelement.hh
    │ │ │ │
    │ │ │ │
    │ │ │ │ -Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    │ │ │ │ +Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    │ │ │ │
    2// vi: set et ts=4 sw=2 sts=2:
    │ │ │ │
    3// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
    │ │ │ │
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    │ │ │ │ -
    5#ifndef DUNE_GEOMETRY_TOPOLOGYFACTORY_HH
    │ │ │ │ -
    6#define DUNE_GEOMETRY_TOPOLOGYFACTORY_HH
    │ │ │ │ +
    5#ifndef DUNE_GEOMETRY_REFERENCEELEMENT_HH
    │ │ │ │ +
    6#define DUNE_GEOMETRY_REFERENCEELEMENT_HH
    │ │ │ │
    7
    │ │ │ │ -
    8#include <cassert>
    │ │ │ │ + │ │ │ │
    9
    │ │ │ │ -
    10#include <array>
    │ │ │ │ -
    11#include <map>
    │ │ │ │ -
    12#include <memory>
    │ │ │ │ -
    13#include <type_traits>
    │ │ │ │ -
    14#include <vector>
    │ │ │ │ -
    15
    │ │ │ │ -
    16#include <dune/geometry/type.hh>
    │ │ │ │ - │ │ │ │ +
    10namespace Dune {
    │ │ │ │ +
    11 namespace Geo {
    │ │ │ │ +
    12
    │ │ │ │ +
    13 namespace Impl {
    │ │ │ │ +
    14
    │ │ │ │ +
    15 // forward declaration for friend declaration
    │ │ │ │ +
    16 template<typename ctype, int dim>
    │ │ │ │ +
    17 class ReferenceElementContainer;
    │ │ │ │
    18
    │ │ │ │ -
    19namespace Dune
    │ │ │ │ -
    20{
    │ │ │ │ -
    21
    │ │ │ │ -
    40 template <class Traits>
    │ │ │ │ - │ │ │ │ -
    42 {
    │ │ │ │ -
    43 // extract types from Traits class
    │ │ │ │ -
    44 static const unsigned int dimension = Traits::dimension;
    │ │ │ │ -
    45 typedef typename Traits::Key Key;
    │ │ │ │ -
    46 typedef typename Traits::Object Object;
    │ │ │ │ -
    47 typedef typename Traits::Factory Factory;
    │ │ │ │ -
    48
    │ │ │ │ -
    50 static Object *create ( const Dune::GeometryType &gt, const Key &key )
    │ │ │ │ -
    51 {
    │ │ │ │ -
    52 return Impl::toGeometryTypeIdConstant<dimension>(gt, [&](auto id) {
    │ │ │ │ -
    53 return create<decltype(id)::value>(key);
    │ │ │ │ -
    54 });
    │ │ │ │ -
    55 }
    │ │ │ │ -
    57 template< GeometryType::Id geometryId >
    │ │ │ │ -
    58 static Object *create ( const Key &key )
    │ │ │ │ -
    59 {
    │ │ │ │ -
    60 return Factory::template createObject< geometryId >( key );
    │ │ │ │ -
    61 }
    │ │ │ │ -
    62
    │ │ │ │ -
    64 template< class Topology >
    │ │ │ │ -
    65 static Object *create ( const Key &key )
    │ │ │ │ -
    66 {
    │ │ │ │ -
    67 return Factory::template createObject< Topology >( key );
    │ │ │ │ -
    68 }
    │ │ │ │ -
    69
    │ │ │ │ -
    71 static void release( Object *object ) { delete object; }
    │ │ │ │ -
    72 };
    │ │ │ │ +
    19 }
    │ │ │ │ +
    20
    │ │ │ │ +
    21 // forward declaration for constructing default reference element type
    │ │ │ │ +
    22 template<typename ctype, int dim>
    │ │ │ │ +
    23 class ReferenceElementImplementation;
    │ │ │ │ +
    24
    │ │ │ │ +
    25 // forward declaration for backwards compatibility conversion
    │ │ │ │ +
    26 template<typename ctype, int dim>
    │ │ │ │ +
    27 struct ReferenceElements;
    │ │ │ │ +
    28
    │ │ │ │ +
    29 // ReferenceElement
    │ │ │ │ +
    30 // ----------------
    │ │ │ │ +
    31
    │ │ │ │ +
    50 template<typename Implementation>
    │ │ │ │ + │ │ │ │ +
    52 {
    │ │ │ │ +
    53
    │ │ │ │ +
    54 public:
    │ │ │ │ +
    55
    │ │ │ │ +
    56#ifndef DOXYGEN
    │ │ │ │ +
    57
    │ │ │ │ +
    59 template<int codim>
    │ │ │ │ +
    60 using Codim = typename Implementation::template Codim<codim>;
    │ │ │ │ +
    61
    │ │ │ │ +
    62#else
    │ │ │ │ +
    63
    │ │ │ │ +
    65 template< int codim >
    │ │ │ │ +
    66 struct Codim
    │ │ │ │ +
    67 {
    │ │ │ │ +
    69 using Geometry = implementation-defined;
    │ │ │ │ +
    70 };
    │ │ │ │ +
    71
    │ │ │ │ +
    72#endif // DOXYGEN
    │ │ │ │
    73
    │ │ │ │ -
    74
    │ │ │ │ -
    75
    │ │ │ │ -
    80 template <class Factory>
    │ │ │ │ - │ │ │ │ -
    82 {
    │ │ │ │ -
    83 static const unsigned int dimension = Factory::dimension;
    │ │ │ │ -
    84 typedef typename Factory::Key Key;
    │ │ │ │ -
    85 typedef const typename Factory::Object Object;
    │ │ │ │ -
    86
    │ │ │ │ -
    88 static Object *create ( const Dune::GeometryType &gt, const Key &key )
    │ │ │ │ -
    89 {
    │ │ │ │ -
    90 assert( gt.id() < numTopologies );
    │ │ │ │ -
    91 return instance().getObject( gt, key );
    │ │ │ │ -
    92 }
    │ │ │ │ -
    94 template< GeometryType::Id geometryId >
    │ │ │ │ -
    95 static auto create ( const Key &key )
    │ │ │ │ -
    96 -> std::enable_if_t< static_cast<GeometryType>(geometryId).dim() == dimension, Object * >
    │ │ │ │ -
    97 {
    │ │ │ │ -
    98 return instance().template getObject< geometryId >( key );
    │ │ │ │ -
    99 }
    │ │ │ │ -
    100
    │ │ │ │ -
    102 template< class Topology >
    │ │ │ │ -
    103 static auto create ( const Key &key )
    │ │ │ │ -
    104 -> std::enable_if_t< Topology::dimension == dimension, Object * >
    │ │ │ │ -
    105 {
    │ │ │ │ -
    106 return instance().template getObject< Topology >( key );
    │ │ │ │ -
    107 }
    │ │ │ │ -
    108
    │ │ │ │ -
    110 static void release ( Object *object )
    │ │ │ │ -
    111 {}
    │ │ │ │ -
    112
    │ │ │ │ -
    113 private:
    │ │ │ │ -
    114 struct ObjectDeleter
    │ │ │ │ -
    115 {
    │ │ │ │ -
    116 void operator() ( Object *ptr ) const { Factory::release( ptr ); }
    │ │ │ │ -
    117 };
    │ │ │ │ -
    118
    │ │ │ │ -
    119 static TopologySingletonFactory &instance ()
    │ │ │ │ -
    120 {
    │ │ │ │ -
    121 static TopologySingletonFactory instance;
    │ │ │ │ -
    122 return instance;
    │ │ │ │ -
    123 }
    │ │ │ │ -
    124
    │ │ │ │ -
    125 static const unsigned int numTopologies = (1 << dimension);
    │ │ │ │ -
    126 typedef std::array< std::unique_ptr< Object, ObjectDeleter >, numTopologies > Array;
    │ │ │ │ -
    127 typedef std::map< Key, Array > Storage;
    │ │ │ │ -
    128
    │ │ │ │ -
    129 TopologySingletonFactory () = default;
    │ │ │ │ -
    130
    │ │ │ │ -
    131 std::unique_ptr< Object, ObjectDeleter > &find ( const unsigned int topologyId, const Key &key )
    │ │ │ │ -
    132 {
    │ │ │ │ -
    133 return storage_[ key ][ topologyId ];
    │ │ │ │ -
    134 }
    │ │ │ │ -
    135
    │ │ │ │ -
    136 Object *getObject ( const Dune::GeometryType &gt, const Key &key )
    │ │ │ │ -
    137 {
    │ │ │ │ -
    138 auto &object = find( gt.id(), key );
    │ │ │ │ -
    139 if( !object )
    │ │ │ │ -
    140 object.reset( Factory::create( gt, key ) );
    │ │ │ │ -
    141 return object.get();
    │ │ │ │ -
    142 }
    │ │ │ │ -
    143
    │ │ │ │ -
    144 template< GeometryType::Id geometryId >
    │ │ │ │ -
    145 Object *getObject ( const Key &key )
    │ │ │ │ -
    146 {
    │ │ │ │ -
    147 static constexpr GeometryType geometry = geometryId;
    │ │ │ │ -
    148 auto &object = find( geometry.id(), key );
    │ │ │ │ -
    149 if( !object )
    │ │ │ │ -
    150 object.reset( Factory::template create< geometry >( key ) );
    │ │ │ │ -
    151 return object.get();
    │ │ │ │ -
    152 }
    │ │ │ │ -
    153
    │ │ │ │ -
    154 template< class Topology >
    │ │ │ │ -
    155 Object *getObject ( const Key &key )
    │ │ │ │ -
    156 {
    │ │ │ │ -
    157 auto &object = find( Topology::id, key );
    │ │ │ │ -
    158 if( !object )
    │ │ │ │ -
    159 object.reset( Factory::template create< Topology >( key ) );
    │ │ │ │ -
    160 return object.get();
    │ │ │ │ -
    161 }
    │ │ │ │ -
    162
    │ │ │ │ -
    163 Storage storage_;
    │ │ │ │ -
    164 };
    │ │ │ │ -
    165
    │ │ │ │ -
    166}
    │ │ │ │ -
    167
    │ │ │ │ -
    168#endif // #ifndef DUNE_GEOMETRY_TOPOLOGYFACTORY_HH
    │ │ │ │ -
    A unique label for each type of element that can occur in a grid.
    │ │ │ │ -
    Helper classes to provide indices for geometrytypes for use in a vector.
    │ │ │ │ +
    75 using ctype = typename Implementation::ctype;
    │ │ │ │ +
    76
    │ │ │ │ + │ │ │ │ +
    79
    │ │ │ │ +
    81 using Coordinate = typename Implementation::Coordinate;
    │ │ │ │ +
    82
    │ │ │ │ +
    84 typedef ctype Volume;
    │ │ │ │ +
    85
    │ │ │ │ +
    87 static constexpr int dimension = Implementation::dimension;
    │ │ │ │ +
    88
    │ │ │ │ +
    89
    │ │ │ │ +
    94 int size(int c) const
    │ │ │ │ +
    95 {
    │ │ │ │ +
    96 return _impl->size(c);
    │ │ │ │ +
    97 }
    │ │ │ │ +
    98
    │ │ │ │ +
    99
    │ │ │ │ +
    111 int size(int i, int c, int cc) const
    │ │ │ │ +
    112 {
    │ │ │ │ +
    113 return _impl->size(i,c,cc);
    │ │ │ │ +
    114 }
    │ │ │ │ +
    115
    │ │ │ │ +
    116
    │ │ │ │ +
    130 int subEntity(int i, int c, int ii, int cc) const
    │ │ │ │ +
    131 {
    │ │ │ │ +
    132 return _impl->subEntity(i,c,ii,cc);
    │ │ │ │ +
    133 }
    │ │ │ │ +
    134
    │ │ │ │ +
    153 auto subEntities ( int i, int c, int cc ) const
    │ │ │ │ +
    154 {
    │ │ │ │ +
    155 return _impl->subEntities(i,c,cc);
    │ │ │ │ +
    156 }
    │ │ │ │ +
    157
    │ │ │ │ +
    158
    │ │ │ │ +
    171 decltype(auto) type(int i, int c) const
    │ │ │ │ +
    172 {
    │ │ │ │ +
    173 return _impl->type(i,c);
    │ │ │ │ +
    174 }
    │ │ │ │ +
    175
    │ │ │ │ +
    176
    │ │ │ │ +
    184 decltype(auto) type() const
    │ │ │ │ +
    185 {
    │ │ │ │ +
    186 return _impl->type();
    │ │ │ │ +
    187 }
    │ │ │ │ +
    188
    │ │ │ │ +
    189
    │ │ │ │ +
    203 decltype(auto) position(int i, int c) const
    │ │ │ │ +
    204 {
    │ │ │ │ +
    205 return _impl->position(i,c);
    │ │ │ │ +
    206 }
    │ │ │ │ +
    207
    │ │ │ │ +
    208
    │ │ │ │ +
    216 bool checkInside(const Coordinate& local) const
    │ │ │ │ +
    217 {
    │ │ │ │ +
    218 return _impl->checkInside(local);
    │ │ │ │ +
    219 }
    │ │ │ │ +
    220
    │ │ │ │ +
    221
    │ │ │ │ +
    233 template<int codim>
    │ │ │ │ +
    234 typename Codim<codim>::Geometry geometry(int i) const
    │ │ │ │ +
    235 {
    │ │ │ │ +
    236 return _impl->template geometry<codim>(i);
    │ │ │ │ +
    237 }
    │ │ │ │ +
    238
    │ │ │ │ +
    239
    │ │ │ │ + │ │ │ │ +
    242 {
    │ │ │ │ +
    243 return _impl->volume();
    │ │ │ │ +
    244 }
    │ │ │ │ +
    245
    │ │ │ │ +
    246
    │ │ │ │ +
    258 decltype(auto) integrationOuterNormal(int face) const
    │ │ │ │ +
    259 {
    │ │ │ │ +
    260 return _impl->integrationOuterNormal(face);
    │ │ │ │ +
    261 }
    │ │ │ │ +
    262
    │ │ │ │ +
    263
    │ │ │ │ + │ │ │ │ +
    272 : _impl(nullptr)
    │ │ │ │ +
    273 {}
    │ │ │ │ +
    274
    │ │ │ │ +
    280 const Implementation& impl() const
    │ │ │ │ +
    281 {
    │ │ │ │ +
    282 return *_impl;
    │ │ │ │ +
    283 }
    │ │ │ │ +
    284
    │ │ │ │ +
    286 bool operator==(const ReferenceElement& r) const
    │ │ │ │ +
    287 {
    │ │ │ │ +
    288 return _impl == r._impl;
    │ │ │ │ +
    289 }
    │ │ │ │ +
    290
    │ │ │ │ +
    292 bool operator!=(const ReferenceElement& r) const
    │ │ │ │ +
    293 {
    │ │ │ │ +
    294 return not (*this == r);
    │ │ │ │ +
    295 }
    │ │ │ │ +
    296
    │ │ │ │ +
    298 friend std::size_t hash_value(const ReferenceElement& r)
    │ │ │ │ +
    299 {
    │ │ │ │ +
    300 return reinterpret_cast<std::size_t>(r._impl);
    │ │ │ │ +
    301 }
    │ │ │ │ +
    302
    │ │ │ │ +
    303 private:
    │ │ │ │ +
    304
    │ │ │ │ +
    305 // The implementation must be a friend to construct a wrapper around itself.
    │ │ │ │ +
    306 friend Implementation;
    │ │ │ │ +
    307
    │ │ │ │ +
    308 // The reference container is a friend to be able to call setImplementation.
    │ │ │ │ +
    309 friend class Impl::ReferenceElementContainer<ctype,dimension>;
    │ │ │ │ +
    310
    │ │ │ │ +
    311 // Constructor for wrapping an implementation reference (required internally by the default implementation)
    │ │ │ │ +
    312 ReferenceElement(const Implementation& impl)
    │ │ │ │ +
    313 : _impl(&impl)
    │ │ │ │ +
    314 {}
    │ │ │ │ +
    315
    │ │ │ │ +
    316 void setImplementation(const Implementation& impl)
    │ │ │ │ +
    317 {
    │ │ │ │ +
    318 _impl = &impl;
    │ │ │ │ +
    319 }
    │ │ │ │ +
    320
    │ │ │ │ +
    321 const Implementation* _impl;
    │ │ │ │ +
    322
    │ │ │ │ +
    323 };
    │ │ │ │ +
    324
    │ │ │ │ +
    325 }
    │ │ │ │ +
    326
    │ │ │ │ +
    327}
    │ │ │ │ +
    328
    │ │ │ │ +
    329
    │ │ │ │ +
    330#endif // DUNE_GEOMETRY_REFERENCEELEMENT_HH
    │ │ │ │ +
    A unique label for each type of element that can occur in a grid.
    │ │ │ │
    Definition: affinegeometry.hh:21
    │ │ │ │ -
    Provide a factory over the generic topologies.
    Definition: topologyfactory.hh:42
    │ │ │ │ -
    Traits::Factory Factory
    Definition: topologyfactory.hh:47
    │ │ │ │ -
    static Object * create(const Dune::GeometryType &gt, const Key &key)
    dynamically create objects
    Definition: topologyfactory.hh:50
    │ │ │ │ -
    static const unsigned int dimension
    Definition: topologyfactory.hh:44
    │ │ │ │ -
    static Object * create(const Key &key)
    statically create objects
    Definition: topologyfactory.hh:58
    │ │ │ │ -
    static void release(Object *object)
    release the object returned by the create methods
    Definition: topologyfactory.hh:71
    │ │ │ │ -
    Traits::Key Key
    Definition: topologyfactory.hh:45
    │ │ │ │ -
    Traits::Object Object
    Definition: topologyfactory.hh:46
    │ │ │ │ -
    A wrapper for a TopologyFactory providing singleton storage. Same usage as TopologyFactory but with e...
    Definition: topologyfactory.hh:82
    │ │ │ │ -
    static auto create(const Key &key) -> std::enable_if_t< Topology::dimension==dimension, Object * >
    statically create objects
    Definition: topologyfactory.hh:103
    │ │ │ │ -
    static Object * create(const Dune::GeometryType &gt, const Key &key)
    dynamically create objects
    Definition: topologyfactory.hh:88
    │ │ │ │ -
    static void release(Object *object)
    release the object returned by the create methods
    Definition: topologyfactory.hh:110
    │ │ │ │ -
    const Factory::Object Object
    Definition: topologyfactory.hh:85
    │ │ │ │ -
    Factory::Key Key
    Definition: topologyfactory.hh:84
    │ │ │ │ -
    static auto create(const Key &key) -> std::enable_if_t< static_cast< GeometryType >(geometryId).dim()==dimension, Object * >
    statically create objects
    Definition: topologyfactory.hh:95
    │ │ │ │ -
    static const unsigned int dimension
    Definition: topologyfactory.hh:83
    │ │ │ │ -
    Unique label for each type of entities that can occur in DUNE grids.
    Definition: type.hh:125
    │ │ │ │ -
    constexpr unsigned int id() const
    Return the topology id of the type.
    Definition: type.hh:376
    │ │ │ │ +
    This class provides access to geometric and topological properties of a reference element.
    Definition: referenceelement.hh:52
    │ │ │ │ +
    CoordinateField volume() const
    obtain the volume of the reference element
    Definition: referenceelement.hh:241
    │ │ │ │ +
    ReferenceElement()
    Constructs an empty reference element.
    Definition: referenceelement.hh:271
    │ │ │ │ +
    bool operator!=(const ReferenceElement &r) const
    Compares for inequality with another reference element.
    Definition: referenceelement.hh:292
    │ │ │ │ +
    decltype(auto) type(int i, int c) const
    obtain the type of subentity (i,c)
    Definition: referenceelement.hh:171
    │ │ │ │ +
    typename Implementation::Coordinate Coordinate
    The coordinate type.
    Definition: referenceelement.hh:81
    │ │ │ │ +
    Codim< codim >::Geometry geometry(int i) const
    obtain the embedding of subentity (i,codim) into the reference element
    Definition: referenceelement.hh:234
    │ │ │ │ +
    static constexpr int dimension
    The dimension of the reference element.
    Definition: referenceelement.hh:87
    │ │ │ │ +
    int size(int i, int c, int cc) const
    number of subentities of codimension cc of subentity (i,c)
    Definition: referenceelement.hh:111
    │ │ │ │ +
    int subEntity(int i, int c, int ii, int cc) const
    obtain number of ii-th subentity with codim cc of (i,c)
    Definition: referenceelement.hh:130
    │ │ │ │ +
    typename Implementation::ctype ctype
    The coordinate field type.
    Definition: referenceelement.hh:75
    │ │ │ │ +
    int size(int c) const
    number of subentities of codimension c
    Definition: referenceelement.hh:94
    │ │ │ │ +
    decltype(auto) type() const
    obtain the type of this reference element
    Definition: referenceelement.hh:184
    │ │ │ │ +
    const Implementation & impl() const
    Returns a reference to the internal implementation object.
    Definition: referenceelement.hh:280
    │ │ │ │ +
    bool checkInside(const Coordinate &local) const
    check if a coordinate is in the reference element
    Definition: referenceelement.hh:216
    │ │ │ │ +
    ctype CoordinateField
    The coordinate field type.
    Definition: referenceelement.hh:78
    │ │ │ │ +
    bool operator==(const ReferenceElement &r) const
    Compares for equality with another reference element.
    Definition: referenceelement.hh:286
    │ │ │ │ +
    decltype(auto) position(int i, int c) const
    position of the barycenter of entity (i,c)
    Definition: referenceelement.hh:203
    │ │ │ │ +
    decltype(auto) integrationOuterNormal(int face) const
    obtain the integration outer normal of the reference element
    Definition: referenceelement.hh:258
    │ │ │ │ +
    friend std::size_t hash_value(const ReferenceElement &r)
    Yields a hash value suitable for storing the reference element a in hash table.
    Definition: referenceelement.hh:298
    │ │ │ │ +
    auto subEntities(int i, int c, int cc) const
    Obtain the range of numbers of subentities with codim cc of (i,c)
    Definition: referenceelement.hh:153
    │ │ │ │ +
    ctype Volume
    Type used for volume.
    Definition: referenceelement.hh:84
    │ │ │ │ +
    Collection of types depending on the codimension.
    Definition: referenceelement.hh:67
    │ │ │ │ +
    implementation-defined Geometry
    type of geometry embedding a subentity into the reference element
    Definition: referenceelement.hh:69
    │ │ │ │
    │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,225 +4,296 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-geometry 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * geometry │ │ │ │ │ -topologyfactory.hh │ │ │ │ │ +referenceelement.hh │ │ │ │ │ Go_to_the_documentation_of_this_file. │ │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ - 5#ifndef DUNE_GEOMETRY_TOPOLOGYFACTORY_HH │ │ │ │ │ - 6#define DUNE_GEOMETRY_TOPOLOGYFACTORY_HH │ │ │ │ │ + 5#ifndef DUNE_GEOMETRY_REFERENCEELEMENT_HH │ │ │ │ │ + 6#define DUNE_GEOMETRY_REFERENCEELEMENT_HH │ │ │ │ │ 7 │ │ │ │ │ - 8#include │ │ │ │ │ + 8#include │ │ │ │ │ 9 │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ - 13#include │ │ │ │ │ - 14#include │ │ │ │ │ - 15 │ │ │ │ │ - 16#include │ │ │ │ │ - 17#include │ │ │ │ │ + 10namespace Dune { │ │ │ │ │ + 11 namespace Geo { │ │ │ │ │ + 12 │ │ │ │ │ + 13 namespace Impl { │ │ │ │ │ + 14 │ │ │ │ │ + 15 // forward declaration for friend declaration │ │ │ │ │ + 16 template │ │ │ │ │ + 17 class ReferenceElementContainer; │ │ │ │ │ 18 │ │ │ │ │ - 19namespace Dune │ │ │ │ │ - 20{ │ │ │ │ │ - 21 │ │ │ │ │ - 40 template │ │ │ │ │ -41 struct TopologyFactory │ │ │ │ │ - 42 { │ │ │ │ │ - 43 // extract types from Traits class │ │ │ │ │ -44 static const unsigned int dimension = Traits::dimension; │ │ │ │ │ -45 typedef typename Traits::Key Key; │ │ │ │ │ -46 typedef typename Traits::Object Object; │ │ │ │ │ -47 typedef typename Traits::Factory Factory; │ │ │ │ │ - 48 │ │ │ │ │ -50 static Object *create ( const Dune::GeometryType >, const Key &key ) │ │ │ │ │ - 51 { │ │ │ │ │ - 52 return Impl::toGeometryTypeIdConstant(gt, [&](auto id) { │ │ │ │ │ - 53 return create(key); │ │ │ │ │ - 54 }); │ │ │ │ │ - 55 } │ │ │ │ │ - 57 template< GeometryType::Id geometryId > │ │ │ │ │ -58 static Object *create ( const Key &key ) │ │ │ │ │ - 59 { │ │ │ │ │ - 60 return Factory::template createObject< geometryId >( key ); │ │ │ │ │ - 61 } │ │ │ │ │ - 62 │ │ │ │ │ - 64 template< class Topology > │ │ │ │ │ -65 static Object *create ( const Key &key ) │ │ │ │ │ - 66 { │ │ │ │ │ - 67 return Factory::template createObject< Topology >( key ); │ │ │ │ │ - 68 } │ │ │ │ │ - 69 │ │ │ │ │ -71 static void release( Object *object ) { delete object; } │ │ │ │ │ - 72 }; │ │ │ │ │ + 19 } │ │ │ │ │ + 20 │ │ │ │ │ + 21 // forward declaration for constructing default reference element type │ │ │ │ │ + 22 template │ │ │ │ │ + 23 class ReferenceElementImplementation; │ │ │ │ │ + 24 │ │ │ │ │ + 25 // forward declaration for backwards compatibility conversion │ │ │ │ │ + 26 template │ │ │ │ │ + 27 struct ReferenceElements; │ │ │ │ │ + 28 │ │ │ │ │ + 29 // ReferenceElement │ │ │ │ │ + 30 // ---------------- │ │ │ │ │ + 31 │ │ │ │ │ + 50 template │ │ │ │ │ +51 class ReferenceElement │ │ │ │ │ + 52 { │ │ │ │ │ + 53 │ │ │ │ │ + 54 public: │ │ │ │ │ + 55 │ │ │ │ │ + 56#ifndef DOXYGEN │ │ │ │ │ + 57 │ │ │ │ │ + 59 template │ │ │ │ │ + 60 using Codim = typename Implementation::template Codim; │ │ │ │ │ + 61 │ │ │ │ │ + 62#else │ │ │ │ │ + 63 │ │ │ │ │ + 65 template< int codim > │ │ │ │ │ +66 struct Codim │ │ │ │ │ + 67 { │ │ │ │ │ +69 using Geometry = implementation-defined; │ │ │ │ │ + 70 }; │ │ │ │ │ + 71 │ │ │ │ │ + 72#endif // DOXYGEN │ │ │ │ │ 73 │ │ │ │ │ - 74 │ │ │ │ │ - 75 │ │ │ │ │ - 80 template │ │ │ │ │ -81 struct TopologySingletonFactory │ │ │ │ │ - 82 { │ │ │ │ │ -83 static const unsigned int dimension = Factory::dimension; │ │ │ │ │ -84 typedef typename Factory::Key Key; │ │ │ │ │ -85 typedef const typename Factory::Object Object; │ │ │ │ │ - 86 │ │ │ │ │ -88 static Object *create ( const Dune::GeometryType >, const Key &key ) │ │ │ │ │ - 89 { │ │ │ │ │ - 90 assert( gt.id() < numTopologies ); │ │ │ │ │ - 91 return instance().getObject( gt, key ); │ │ │ │ │ - 92 } │ │ │ │ │ - 94 template< GeometryType::Id geometryId > │ │ │ │ │ -95 static auto create ( const Key &key ) │ │ │ │ │ - 96 -> std::enable_if_t< static_cast(geometryId).dim() == │ │ │ │ │ -dimension, Object * > │ │ │ │ │ - 97 { │ │ │ │ │ - 98 return instance().template getObject< geometryId >( key ); │ │ │ │ │ - 99 } │ │ │ │ │ - 100 │ │ │ │ │ - 102 template< class Topology > │ │ │ │ │ -103 static auto create ( const Key &key ) │ │ │ │ │ - 104 -> std::enable_if_t< Topology::dimension == dimension, Object * > │ │ │ │ │ - 105 { │ │ │ │ │ - 106 return instance().template getObject< Topology >( key ); │ │ │ │ │ - 107 } │ │ │ │ │ - 108 │ │ │ │ │ -110 static void release ( Object *object ) │ │ │ │ │ - 111 {} │ │ │ │ │ - 112 │ │ │ │ │ - 113 private: │ │ │ │ │ - 114 struct ObjectDeleter │ │ │ │ │ - 115 { │ │ │ │ │ - 116 void operator() ( Object *ptr ) const { Factory::release( ptr ); } │ │ │ │ │ - 117 }; │ │ │ │ │ - 118 │ │ │ │ │ - 119 static TopologySingletonFactory &instance () │ │ │ │ │ - 120 { │ │ │ │ │ - 121 static TopologySingletonFactory instance; │ │ │ │ │ - 122 return instance; │ │ │ │ │ - 123 } │ │ │ │ │ - 124 │ │ │ │ │ - 125 static const unsigned int numTopologies = (1 << dimension); │ │ │ │ │ - 126 typedef std::array< std::unique_ptr< Object, ObjectDeleter >, │ │ │ │ │ -numTopologies > Array; │ │ │ │ │ - 127 typedef std::map< Key, Array > Storage; │ │ │ │ │ - 128 │ │ │ │ │ - 129 TopologySingletonFactory () = default; │ │ │ │ │ - 130 │ │ │ │ │ - 131 std::unique_ptr< Object, ObjectDeleter > &find ( const unsigned int │ │ │ │ │ -topologyId, const Key &key ) │ │ │ │ │ - 132 { │ │ │ │ │ - 133 return storage_[ key ][ topologyId ]; │ │ │ │ │ - 134 } │ │ │ │ │ - 135 │ │ │ │ │ - 136 Object *getObject ( const Dune::GeometryType >, const Key &key ) │ │ │ │ │ - 137 { │ │ │ │ │ - 138 auto &object = find( gt.id(), key ); │ │ │ │ │ - 139 if( !object ) │ │ │ │ │ - 140 object.reset( Factory::create( gt, key ) ); │ │ │ │ │ - 141 return object.get(); │ │ │ │ │ - 142 } │ │ │ │ │ - 143 │ │ │ │ │ - 144 template< GeometryType::Id geometryId > │ │ │ │ │ - 145 Object *getObject ( const Key &key ) │ │ │ │ │ - 146 { │ │ │ │ │ - 147 static constexpr GeometryType geometry = geometryId; │ │ │ │ │ - 148 auto &object = find( geometry.id(), key ); │ │ │ │ │ - 149 if( !object ) │ │ │ │ │ - 150 object.reset( Factory::template create< geometry >( key ) ); │ │ │ │ │ - 151 return object.get(); │ │ │ │ │ - 152 } │ │ │ │ │ - 153 │ │ │ │ │ - 154 template< class Topology > │ │ │ │ │ - 155 Object *getObject ( const Key &key ) │ │ │ │ │ - 156 { │ │ │ │ │ - 157 auto &object = find( Topology::id, key ); │ │ │ │ │ - 158 if( !object ) │ │ │ │ │ - 159 object.reset( Factory::template create< Topology >( key ) ); │ │ │ │ │ - 160 return object.get(); │ │ │ │ │ - 161 } │ │ │ │ │ - 162 │ │ │ │ │ - 163 Storage storage_; │ │ │ │ │ - 164 }; │ │ │ │ │ - 165 │ │ │ │ │ - 166} │ │ │ │ │ - 167 │ │ │ │ │ - 168#endif // #ifndef DUNE_GEOMETRY_TOPOLOGYFACTORY_HH │ │ │ │ │ +75 using ctype = typename Implementation::ctype; │ │ │ │ │ + 76 │ │ │ │ │ +78 using CoordinateField = ctype; │ │ │ │ │ + 79 │ │ │ │ │ +81 using Coordinate = typename Implementation::Coordinate; │ │ │ │ │ + 82 │ │ │ │ │ +84 typedef ctype Volume; │ │ │ │ │ + 85 │ │ │ │ │ +87 static constexpr int dimension = Implementation::dimension; │ │ │ │ │ + 88 │ │ │ │ │ + 89 │ │ │ │ │ +94 int size(int c) const │ │ │ │ │ + 95 { │ │ │ │ │ + 96 return _impl->size(c); │ │ │ │ │ + 97 } │ │ │ │ │ + 98 │ │ │ │ │ + 99 │ │ │ │ │ +111 int size(int i, int c, int cc) const │ │ │ │ │ + 112 { │ │ │ │ │ + 113 return _impl->size(i,c,cc); │ │ │ │ │ + 114 } │ │ │ │ │ + 115 │ │ │ │ │ + 116 │ │ │ │ │ +130 int subEntity(int i, int c, int ii, int cc) const │ │ │ │ │ + 131 { │ │ │ │ │ + 132 return _impl->subEntity(i,c,ii,cc); │ │ │ │ │ + 133 } │ │ │ │ │ + 134 │ │ │ │ │ +153 auto subEntities ( int i, int c, int cc ) const │ │ │ │ │ + 154 { │ │ │ │ │ + 155 return _impl->subEntities(i,c,cc); │ │ │ │ │ + 156 } │ │ │ │ │ + 157 │ │ │ │ │ + 158 │ │ │ │ │ +171 decltype(auto) type(int i, int c) const │ │ │ │ │ + 172 { │ │ │ │ │ + 173 return _impl->type(i,c); │ │ │ │ │ + 174 } │ │ │ │ │ + 175 │ │ │ │ │ + 176 │ │ │ │ │ +184 decltype(auto) type() const │ │ │ │ │ + 185 { │ │ │ │ │ + 186 return _impl->type(); │ │ │ │ │ + 187 } │ │ │ │ │ + 188 │ │ │ │ │ + 189 │ │ │ │ │ +203 decltype(auto) position(int i, int c) const │ │ │ │ │ + 204 { │ │ │ │ │ + 205 return _impl->position(i,c); │ │ │ │ │ + 206 } │ │ │ │ │ + 207 │ │ │ │ │ + 208 │ │ │ │ │ +216 bool checkInside(const Coordinate& local) const │ │ │ │ │ + 217 { │ │ │ │ │ + 218 return _impl->checkInside(local); │ │ │ │ │ + 219 } │ │ │ │ │ + 220 │ │ │ │ │ + 221 │ │ │ │ │ + 233 template │ │ │ │ │ +234 typename Codim::Geometry geometry(int i) const │ │ │ │ │ + 235 { │ │ │ │ │ + 236 return _impl->template geometry(i); │ │ │ │ │ + 237 } │ │ │ │ │ + 238 │ │ │ │ │ + 239 │ │ │ │ │ +241 CoordinateField volume() const │ │ │ │ │ + 242 { │ │ │ │ │ + 243 return _impl->volume(); │ │ │ │ │ + 244 } │ │ │ │ │ + 245 │ │ │ │ │ + 246 │ │ │ │ │ +258 decltype(auto) integrationOuterNormal(int face) const │ │ │ │ │ + 259 { │ │ │ │ │ + 260 return _impl->integrationOuterNormal(face); │ │ │ │ │ + 261 } │ │ │ │ │ + 262 │ │ │ │ │ + 263 │ │ │ │ │ +271 ReferenceElement() │ │ │ │ │ + 272 : _impl(nullptr) │ │ │ │ │ + 273 {} │ │ │ │ │ + 274 │ │ │ │ │ +280 const Implementation& impl() const │ │ │ │ │ + 281 { │ │ │ │ │ + 282 return *_impl; │ │ │ │ │ + 283 } │ │ │ │ │ + 284 │ │ │ │ │ +286 bool operator==(const ReferenceElement& r) const │ │ │ │ │ + 287 { │ │ │ │ │ + 288 return _impl == r._impl; │ │ │ │ │ + 289 } │ │ │ │ │ + 290 │ │ │ │ │ +292 bool operator!=(const ReferenceElement& r) const │ │ │ │ │ + 293 { │ │ │ │ │ + 294 return not (*this == r); │ │ │ │ │ + 295 } │ │ │ │ │ + 296 │ │ │ │ │ +298 friend std::size_t hash_value(const ReferenceElement& r) │ │ │ │ │ + 299 { │ │ │ │ │ + 300 return reinterpret_cast(r._impl); │ │ │ │ │ + 301 } │ │ │ │ │ + 302 │ │ │ │ │ + 303 private: │ │ │ │ │ + 304 │ │ │ │ │ + 305 // The implementation must be a friend to construct a wrapper around │ │ │ │ │ +itself. │ │ │ │ │ + 306 friend Implementation; │ │ │ │ │ + 307 │ │ │ │ │ + 308 // The reference container is a friend to be able to call │ │ │ │ │ +setImplementation. │ │ │ │ │ + 309 friend class Impl::ReferenceElementContainer; │ │ │ │ │ + 310 │ │ │ │ │ + 311 // Constructor for wrapping an implementation reference (required │ │ │ │ │ +internally by the default implementation) │ │ │ │ │ + 312 ReferenceElement(const Implementation& impl) │ │ │ │ │ + 313 : _impl(&impl) │ │ │ │ │ + 314 {} │ │ │ │ │ + 315 │ │ │ │ │ + 316 void setImplementation(const Implementation& impl) │ │ │ │ │ + 317 { │ │ │ │ │ + 318 _impl = &impl; │ │ │ │ │ + 319 } │ │ │ │ │ + 320 │ │ │ │ │ + 321 const Implementation* _impl; │ │ │ │ │ + 322 │ │ │ │ │ + 323 }; │ │ │ │ │ + 324 │ │ │ │ │ + 325 } │ │ │ │ │ + 326 │ │ │ │ │ + 327} │ │ │ │ │ + 328 │ │ │ │ │ + 329 │ │ │ │ │ + 330#endif // DUNE_GEOMETRY_REFERENCEELEMENT_HH │ │ │ │ │ type.hh │ │ │ │ │ A unique label for each type of element that can occur in a grid. │ │ │ │ │ -typeindex.hh │ │ │ │ │ -Helper classes to provide indices for geometrytypes for use in a vector. │ │ │ │ │ Dune │ │ │ │ │ Definition: affinegeometry.hh:21 │ │ │ │ │ -Dune::TopologyFactory │ │ │ │ │ -Provide a factory over the generic topologies. │ │ │ │ │ -Definition: topologyfactory.hh:42 │ │ │ │ │ -Dune::TopologyFactory::Factory │ │ │ │ │ -Traits::Factory Factory │ │ │ │ │ -Definition: topologyfactory.hh:47 │ │ │ │ │ -Dune::TopologyFactory::create │ │ │ │ │ -static Object * create(const Dune::GeometryType >, const Key &key) │ │ │ │ │ -dynamically create objects │ │ │ │ │ -Definition: topologyfactory.hh:50 │ │ │ │ │ -Dune::TopologyFactory::dimension │ │ │ │ │ -static const unsigned int dimension │ │ │ │ │ -Definition: topologyfactory.hh:44 │ │ │ │ │ -Dune::TopologyFactory::create │ │ │ │ │ -static Object * create(const Key &key) │ │ │ │ │ -statically create objects │ │ │ │ │ -Definition: topologyfactory.hh:58 │ │ │ │ │ -Dune::TopologyFactory::release │ │ │ │ │ -static void release(Object *object) │ │ │ │ │ -release the object returned by the create methods │ │ │ │ │ -Definition: topologyfactory.hh:71 │ │ │ │ │ -Dune::TopologyFactory::Key │ │ │ │ │ -Traits::Key Key │ │ │ │ │ -Definition: topologyfactory.hh:45 │ │ │ │ │ -Dune::TopologyFactory::Object │ │ │ │ │ -Traits::Object Object │ │ │ │ │ -Definition: topologyfactory.hh:46 │ │ │ │ │ -Dune::TopologySingletonFactory │ │ │ │ │ -A wrapper for a TopologyFactory providing singleton storage. Same usage as │ │ │ │ │ -TopologyFactory but with e... │ │ │ │ │ -Definition: topologyfactory.hh:82 │ │ │ │ │ -Dune::TopologySingletonFactory::create │ │ │ │ │ -static auto create(const Key &key) -> std::enable_if_t< Topology:: │ │ │ │ │ -dimension==dimension, Object * > │ │ │ │ │ -statically create objects │ │ │ │ │ -Definition: topologyfactory.hh:103 │ │ │ │ │ -Dune::TopologySingletonFactory::create │ │ │ │ │ -static Object * create(const Dune::GeometryType >, const Key &key) │ │ │ │ │ -dynamically create objects │ │ │ │ │ -Definition: topologyfactory.hh:88 │ │ │ │ │ -Dune::TopologySingletonFactory::release │ │ │ │ │ -static void release(Object *object) │ │ │ │ │ -release the object returned by the create methods │ │ │ │ │ -Definition: topologyfactory.hh:110 │ │ │ │ │ -Dune::TopologySingletonFactory::Object │ │ │ │ │ -const Factory::Object Object │ │ │ │ │ -Definition: topologyfactory.hh:85 │ │ │ │ │ -Dune::TopologySingletonFactory::Key │ │ │ │ │ -Factory::Key Key │ │ │ │ │ -Definition: topologyfactory.hh:84 │ │ │ │ │ -Dune::TopologySingletonFactory::create │ │ │ │ │ -static auto create(const Key &key) -> std::enable_if_t< static_cast< │ │ │ │ │ -GeometryType >(geometryId).dim()==dimension, Object * > │ │ │ │ │ -statically create objects │ │ │ │ │ -Definition: topologyfactory.hh:95 │ │ │ │ │ -Dune::TopologySingletonFactory::dimension │ │ │ │ │ -static const unsigned int dimension │ │ │ │ │ -Definition: topologyfactory.hh:83 │ │ │ │ │ -Dune::GeometryType │ │ │ │ │ -Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ -Definition: type.hh:125 │ │ │ │ │ -Dune::GeometryType::id │ │ │ │ │ -constexpr unsigned int id() const │ │ │ │ │ -Return the topology id of the type. │ │ │ │ │ -Definition: type.hh:376 │ │ │ │ │ +Dune::Geo::ReferenceElement │ │ │ │ │ +This class provides access to geometric and topological properties of a │ │ │ │ │ +reference element. │ │ │ │ │ +Definition: referenceelement.hh:52 │ │ │ │ │ +Dune::Geo::ReferenceElement::volume │ │ │ │ │ +CoordinateField volume() const │ │ │ │ │ +obtain the volume of the reference element │ │ │ │ │ +Definition: referenceelement.hh:241 │ │ │ │ │ +Dune::Geo::ReferenceElement::ReferenceElement │ │ │ │ │ +ReferenceElement() │ │ │ │ │ +Constructs an empty reference element. │ │ │ │ │ +Definition: referenceelement.hh:271 │ │ │ │ │ +Dune::Geo::ReferenceElement::operator!= │ │ │ │ │ +bool operator!=(const ReferenceElement &r) const │ │ │ │ │ +Compares for inequality with another reference element. │ │ │ │ │ +Definition: referenceelement.hh:292 │ │ │ │ │ +Dune::Geo::ReferenceElement::type │ │ │ │ │ +decltype(auto) type(int i, int c) const │ │ │ │ │ +obtain the type of subentity (i,c) │ │ │ │ │ +Definition: referenceelement.hh:171 │ │ │ │ │ +Dune::Geo::ReferenceElement::Coordinate │ │ │ │ │ +typename Implementation::Coordinate Coordinate │ │ │ │ │ +The coordinate type. │ │ │ │ │ +Definition: referenceelement.hh:81 │ │ │ │ │ +Dune::Geo::ReferenceElement::geometry │ │ │ │ │ +Codim< codim >::Geometry geometry(int i) const │ │ │ │ │ +obtain the embedding of subentity (i,codim) into the reference element │ │ │ │ │ +Definition: referenceelement.hh:234 │ │ │ │ │ +Dune::Geo::ReferenceElement::dimension │ │ │ │ │ +static constexpr int dimension │ │ │ │ │ +The dimension of the reference element. │ │ │ │ │ +Definition: referenceelement.hh:87 │ │ │ │ │ +Dune::Geo::ReferenceElement::size │ │ │ │ │ +int size(int i, int c, int cc) const │ │ │ │ │ +number of subentities of codimension cc of subentity (i,c) │ │ │ │ │ +Definition: referenceelement.hh:111 │ │ │ │ │ +Dune::Geo::ReferenceElement::subEntity │ │ │ │ │ +int subEntity(int i, int c, int ii, int cc) const │ │ │ │ │ +obtain number of ii-th subentity with codim cc of (i,c) │ │ │ │ │ +Definition: referenceelement.hh:130 │ │ │ │ │ +Dune::Geo::ReferenceElement::ctype │ │ │ │ │ +typename Implementation::ctype ctype │ │ │ │ │ +The coordinate field type. │ │ │ │ │ +Definition: referenceelement.hh:75 │ │ │ │ │ +Dune::Geo::ReferenceElement::size │ │ │ │ │ +int size(int c) const │ │ │ │ │ +number of subentities of codimension c │ │ │ │ │ +Definition: referenceelement.hh:94 │ │ │ │ │ +Dune::Geo::ReferenceElement::type │ │ │ │ │ +decltype(auto) type() const │ │ │ │ │ +obtain the type of this reference element │ │ │ │ │ +Definition: referenceelement.hh:184 │ │ │ │ │ +Dune::Geo::ReferenceElement::impl │ │ │ │ │ +const Implementation & impl() const │ │ │ │ │ +Returns a reference to the internal implementation object. │ │ │ │ │ +Definition: referenceelement.hh:280 │ │ │ │ │ +Dune::Geo::ReferenceElement::checkInside │ │ │ │ │ +bool checkInside(const Coordinate &local) const │ │ │ │ │ +check if a coordinate is in the reference element │ │ │ │ │ +Definition: referenceelement.hh:216 │ │ │ │ │ +Dune::Geo::ReferenceElement::CoordinateField │ │ │ │ │ +ctype CoordinateField │ │ │ │ │ +The coordinate field type. │ │ │ │ │ +Definition: referenceelement.hh:78 │ │ │ │ │ +Dune::Geo::ReferenceElement::operator== │ │ │ │ │ +bool operator==(const ReferenceElement &r) const │ │ │ │ │ +Compares for equality with another reference element. │ │ │ │ │ +Definition: referenceelement.hh:286 │ │ │ │ │ +Dune::Geo::ReferenceElement::position │ │ │ │ │ +decltype(auto) position(int i, int c) const │ │ │ │ │ +position of the barycenter of entity (i,c) │ │ │ │ │ +Definition: referenceelement.hh:203 │ │ │ │ │ +Dune::Geo::ReferenceElement::integrationOuterNormal │ │ │ │ │ +decltype(auto) integrationOuterNormal(int face) const │ │ │ │ │ +obtain the integration outer normal of the reference element │ │ │ │ │ +Definition: referenceelement.hh:258 │ │ │ │ │ +Dune::Geo::ReferenceElement::hash_value │ │ │ │ │ +friend std::size_t hash_value(const ReferenceElement &r) │ │ │ │ │ +Yields a hash value suitable for storing the reference element a in hash table. │ │ │ │ │ +Definition: referenceelement.hh:298 │ │ │ │ │ +Dune::Geo::ReferenceElement::subEntities │ │ │ │ │ +auto subEntities(int i, int c, int cc) const │ │ │ │ │ +Obtain the range of numbers of subentities with codim cc of (i,c) │ │ │ │ │ +Definition: referenceelement.hh:153 │ │ │ │ │ +Dune::Geo::ReferenceElement::Volume │ │ │ │ │ +ctype Volume │ │ │ │ │ +Type used for volume. │ │ │ │ │ +Definition: referenceelement.hh:84 │ │ │ │ │ +Dune::Geo::ReferenceElement::Codim │ │ │ │ │ +Collection of types depending on the codimension. │ │ │ │ │ +Definition: referenceelement.hh:67 │ │ │ │ │ +Dune::Geo::ReferenceElement::Codim::Geometry │ │ │ │ │ +implementation-defined Geometry │ │ │ │ │ +type of geometry embedding a subentity into the reference element │ │ │ │ │ +Definition: referenceelement.hh:69 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4