--- /srv/reproducible-results/rbuild-debian/r-b-build.DghCx348/b1/dune-geometry_2.10.0-1_armhf.changes +++ /srv/reproducible-results/rbuild-debian/r-b-build.DghCx348/b2/dune-geometry_2.10.0-1_armhf.changes ├── Files │ @@ -1,4 +1,4 @@ │ │ 42f73487d46a70fc4c3da6bc9ad8667f 378364 debug optional libdune-geometry-dev-dbgsym_2.10.0-1_armhf.deb │ 7124a1664e5e2b3f7d687e3a978d41df 279952 libdevel optional libdune-geometry-dev_2.10.0-1_armhf.deb │ - cc779194adff4134b0ec3f1582240f6c 1570616 doc optional libdune-geometry-doc_2.10.0-1_all.deb │ + fa7282f6c758116a2c789d5e4f977824 1570780 doc optional libdune-geometry-doc_2.10.0-1_all.deb ├── libdune-geometry-doc_2.10.0-1_all.deb │ ├── file list │ │ @@ -1,3 +1,3 @@ │ │ -rw-r--r-- 0 0 0 4 2024-11-14 18:01:13.000000 debian-binary │ │ --rw-r--r-- 0 0 0 16600 2024-11-14 18:01:13.000000 control.tar.xz │ │ --rw-r--r-- 0 0 0 1553824 2024-11-14 18:01:13.000000 data.tar.xz │ │ +-rw-r--r-- 0 0 0 16428 2024-11-14 18:01:13.000000 control.tar.xz │ │ +-rw-r--r-- 0 0 0 1554160 2024-11-14 18:01:13.000000 data.tar.xz │ ├── control.tar.xz │ │ ├── control.tar │ │ │ ├── ./md5sums │ │ │ │ ├── ./md5sums │ │ │ │ │┄ Files differ │ │ │ │ ├── line order │ │ │ │ │ @@ -8,25 +8,24 @@ │ │ │ │ │ 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/a00038.html │ │ │ │ │ +usr/share/doc/libdune-geometry-doc/doxygen/a00008.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 │ │ │ │ │ @@ -52,14 +51,15 @@ │ │ │ │ │ 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/a00233_source.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/a00239_source.html │ │ │ │ │ usr/share/doc/libdune-geometry-doc/doxygen/a00242.html │ ├── data.tar.xz │ │ ├── data.tar │ │ │ ├── file list │ │ │ │ @@ -16,70 +16,70 @@ │ │ │ │ -rw-r--r-- 0 root (0) root (0) 29836 2024-09-05 07:06:07.000000 ./usr/share/doc/libdune-geometry-doc/appl/refelements/gg_tetrahedron.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 22586 2024-09-05 07:06:07.000000 ./usr/share/doc/libdune-geometry-doc/appl/refelements/gg_tetrahedron_edges.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 6480 2024-09-05 07:06:07.000000 ./usr/share/doc/libdune-geometry-doc/appl/refelements/gg_triangle.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 973 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/changelog.Debian.gz │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3700 2024-09-05 07:06:07.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 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/ │ │ │ │ --rw-r--r-- 0 root (0) root (0) 3074 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00038.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 3074 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00008.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3048 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00164.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3046 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00167.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 11782 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00170.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 156304 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00170_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4113 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00173.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7061 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00173_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4602 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00176.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 18310 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00176_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5104 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00179.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 12686 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00179_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9462 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00182.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 85721 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00182_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7472 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00185.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 64525 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00185_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5861 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00188.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 36533 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00188_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6689 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00191.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 35005 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00191_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4509 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00194.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8118 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00194_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7239 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00197.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 29450 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00197_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10072 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00200.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 51406 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00200_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7985 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00203.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 171804 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00203_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9691 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00206.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 96970 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00206_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10133 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00209.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 86387 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00209_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 12980 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00212.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 110071 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00212_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10327 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00215.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 99412 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00215_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10617 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00218.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 34668 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00218_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10292 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00221.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 99117 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00221_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5393 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00224.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 68218 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00224_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 14826 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00227.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 96037 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00227_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4306 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00230.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5566 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00233.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 120510 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00233_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6695 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00236.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 83430 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00236_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5298 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00239.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 112794 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00239_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5591 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00242.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 45001 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00242_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5095 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00245.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9366 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00245_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5670 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00248.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 29348 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00248_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4509 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00170.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8118 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00170_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9462 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00173.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 85721 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00173_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6689 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00176.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 35005 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00176_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4306 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00179.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5393 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00182.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 68218 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00182_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7239 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00185.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 29450 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00185_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10133 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00188.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 86387 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00188_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10292 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00191.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 99117 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00191_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10617 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00194.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 34668 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00194_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 12980 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00197.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 110071 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00197_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9691 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00200.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 96970 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00200_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10327 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00203.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 99412 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00203_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5591 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00206.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 45001 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00206_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 11782 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00209.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 156304 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00209_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6695 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00212.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 83430 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00212_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7472 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00215.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 64525 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00215_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5298 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00218.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 112794 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00218_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5095 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00221.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9366 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00221_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 14826 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00224.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 96037 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00224_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4602 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00227.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 18310 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00227_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4113 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00230.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7061 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00230_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5104 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00233.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 12686 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00233_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5861 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00236.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 36533 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00236_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7985 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00239.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 171804 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00239_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10072 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00242.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 51406 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00242_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5670 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00245.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 29348 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00245_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5566 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00248.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 120510 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00248_source.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 5067 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00252.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 11280 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00252.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 5015 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00253.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3926 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00253.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 57623 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00254.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3734 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00254.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3474 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/a00255.html │ │ │ │ @@ -319,15 +319,15 @@ │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3162 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/dir_8c28f2953344a167049ba6db5a27148a_dep.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 7098 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/dir_b609f53bbb5e26b8e9292001c59476a3.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 2492 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/dir_b609f53bbb5e26b8e9292001c59476a3_dep.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 4025 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/dir_de8ef2d1b4283b99fcb86ec9d2fa66db.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 1994 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/dir_de8ef2d1b4283b99fcb86ec9d2fa66db_dep.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3988 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/dir_e68e8157741866f444e17edd764ebbae.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 45631 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/doxygen.css │ │ │ │ --rw-r--r-- 0 root (0) root (0) 29042 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/dune-geometry.tag.gz │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 29045 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/dune-geometry.tag.gz │ │ │ │ -rw-r--r-- 0 root (0) root (0) 7704 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/dynsections.js │ │ │ │ -rw-r--r-- 0 root (0) root (0) 14807 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/files.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 836 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/form_0.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 929 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/form_0_dark.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 2566 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/form_1.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 1385 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/form_10.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 354 2024-11-14 18:01:13.000000 ./usr/share/doc/libdune-geometry-doc/doxygen/form_100.png │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00170.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: virtualrefinement.cc File Reference │ │ │ │ +dune-geometry: refinement.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -69,98 +69,30 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
│ │ │ │ -Classes | │ │ │ │ -Namespaces | │ │ │ │ -Macros | │ │ │ │ -Functions
│ │ │ │ -
virtualrefinement.cc File Reference
│ │ │ │ +
refinement.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

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

This file simply includes all Refinement implementations so you don't have to do them separately. │ │ │ │ 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 "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::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::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
 
│ │ │ │

Detailed Description

│ │ │ │ -

This file contains the virtual wrapper around refinement.

│ │ │ │ -

Macro Definition Documentation

│ │ │ │ - │ │ │ │ -

◆ DUNE_GEOMETRY_VIRTUALREFINEMENT_CC

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

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

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,74 +1,21 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -virtualrefinement.cc File Reference │ │ │ │ │ -This file contains the virtual wrapper around refinement. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "_t_y_p_e_._h_h" │ │ │ │ │ -#include "_r_e_f_i_n_e_m_e_n_t_._h_h" │ │ │ │ │ +refinement.hh File Reference │ │ │ │ │ +This file simply includes all _R_e_f_i_n_e_m_e_n_t implementations so you don't have to │ │ │ │ │ +do them separately. _M_o_r_e_._._. │ │ │ │ │ +#include "_r_e_f_i_n_e_m_e_n_t_/_b_a_s_e_._c_c" │ │ │ │ │ +#include "_r_e_f_i_n_e_m_e_n_t_/_h_c_u_b_e_._c_c" │ │ │ │ │ +#include "_r_e_f_i_n_e_m_e_n_t_/_s_i_m_p_l_e_x_._c_c" │ │ │ │ │ +#include "_r_e_f_i_n_e_m_e_n_t_/_h_c_u_b_e_t_r_i_a_n_g_u_l_a_t_i_o_n_._c_c" │ │ │ │ │ +#include "_r_e_f_i_n_e_m_e_n_t_/_p_r_i_s_m_t_r_i_a_n_g_u_l_a_t_i_o_n_._c_c" │ │ │ │ │ +#include "_r_e_f_i_n_e_m_e_n_t_/_p_y_r_a_m_i_d_t_r_i_a_n_g_u_l_a_t_i_o_n_._c_c" │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ - _d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ - _0_ _> │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_ _>_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ - _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ - _C_o_o_r_d_T_y_p_e_,_ _0_ _> │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_ _>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_< │ │ │ │ │ - _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_ _> │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_, │ │ │ │ │ - _d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_ _t_o_p_o_l_o_g_y_I_d_, │ │ │ │ │ - _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_,_ _d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_ _t_o_p_o_l_o_g_y_I_d_, │ │ │ │ │ - _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_,_ _0_ _> │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_, │ │ │ │ │ - _d_i_m_e_n_s_i_o_n_ _>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_B_u_i_l_d_e_r_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_ _> │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_B_u_i_l_d_e_r_<_ _1_,_ _C_o_o_r_d_T_y_p_e_ _> │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_B_u_i_l_d_e_r_<_ _3_,_ _C_o_o_r_d_T_y_p_e_ _> │ │ │ │ │ -  │ │ │ │ │ -NNaammeessppaacceess │ │ │ │ │ -namespace   _D_u_n_e │ │ │ │ │ -  │ │ │ │ │ -MMaaccrrooss │ │ │ │ │ -#define  _D_U_N_E___G_E_O_M_E_T_R_Y___V_I_R_T_U_A_L_R_E_F_I_N_E_M_E_N_T___C_C │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t< dimension, CoordType > _D_u_n_e_:_:_b_u_i_l_d_R_e_f_i_n_e_m_e_n_t (_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ - &  geometryType, _G_e_o_m_e_t_r_y_T_y_p_e coerceTo) │ │ │ │ │ - return a reference to the │ │ │ │ │ -  _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t according to the │ │ │ │ │ - parameters │ │ │ │ │ -  │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -This file contains the virtual wrapper around refinement. │ │ │ │ │ -********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ -********** _?◆_? DDUUNNEE__GGEEOOMMEETTRRYY__VVIIRRTTUUAALLRREEFFIINNEEMMEENNTT__CCCC ********** │ │ │ │ │ -#define DUNE_GEOMETRY_VIRTUALREFINEMENT_CC │ │ │ │ │ +This file simply includes all _R_e_f_i_n_e_m_e_n_t implementations so you don't have to │ │ │ │ │ +do them separately. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00170_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: virtualrefinement.cc Source File │ │ │ │ +dune-geometry: refinement.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,817 +74,42 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
virtualrefinement.cc
│ │ │ │ +
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 © 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_VIRTUALREFINEMENT_CC
│ │ │ │ -
7#define DUNE_GEOMETRY_VIRTUALREFINEMENT_CC
│ │ │ │ -
8
│ │ │ │ -
14#include <cassert>
│ │ │ │ -
15#include <typeinfo>
│ │ │ │ -
16
│ │ │ │ -
17#include <dune/common/exceptions.hh>
│ │ │ │ -
18#include <dune/common/fvector.hh>
│ │ │ │ -
19#include <dune/common/iteratorfacades.hh>
│ │ │ │ -
20
│ │ │ │ -
21#include "type.hh"
│ │ │ │ -
22#include "refinement.hh"
│ │ │ │ -
23
│ │ │ │ -
24namespace Dune
│ │ │ │ -
25{
│ │ │ │ -
26 // //////////////////////////////////////////
│ │ │ │ -
27 //
│ │ │ │ -
28 // The virtual base class and its iterators
│ │ │ │ -
29 //
│ │ │ │ -
30
│ │ │ │ -
31 //
│ │ │ │ -
32 // Refinement
│ │ │ │ -
33 //
│ │ │ │ -
34
│ │ │ │ -
35 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
39 {
│ │ │ │ -
40 return VertexIterator(vBeginBack(tag));
│ │ │ │ -
41 }
│ │ │ │ -
│ │ │ │ -
42
│ │ │ │ -
43 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
47 {
│ │ │ │ -
48 return VertexIterator(vEndBack(tag));
│ │ │ │ -
49 }
│ │ │ │ -
│ │ │ │ -
50
│ │ │ │ -
51 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
55 {
│ │ │ │ -
56 return ElementIterator(eBeginBack(tag));
│ │ │ │ -
57 }
│ │ │ │ -
│ │ │ │ -
58
│ │ │ │ -
59 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
63 {
│ │ │ │ -
64 return ElementIterator(eEndBack(tag));
│ │ │ │ -
65 }
│ │ │ │ -
│ │ │ │ -
66
│ │ │ │ -
67 //
│ │ │ │ -
68 // The iterators
│ │ │ │ -
69 //
│ │ │ │ -
70
│ │ │ │ -
71 template<int dimension, class CoordType, int codimension>
│ │ │ │ - │ │ │ │ -
73
│ │ │ │ -
74 // The iterator for vertices
│ │ │ │ -
75 template<int dimension, class CoordType>
│ │ │ │ -
│ │ │ │ -
76 class VirtualRefinementSubEntityIteratorSpecial<dimension, CoordType, dimension>
│ │ │ │ -
77 {};
│ │ │ │ -
│ │ │ │ -
78
│ │ │ │ -
79 // The iterator for elements
│ │ │ │ -
80 template<int dimension, class CoordType>
│ │ │ │ -
│ │ │ │ -
81 class VirtualRefinementSubEntityIteratorSpecial<dimension, CoordType, 0>
│ │ │ │ -
82 {
│ │ │ │ -
83 public:
│ │ │ │ - │ │ │ │ -
85 typedef typename Refinement::template Codim<0>::SubEntityIterator Common;
│ │ │ │ -
86 typedef typename Refinement::IndexVector IndexVector;
│ │ │ │ -
87
│ │ │ │ -
88 IndexVector vertexIndices() const;
│ │ │ │ -
89 };
│ │ │ │ -
│ │ │ │ -
90
│ │ │ │ -
91 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
94 vertexIndices() const
│ │ │ │ -
95 {
│ │ │ │ -
96 return static_cast<const Common *>(this)->backend->vertexIndices();
│ │ │ │ -
97 }
│ │ │ │ -
│ │ │ │ -
98
│ │ │ │ -
99 // The iterator common stuff
│ │ │ │ -
100 template<int dimension, class CoordType>
│ │ │ │ -
101 template<int codimension>
│ │ │ │ -
│ │ │ │ -
102 class VirtualRefinement<dimension, CoordType>::Codim<codimension>::SubEntityIterator
│ │ │ │ -
103 : public ForwardIteratorFacade<typename VirtualRefinement<dimension, CoordType>::template Codim<codimension>::SubEntityIterator, int>,
│ │ │ │ -
104 public VirtualRefinementSubEntityIteratorSpecial<dimension, CoordType, codimension>
│ │ │ │ -
105 {
│ │ │ │ -
106 public:
│ │ │ │ - │ │ │ │ -
108 typedef typename Refinement::template Codim<codimension>::SubEntityIterator This;
│ │ │ │ -
109 typedef typename Refinement::template SubEntityIteratorBack<codimension> IteratorBack;
│ │ │ │ -
110 typedef typename Refinement::CoordVector CoordVector;
│ │ │ │ -
111
│ │ │ │ - │ │ │ │ -
113 SubEntityIterator(const This &other);
│ │ │ │ - │ │ │ │ -
115
│ │ │ │ -
116 This &operator=(const This &other);
│ │ │ │ -
117
│ │ │ │ -
118 bool equals(const This &other) const;
│ │ │ │ -
119 void increment();
│ │ │ │ -
120
│ │ │ │ -
121 int index() const;
│ │ │ │ -
122
│ │ │ │ -
123 // If you simply use an unqualified CoordVector here g++-4.2 chokes
│ │ │ │ - │ │ │ │ -
125 CoordVector coords() const;
│ │ │ │ -
126 private:
│ │ │ │ -
127 friend class VirtualRefinementSubEntityIteratorSpecial<dimension, CoordType, codimension>;
│ │ │ │ -
128 IteratorBack *backend;
│ │ │ │ -
129 };
│ │ │ │ -
│ │ │ │ -
130
│ │ │ │ -
131#ifndef DOXYGEN
│ │ │ │ -
132 template<int dimension, class CoordType>
│ │ │ │ -
133 template<int codimension>
│ │ │ │ - │ │ │ │ -
135 SubEntityIterator(IteratorBack *backend_)
│ │ │ │ -
136 : backend(backend_)
│ │ │ │ -
137 {}
│ │ │ │ -
138
│ │ │ │ -
139 template<int dimension, class CoordType>
│ │ │ │ -
140 template<int codimension>
│ │ │ │ - │ │ │ │ -
142 SubEntityIterator(const This &other)
│ │ │ │ -
143 : backend(other.backend->clone())
│ │ │ │ -
144 {}
│ │ │ │ -
145
│ │ │ │ -
146 template<int dimension, class CoordType>
│ │ │ │ -
147 template<int codimension>
│ │ │ │ -
148 VirtualRefinement<dimension, CoordType>::Codim<codimension>::SubEntityIterator::
│ │ │ │ -
149 ~SubEntityIterator()
│ │ │ │ -
150 {
│ │ │ │ -
151 delete backend;
│ │ │ │ -
152 }
│ │ │ │ -
153
│ │ │ │ -
154 template<int dimension, class CoordType>
│ │ │ │ -
155 template<int codimension>
│ │ │ │ -
156 typename VirtualRefinement<dimension, CoordType>::template Codim<codimension>::SubEntityIterator &
│ │ │ │ -
157 VirtualRefinement<dimension, CoordType>::Codim<codimension>::SubEntityIterator::
│ │ │ │ -
158 operator=(const This &other)
│ │ │ │ -
159 {
│ │ │ │ -
160 delete backend;
│ │ │ │ -
161 backend = other.backend->clone();
│ │ │ │ -
162 }
│ │ │ │ -
163
│ │ │ │ -
164 template<int dimension, class CoordType>
│ │ │ │ -
165 template<int codimension>
│ │ │ │ -
166 bool
│ │ │ │ -
167 VirtualRefinement<dimension, CoordType>::Codim<codimension>::SubEntityIterator::
│ │ │ │ -
168 equals(const This &other) const
│ │ │ │ -
169 { return *backend == *(other.backend); }
│ │ │ │ -
170
│ │ │ │ -
171 template<int dimension, class CoordType>
│ │ │ │ -
172 template<int codimension>
│ │ │ │ -
173 void
│ │ │ │ -
174 VirtualRefinement<dimension, CoordType>::Codim<codimension>::SubEntityIterator::
│ │ │ │ -
175 increment()
│ │ │ │ -
176 {
│ │ │ │ -
177 ++*backend;
│ │ │ │ -
178 }
│ │ │ │ -
179
│ │ │ │ -
180 template<int dimension, class CoordType>
│ │ │ │ -
181 template<int codimension>
│ │ │ │ -
182 int
│ │ │ │ -
183 VirtualRefinement<dimension, CoordType>::Codim<codimension>::SubEntityIterator::
│ │ │ │ -
184 index() const
│ │ │ │ -
185 { return backend->index(); }
│ │ │ │ -
186
│ │ │ │ -
187 template<int dimension, class CoordType>
│ │ │ │ -
188 template<int codimension>
│ │ │ │ -
189 typename VirtualRefinement<dimension, CoordType>::template Codim<codimension>::SubEntityIterator::CoordVector
│ │ │ │ -
190 VirtualRefinement<dimension, CoordType>::Codim<codimension>::SubEntityIterator::
│ │ │ │ -
191 coords() const
│ │ │ │ -
192 { return backend->coords(); }
│ │ │ │ -
193#endif // DOXYGEN
│ │ │ │ -
194
│ │ │ │ -
195 //
│ │ │ │ -
196 // The iterator backend
│ │ │ │ -
197 //
│ │ │ │ -
198
│ │ │ │ -
199 template<int dimension, class CoordType, int codimension>
│ │ │ │ - │ │ │ │ -
201
│ │ │ │ -
202 // The iterator backend for vertices
│ │ │ │ -
203 template<int dimension, class CoordType>
│ │ │ │ -
│ │ │ │ -
204 class VirtualRefinementSubEntityIteratorBackSpecial<dimension, CoordType, dimension>
│ │ │ │ -
205 {
│ │ │ │ -
206 public:
│ │ │ │ -
207
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
209 {}
│ │ │ │ -
│ │ │ │ -
210 };
│ │ │ │ -
│ │ │ │ -
211
│ │ │ │ -
212 // The iterator backend for elements
│ │ │ │ -
213 template<int dimension, class CoordType>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
215 {
│ │ │ │ -
216 public:
│ │ │ │ - │ │ │ │ -
218 typedef typename Refinement::IndexVector IndexVector;
│ │ │ │ -
219
│ │ │ │ -
220 virtual IndexVector vertexIndices() const = 0;
│ │ │ │ -
221
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
223 {}
│ │ │ │ -
│ │ │ │ -
224 };
│ │ │ │ -
│ │ │ │ -
225
│ │ │ │ -
226 // The iterator backend common stuff
│ │ │ │ -
227 template<int dimension, class CoordType>
│ │ │ │ -
228 template<int codimension>
│ │ │ │ -
│ │ │ │ -
229 class VirtualRefinement<dimension, CoordType>::SubEntityIteratorBack
│ │ │ │ -
230 : public VirtualRefinementSubEntityIteratorBackSpecial<dimension, CoordType, codimension>
│ │ │ │ -
231 {
│ │ │ │ -
232 public:
│ │ │ │ - │ │ │ │ -
234 typedef typename Refinement::template SubEntityIteratorBack<codimension> This;
│ │ │ │ -
235 typedef typename Refinement::CoordVector CoordVector;
│ │ │ │ -
236
│ │ │ │ - │ │ │ │ -
238
│ │ │ │ -
239 virtual This *clone() const = 0;
│ │ │ │ -
240
│ │ │ │ -
241 virtual bool operator==(const This &other) const = 0;
│ │ │ │ -
242 virtual This &operator++() = 0;
│ │ │ │ +
5#ifndef DUNE_GEOMETRY_REFINEMENT_HH
│ │ │ │ +
6#define DUNE_GEOMETRY_REFINEMENT_HH
│ │ │ │ +
7
│ │ │ │ +
239// The interface (template<...> class StaticRefinement) is not included here
│ │ │ │ +
240// since it derives from parts which I consider implementation. Look
│ │ │ │ +
241// into refinement/base.cc if the documentation is above is not enough.
│ │ │ │ +
242#include "refinement/base.cc"
│ │ │ │
243
│ │ │ │ -
244 virtual int index() const = 0;
│ │ │ │ -
245 virtual CoordVector coords() const = 0;
│ │ │ │ -
246 };
│ │ │ │ -
│ │ │ │ -
247
│ │ │ │ -
248 // /////////////////////////////////////////////////
│ │ │ │ -
249 //
│ │ │ │ -
250 // The derived classes and their iterator backends
│ │ │ │ -
251 //
│ │ │ │ -
252
│ │ │ │ -
253 //
│ │ │ │ -
254 // The refinement implementation
│ │ │ │ -
255 //
│ │ │ │ -
256
│ │ │ │ -
257 template<unsigned topologyId, class CoordType,
│ │ │ │ -
258 unsigned coerceToId, int dimension>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
260 : public Dune::VirtualRefinement<dimension, CoordType>
│ │ │ │ -
261 {
│ │ │ │ -
262 public:
│ │ │ │ - │ │ │ │ - │ │ │ │ -
265
│ │ │ │ -
266 template<int codimension>
│ │ │ │ - │ │ │ │ -
268
│ │ │ │ -
269 int nVertices(Dune::RefinementIntervals tag) const override;
│ │ │ │ -
270
│ │ │ │ -
271 int nElements(Dune::RefinementIntervals tag) const override;
│ │ │ │ -
272
│ │ │ │ - │ │ │ │ -
274 private:
│ │ │ │ - │ │ │ │ -
276
│ │ │ │ -
277 typename VirtualRefinement::VertexIteratorBack *vBeginBack(Dune::RefinementIntervals tag) const override;
│ │ │ │ -
278 typename VirtualRefinement::VertexIteratorBack *vEndBack(Dune::RefinementIntervals tag) const override;
│ │ │ │ -
279 typename VirtualRefinement::ElementIteratorBack *eBeginBack(Dune::RefinementIntervals tag) const override;
│ │ │ │ -
280 typename VirtualRefinement::ElementIteratorBack *eEndBack(Dune::RefinementIntervals tag) const override;
│ │ │ │ -
281 };
│ │ │ │ -
│ │ │ │ -
282
│ │ │ │ -
283 template<unsigned topologyId, class CoordType,
│ │ │ │ -
284 unsigned coerceToId, int dimension>
│ │ │ │ -
285 VirtualRefinementImp<topologyId, CoordType, coerceToId, dimension> &
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
287 {
│ │ │ │ -
288 static VirtualRefinementImp instance_{};
│ │ │ │ -
289 return instance_;
│ │ │ │ -
290 }
│ │ │ │ -
│ │ │ │ -
291
│ │ │ │ -
292 template<unsigned topologyId, class CoordType,
│ │ │ │ -
293 unsigned coerceToId, int dimension>
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
296 {
│ │ │ │ -
297 return StaticRefinement::nVertices(tag);
│ │ │ │ -
298 }
│ │ │ │ -
│ │ │ │ -
299
│ │ │ │ -
300 template<unsigned topologyId, class CoordType,
│ │ │ │ -
301 unsigned coerceToId, int dimension>
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
305 {
│ │ │ │ -
306 return new SubEntityIteratorBack<dimension>(StaticRefinement::vBegin(tag));
│ │ │ │ -
307 }
│ │ │ │ -
308
│ │ │ │ -
309 template<unsigned topologyId, class CoordType,
│ │ │ │ -
310 unsigned coerceToId, int dimension>
│ │ │ │ - │ │ │ │ -
312 VirtualRefinementImp<topologyId, CoordType, coerceToId, dimension>::
│ │ │ │ -
313 vEndBack(Dune::RefinementIntervals tag) const
│ │ │ │ -
314 {
│ │ │ │ -
315 return new SubEntityIteratorBack<dimension>(StaticRefinement::vEnd(tag));
│ │ │ │ -
316 }
│ │ │ │ -
317
│ │ │ │ -
318 template<unsigned topologyId, class CoordType,
│ │ │ │ -
319 unsigned coerceToId, int dimension>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
321 {
│ │ │ │ -
322 return StaticRefinement::nElements(tag);
│ │ │ │ -
323 }
│ │ │ │ -
│ │ │ │ -
324
│ │ │ │ -
325 template<unsigned topologyId, class CoordType,
│ │ │ │ -
326 unsigned coerceToId, int dimension>
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
330 {
│ │ │ │ -
331 return new SubEntityIteratorBack<0>(StaticRefinement::eBegin(tag));
│ │ │ │ -
332 }
│ │ │ │ -
333
│ │ │ │ -
334 template<unsigned topologyId, class CoordType,
│ │ │ │ -
335 unsigned coerceToId, int dimension>
│ │ │ │ - │ │ │ │ -
337 VirtualRefinementImp<topologyId, CoordType, coerceToId, dimension>::
│ │ │ │ -
338 eEndBack(Dune::RefinementIntervals tag) const
│ │ │ │ -
339 {
│ │ │ │ -
340 return new SubEntityIteratorBack<0>(StaticRefinement::eEnd(tag));
│ │ │ │ -
341 }
│ │ │ │ -
342
│ │ │ │ -
343 //
│ │ │ │ -
344 // The iterator backend implementation
│ │ │ │ -
345 //
│ │ │ │ -
346
│ │ │ │ -
347 // The iterator backend implementation specialties
│ │ │ │ -
348 template<unsigned topologyId, class CoordType,
│ │ │ │ -
349 unsigned coerceToId, int dimension, int codimension>
│ │ │ │ - │ │ │ │ -
351
│ │ │ │ -
352 // The iterator backend implementation specialties for vertices
│ │ │ │ -
353 template<unsigned topologyId, class CoordType,
│ │ │ │ -
354 unsigned coerceToId, int dimension>
│ │ │ │ -
│ │ │ │ -
355 class VirtualRefinementImpSubEntityIteratorBackSpecial<topologyId, CoordType, coerceToId, dimension, dimension>
│ │ │ │ -
356 : public VirtualRefinement<dimension, CoordType>::template SubEntityIteratorBack<dimension>
│ │ │ │ -
357 {};
│ │ │ │ -
│ │ │ │ -
358
│ │ │ │ -
359 // The iterator backend implementation specialties for elements
│ │ │ │ -
360
│ │ │ │ -
361 template<unsigned topologyId, class CoordType,
│ │ │ │ -
362 unsigned coerceToId, int dimension>
│ │ │ │ -
│ │ │ │ -
363 class VirtualRefinementImpSubEntityIteratorBackSpecial<topologyId, CoordType, coerceToId, dimension, 0>
│ │ │ │ -
364 : public VirtualRefinement<dimension, CoordType>::template SubEntityIteratorBack<0>
│ │ │ │ -
365 {
│ │ │ │ -
366 public:
│ │ │ │ - │ │ │ │ -
368 typedef typename VirtualRefinementImp::template SubEntityIteratorBack<0> Common;
│ │ │ │ - │ │ │ │ - │ │ │ │ -
371 typedef typename RefinementBase::IndexVector IndexVector;
│ │ │ │ -
372
│ │ │ │ -
373 IndexVector vertexIndices() const;
│ │ │ │ -
374 };
│ │ │ │ -
│ │ │ │ -
375
│ │ │ │ -
376 template<unsigned topologyId, class CoordType,
│ │ │ │ -
377 unsigned coerceToId, int dimension>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
380 vertexIndices() const
│ │ │ │ -
381 {
│ │ │ │ -
382 IndexVector vIndices;
│ │ │ │ -
383 vIndices.reserve(StaticRefinement::IndexVector::dimension);
│ │ │ │ -
384
│ │ │ │ -
385 typename StaticRefinement::IndexVector sIndices = static_cast<const Common *>(this)->backend.vertexIndices();
│ │ │ │ -
386 for(int i = 0; i < StaticRefinement::IndexVector::dimension; ++i)
│ │ │ │ -
387 vIndices.push_back(sIndices[i]);
│ │ │ │ -
388 return vIndices;
│ │ │ │ -
389 }
│ │ │ │ -
│ │ │ │ -
390
│ │ │ │ -
391 // The shared iterator backend implementation
│ │ │ │ -
392 template<unsigned topologyId, class CoordType,
│ │ │ │ -
393 unsigned coerceToId, int dimension>
│ │ │ │ -
394 template<int codimension>
│ │ │ │ -
│ │ │ │ -
395 class VirtualRefinementImp<topologyId, CoordType, coerceToId, dimension>::SubEntityIteratorBack
│ │ │ │ -
396 : public VirtualRefinementImpSubEntityIteratorBackSpecial<topologyId, CoordType, coerceToId, dimension, codimension>
│ │ │ │ -
397 {
│ │ │ │ -
398 public:
│ │ │ │ -
399 typedef typename StaticRefinement::template Codim<codimension>::SubEntityIterator BackendIterator;
│ │ │ │ - │ │ │ │ -
401 typedef typename VirtualRefinement::template SubEntityIteratorBack<codimension> Base;
│ │ │ │ - │ │ │ │ -
403
│ │ │ │ - │ │ │ │ -
405 SubEntityIteratorBack(const This &other);
│ │ │ │ -
406
│ │ │ │ -
407 Base *clone() const;
│ │ │ │ -
408
│ │ │ │ -
409 bool operator==(const Base &other) const;
│ │ │ │ -
410 Base &operator++();
│ │ │ │ -
411
│ │ │ │ -
412 int index() const;
│ │ │ │ -
413 CoordVector coords() const;
│ │ │ │ -
414
│ │ │ │ -
415 private:
│ │ │ │ -
416 friend class VirtualRefinementImpSubEntityIteratorBackSpecial<topologyId, CoordType, coerceToId, dimension, codimension>;
│ │ │ │ -
417 BackendIterator backend;
│ │ │ │ -
418 };
│ │ │ │ -
│ │ │ │ -
419
│ │ │ │ -
420 template<unsigned topologyId, class CoordType,
│ │ │ │ -
421 unsigned coerceToId, int dimension>
│ │ │ │ -
422 template<int codimension>
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
425 : backend(backend_)
│ │ │ │ -
426 {}
│ │ │ │ -
│ │ │ │ -
427
│ │ │ │ -
428 template<unsigned topologyId, class CoordType,
│ │ │ │ -
429 unsigned coerceToId, int dimension>
│ │ │ │ -
430 template<int codimension>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
432 SubEntityIteratorBack(const This &other)
│ │ │ │ -
433 : VirtualRefinementImpSubEntityIteratorBackSpecial<topologyId, CoordType, coerceToId, dimension, codimension>(other),
│ │ │ │ -
434 backend(other.backend)
│ │ │ │ -
435 {}
│ │ │ │ -
│ │ │ │ -
436
│ │ │ │ -
437 template<unsigned topologyId, class CoordType, unsigned coerceToId, int dimension>
│ │ │ │ -
438 template<int codimension>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
441 clone() const
│ │ │ │ -
442 { return new This(*this); }
│ │ │ │ -
│ │ │ │ -
443
│ │ │ │ -
444 template<unsigned topologyId, class CoordType, unsigned coerceToId, int dimension>
│ │ │ │ -
445 template<int codimension>
│ │ │ │ -
446 bool
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
448 operator==(const Base &other) const
│ │ │ │ -
449 {
│ │ │ │ -
450 try {
│ │ │ │ -
451 return backend == dynamic_cast<const This &>(other).backend;
│ │ │ │ -
452 }
│ │ │ │ -
453 catch(const std::bad_cast&)
│ │ │ │ -
454 {
│ │ │ │ -
455 return false;
│ │ │ │ -
456 }
│ │ │ │ -
457 }
│ │ │ │ -
│ │ │ │ -
458
│ │ │ │ -
459 template<unsigned topologyId, class CoordType, unsigned coerceToId, int dimension>
│ │ │ │ -
460 template<int codimension>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
464 {
│ │ │ │ -
465 ++backend;
│ │ │ │ -
466 return *this;
│ │ │ │ -
467 }
│ │ │ │ -
│ │ │ │ -
468
│ │ │ │ -
469 template<unsigned topologyId, class CoordType, unsigned coerceToId, int dimension>
│ │ │ │ -
470 template<int codimension>
│ │ │ │ -
471 int
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
473 index() const
│ │ │ │ -
474 { return backend.index(); }
│ │ │ │ -
│ │ │ │ -
475
│ │ │ │ -
476 template<unsigned topologyId, class CoordType, unsigned coerceToId, int dimension>
│ │ │ │ -
477 template<int codimension>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
480 coords() const
│ │ │ │ -
481 { return backend.coords(); }
│ │ │ │ -
│ │ │ │ -
482
│ │ │ │ -
483 // ////////////////////////
│ │ │ │ -
484 //
│ │ │ │ -
485 // The refinement builder
│ │ │ │ -
486 //
│ │ │ │ -
487
│ │ │ │ -
488 template<int dimension, class CoordType>
│ │ │ │ -
489 class RefinementBuilder;
│ │ │ │ -
490
│ │ │ │ -
501 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
504 GeometryType geometryType,
│ │ │ │ -
506 GeometryType coerceTo)
│ │ │ │ -
507 {
│ │ │ │ -
508 // Check that the user used valid geometry types
│ │ │ │ -
509 assert(geometryType.dim() == dimension && coerceTo.dim() == dimension);
│ │ │ │ -
510 return RefinementBuilder<dimension, CoordType>::build( geometryType.id(), coerceTo.id() );
│ │ │ │ -
511 }
│ │ │ │ -
│ │ │ │ -
512
│ │ │ │ -
513 // In principle the trick with the class is no longer necessary,
│ │ │ │ -
514 // but I'm keeping it in here so it will be easier to specialize
│ │ │ │ -
515 // buildRefinement when someone implements pyramids and prisms
│ │ │ │ -
516 template<int dimension, class CoordType>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
518 {
│ │ │ │ -
519 public:
│ │ │ │ -
520 static
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
522 build(unsigned topologyId, unsigned coerceToId)
│ │ │ │ -
523 {
│ │ │ │ -
524 topologyId &= ~1;
│ │ │ │ -
525 coerceToId &= ~1;
│ │ │ │ -
526
│ │ │ │ -
527 constexpr unsigned idSimplex = GeometryTypes::simplex(dimension).id() & ~1;
│ │ │ │ -
528 constexpr unsigned idCube = GeometryTypes::cube(dimension).id() & ~1;
│ │ │ │ -
529
│ │ │ │ -
530 switch( topologyId )
│ │ │ │ -
531 {
│ │ │ │ -
532 //case GeometryType::simplex:
│ │ │ │ -
533 case idSimplex :
│ │ │ │ -
534 //switch( coerceTo )
│ │ │ │ -
535 switch( coerceToId )
│ │ │ │ -
536 {
│ │ │ │ -
537 //case GeometryType::simplex:
│ │ │ │ -
538 case idSimplex :
│ │ │ │ - │ │ │ │ -
540 default :
│ │ │ │ -
541 break;
│ │ │ │ -
542 }
│ │ │ │ -
543 break;
│ │ │ │ -
544
│ │ │ │ -
545 //case GeometryType::cube:
│ │ │ │ -
546 case idCube :
│ │ │ │ -
547 switch( coerceToId )
│ │ │ │ -
548 {
│ │ │ │ -
549 case idSimplex :
│ │ │ │ - │ │ │ │ -
551 case idCube :
│ │ │ │ - │ │ │ │ -
553 default :
│ │ │ │ -
554 break;
│ │ │ │ -
555 }
│ │ │ │ -
556 break;
│ │ │ │ -
557
│ │ │ │ -
558 default :
│ │ │ │ -
559 break;
│ │ │ │ -
560 }
│ │ │ │ -
561 DUNE_THROW( NotImplemented, "No Refinement<" << topologyId << ", CoordType, "
│ │ │ │ -
562 << coerceToId << " >.");
│ │ │ │ -
563 }
│ │ │ │ -
│ │ │ │ -
564 };
│ │ │ │ -
│ │ │ │ -
565
│ │ │ │ -
566 template<class CoordType>
│ │ │ │ -
│ │ │ │ -
567 class RefinementBuilder<1, CoordType>
│ │ │ │ -
568 {
│ │ │ │ -
569 static const std::size_t dimension = 1;
│ │ │ │ -
570 public:
│ │ │ │ -
571 static
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
573 build(unsigned topologyId, unsigned coerceToId)
│ │ │ │ -
574 {
│ │ │ │ -
575 topologyId &= ~1;
│ │ │ │ -
576 coerceToId &= ~1;
│ │ │ │ -
577
│ │ │ │ -
578 constexpr unsigned idSimplex = GeometryTypes::simplex(dimension).id() & ~1;
│ │ │ │ -
579
│ │ │ │ -
580 if (topologyId == 0 && coerceToId == 0)
│ │ │ │ - │ │ │ │ -
582
│ │ │ │ -
583 DUNE_THROW( NotImplemented, "No Refinement<" << topologyId << ", CoordType, "
│ │ │ │ -
584 << coerceToId << " >.");
│ │ │ │ -
585 }
│ │ │ │ -
│ │ │ │ -
586 };
│ │ │ │ -
│ │ │ │ -
587
│ │ │ │ -
588 template<class CoordType>
│ │ │ │ -
│ │ │ │ -
589 class RefinementBuilder<3, CoordType>
│ │ │ │ -
590 {
│ │ │ │ -
591 static const std::size_t dimension = 3;
│ │ │ │ -
592 public:
│ │ │ │ -
593 static
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
595 build(unsigned topologyId, unsigned coerceToId)
│ │ │ │ -
596 {
│ │ │ │ -
597 topologyId &= ~1;
│ │ │ │ -
598 coerceToId &= ~1;
│ │ │ │ -
599
│ │ │ │ -
600 constexpr unsigned idSimplex = GeometryTypes::simplex(dimension).id() & ~1;
│ │ │ │ -
601 constexpr unsigned idCube = GeometryTypes::cube(dimension).id() & ~1;
│ │ │ │ -
602 constexpr unsigned idPrism = GeometryTypes::prism.id() & ~1;
│ │ │ │ -
603 constexpr unsigned idPyramid = GeometryTypes::pyramid.id() & ~1;
│ │ │ │ -
604
│ │ │ │ -
605 switch( topologyId )
│ │ │ │ -
606 {
│ │ │ │ -
607 //case GeometryType::simplex:
│ │ │ │ -
608 case idSimplex :
│ │ │ │ -
609 //switch( coerceTo )
│ │ │ │ -
610 switch( coerceToId )
│ │ │ │ -
611 {
│ │ │ │ -
612 //case GeometryType::simplex:
│ │ │ │ -
613 case idSimplex :
│ │ │ │ - │ │ │ │ -
615 default :
│ │ │ │ -
616 break;
│ │ │ │ -
617 }
│ │ │ │ -
618 break;
│ │ │ │ -
619
│ │ │ │ -
620 //case GeometryType::cube:
│ │ │ │ -
621 case idCube :
│ │ │ │ -
622 switch( coerceToId )
│ │ │ │ -
623 {
│ │ │ │ -
624 case idSimplex :
│ │ │ │ - │ │ │ │ -
626 case idCube :
│ │ │ │ - │ │ │ │ -
628 default :
│ │ │ │ -
629 break;
│ │ │ │ -
630 }
│ │ │ │ -
631 break;
│ │ │ │ -
632
│ │ │ │ -
633 //case GeometryType::prism:
│ │ │ │ -
634 case idPrism :
│ │ │ │ -
635 switch( coerceToId )
│ │ │ │ -
636 {
│ │ │ │ -
637 case idSimplex :
│ │ │ │ - │ │ │ │ -
639 default :
│ │ │ │ -
640 break;
│ │ │ │ -
641 }
│ │ │ │ -
642 break;
│ │ │ │ -
643
│ │ │ │ -
644 //case GeometryType::pyramid:
│ │ │ │ -
645 case idPyramid :
│ │ │ │ -
646 switch( coerceToId )
│ │ │ │ -
647 {
│ │ │ │ -
648 case idSimplex :
│ │ │ │ - │ │ │ │ -
650 default :
│ │ │ │ -
651 break;
│ │ │ │ -
652 }
│ │ │ │ -
653 break;
│ │ │ │ -
654
│ │ │ │ -
655 default :
│ │ │ │ -
656 break;
│ │ │ │ -
657 }
│ │ │ │ -
658 DUNE_THROW( NotImplemented, "No Refinement<" << topologyId << ", CoordType, "
│ │ │ │ -
659 << coerceToId << " >.");
│ │ │ │ -
660 }
│ │ │ │ -
│ │ │ │ -
661 };
│ │ │ │ -
│ │ │ │ -
662
│ │ │ │ -
663} // namespace Dune
│ │ │ │ -
664
│ │ │ │ -
665#endif // DUNE_GEOMETRY_VIRTUALREFINEMENT_CC
│ │ │ │ -
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.
│ │ │ │ -
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
│ │ │ │ -
Static tag representing a codimension.
Definition dimension.hh:24
│ │ │ │ -
Holds the number of refined intervals per axis needed for virtual and static refinement.
Definition base.cc:94
│ │ │ │ -
Wrap each Refinement implementation to get a consistent interface.
Definition base.cc:141
│ │ │ │ -
static ElementIterator eEnd(Dune::RefinementIntervals tag)
Get an ElementIterator.
Definition base.cc:247
│ │ │ │ -
static ElementIterator eBegin(Dune::RefinementIntervals tag)
Get an ElementIterator.
Definition base.cc:237
│ │ │ │ -
static int nElements(Dune::RefinementIntervals tag)
Get the number of Elements.
Definition base.cc:227
│ │ │ │ -
static int nVertices(Dune::RefinementIntervals tag)
Get the number of Vertices.
Definition base.cc:197
│ │ │ │ -
static VertexIterator vBegin(Dune::RefinementIntervals tag)
Get a VertexIterator.
Definition base.cc:207
│ │ │ │ -
typedef IndexVector
The IndexVector of the Refinement.
Definition base.cc:177
│ │ │ │ -
static VertexIterator vEnd(Dune::RefinementIntervals tag)
Get a VertexIterator.
Definition base.cc:217
│ │ │ │ -
Unique label for each type of entities that can occur in DUNE grids.
Definition type.hh:114
│ │ │ │ -
constexpr unsigned int dim() const
Return dimension of the type.
Definition type.hh:360
│ │ │ │ -
constexpr unsigned int id() const
Return the topology id of the type.
Definition type.hh:365
│ │ │ │ -
Definition virtualrefinement.cc:72
│ │ │ │ -
Refinement::template Codim< 0 >::SubEntityIterator Common
Definition virtualrefinement.cc:85
│ │ │ │ -
VirtualRefinement< dimension, CoordType > Refinement
Definition virtualrefinement.cc:84
│ │ │ │ -
Refinement::IndexVector IndexVector
Definition virtualrefinement.cc:86
│ │ │ │ -
VirtualRefinement< dimension, CoordType >::template Codim< codimension >::SubEntityIterator::CoordVector coords() const
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
Refinement::template SubEntityIteratorBack< codimension > IteratorBack
Definition virtualrefinement.cc:109
│ │ │ │ -
Refinement::CoordVector CoordVector
Definition virtualrefinement.cc:110
│ │ │ │ -
Refinement::template Codim< codimension >::SubEntityIterator This
Definition virtualrefinement.cc:108
│ │ │ │ -
bool equals(const This &other) const
│ │ │ │ -
VirtualRefinement< dimension, CoordType > Refinement
Definition virtualrefinement.cc:107
│ │ │ │ - │ │ │ │ -
Definition virtualrefinement.cc:200
│ │ │ │ -
virtual ~VirtualRefinementSubEntityIteratorBackSpecial()
Definition virtualrefinement.cc:208
│ │ │ │ - │ │ │ │ -
VirtualRefinement< dimension, CoordType > Refinement
Definition virtualrefinement.cc:217
│ │ │ │ -
Refinement::IndexVector IndexVector
Definition virtualrefinement.cc:218
│ │ │ │ -
virtual ~VirtualRefinementSubEntityIteratorBackSpecial()
Definition virtualrefinement.cc:222
│ │ │ │ -
Definition virtualrefinement.cc:231
│ │ │ │ - │ │ │ │ -
Refinement::template SubEntityIteratorBack< codimension > This
Definition virtualrefinement.cc:234
│ │ │ │ - │ │ │ │ -
Refinement::CoordVector CoordVector
Definition virtualrefinement.cc:235
│ │ │ │ -
VirtualRefinement< dimension, CoordType > Refinement
Definition virtualrefinement.cc:233
│ │ │ │ -
virtual bool operator==(const This &other) const =0
│ │ │ │ -
virtual CoordVector coords() const =0
│ │ │ │ -
virtual ~SubEntityIteratorBack()
Definition virtualrefinement.cc:237
│ │ │ │ - │ │ │ │ -
Definition virtualrefinement.cc:261
│ │ │ │ -
int nVertices(Dune::RefinementIntervals tag) const override
Get the number of Vertices.
Definition virtualrefinement.cc:295
│ │ │ │ -
int nElements(Dune::RefinementIntervals tag) const override
Get the number of Elements.
Definition virtualrefinement.cc:320
│ │ │ │ -
Dune::VirtualRefinement< dimension, CoordType > VirtualRefinement
Definition virtualrefinement.cc:264
│ │ │ │ -
static VirtualRefinementImp< topologyId, CoordType, coerceToId, dimension > & instance()
Definition virtualrefinement.cc:286
│ │ │ │ -
Dune::StaticRefinement< topologyId, CoordType, coerceToId, dimension > StaticRefinement
Definition virtualrefinement.cc:263
│ │ │ │ -
Definition virtualrefinement.cc:397
│ │ │ │ -
VirtualRefinement::template SubEntityIteratorBack< codimension > Base
Definition virtualrefinement.cc:401
│ │ │ │ -
VirtualRefinementImp< topologyId, CoordType, coerceToId, dimension >::template SubEntityIteratorBack< codimension > This
Definition virtualrefinement.cc:400
│ │ │ │ -
StaticRefinement::template Codim< codimension >::SubEntityIterator BackendIterator
Definition virtualrefinement.cc:399
│ │ │ │ -
VirtualRefinement::CoordVector CoordVector
Definition virtualrefinement.cc:402
│ │ │ │ - │ │ │ │ -
VirtualRefinementImp::template SubEntityIteratorBack< 0 > Common
Definition virtualrefinement.cc:368
│ │ │ │ - │ │ │ │ -
VirtualRefinement< dimension, CoordType > RefinementBase
Definition virtualrefinement.cc:370
│ │ │ │ -
Dune::VirtualRefinementImp< topologyId, CoordType, coerceToId, dimension > VirtualRefinementImp
Definition virtualrefinement.cc:367
│ │ │ │ -
VirtualRefinementImp::StaticRefinement StaticRefinement
Definition virtualrefinement.cc:369
│ │ │ │ -
Definition virtualrefinement.cc:518
│ │ │ │ -
static VirtualRefinement< dimension, CoordType > & build(unsigned topologyId, unsigned coerceToId)
Definition virtualrefinement.cc:522
│ │ │ │ -
static VirtualRefinement< dimension, CoordType > & build(unsigned topologyId, unsigned coerceToId)
Definition virtualrefinement.cc:573
│ │ │ │ -
static VirtualRefinement< dimension, CoordType > & build(unsigned topologyId, unsigned coerceToId)
Definition virtualrefinement.cc:595
│ │ │ │ -
VirtualRefinement base class.
Definition virtualrefinement.hh:283
│ │ │ │ -
SubEntityIteratorBack< dimension > VertexIteratorBack
Definition virtualrefinement.hh:307
│ │ │ │ -
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
│ │ │ │ -
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:290
│ │ │ │ -
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:297
│ │ │ │ -
Codim< dimension >::SubEntityIterator VertexIterator
The VertexIterator of the VirtualRefinement.
Definition virtualrefinement.hh:288
│ │ │ │ -
SubEntityIteratorBack< 0 > ElementIteratorBack
Definition virtualrefinement.hh:308
│ │ │ │ -
codim database of VirtualRefinement
Definition virtualrefinement.hh:367
│ │ │ │ +
244#include "refinement/hcube.cc"
│ │ │ │ +
245#include "refinement/simplex.cc"
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
249
│ │ │ │ +
250#endif // DUNE_GEOMETRY_REFINEMENT_HH
│ │ │ │ +
This file contains the Refinement implementation for hypercubes (quadrilaterals, hexahedrons,...
│ │ │ │ + │ │ │ │ +
This file contains the parts independent of a particular Refinement implementation.
│ │ │ │ +
This file contains the Refinement implementation for simplices (triangles, tetrahedrons....
│ │ │ │ +
This file contains the Refinement implementation for triangulating hypercubes (quadrilateral -> trian...
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,1002 +1,44 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -virtualrefinement.cc │ │ │ │ │ +refinement.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 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 © 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_VIRTUALREFINEMENT_CC │ │ │ │ │ -_7#define DUNE_GEOMETRY_VIRTUALREFINEMENT_CC │ │ │ │ │ -8 │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16 │ │ │ │ │ -17#include │ │ │ │ │ -18#include │ │ │ │ │ -19#include │ │ │ │ │ -20 │ │ │ │ │ -21#include "_t_y_p_e_._h_h" │ │ │ │ │ -22#include "_r_e_f_i_n_e_m_e_n_t_._h_h" │ │ │ │ │ -23 │ │ │ │ │ -24namespace _D_u_n_e │ │ │ │ │ -25{ │ │ │ │ │ -26 // ////////////////////////////////////////// │ │ │ │ │ -27 // │ │ │ │ │ -28 // The virtual base class and its iterators │ │ │ │ │ -29 // │ │ │ │ │ -30 │ │ │ │ │ -31 // │ │ │ │ │ -32 // Refinement │ │ │ │ │ -33 // │ │ │ │ │ -34 │ │ │ │ │ -35 template │ │ │ │ │ -36 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ -_3_7 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -38_ _v_B_e_g_i_n(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const │ │ │ │ │ -39 { │ │ │ │ │ -40 return _V_e_r_t_e_x_I_t_e_r_a_t_o_r(vBeginBack(tag)); │ │ │ │ │ -41 } │ │ │ │ │ -42 │ │ │ │ │ -43 template │ │ │ │ │ -44 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ -_4_5 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -46_ _v_E_n_d(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const │ │ │ │ │ -47 { │ │ │ │ │ -48 return _V_e_r_t_e_x_I_t_e_r_a_t_o_r(vEndBack(tag)); │ │ │ │ │ -49 } │ │ │ │ │ -50 │ │ │ │ │ -51 template │ │ │ │ │ -52 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ -_5_3 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -54_ _e_B_e_g_i_n(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const │ │ │ │ │ -55 { │ │ │ │ │ -56 return _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r(eBeginBack(tag)); │ │ │ │ │ -57 } │ │ │ │ │ -58 │ │ │ │ │ -59 template │ │ │ │ │ -60 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ -_6_1 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -62_ _e_E_n_d(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const │ │ │ │ │ -63 { │ │ │ │ │ -64 return _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r(eEndBack(tag)); │ │ │ │ │ -65 } │ │ │ │ │ -66 │ │ │ │ │ -67 // │ │ │ │ │ -68 // The iterators │ │ │ │ │ -69 // │ │ │ │ │ -70 │ │ │ │ │ -71 template │ │ │ │ │ -_7_2 class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l; │ │ │ │ │ -73 │ │ │ │ │ -74 // The iterator for vertices │ │ │ │ │ -75 template │ │ │ │ │ -_7_6 class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ -77 {}; │ │ │ │ │ -78 │ │ │ │ │ -79 // The iterator for elements │ │ │ │ │ -80 template │ │ │ │ │ -_8_1 class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ -82 { │ │ │ │ │ -83 public: │ │ │ │ │ -_8_4 typedef _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -_8_5 typedef typename Refinement::template _C_o_d_i_m_<_0_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _C_o_m_m_o_n; │ │ │ │ │ -_8_6 typedef typename Refinement::IndexVector _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ -87 │ │ │ │ │ -88 _I_n_d_e_x_V_e_c_t_o_r vertexIndices() const; │ │ │ │ │ -89 }; │ │ │ │ │ -90 │ │ │ │ │ -91 template │ │ │ │ │ -92 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ -_0_>_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ -_9_3 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -94_ _v_e_r_t_e_x_I_n_d_i_c_e_s() const │ │ │ │ │ -95 { │ │ │ │ │ -96 return static_cast(this)->backend->vertexIndices(); │ │ │ │ │ -97 } │ │ │ │ │ -98 │ │ │ │ │ -99 // The iterator common stuff │ │ │ │ │ -100 template │ │ │ │ │ -101 template │ │ │ │ │ -_1_0_2 class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t::_C_o_d_i_m:: │ │ │ │ │ -SubEntityIterator │ │ │ │ │ -103 : public ForwardIteratorFacade::template Codim::SubEntityIterator, int>, │ │ │ │ │ -104 public _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ -105 { │ │ │ │ │ -106 public: │ │ │ │ │ -_1_0_7 typedef _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -_1_0_8 typedef typename Refinement::template _C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ -_T_h_i_s; │ │ │ │ │ -_1_0_9 typedef typename Refinement::template _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_c_o_d_i_m_e_n_s_i_o_n_> │ │ │ │ │ -_I_t_e_r_a_t_o_r_B_a_c_k; │ │ │ │ │ -_1_1_0 typedef typename Refinement::CoordVector _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ -111 │ │ │ │ │ -_1_1_2 _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r(_I_t_e_r_a_t_o_r_B_a_c_k *backend); │ │ │ │ │ -_1_1_3 _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r(const _T_h_i_s &other); │ │ │ │ │ -_1_1_4 _~_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r(); │ │ │ │ │ -115 │ │ │ │ │ -_1_1_6 _T_h_i_s &_o_p_e_r_a_t_o_r_=(const _T_h_i_s &other); │ │ │ │ │ -117 │ │ │ │ │ -_1_1_8 bool _e_q_u_a_l_s(const _T_h_i_s &other) const; │ │ │ │ │ -_1_1_9 void _i_n_c_r_e_m_e_n_t(); │ │ │ │ │ -120 │ │ │ │ │ -_1_2_1 int _i_n_d_e_x() const; │ │ │ │ │ -122 │ │ │ │ │ -123 // If you simply use an unqualified CoordVector here g++-4.2 chokes │ │ │ │ │ -124 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_t_e_m_p_l_a_t_e │ │ │ │ │ -_C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r:: │ │ │ │ │ -_1_2_5 CoordVector _c_o_o_r_d_s() const; │ │ │ │ │ -126 private: │ │ │ │ │ -127 friend class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l; │ │ │ │ │ -128 _I_t_e_r_a_t_o_r_B_a_c_k *backend; │ │ │ │ │ -129 }; │ │ │ │ │ -130 │ │ │ │ │ -131#ifndef DOXYGEN │ │ │ │ │ -132 template │ │ │ │ │ -133 template │ │ │ │ │ -134 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_:_: │ │ │ │ │ -135_ _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r(IteratorBack *backend_) │ │ │ │ │ -136 : backend(backend_) │ │ │ │ │ -137 {} │ │ │ │ │ -138 │ │ │ │ │ -139 template │ │ │ │ │ -140 template │ │ │ │ │ -141 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_:_: │ │ │ │ │ -142_ _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r(const This &other) │ │ │ │ │ -143 : backend(other.backend->clone()) │ │ │ │ │ -144 {} │ │ │ │ │ -145 │ │ │ │ │ -146 template │ │ │ │ │ -147 template │ │ │ │ │ -148 VirtualRefinement::Codim:: │ │ │ │ │ -SubEntityIterator:: │ │ │ │ │ -149 ~SubEntityIterator() │ │ │ │ │ -150 { │ │ │ │ │ -151 delete backend; │ │ │ │ │ -152 } │ │ │ │ │ -153 │ │ │ │ │ -154 template │ │ │ │ │ -155 template │ │ │ │ │ -156 typename VirtualRefinement::template │ │ │ │ │ -Codim::SubEntityIterator & │ │ │ │ │ -157 VirtualRefinement::Codim:: │ │ │ │ │ -SubEntityIterator:: │ │ │ │ │ -158 operator=(const This &other) │ │ │ │ │ -159 { │ │ │ │ │ -160 delete backend; │ │ │ │ │ -161 backend = other.backend->clone(); │ │ │ │ │ -162 } │ │ │ │ │ -163 │ │ │ │ │ -164 template │ │ │ │ │ -165 template │ │ │ │ │ -166 bool │ │ │ │ │ -167 VirtualRefinement::Codim:: │ │ │ │ │ -SubEntityIterator:: │ │ │ │ │ -168 equals(const This &other) const │ │ │ │ │ -169 { return *backend == *(other.backend); } │ │ │ │ │ -170 │ │ │ │ │ -171 template │ │ │ │ │ -172 template │ │ │ │ │ -173 void │ │ │ │ │ -174 VirtualRefinement::Codim:: │ │ │ │ │ -SubEntityIterator:: │ │ │ │ │ -175 increment() │ │ │ │ │ -176 { │ │ │ │ │ -177 ++*backend; │ │ │ │ │ -178 } │ │ │ │ │ -179 │ │ │ │ │ -180 template │ │ │ │ │ -181 template │ │ │ │ │ -182 int │ │ │ │ │ -183 VirtualRefinement::Codim:: │ │ │ │ │ -SubEntityIterator:: │ │ │ │ │ -184 index() const │ │ │ │ │ -185 { return backend->index(); } │ │ │ │ │ -186 │ │ │ │ │ -187 template │ │ │ │ │ -188 template │ │ │ │ │ -189 typename VirtualRefinement::template │ │ │ │ │ -Codim::SubEntityIterator::CoordVector │ │ │ │ │ -190 VirtualRefinement::Codim:: │ │ │ │ │ -SubEntityIterator:: │ │ │ │ │ -191 coords() const │ │ │ │ │ -192 { return backend->coords(); } │ │ │ │ │ -193#endif // DOXYGEN │ │ │ │ │ -194 │ │ │ │ │ -195 // │ │ │ │ │ -196 // The iterator backend │ │ │ │ │ -197 // │ │ │ │ │ -198 │ │ │ │ │ -199 template │ │ │ │ │ -_2_0_0 class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l; │ │ │ │ │ -201 │ │ │ │ │ -202 // The iterator backend for vertices │ │ │ │ │ -203 template │ │ │ │ │ -_2_0_4 class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l │ │ │ │ │ -205 { │ │ │ │ │ -206 public: │ │ │ │ │ -207 │ │ │ │ │ -_2_0_8 virtual _~_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l() │ │ │ │ │ -209 {} │ │ │ │ │ -210 }; │ │ │ │ │ -211 │ │ │ │ │ -212 // The iterator backend for elements │ │ │ │ │ -213 template │ │ │ │ │ -_2_1_4 class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l │ │ │ │ │ -215 { │ │ │ │ │ -216 public: │ │ │ │ │ -_2_1_7 typedef _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -_2_1_8 typedef typename Refinement::IndexVector _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ -219 │ │ │ │ │ -_2_2_0 virtual _I_n_d_e_x_V_e_c_t_o_r _v_e_r_t_e_x_I_n_d_i_c_e_s() const = 0; │ │ │ │ │ -221 │ │ │ │ │ -_2_2_2 virtual _~_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l() │ │ │ │ │ -223 {} │ │ │ │ │ -224 }; │ │ │ │ │ -225 │ │ │ │ │ -226 // The iterator backend common stuff │ │ │ │ │ -227 template │ │ │ │ │ -228 template │ │ │ │ │ -_2_2_9 class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t::_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k │ │ │ │ │ -230 : public _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l │ │ │ │ │ -231 { │ │ │ │ │ -232 public: │ │ │ │ │ -_2_3_3 typedef _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -_2_3_4 typedef typename Refinement::template _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_c_o_d_i_m_e_n_s_i_o_n_> │ │ │ │ │ -_T_h_i_s; │ │ │ │ │ -_2_3_5 typedef typename Refinement::CoordVector _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ -236 │ │ │ │ │ -_2_3_7 virtual _~_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k() {} │ │ │ │ │ -238 │ │ │ │ │ -_2_3_9 virtual _T_h_i_s *_c_l_o_n_e() const = 0; │ │ │ │ │ -240 │ │ │ │ │ -_2_4_1 virtual bool _o_p_e_r_a_t_o_r_=_=(const _T_h_i_s &other) const = 0; │ │ │ │ │ -_2_4_2 virtual _T_h_i_s &_o_p_e_r_a_t_o_r_+_+() = 0; │ │ │ │ │ +5#ifndef DUNE_GEOMETRY_REFINEMENT_HH │ │ │ │ │ +6#define DUNE_GEOMETRY_REFINEMENT_HH │ │ │ │ │ +7 │ │ │ │ │ +239// The interface (template<...> class StaticRefinement) is not included here │ │ │ │ │ +240// since it derives from parts which I consider implementation. Look │ │ │ │ │ +241// into refinement/base.cc if the documentation is above is not enough. │ │ │ │ │ +242#include "_r_e_f_i_n_e_m_e_n_t_/_b_a_s_e_._c_c" │ │ │ │ │ 243 │ │ │ │ │ -_2_4_4 virtual int _i_n_d_e_x() const = 0; │ │ │ │ │ -_2_4_5 virtual _C_o_o_r_d_V_e_c_t_o_r _c_o_o_r_d_s() const = 0; │ │ │ │ │ -246 }; │ │ │ │ │ -247 │ │ │ │ │ -248 // ///////////////////////////////////////////////// │ │ │ │ │ -249 // │ │ │ │ │ -250 // The derived classes and their iterator backends │ │ │ │ │ -251 // │ │ │ │ │ -252 │ │ │ │ │ -253 // │ │ │ │ │ -254 // The refinement implementation │ │ │ │ │ -255 // │ │ │ │ │ -256 │ │ │ │ │ -257 template │ │ │ │ │ -_2_5_9 class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ -260 : public _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -261 { │ │ │ │ │ -262 public: │ │ │ │ │ -_2_6_3 typedef _D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_, │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_> _S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -_2_6_4 typedef _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -265 │ │ │ │ │ -266 template │ │ │ │ │ -267 class _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k; │ │ │ │ │ -268 │ │ │ │ │ -269 int nVertices(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const override; │ │ │ │ │ -270 │ │ │ │ │ -271 int nElements(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const override; │ │ │ │ │ -272 │ │ │ │ │ -273 static _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_> │ │ │ │ │ -&instance(); │ │ │ │ │ -274 private: │ │ │ │ │ -275 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p() {} │ │ │ │ │ -276 │ │ │ │ │ -277 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_B_a_c_k *vBeginBack(_D_u_n_e_:_: │ │ │ │ │ -_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const override; │ │ │ │ │ -278 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_B_a_c_k *vEndBack(_D_u_n_e_:_: │ │ │ │ │ -_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const override; │ │ │ │ │ -279 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r_B_a_c_k *eBeginBack(_D_u_n_e_:_: │ │ │ │ │ -_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const override; │ │ │ │ │ -280 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r_B_a_c_k *eEndBack(_D_u_n_e_:_: │ │ │ │ │ -_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const override; │ │ │ │ │ -281 }; │ │ │ │ │ -282 │ │ │ │ │ -283 template │ │ │ │ │ -285 VirtualRefinementImp & │ │ │ │ │ -_2_8_6 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_i_n_s_t_a_n_c_e() │ │ │ │ │ -287 { │ │ │ │ │ -288 static _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p instance_{}; │ │ │ │ │ -289 return instance_; │ │ │ │ │ -290 } │ │ │ │ │ -291 │ │ │ │ │ -292 template │ │ │ │ │ -_2_9_4 int _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -295_ _n_V_e_r_t_i_c_e_s(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const │ │ │ │ │ -296 { │ │ │ │ │ -297 return _S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_n_V_e_r_t_i_c_e_s(tag); │ │ │ │ │ -298 } │ │ │ │ │ -299 │ │ │ │ │ -300 template │ │ │ │ │ -302 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_, │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_>_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_B_a_c_k * │ │ │ │ │ -303 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -304_ _v_B_e_g_i_n_B_a_c_k(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const │ │ │ │ │ -305 { │ │ │ │ │ -306 return new SubEntityIteratorBack(_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_v_B_e_g_i_n(tag)); │ │ │ │ │ -307 } │ │ │ │ │ -308 │ │ │ │ │ -309 template │ │ │ │ │ -311 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_, │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_>_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_B_a_c_k * │ │ │ │ │ -312 VirtualRefinementImp:: │ │ │ │ │ -313 vEndBack(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const │ │ │ │ │ -314 { │ │ │ │ │ -315 return new SubEntityIteratorBack(_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_v_E_n_d(tag)); │ │ │ │ │ -316 } │ │ │ │ │ -317 │ │ │ │ │ -318 template │ │ │ │ │ -_3_2_0 int _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_n_E_l_e_m_e_n_t_s(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const │ │ │ │ │ -321 { │ │ │ │ │ -322 return _S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_n_E_l_e_m_e_n_t_s(tag); │ │ │ │ │ -323 } │ │ │ │ │ -324 │ │ │ │ │ -325 template │ │ │ │ │ -327 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_, │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_>_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r_B_a_c_k * │ │ │ │ │ -328 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -329_ _e_B_e_g_i_n_B_a_c_k(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const │ │ │ │ │ -330 { │ │ │ │ │ -331 return new SubEntityIteratorBack<0>(_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_e_B_e_g_i_n(tag)); │ │ │ │ │ -332 } │ │ │ │ │ -333 │ │ │ │ │ -334 template │ │ │ │ │ -336 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_, │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_>_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r_B_a_c_k * │ │ │ │ │ -337 VirtualRefinementImp:: │ │ │ │ │ -338 eEndBack(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const │ │ │ │ │ -339 { │ │ │ │ │ -340 return new SubEntityIteratorBack<0>(_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_e_E_n_d(tag)); │ │ │ │ │ -341 } │ │ │ │ │ -342 │ │ │ │ │ -343 // │ │ │ │ │ -344 // The iterator backend implementation │ │ │ │ │ -345 // │ │ │ │ │ -346 │ │ │ │ │ -347 // The iterator backend implementation specialties │ │ │ │ │ -348 template │ │ │ │ │ -_3_5_0 class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l; │ │ │ │ │ -351 │ │ │ │ │ -352 // The iterator backend implementation specialties for vertices │ │ │ │ │ -353 template │ │ │ │ │ -_3_5_5 class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l │ │ │ │ │ -356 : public _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t::template │ │ │ │ │ -SubEntityIteratorBack │ │ │ │ │ -357 {}; │ │ │ │ │ -358 │ │ │ │ │ -359 // The iterator backend implementation specialties for elements │ │ │ │ │ -360 │ │ │ │ │ -361 template │ │ │ │ │ -_3_6_3 class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l │ │ │ │ │ -364 : public _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t::template │ │ │ │ │ -SubEntityIteratorBack<0> │ │ │ │ │ -365 { │ │ │ │ │ -366 public: │ │ │ │ │ -_3_6_7 typedef _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_, │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_> _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p; │ │ │ │ │ -_3_6_8 typedef typename VirtualRefinementImp::template SubEntityIteratorBack<0> │ │ │ │ │ -_C_o_m_m_o_n; │ │ │ │ │ -_3_6_9 typedef typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t _S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -_3_7_0 typedef _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t_B_a_s_e; │ │ │ │ │ -_3_7_1 typedef typename RefinementBase::IndexVector _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ -372 │ │ │ │ │ -373 _I_n_d_e_x_V_e_c_t_o_r vertexIndices() const; │ │ │ │ │ -374 }; │ │ │ │ │ -375 │ │ │ │ │ -376 template │ │ │ │ │ -378 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_t_o_p_o_l_o_g_y_I_d_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_,_ _0_>_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ -_3_7_9 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ -_c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_,_ _0_>_:_: │ │ │ │ │ -380_ _v_e_r_t_e_x_I_n_d_i_c_e_s() const │ │ │ │ │ -381 { │ │ │ │ │ -382 _I_n_d_e_x_V_e_c_t_o_r vIndices; │ │ │ │ │ -383 vIndices.reserve(StaticRefinement::IndexVector::dimension); │ │ │ │ │ -384 │ │ │ │ │ -385 typename _S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_I_n_d_e_x_V_e_c_t_o_r sIndices = static_cast(this)->backend.vertexIndices(); │ │ │ │ │ -386 for(int i = 0; i < StaticRefinement::IndexVector::dimension; ++i) │ │ │ │ │ -387 vIndices.push_back(sIndices[i]); │ │ │ │ │ -388 return vIndices; │ │ │ │ │ -389 } │ │ │ │ │ -390 │ │ │ │ │ -391 // The shared iterator backend implementation │ │ │ │ │ -392 template │ │ │ │ │ -394 template │ │ │ │ │ -_3_9_5 class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p:: │ │ │ │ │ -_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k │ │ │ │ │ -396 : public _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l │ │ │ │ │ -397 { │ │ │ │ │ -398 public: │ │ │ │ │ -_3_9_9 typedef typename StaticRefinement::template _C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r; │ │ │ │ │ -_4_0_0 typedef typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_, │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_>_:_:_t_e_m_p_l_a_t_e _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_c_o_d_i_m_e_n_s_i_o_n_> _T_h_i_s; │ │ │ │ │ -_4_0_1 typedef typename VirtualRefinement::template │ │ │ │ │ -_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_c_o_d_i_m_e_n_s_i_o_n_> _B_a_s_e; │ │ │ │ │ -_4_0_2 typedef typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_o_r_d_V_e_c_t_o_r _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ -403 │ │ │ │ │ -404 _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k(const _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r &backend); │ │ │ │ │ -405 _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k(const _T_h_i_s &other); │ │ │ │ │ -406 │ │ │ │ │ -407 _B_a_s_e *clone() const; │ │ │ │ │ -408 │ │ │ │ │ -409 bool operator==(const _B_a_s_e &other) const; │ │ │ │ │ -410 _B_a_s_e &operator++(); │ │ │ │ │ -411 │ │ │ │ │ -412 int index() const; │ │ │ │ │ -_4_1_3 _C_o_o_r_d_V_e_c_t_o_r coords() const; │ │ │ │ │ -414 │ │ │ │ │ -415 private: │ │ │ │ │ -416 friend class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l; │ │ │ │ │ -417 _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r backend; │ │ │ │ │ -418 }; │ │ │ │ │ -419 │ │ │ │ │ -420 template │ │ │ │ │ -422 template │ │ │ │ │ -_4_2_3 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -424_ _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k(const _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r &backend_) │ │ │ │ │ -425 : backend(backend_) │ │ │ │ │ -426 {} │ │ │ │ │ -427 │ │ │ │ │ -428 template │ │ │ │ │ -430 template │ │ │ │ │ -_4_3_1 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -432_ _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k(const _T_h_i_s &other) │ │ │ │ │ -433 : _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l(other), │ │ │ │ │ -434 backend(other.backend) │ │ │ │ │ -435 {} │ │ │ │ │ -436 │ │ │ │ │ -437 template │ │ │ │ │ -438 template │ │ │ │ │ -439 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_, │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_>_:_:_t_e_m_p_l_a_t_e _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_c_o_d_i_m_e_n_s_i_o_n_>_:_:_B_a_s_e * │ │ │ │ │ -_4_4_0 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -441_ _c_l_o_n_e() const │ │ │ │ │ -442 { return new _T_h_i_s(*this); } │ │ │ │ │ -443 │ │ │ │ │ -444 template │ │ │ │ │ -445 template │ │ │ │ │ -446 bool │ │ │ │ │ -_4_4_7 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -448_ _o_p_e_r_a_t_o_r_=_=(const _B_a_s_e &other) const │ │ │ │ │ -449 { │ │ │ │ │ -450 try { │ │ │ │ │ -451 return backend == dynamic_cast(other).backend; │ │ │ │ │ -452 } │ │ │ │ │ -453 catch(const std::bad_cast&) │ │ │ │ │ -454 { │ │ │ │ │ -455 return false; │ │ │ │ │ -456 } │ │ │ │ │ -457 } │ │ │ │ │ -458 │ │ │ │ │ -459 template │ │ │ │ │ -460 template │ │ │ │ │ -461 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_, │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_>_:_:_t_e_m_p_l_a_t_e _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_c_o_d_i_m_e_n_s_i_o_n_>_:_:_B_a_s_e & │ │ │ │ │ -_4_6_2 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -463_ _o_p_e_r_a_t_o_r_+_+() │ │ │ │ │ -464 { │ │ │ │ │ -465 ++backend; │ │ │ │ │ -466 return *this; │ │ │ │ │ -467 } │ │ │ │ │ -468 │ │ │ │ │ -469 template │ │ │ │ │ -470 template │ │ │ │ │ -471 int │ │ │ │ │ -_4_7_2 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -473_ _i_n_d_e_x() const │ │ │ │ │ -474 { return backend.index(); } │ │ │ │ │ -475 │ │ │ │ │ -476 template │ │ │ │ │ -477 template │ │ │ │ │ -478 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_, │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_>_:_:_t_e_m_p_l_a_t_e _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_c_o_d_i_m_e_n_s_i_o_n_>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -_4_7_9 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -480_ _c_o_o_r_d_s() const │ │ │ │ │ -481 { return backend.coords(); } │ │ │ │ │ -482 │ │ │ │ │ -483 // //////////////////////// │ │ │ │ │ -484 // │ │ │ │ │ -485 // The refinement builder │ │ │ │ │ -486 // │ │ │ │ │ -487 │ │ │ │ │ -488 template │ │ │ │ │ -489 class _R_e_f_i_n_e_m_e_n_t_B_u_i_l_d_e_r; │ │ │ │ │ -490 │ │ │ │ │ -501 template │ │ │ │ │ -502 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> & │ │ │ │ │ -_5_0_3 _b_u_i_l_d_R_e_f_i_n_e_m_e_n_t( │ │ │ │ │ -504 _G_e_o_m_e_t_r_y_T_y_p_e geometryType, │ │ │ │ │ -506 _G_e_o_m_e_t_r_y_T_y_p_e coerceTo) │ │ │ │ │ -507 { │ │ │ │ │ -508 // Check that the user used valid geometry types │ │ │ │ │ -509 assert(geometryType._d_i_m() == dimension && coerceTo._d_i_m() == dimension); │ │ │ │ │ -510 return _R_e_f_i_n_e_m_e_n_t_B_u_i_l_d_e_r_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_b_u_i_l_d( geometryType._i_d(), │ │ │ │ │ -coerceTo._i_d() ); │ │ │ │ │ -511 } │ │ │ │ │ -512 │ │ │ │ │ -513 // In principle the trick with the class is no longer necessary, │ │ │ │ │ -514 // but I'm keeping it in here so it will be easier to specialize │ │ │ │ │ -515 // buildRefinement when someone implements pyramids and prisms │ │ │ │ │ -516 template │ │ │ │ │ -_5_1_7 class _R_e_f_i_n_e_m_e_n_t_B_u_i_l_d_e_r │ │ │ │ │ -518 { │ │ │ │ │ -519 public: │ │ │ │ │ -520 static │ │ │ │ │ -521 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> & │ │ │ │ │ -_5_2_2 _b_u_i_l_d(unsigned topologyId, unsigned coerceToId) │ │ │ │ │ -523 { │ │ │ │ │ -524 topologyId &= ~1; │ │ │ │ │ -525 coerceToId &= ~1; │ │ │ │ │ -526 │ │ │ │ │ -527 constexpr unsigned idSimplex = GeometryTypes::simplex(dimension).id() & ~1; │ │ │ │ │ -528 constexpr unsigned idCube = GeometryTypes::cube(dimension).id() & ~1; │ │ │ │ │ -529 │ │ │ │ │ -530 switch( topologyId ) │ │ │ │ │ -531 { │ │ │ │ │ -532 //case GeometryType::simplex: │ │ │ │ │ -533 case idSimplex : │ │ │ │ │ -534 //switch( coerceTo ) │ │ │ │ │ -535 switch( coerceToId ) │ │ │ │ │ -536 { │ │ │ │ │ -537 //case GeometryType::simplex: │ │ │ │ │ -538 case idSimplex : │ │ │ │ │ -539 return _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _i_d_S_i_m_p_l_e_x_,_ _C_o_o_r_d_T_y_p_e_,_ _i_d_S_i_m_p_l_e_x_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_i_n_s_t_a_n_c_e(); │ │ │ │ │ -540 default : │ │ │ │ │ -541 break; │ │ │ │ │ -542 } │ │ │ │ │ -543 break; │ │ │ │ │ -544 │ │ │ │ │ -545 //case GeometryType::cube: │ │ │ │ │ -546 case idCube : │ │ │ │ │ -547 switch( coerceToId ) │ │ │ │ │ -548 { │ │ │ │ │ -549 case idSimplex : │ │ │ │ │ -550 return _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _i_d_C_u_b_e_,_ _C_o_o_r_d_T_y_p_e_,_ _i_d_S_i_m_p_l_e_x_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_i_n_s_t_a_n_c_e(); │ │ │ │ │ -551 case idCube : │ │ │ │ │ -552 return _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _i_d_C_u_b_e_,_ _C_o_o_r_d_T_y_p_e_,_ _i_d_C_u_b_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_i_n_s_t_a_n_c_e(); │ │ │ │ │ -553 default : │ │ │ │ │ -554 break; │ │ │ │ │ -555 } │ │ │ │ │ -556 break; │ │ │ │ │ -557 │ │ │ │ │ -558 default : │ │ │ │ │ -559 break; │ │ │ │ │ -560 } │ │ │ │ │ -561 DUNE_THROW( NotImplemented, "No Refinement<" << topologyId << ", CoordType, │ │ │ │ │ -" │ │ │ │ │ -562 << coerceToId << " >."); │ │ │ │ │ -563 } │ │ │ │ │ -564 }; │ │ │ │ │ -565 │ │ │ │ │ -566 template │ │ │ │ │ -_5_6_7 class _R_e_f_i_n_e_m_e_n_t_B_u_i_l_d_e_r<1, CoordType> │ │ │ │ │ -568 { │ │ │ │ │ -569 static const std::size_t dimension = 1; │ │ │ │ │ -570 public: │ │ │ │ │ -571 static │ │ │ │ │ -572 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> & │ │ │ │ │ -_5_7_3 _b_u_i_l_d(unsigned topologyId, unsigned coerceToId) │ │ │ │ │ -574 { │ │ │ │ │ -575 topologyId &= ~1; │ │ │ │ │ -576 coerceToId &= ~1; │ │ │ │ │ -577 │ │ │ │ │ -578 constexpr unsigned idSimplex = GeometryTypes::simplex(dimension).id() & ~1; │ │ │ │ │ -579 │ │ │ │ │ -580 if (topologyId == 0 && coerceToId == 0) │ │ │ │ │ -581 return _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _i_d_S_i_m_p_l_e_x_,_ _C_o_o_r_d_T_y_p_e_,_ _i_d_S_i_m_p_l_e_x_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_i_n_s_t_a_n_c_e(); │ │ │ │ │ -582 │ │ │ │ │ -583 DUNE_THROW( NotImplemented, "No Refinement<" << topologyId << ", CoordType, │ │ │ │ │ -" │ │ │ │ │ -584 << coerceToId << " >."); │ │ │ │ │ -585 } │ │ │ │ │ -586 }; │ │ │ │ │ -587 │ │ │ │ │ -588 template │ │ │ │ │ -_5_8_9 class _R_e_f_i_n_e_m_e_n_t_B_u_i_l_d_e_r<3, CoordType> │ │ │ │ │ -590 { │ │ │ │ │ -591 static const std::size_t dimension = 3; │ │ │ │ │ -592 public: │ │ │ │ │ -593 static │ │ │ │ │ -594 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> & │ │ │ │ │ -_5_9_5 _b_u_i_l_d(unsigned topologyId, unsigned coerceToId) │ │ │ │ │ -596 { │ │ │ │ │ -597 topologyId &= ~1; │ │ │ │ │ -598 coerceToId &= ~1; │ │ │ │ │ -599 │ │ │ │ │ -600 constexpr unsigned idSimplex = GeometryTypes::simplex(dimension).id() & ~1; │ │ │ │ │ -601 constexpr unsigned idCube = GeometryTypes::cube(dimension).id() & ~1; │ │ │ │ │ -602 constexpr unsigned idPrism = GeometryTypes::prism.id() & ~1; │ │ │ │ │ -603 constexpr unsigned idPyramid = GeometryTypes::pyramid.id() & ~1; │ │ │ │ │ -604 │ │ │ │ │ -605 switch( topologyId ) │ │ │ │ │ -606 { │ │ │ │ │ -607 //case GeometryType::simplex: │ │ │ │ │ -608 case idSimplex : │ │ │ │ │ -609 //switch( coerceTo ) │ │ │ │ │ -610 switch( coerceToId ) │ │ │ │ │ -611 { │ │ │ │ │ -612 //case GeometryType::simplex: │ │ │ │ │ -613 case idSimplex : │ │ │ │ │ -614 return _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _i_d_S_i_m_p_l_e_x_,_ _C_o_o_r_d_T_y_p_e_,_ _i_d_S_i_m_p_l_e_x_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_i_n_s_t_a_n_c_e(); │ │ │ │ │ -615 default : │ │ │ │ │ -616 break; │ │ │ │ │ -617 } │ │ │ │ │ -618 break; │ │ │ │ │ -619 │ │ │ │ │ -620 //case GeometryType::cube: │ │ │ │ │ -621 case idCube : │ │ │ │ │ -622 switch( coerceToId ) │ │ │ │ │ -623 { │ │ │ │ │ -624 case idSimplex : │ │ │ │ │ -625 return _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _i_d_C_u_b_e_,_ _C_o_o_r_d_T_y_p_e_,_ _i_d_S_i_m_p_l_e_x_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_i_n_s_t_a_n_c_e(); │ │ │ │ │ -626 case idCube : │ │ │ │ │ -627 return _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _i_d_C_u_b_e_,_ _C_o_o_r_d_T_y_p_e_,_ _i_d_C_u_b_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_i_n_s_t_a_n_c_e(); │ │ │ │ │ -628 default : │ │ │ │ │ -629 break; │ │ │ │ │ -630 } │ │ │ │ │ -631 break; │ │ │ │ │ -632 │ │ │ │ │ -633 //case GeometryType::prism: │ │ │ │ │ -634 case idPrism : │ │ │ │ │ -635 switch( coerceToId ) │ │ │ │ │ -636 { │ │ │ │ │ -637 case idSimplex : │ │ │ │ │ -638 return _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _i_d_P_r_i_s_m_,_ _C_o_o_r_d_T_y_p_e_,_ _i_d_S_i_m_p_l_e_x_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_i_n_s_t_a_n_c_e(); │ │ │ │ │ -639 default : │ │ │ │ │ -640 break; │ │ │ │ │ -641 } │ │ │ │ │ -642 break; │ │ │ │ │ -643 │ │ │ │ │ -644 //case GeometryType::pyramid: │ │ │ │ │ -645 case idPyramid : │ │ │ │ │ -646 switch( coerceToId ) │ │ │ │ │ -647 { │ │ │ │ │ -648 case idSimplex : │ │ │ │ │ -649 return _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _i_d_P_y_r_a_m_i_d_,_ _C_o_o_r_d_T_y_p_e_,_ _i_d_S_i_m_p_l_e_x_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_i_n_s_t_a_n_c_e(); │ │ │ │ │ -650 default : │ │ │ │ │ -651 break; │ │ │ │ │ -652 } │ │ │ │ │ -653 break; │ │ │ │ │ -654 │ │ │ │ │ -655 default : │ │ │ │ │ -656 break; │ │ │ │ │ -657 } │ │ │ │ │ -658 DUNE_THROW( NotImplemented, "No Refinement<" << topologyId << ", CoordType, │ │ │ │ │ -" │ │ │ │ │ -659 << coerceToId << " >."); │ │ │ │ │ -660 } │ │ │ │ │ -661 }; │ │ │ │ │ -662 │ │ │ │ │ -663} // namespace Dune │ │ │ │ │ -664 │ │ │ │ │ -665#endif // DUNE_GEOMETRY_VIRTUALREFINEMENT_CC │ │ │ │ │ -_r_e_f_i_n_e_m_e_n_t_._h_h │ │ │ │ │ -This file simply includes all Refinement implementations so you don't have to │ │ │ │ │ -do them separately. │ │ │ │ │ -_t_y_p_e_._h_h │ │ │ │ │ -A unique label for each type of element that can occur in a grid. │ │ │ │ │ -_D_u_n_e │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:21 │ │ │ │ │ -_D_u_n_e_:_:_b_u_i_l_d_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -VirtualRefinement< dimension, CoordType > & buildRefinement(GeometryType │ │ │ │ │ -geometryType, GeometryType coerceTo) │ │ │ │ │ -return a reference to the VirtualRefinement according to the parameters │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:503 │ │ │ │ │ -_D_u_n_e_:_:_C_o_d_i_m │ │ │ │ │ -Static tag representing a codimension. │ │ │ │ │ -DDeeffiinniittiioonn dimension.hh:24 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s │ │ │ │ │ -Holds the number of refined intervals per axis needed for virtual and static │ │ │ │ │ -refinement. │ │ │ │ │ -DDeeffiinniittiioonn base.cc:94 │ │ │ │ │ -_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -Wrap each Refinement implementation to get a consistent interface. │ │ │ │ │ -DDeeffiinniittiioonn base.cc:141 │ │ │ │ │ -_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_e_E_n_d │ │ │ │ │ -static ElementIterator eEnd(Dune::RefinementIntervals tag) │ │ │ │ │ -Get an ElementIterator. │ │ │ │ │ -DDeeffiinniittiioonn base.cc:247 │ │ │ │ │ -_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_e_B_e_g_i_n │ │ │ │ │ -static ElementIterator eBegin(Dune::RefinementIntervals tag) │ │ │ │ │ -Get an ElementIterator. │ │ │ │ │ -DDeeffiinniittiioonn base.cc:237 │ │ │ │ │ -_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_n_E_l_e_m_e_n_t_s │ │ │ │ │ -static int nElements(Dune::RefinementIntervals tag) │ │ │ │ │ -Get the number of Elements. │ │ │ │ │ -DDeeffiinniittiioonn base.cc:227 │ │ │ │ │ -_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_n_V_e_r_t_i_c_e_s │ │ │ │ │ -static int nVertices(Dune::RefinementIntervals tag) │ │ │ │ │ -Get the number of Vertices. │ │ │ │ │ -DDeeffiinniittiioonn base.cc:197 │ │ │ │ │ -_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_v_B_e_g_i_n │ │ │ │ │ -static VertexIterator vBegin(Dune::RefinementIntervals tag) │ │ │ │ │ -Get a VertexIterator. │ │ │ │ │ -DDeeffiinniittiioonn base.cc:207 │ │ │ │ │ -_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ -typedef IndexVector │ │ │ │ │ -The IndexVector of the Refinement. │ │ │ │ │ -DDeeffiinniittiioonn base.cc:177 │ │ │ │ │ -_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_v_E_n_d │ │ │ │ │ -static VertexIterator vEnd(Dune::RefinementIntervals tag) │ │ │ │ │ -Get a VertexIterator. │ │ │ │ │ -DDeeffiinniittiioonn base.cc:217 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ -Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:114 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_d_i_m │ │ │ │ │ -constexpr unsigned int dim() const │ │ │ │ │ -Return dimension of the type. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:360 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_d │ │ │ │ │ -constexpr unsigned int id() const │ │ │ │ │ -Return the topology id of the type. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:365 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:72 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_: │ │ │ │ │ -_C_o_m_m_o_n │ │ │ │ │ -Refinement::template Codim< 0 >::SubEntityIterator Common │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:85 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_: │ │ │ │ │ -_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -VirtualRefinement< dimension, CoordType > Refinement │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:84 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_: │ │ │ │ │ -_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ -Refinement::IndexVector IndexVector │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:86 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_c_o_o_r_d_s │ │ │ │ │ -VirtualRefinement< dimension, CoordType >::template Codim< codimension >:: │ │ │ │ │ -SubEntityIterator::CoordVector coords() const │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ -SubEntityIterator(const This &other) │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ -This & operator=(const This &other) │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_i_n_d_e_x │ │ │ │ │ -int index() const │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_~_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ -~SubEntityIterator() │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ -SubEntityIterator(IteratorBack *backend) │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_I_t_e_r_a_t_o_r_B_a_c_k │ │ │ │ │ -Refinement::template SubEntityIteratorBack< codimension > IteratorBack │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:109 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -Refinement::CoordVector CoordVector │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:110 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_T_h_i_s │ │ │ │ │ -Refinement::template Codim< codimension >::SubEntityIterator This │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:108 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_e_q_u_a_l_s │ │ │ │ │ -bool equals(const This &other) const │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -VirtualRefinement< dimension, CoordType > Refinement │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:107 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_i_n_c_r_e_m_e_n_t │ │ │ │ │ -void increment() │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:200 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_ _>_:_:_~_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l │ │ │ │ │ -virtual ~VirtualRefinementSubEntityIteratorBackSpecial() │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:208 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0 │ │ │ │ │ -_>_:_:_v_e_r_t_e_x_I_n_d_i_c_e_s │ │ │ │ │ -virtual IndexVector vertexIndices() const =0 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0 │ │ │ │ │ -_>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -VirtualRefinement< dimension, CoordType > Refinement │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:217 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0 │ │ │ │ │ -_>_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ -Refinement::IndexVector IndexVector │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:218 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0 │ │ │ │ │ -_>_:_:_~_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l │ │ │ │ │ -virtual ~VirtualRefinementSubEntityIteratorBackSpecial() │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:222 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:231 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_:_:_i_n_d_e_x │ │ │ │ │ -virtual int index() const =0 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_:_:_T_h_i_s │ │ │ │ │ -Refinement::template SubEntityIteratorBack< codimension > This │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:234 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_:_:_c_l_o_n_e │ │ │ │ │ -virtual This * clone() const =0 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -Refinement::CoordVector CoordVector │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:235 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -VirtualRefinement< dimension, CoordType > Refinement │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:233 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ -virtual bool operator==(const This &other) const =0 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_:_:_c_o_o_r_d_s │ │ │ │ │ -virtual CoordVector coords() const =0 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_:_:_~_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k │ │ │ │ │ -virtual ~SubEntityIteratorBack() │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:237 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ -virtual This & operator++()=0 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:261 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_n_V_e_r_t_i_c_e_s │ │ │ │ │ -int nVertices(Dune::RefinementIntervals tag) const override │ │ │ │ │ -Get the number of Vertices. │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:295 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_n_E_l_e_m_e_n_t_s │ │ │ │ │ -int nElements(Dune::RefinementIntervals tag) const override │ │ │ │ │ -Get the number of Elements. │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:320 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -Dune::VirtualRefinement< dimension, CoordType > VirtualRefinement │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:264 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_i_n_s_t_a_n_c_e │ │ │ │ │ -static VirtualRefinementImp< topologyId, CoordType, coerceToId, dimension > & │ │ │ │ │ -instance() │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:286 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -Dune::StaticRefinement< topologyId, CoordType, coerceToId, dimension > │ │ │ │ │ -StaticRefinement │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:263 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:397 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_:_:_B_a_s_e │ │ │ │ │ -VirtualRefinement::template SubEntityIteratorBack< codimension > Base │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:401 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_:_:_T_h_i_s │ │ │ │ │ -VirtualRefinementImp< topologyId, CoordType, coerceToId, dimension >::template │ │ │ │ │ -SubEntityIteratorBack< codimension > This │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:400 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_:_:_B_a_c_k_e_n_d_I_t_e_r_a_t_o_r │ │ │ │ │ -StaticRefinement::template Codim< codimension >::SubEntityIterator │ │ │ │ │ -BackendIterator │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:399 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -VirtualRefinement::CoordVector CoordVector │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:402 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:350 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_ _t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ -_c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_,_ _0_ _>_:_:_C_o_m_m_o_n │ │ │ │ │ -VirtualRefinementImp::template SubEntityIteratorBack< 0 > Common │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:368 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_ _t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ -_c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_,_ _0_ _>_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ -RefinementBase::IndexVector IndexVector │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:371 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_ _t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ -_c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_,_ _0_ _>_:_:_R_e_f_i_n_e_m_e_n_t_B_a_s_e │ │ │ │ │ -VirtualRefinement< dimension, CoordType > RefinementBase │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:370 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_ _t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ -_c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_,_ _0_ _>_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ -Dune::VirtualRefinementImp< topologyId, CoordType, coerceToId, dimension > │ │ │ │ │ -VirtualRefinementImp │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:367 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_ _t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ -_c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_,_ _0_ _>_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -VirtualRefinementImp::StaticRefinement StaticRefinement │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:369 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_B_u_i_l_d_e_r │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:518 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_B_u_i_l_d_e_r_:_:_b_u_i_l_d │ │ │ │ │ -static VirtualRefinement< dimension, CoordType > & build(unsigned topologyId, │ │ │ │ │ -unsigned coerceToId) │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:522 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_B_u_i_l_d_e_r_<_ _1_,_ _C_o_o_r_d_T_y_p_e_ _>_:_:_b_u_i_l_d │ │ │ │ │ -static VirtualRefinement< dimension, CoordType > & build(unsigned topologyId, │ │ │ │ │ -unsigned coerceToId) │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:573 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_B_u_i_l_d_e_r_<_ _3_,_ _C_o_o_r_d_T_y_p_e_ _>_:_:_b_u_i_l_d │ │ │ │ │ -static VirtualRefinement< dimension, CoordType > & build(unsigned topologyId, │ │ │ │ │ -unsigned coerceToId) │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:595 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -VirtualRefinement base class. │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.hh:283 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_B_a_c_k │ │ │ │ │ -SubEntityIteratorBack< dimension > VertexIteratorBack │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.hh:307 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_v_B_e_g_i_n │ │ │ │ │ -VertexIterator vBegin(Dune::RefinementIntervals tag) const │ │ │ │ │ -Get an VertexIterator. │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:38 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_e_B_e_g_i_n │ │ │ │ │ -ElementIterator eBegin(Dune::RefinementIntervals tag) const │ │ │ │ │ -Get an ElementIterator. │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:54 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_e_E_n_d │ │ │ │ │ -ElementIterator eEnd(Dune::RefinementIntervals tag) const │ │ │ │ │ -Get an ElementIterator. │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:62 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ -Codim< 0 >::SubEntityIterator ElementIterator │ │ │ │ │ -The ElementIterator of the VirtualRefinement. │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.hh:290 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_v_E_n_d │ │ │ │ │ -VertexIterator vEnd(Dune::RefinementIntervals tag) const │ │ │ │ │ -Get an VertexIterator. │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:46 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -FieldVector< CoordType, dimension > CoordVector │ │ │ │ │ -The CoordVector of the VirtualRefinement. │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.hh:297 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ -Codim< dimension >::SubEntityIterator VertexIterator │ │ │ │ │ -The VertexIterator of the VirtualRefinement. │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.hh:288 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r_B_a_c_k │ │ │ │ │ -SubEntityIteratorBack< 0 > ElementIteratorBack │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.hh:308 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m │ │ │ │ │ -codim database of VirtualRefinement │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.hh:367 │ │ │ │ │ +244#include "_r_e_f_i_n_e_m_e_n_t_/_h_c_u_b_e_._c_c" │ │ │ │ │ +245#include "_r_e_f_i_n_e_m_e_n_t_/_s_i_m_p_l_e_x_._c_c" │ │ │ │ │ +246#include "_r_e_f_i_n_e_m_e_n_t_/_h_c_u_b_e_t_r_i_a_n_g_u_l_a_t_i_o_n_._c_c" │ │ │ │ │ +247#include "_r_e_f_i_n_e_m_e_n_t_/_p_r_i_s_m_t_r_i_a_n_g_u_l_a_t_i_o_n_._c_c" │ │ │ │ │ +248#include "_r_e_f_i_n_e_m_e_n_t_/_p_y_r_a_m_i_d_t_r_i_a_n_g_u_l_a_t_i_o_n_._c_c" │ │ │ │ │ +249 │ │ │ │ │ +250#endif // DUNE_GEOMETRY_REFINEMENT_HH │ │ │ │ │ +_h_c_u_b_e_._c_c │ │ │ │ │ +This file contains the Refinement implementation for hypercubes │ │ │ │ │ +(quadrilaterals, hexahedrons,... │ │ │ │ │ +_p_r_i_s_m_t_r_i_a_n_g_u_l_a_t_i_o_n_._c_c │ │ │ │ │ +_b_a_s_e_._c_c │ │ │ │ │ +This file contains the parts independent of a particular Refinement │ │ │ │ │ +implementation. │ │ │ │ │ +_s_i_m_p_l_e_x_._c_c │ │ │ │ │ +This file contains the Refinement implementation for simplices (triangles, │ │ │ │ │ +tetrahedrons.... │ │ │ │ │ +_h_c_u_b_e_t_r_i_a_n_g_u_l_a_t_i_o_n_._c_c │ │ │ │ │ +This file contains the Refinement implementation for triangulating hypercubes │ │ │ │ │ +(quadrilateral -> trian... │ │ │ │ │ +_p_y_r_a_m_i_d_t_r_i_a_n_g_u_l_a_t_i_o_n_._c_c │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00173.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: convergence.hh File Reference │ │ │ │ +dune-geometry: localfiniteelementgeometry.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,32 +65,69 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Namespaces
│ │ │ │ -
convergence.hh File Reference
│ │ │ │ +Classes | │ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
localfiniteelementgeometry.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <cmath>
│ │ │ │ +
#include <cassert>
│ │ │ │ +#include <functional>
│ │ │ │ #include <limits>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <vector>
│ │ │ │ +#include <dune/common/fmatrix.hh>
│ │ │ │ +#include <dune/common/fvector.hh>
│ │ │ │ +#include <dune/common/math.hh>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │ +#include <dune/common/std/type_traits.hh>
│ │ │ │ +#include <dune/geometry/affinegeometry.hh>
│ │ │ │ +#include <dune/geometry/quadraturerules.hh>
│ │ │ │ +#include <dune/geometry/referenceelements.hh>
│ │ │ │ +#include <dune/geometry/type.hh>
│ │ │ │ +#include <dune/geometry/utility/algorithms.hh>
│ │ │ │ +#include <dune/geometry/utility/convergence.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ +Classes

class  Dune::LocalFiniteElementGeometry< LFE, cdim >
 Geometry implementation based on local-basis function parametrization. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

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

│ │ │ │ +Functions

template<class I , class LFE , class GlobalCoordinate >
 Dune::LocalFiniteElementGeometry (Geo::ReferenceElement< I >, const LFE &, std::vector< GlobalCoordinate >) -> LocalFiniteElementGeometry< LFE, GlobalCoordinate::dimension >
 
template<class I , class LFE , class F , class Range = std::invoke_result_t<F,Impl::LocalCoordinate_t<LFE>>>
 Dune::LocalFiniteElementGeometry (Geo::ReferenceElement< I >, const LFE &, const F &) -> LocalFiniteElementGeometry< LFE, Range::dimension >
 
template<class LFE , class GlobalCoordinate >
 Dune::LocalFiniteElementGeometry (GeometryType, const LFE &localFE, std::vector< GlobalCoordinate >) -> LocalFiniteElementGeometry< LFE, GlobalCoordinate::dimension >
 
template<class LFE , class F , class Range = std::invoke_result_t<F,Impl::LocalCoordinate_t<LFE>>>
 Dune::LocalFiniteElementGeometry (GeometryType, const LFE &, const F &) -> LocalFiniteElementGeometry< LFE, Range::dimension >
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,17 +1,56 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ - * _u_t_i_l_i_t_y │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -convergence.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +localfiniteelementgeometry.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_a_f_f_i_n_e_g_e_o_m_e_t_r_y_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_q_u_a_d_r_a_t_u_r_e_r_u_l_e_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_u_t_i_l_i_t_y_/_a_l_g_o_r_i_t_h_m_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_u_t_i_l_i_t_y_/_c_o_n_v_e_r_g_e_n_c_e_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +class   _D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_<_ _L_F_E_,_ _c_d_i_m_ _> │ │ │ │ │ +  Geometry implementation based on local-basis function parametrization. │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +  _D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y (_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t< I >, const LFE &, │ │ │ │ │ + std::vector< GlobalCoordinate >) -> _L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y< LFE, │ │ │ │ │ + GlobalCoordinate::dimension > │ │ │ │ │ +  │ │ │ │ │ +template>> │ │ │ │ │ +  _D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y (_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t< I >, const LFE &, │ │ │ │ │ + const F &) -> _L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y< LFE, Range::dimension > │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +  _D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y (_G_e_o_m_e_t_r_y_T_y_p_e, const LFE &localFE, std:: │ │ │ │ │ + vector< GlobalCoordinate >) -> _L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y< LFE, │ │ │ │ │ + GlobalCoordinate::dimension > │ │ │ │ │ +  │ │ │ │ │ +template>> │ │ │ │ │ +  _D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y (_G_e_o_m_e_t_r_y_T_y_p_e, const LFE &, const F &) - │ │ │ │ │ + > _L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y< LFE, Range::dimension > │ │ │ │ │ +  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00173_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: convergence.hh Source File │ │ │ │ +dune-geometry: localfiniteelementgeometry.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,44 +70,439 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
convergence.hh
│ │ │ │ +
localfiniteelementgeometry.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 © 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_UTILITY_CONVERGENCE_HH
│ │ │ │ -
6#define DUNE_GEOMETRY_UTILITY_CONVERGENCE_HH
│ │ │ │ +
5#ifndef DUNE_GEOMETRY_LOCALFINITEELEMENTGEOMETRY_HH
│ │ │ │ +
6#define DUNE_GEOMETRY_LOCALFINITEELEMENTGEOMETRY_HH
│ │ │ │
7
│ │ │ │ -
8#include <cmath>
│ │ │ │ -
9#include <limits>
│ │ │ │ -
10
│ │ │ │ -
11namespace Dune::Impl {
│ │ │ │ -
12
│ │ │ │ -
13template <class R = double>
│ │ │ │ -
14struct ConvergenceOptions
│ │ │ │ -
15{
│ │ │ │ -
17 int maxIt = 100;
│ │ │ │ -
18
│ │ │ │ -
20 R absTol = []{ using std::sqrt; return sqrt(std::numeric_limits<R>::epsilon()); }();
│ │ │ │ -
21};
│ │ │ │ -
22
│ │ │ │ -
23} // end namespace Dune::Impl
│ │ │ │ -
24
│ │ │ │ -
25#endif // DUNE_GEOMETRY_UTILITY_CONVERGENCE_HH
│ │ │ │ +
8#include <cassert>
│ │ │ │ +
9#include <functional>
│ │ │ │ +
10#include <limits>
│ │ │ │ +
11#include <type_traits>
│ │ │ │ +
12#include <vector>
│ │ │ │ +
13
│ │ │ │ +
14#include <dune/common/fmatrix.hh>
│ │ │ │ +
15#include <dune/common/fvector.hh>
│ │ │ │ +
16#include <dune/common/math.hh>
│ │ │ │ +
17#include <dune/common/typetraits.hh>
│ │ │ │ +
18#include <dune/common/std/type_traits.hh>
│ │ │ │ +
19
│ │ │ │ +
20#include <dune/geometry/affinegeometry.hh> // for FieldMatrixHelper
│ │ │ │ + │ │ │ │ + │ │ │ │ +
23#include <dune/geometry/type.hh>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
26
│ │ │ │ +
27namespace Dune {
│ │ │ │ +
28
│ │ │ │ +
38template <class LFE, int cdim>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
40{
│ │ │ │ +
41 using LocalFiniteElement = LFE;
│ │ │ │ +
42 using LocalBasis = typename LFE::Traits::LocalBasisType;
│ │ │ │ +
43 using LocalBasisTraits = typename LocalBasis::Traits;
│ │ │ │ +
44
│ │ │ │ +
45public:
│ │ │ │ +
47 using ctype = typename LocalBasisTraits::DomainFieldType;
│ │ │ │ +
48
│ │ │ │ +
50 static const int mydimension = LocalBasisTraits::dimDomain;
│ │ │ │ +
51
│ │ │ │ +
53 static const int coorddimension = cdim;
│ │ │ │ +
54
│ │ │ │ +
56 using LocalCoordinate = FieldVector<ctype, mydimension>;
│ │ │ │ +
57
│ │ │ │ +
59 using GlobalCoordinate = FieldVector<ctype, coorddimension>;
│ │ │ │ +
60
│ │ │ │ +
62 using Volume = decltype(power(std::declval<ctype>(),mydimension));
│ │ │ │ +
63
│ │ │ │ +
65 using Jacobian = FieldMatrix<ctype, coorddimension, mydimension>;
│ │ │ │ +
66
│ │ │ │ +
68 using JacobianTransposed = FieldMatrix<ctype, mydimension, coorddimension>;
│ │ │ │ +
69
│ │ │ │ +
71 using JacobianInverse = FieldMatrix<ctype, mydimension, coorddimension>;
│ │ │ │ +
72
│ │ │ │ +
74 using JacobianInverseTransposed = FieldMatrix<ctype, coorddimension, mydimension>;
│ │ │ │ +
75
│ │ │ │ +
76public:
│ │ │ │ + │ │ │ │ + │ │ │ │ +
80
│ │ │ │ +
81protected:
│ │ │ │ +
82 using MatrixHelper = Impl::FieldMatrixHelper<ctype>;
│ │ │ │ +
83
│ │ │ │ +
84public:
│ │ │ │ + │ │ │ │ +
87
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
104 const LocalFiniteElement& localFE,
│ │ │ │ +
105 std::vector<GlobalCoordinate> vertices)
│ │ │ │ +
106 : refElement_(refElement)
│ │ │ │ +
107 , localFE_(localFE)
│ │ │ │ +
108 , vertices_(std::move(vertices))
│ │ │ │ +
109 {
│ │ │ │ +
110 assert(localFE_.size() == vertices_.size());
│ │ │ │ +
111 }
│ │ │ │ +
│ │ │ │ +
112
│ │ │ │ +
126 template <class Param,
│ │ │ │ +
127 std::enable_if_t<std::is_invocable_r_v<GlobalCoordinate,Param,LocalCoordinate>, int> = 0>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
129 const LocalFiniteElement& localFE,
│ │ │ │ +
130 Param&& parametrization)
│ │ │ │ +
131 : refElement_(refElement)
│ │ │ │ +
132 , localFE_(localFE)
│ │ │ │ +
133 {
│ │ │ │ +
134 localFE_.localInterpolation().interpolate(parametrization, vertices_);
│ │ │ │ +
135 }
│ │ │ │ +
│ │ │ │ +
136
│ │ │ │ +
143 template <class... Args>
│ │ │ │ +
│ │ │ │ +
144 explicit LocalFiniteElementGeometry (GeometryType gt, Args&&... args)
│ │ │ │ +
145 : LocalFiniteElementGeometry(ReferenceElements::general(gt), std::forward<Args>(args)...)
│ │ │ │ +
146 {}
│ │ │ │ +
│ │ │ │ +
147
│ │ │ │ +
│ │ │ │ +
149 int order () const
│ │ │ │ +
150 {
│ │ │ │ +
151 return localBasis().order();
│ │ │ │ +
152 }
│ │ │ │ +
│ │ │ │ +
153
│ │ │ │ +
│ │ │ │ +
159 bool affine () const
│ │ │ │ +
160 {
│ │ │ │ +
161 if (!affine_)
│ │ │ │ +
162 affine_.emplace(affineImpl());
│ │ │ │ +
163 return *affine_;
│ │ │ │ +
164 }
│ │ │ │ +
│ │ │ │ +
165
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
168 {
│ │ │ │ +
169 return refElement_.type();
│ │ │ │ +
170 }
│ │ │ │ +
│ │ │ │ +
171
│ │ │ │ +
│ │ │ │ +
173 int corners () const
│ │ │ │ +
174 {
│ │ │ │ +
175 return refElement_.size(mydimension);
│ │ │ │ +
176 }
│ │ │ │ +
│ │ │ │ +
177
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
180 {
│ │ │ │ +
181 assert( (i >= 0) && (i < corners()) );
│ │ │ │ +
182 return global(refElement_.position(i, mydimension));
│ │ │ │ +
183 }
│ │ │ │ +
│ │ │ │ +
184
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
187 {
│ │ │ │ +
188 return global(refElement_.position(0, 0));
│ │ │ │ +
189 }
│ │ │ │ +
│ │ │ │ +
190
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
203 {
│ │ │ │ +
204 thread_local std::vector<typename LocalBasisTraits::RangeType> shapeValues;
│ │ │ │ +
205 localBasis().evaluateFunction(local, shapeValues);
│ │ │ │ +
206 assert(shapeValues.size() == vertices_.size());
│ │ │ │ +
207
│ │ │ │ +
208 GlobalCoordinate out(0);
│ │ │ │ +
209 for (std::size_t i = 0; i < shapeValues.size(); ++i)
│ │ │ │ +
210 out.axpy(shapeValues[i], vertices_[i]);
│ │ │ │ +
211
│ │ │ │ +
212 return out;
│ │ │ │ +
213 }
│ │ │ │ +
│ │ │ │ +
214
│ │ │ │ +
│ │ │ │ +
232 LocalCoordinate local (const GlobalCoordinate& y, Impl::GaussNewtonOptions<ctype> opts = {}) const
│ │ │ │ +
233 {
│ │ │ │ +
234 LocalCoordinate x = refElement_.position(0,0);
│ │ │ │ +
235 Impl::GaussNewtonErrorCode err = Impl::gaussNewton(
│ │ │ │ +
236 [&](const LocalCoordinate& local) { return this->global(local); },
│ │ │ │ +
237 [&](const LocalCoordinate& local) { return this->jacobianTransposed(local); },
│ │ │ │ +
238 y, x, opts
│ │ │ │ +
239 );
│ │ │ │ +
240
│ │ │ │ +
241 if (err != Impl::GaussNewtonErrorCode::OK)
│ │ │ │ +
242 DUNE_THROW(Dune::Exception,
│ │ │ │ +
243 "Local coordinate can not be recovered from global coordinate, error code = " << int(err) << "\n"
│ │ │ │ +
244 << " (global(x) - y).two_norm() = " << (global(x) - y).two_norm()
│ │ │ │ +
245 << " > tol = " << opts.absTol);
│ │ │ │ +
246
│ │ │ │ +
247 return x;
│ │ │ │ +
248 }
│ │ │ │ +
│ │ │ │ +
249
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
261 {
│ │ │ │ +
262 return MatrixHelper::sqrtDetAAT(jacobianTransposed(local));
│ │ │ │ +
263 }
│ │ │ │ +
│ │ │ │ +
264
│ │ │ │ +
│ │ │ │ +
276 Volume volume (Impl::ConvergenceOptions<ctype> opts = {}) const
│ │ │ │ +
277 {
│ │ │ │ + │ │ │ │ +
279 if (affine())
│ │ │ │ +
280 return vol0;
│ │ │ │ +
281
│ │ │ │ +
282 using std::abs;
│ │ │ │ +
283 for (int p = 2; p < opts.maxIt; ++p) {
│ │ │ │ + │ │ │ │ +
285 if (abs(vol1 - vol0) < opts.absTol)
│ │ │ │ +
286 return vol1;
│ │ │ │ +
287
│ │ │ │ +
288 vol0 = vol1;
│ │ │ │ +
289 }
│ │ │ │ +
290 return vol0;
│ │ │ │ +
291 }
│ │ │ │ +
│ │ │ │ +
292
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
295 {
│ │ │ │ +
296 Volume vol(0);
│ │ │ │ +
297 for (const auto& qp : quadRule)
│ │ │ │ +
298 vol += integrationElement(qp.position()) * qp.weight();
│ │ │ │ +
299 return vol;
│ │ │ │ +
300 }
│ │ │ │ +
│ │ │ │ +
301
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
308 {
│ │ │ │ +
309 thread_local std::vector<typename LocalBasisTraits::JacobianType> shapeJacobians;
│ │ │ │ +
310 localBasis().evaluateJacobian(local, shapeJacobians);
│ │ │ │ +
311 assert(shapeJacobians.size() == vertices_.size());
│ │ │ │ +
312
│ │ │ │ +
313 Jacobian out(0);
│ │ │ │ +
314 for (std::size_t i = 0; i < shapeJacobians.size(); ++i) {
│ │ │ │ +
315 for (int j = 0; j < Jacobian::rows; ++j) {
│ │ │ │ +
316 shapeJacobians[i].umtv(vertices_[i][j], out[j]);
│ │ │ │ +
317 }
│ │ │ │ +
318 }
│ │ │ │ +
319 return out;
│ │ │ │ +
320 }
│ │ │ │ +
│ │ │ │ +
321
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
328 {
│ │ │ │ +
329 return jacobian(local).transposed();
│ │ │ │ +
330 }
│ │ │ │ +
│ │ │ │ +
331
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
340 {
│ │ │ │ +
341 JacobianInverse out;
│ │ │ │ +
342 MatrixHelper::leftInvA(jacobian(local), out);
│ │ │ │ +
343 return out;
│ │ │ │ +
344 }
│ │ │ │ +
│ │ │ │ +
345
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
354 {
│ │ │ │ +
355 return jacobianInverse(local).transposed();
│ │ │ │ +
356 }
│ │ │ │ +
│ │ │ │ +
357
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
360 {
│ │ │ │ +
361 return geometry.refElement_;
│ │ │ │ +
362 }
│ │ │ │ +
│ │ │ │ +
363
│ │ │ │ +
│ │ │ │ +
365 const LocalFiniteElement& finiteElement () const
│ │ │ │ +
366 {
│ │ │ │ +
367 return localFE_;
│ │ │ │ +
368 }
│ │ │ │ +
│ │ │ │ +
369
│ │ │ │ +
│ │ │ │ +
371 const std::vector<GlobalCoordinate>& coefficients () const
│ │ │ │ +
372 {
│ │ │ │ +
373 return vertices_;
│ │ │ │ +
374 }
│ │ │ │ +
│ │ │ │ +
375
│ │ │ │ +
│ │ │ │ +
377 const LocalBasis& localBasis () const
│ │ │ │ +
378 {
│ │ │ │ +
379 return localFE_.localBasis();
│ │ │ │ +
380 }
│ │ │ │ +
│ │ │ │ +
381
│ │ │ │ +
382private:
│ │ │ │ +
383
│ │ │ │ +
384 bool affineImpl () const
│ │ │ │ +
385 {
│ │ │ │ +
386 if constexpr(mydimension == 0)
│ │ │ │ +
387 // point geometries are always affine mappings
│ │ │ │ +
388 return true;
│ │ │ │ +
389 else {
│ │ │ │ +
390 if (order() > 1)
│ │ │ │ +
391 // higher-order parametrizations are by definition not affine
│ │ │ │ +
392 return false;
│ │ │ │ +
393 if constexpr(mydimension == 1)
│ │ │ │ +
394 // linear line geometries are affine mappings
│ │ │ │ +
395 return true;
│ │ │ │ +
396 else {
│ │ │ │ +
397 if (type().isSimplex())
│ │ │ │ +
398 // linear simplex geometries are affine mappings
│ │ │ │ +
399 return true;
│ │ │ │ +
400
│ │ │ │ +
401 // multi-linear mappings on non-simplex geometries might be affine
│ │ │ │ +
402 // as well. This is tested explicitly for all vertices by constructing
│ │ │ │ +
403 // an affine mapping from dim+1 affine-independent corners and evaluating
│ │ │ │ +
404 // at the other corners.
│ │ │ │ +
405 auto refSimplex = referenceElement<ctype,mydimension>(GeometryTypes::simplex(mydimension));
│ │ │ │ +
406 auto simplexIndices = Dune::range(refSimplex.size(mydimension));
│ │ │ │ +
407 auto simplexCorners = Dune::transformedRangeView(simplexIndices,
│ │ │ │ +
408 [&](int i) { return this->global(refSimplex.position(i,mydimension)); });
│ │ │ │ +
409 AffineGeometry<ctype,mydimension,coorddimension> affineGeo(refSimplex,simplexCorners);
│ │ │ │ +
410 using std::sqrt;
│ │ │ │ +
411 const ctype tol = sqrt(std::numeric_limits<ctype>::epsilon());
│ │ │ │ +
412 for (int i = 0; i < corners(); ++i) {
│ │ │ │ +
413 const auto corner = refElement_.position(i,mydimension);
│ │ │ │ +
414 if ((affineGeo.global(corner) - global(corner)).two_norm() > tol)
│ │ │ │ +
415 return false;
│ │ │ │ +
416 }
│ │ │ │ +
417 return true;
│ │ │ │ +
418 }
│ │ │ │ +
419 }
│ │ │ │ +
420 }
│ │ │ │ +
421
│ │ │ │ +
422private:
│ │ │ │ +
424 ReferenceElement refElement_{};
│ │ │ │ +
425
│ │ │ │ +
427 LocalFiniteElement localFE_{};
│ │ │ │ +
428
│ │ │ │ +
430 std::vector<GlobalCoordinate> vertices_{};
│ │ │ │ +
431
│ │ │ │ +
432 mutable std::optional<bool> affine_ = std::nullopt;
│ │ │ │ +
433};
│ │ │ │ +
│ │ │ │ +
434
│ │ │ │ +
435namespace Impl {
│ │ │ │ +
436
│ │ │ │ +
437// extract the LocalCoordinate type from a LocalFiniteElement
│ │ │ │ +
438template <class LFE>
│ │ │ │ +
439using LocalCoordinate_t
│ │ │ │ +
440 = FieldVector<typename LFE::Traits::LocalBasisType::Traits::DomainFieldType,
│ │ │ │ +
441 LFE::Traits::LocalBasisType::Traits::dimDomain>;
│ │ │ │ +
442
│ │ │ │ +
443} // end namespace Impl
│ │ │ │ +
444
│ │ │ │ +
445
│ │ │ │ +
446// deduction guides
│ │ │ │ +
447template <class I, class LFE, class GlobalCoordinate>
│ │ │ │ +
448LocalFiniteElementGeometry (Geo::ReferenceElement<I>, const LFE&, std::vector<GlobalCoordinate>)
│ │ │ │ + │ │ │ │ +
450
│ │ │ │ +
451template <class I, class LFE, class F,
│ │ │ │ +
452 class Range = std::invoke_result_t<F,Impl::LocalCoordinate_t<LFE>>>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
455
│ │ │ │ +
456template <class LFE, class GlobalCoordinate>
│ │ │ │ +
457LocalFiniteElementGeometry (GeometryType, const LFE& localFE, std::vector<GlobalCoordinate>)
│ │ │ │ + │ │ │ │ +
459
│ │ │ │ +
460template <class LFE, class F,
│ │ │ │ +
461 class Range = std::invoke_result_t<F,Impl::LocalCoordinate_t<LFE>>>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
464
│ │ │ │ +
465} // namespace Dune
│ │ │ │ +
466
│ │ │ │ +
467#endif // DUNE_GEOMETRY_LOCALFINITEELEMENTGEOMETRY_HH
│ │ │ │ +
A unique label for each type of element that can occur in a grid.
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
An implementation of the Geometry interface for affine geometries.
│ │ │ │ +
STL namespace.
│ │ │ │ +
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:128
│ │ │ │ +
typename Container::ReferenceElement ReferenceElement
The reference element type.
Definition referenceelements.hh:146
│ │ │ │ +
Geometry implementation based on local-basis function parametrization.
Definition localfiniteelementgeometry.hh:40
│ │ │ │ +
GeometryType type() const
Obtain the name of the reference element.
Definition localfiniteelementgeometry.hh:167
│ │ │ │ +
decltype(power(std::declval< ctype >(), mydimension)) Volume
type of volume
Definition localfiniteelementgeometry.hh:62
│ │ │ │ +
LocalCoordinate local(const GlobalCoordinate &y, Impl::GaussNewtonOptions< ctype > opts={}) const
Evaluate the inverse coordinate mapping.
Definition localfiniteelementgeometry.hh:232
│ │ │ │ +
LocalFiniteElementGeometry(const ReferenceElement &refElement, const LocalFiniteElement &localFE, std::vector< GlobalCoordinate > vertices)
Constructor from a vector of coefficients of the LocalBasis parametrizing the geometry.
Definition localfiniteelementgeometry.hh:103
│ │ │ │ +
JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const
Obtain the transposed of the Jacobian.
Definition localfiniteelementgeometry.hh:327
│ │ │ │ +
const LocalBasis & localBasis() const
The local basis of the stored local finite-element.
Definition localfiniteelementgeometry.hh:377
│ │ │ │ +
typename LocalBasisTraits::DomainFieldType ctype
coordinate type
Definition localfiniteelementgeometry.hh:47
│ │ │ │ +
JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate &local) const
Obtain the transposed of the Jacobian's inverse.
Definition localfiniteelementgeometry.hh:353
│ │ │ │ +
friend ReferenceElement referenceElement(const LocalFiniteElementGeometry &geometry)
Obtain the reference-element related to this geometry.
Definition localfiniteelementgeometry.hh:359
│ │ │ │ +
LocalFiniteElementGeometry()=default
Default constructed geometry results in an empty/invalid representation.
│ │ │ │ +
bool affine() const
Is this mapping affine? Geometries of order 1 might be affine, but it needs to be checked on non-simp...
Definition localfiniteelementgeometry.hh:159
│ │ │ │ +
Jacobian jacobian(const LocalCoordinate &local) const
Obtain the Jacobian.
Definition localfiniteelementgeometry.hh:307
│ │ │ │ +
Volume volume(const QuadratureRule< ctype, mydimension > &quadRule) const
Obtain the volume of the mapping's image by given quadrature rules.
Definition localfiniteelementgeometry.hh:294
│ │ │ │ +
const std::vector< GlobalCoordinate > & coefficients() const
Obtain the coefficients of the parametrization.
Definition localfiniteelementgeometry.hh:371
│ │ │ │ +
LocalFiniteElementGeometry(GeometryType gt, Args &&... args)
Constructor, forwarding to the other constructors that take a reference-element.
Definition localfiniteelementgeometry.hh:144
│ │ │ │ +
static const int coorddimension
coordinate dimension
Definition localfiniteelementgeometry.hh:53
│ │ │ │ +
int corners() const
Obtain number of corners of the corresponding reference element.
Definition localfiniteelementgeometry.hh:173
│ │ │ │ +
GlobalCoordinate center() const
Obtain the centroid of the mapping's image.
Definition localfiniteelementgeometry.hh:186
│ │ │ │ +
const LocalFiniteElement & finiteElement() const
Obtain the local finite-element.
Definition localfiniteelementgeometry.hh:365
│ │ │ │ +
GlobalCoordinate global(const LocalCoordinate &local) const
Evaluate the coordinate mapping.
Definition localfiniteelementgeometry.hh:202
│ │ │ │ +
Impl::FieldMatrixHelper< ctype > MatrixHelper
Definition localfiniteelementgeometry.hh:82
│ │ │ │ +
typename ReferenceElements::ReferenceElement ReferenceElement
Definition localfiniteelementgeometry.hh:79
│ │ │ │ +
GlobalCoordinate corner(int i) const
Obtain coordinates of the i-th corner.
Definition localfiniteelementgeometry.hh:179
│ │ │ │ +
Volume volume(Impl::ConvergenceOptions< ctype > opts={}) const
Obtain the volume of the mapping's image.
Definition localfiniteelementgeometry.hh:276
│ │ │ │ +
static const int mydimension
geometry dimension
Definition localfiniteelementgeometry.hh:50
│ │ │ │ +
JacobianInverse jacobianInverse(const LocalCoordinate &local) const
Obtain the Jacobian's inverse.
Definition localfiniteelementgeometry.hh:339
│ │ │ │ +
FieldVector< ctype, coorddimension > GlobalCoordinate
type of global coordinates
Definition localfiniteelementgeometry.hh:59
│ │ │ │ +
FieldMatrix< ctype, coorddimension, mydimension > Jacobian
type of jacobian
Definition localfiniteelementgeometry.hh:65
│ │ │ │ +
FieldMatrix< ctype, coorddimension, mydimension > JacobianInverseTransposed
type of jacobian inverse transposed
Definition localfiniteelementgeometry.hh:74
│ │ │ │ +
FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse
type of jacobian inverse
Definition localfiniteelementgeometry.hh:71
│ │ │ │ +
ctype integrationElement(const LocalCoordinate &local) const
Obtain the integration element.
Definition localfiniteelementgeometry.hh:260
│ │ │ │ +
int order() const
Obtain the (highest) polynomial order of the parametrization.
Definition localfiniteelementgeometry.hh:149
│ │ │ │ +
FieldVector< ctype, mydimension > LocalCoordinate
type of local coordinates
Definition localfiniteelementgeometry.hh:56
│ │ │ │ +
FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed
type of jacobian transposed
Definition localfiniteelementgeometry.hh:68
│ │ │ │ +
LocalFiniteElementGeometry(const ReferenceElement &refElement, const LocalFiniteElement &localFE, Param &&parametrization)
Constructor from a local parametrization function, mapping local to (curved) global coordinates.
Definition localfiniteelementgeometry.hh:128
│ │ │ │ +
Abstract base class for quadrature rules.
Definition quadraturerules.hh:214
│ │ │ │ +
A container for all quadrature rules of dimension dim
Definition quadraturerules.hh:260
│ │ │ │ +
Unique label for each type of entities that can occur in DUNE grids.
Definition type.hh:114
│ │ │ │ +
constexpr bool isSimplex() const
Return true if entity is a simplex of any dimension.
Definition type.hh:319
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,36 +1,531 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ - * _u_t_i_l_i_t_y │ │ │ │ │ -convergence.hh │ │ │ │ │ +localfiniteelementgeometry.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 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 © 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_UTILITY_CONVERGENCE_HH │ │ │ │ │ -6#define DUNE_GEOMETRY_UTILITY_CONVERGENCE_HH │ │ │ │ │ +5#ifndef DUNE_GEOMETRY_LOCALFINITEELEMENTGEOMETRY_HH │ │ │ │ │ +6#define DUNE_GEOMETRY_LOCALFINITEELEMENTGEOMETRY_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10 │ │ │ │ │ -11namespace Dune::Impl { │ │ │ │ │ -12 │ │ │ │ │ -13template │ │ │ │ │ -14struct ConvergenceOptions │ │ │ │ │ -15{ │ │ │ │ │ -17 int maxIt = 100; │ │ │ │ │ -18 │ │ │ │ │ -20 R absTol = []{ using std::sqrt; return sqrt(std::numeric_limits::epsilon │ │ │ │ │ -()); }(); │ │ │ │ │ -21}; │ │ │ │ │ -22 │ │ │ │ │ -23} // end namespace Dune::Impl │ │ │ │ │ -24 │ │ │ │ │ -25#endif // DUNE_GEOMETRY_UTILITY_CONVERGENCE_HH │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13 │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ +17#include │ │ │ │ │ +18#include │ │ │ │ │ +19 │ │ │ │ │ +20#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_a_f_f_i_n_e_g_e_o_m_e_t_r_y_._h_h> // for FieldMatrixHelper │ │ │ │ │ +21#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_q_u_a_d_r_a_t_u_r_e_r_u_l_e_s_._h_h> │ │ │ │ │ +22#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ +23#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ +24#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_u_t_i_l_i_t_y_/_a_l_g_o_r_i_t_h_m_s_._h_h> │ │ │ │ │ +25#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_u_t_i_l_i_t_y_/_c_o_n_v_e_r_g_e_n_c_e_._h_h> │ │ │ │ │ +26 │ │ │ │ │ +27namespace _D_u_n_e { │ │ │ │ │ +28 │ │ │ │ │ +38template │ │ │ │ │ +_3_9class _L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y │ │ │ │ │ +40{ │ │ │ │ │ +41 using LocalFiniteElement = LFE; │ │ │ │ │ +42 using LocalBasis = typename LFE::Traits::LocalBasisType; │ │ │ │ │ +43 using LocalBasisTraits = typename LocalBasis::Traits; │ │ │ │ │ +44 │ │ │ │ │ +45public: │ │ │ │ │ +_4_7 using _c_t_y_p_e = typename LocalBasisTraits::DomainFieldType; │ │ │ │ │ +48 │ │ │ │ │ +_5_0 static const int _m_y_d_i_m_e_n_s_i_o_n = LocalBasisTraits::dimDomain; │ │ │ │ │ +51 │ │ │ │ │ +_5_3 static const int _c_o_o_r_d_d_i_m_e_n_s_i_o_n = cdim; │ │ │ │ │ +54 │ │ │ │ │ +_5_6 using _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e = FieldVector; │ │ │ │ │ +57 │ │ │ │ │ +_5_9 using _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e = FieldVector; │ │ │ │ │ +60 │ │ │ │ │ +_6_2 using _V_o_l_u_m_e = decltype(power(std::declval(),_m_y_d_i_m_e_n_s_i_o_n)); │ │ │ │ │ +63 │ │ │ │ │ +_6_5 using _J_a_c_o_b_i_a_n = FieldMatrix; │ │ │ │ │ +66 │ │ │ │ │ +_6_8 using _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d = FieldMatrix; │ │ │ │ │ +69 │ │ │ │ │ +_7_1 using _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e = FieldMatrix; │ │ │ │ │ +72 │ │ │ │ │ +_7_4 using _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d = FieldMatrix; │ │ │ │ │ +75 │ │ │ │ │ +76public: │ │ │ │ │ +_7_8 using _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s = _D_u_n_e_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_<_c_t_y_p_e_,_ _m_y_d_i_m_e_n_s_i_o_n_>; │ │ │ │ │ +_7_9 using _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t = typename _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t; │ │ │ │ │ +80 │ │ │ │ │ +81protected: │ │ │ │ │ +_8_2 using _M_a_t_r_i_x_H_e_l_p_e_r = Impl::FieldMatrixHelper; │ │ │ │ │ +83 │ │ │ │ │ +84public: │ │ │ │ │ +_8_6 _L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y () = default; │ │ │ │ │ +87 │ │ │ │ │ +_1_0_3 _L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y (const _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t& refElement, │ │ │ │ │ +104 const LocalFiniteElement& localFE, │ │ │ │ │ +105 std::vector vertices) │ │ │ │ │ +106 : refElement_(refElement) │ │ │ │ │ +107 , localFE_(localFE) │ │ │ │ │ +108 , vertices_(_s_t_d::move(vertices)) │ │ │ │ │ +109 { │ │ │ │ │ +110 assert(localFE_.size() == vertices_.size()); │ │ │ │ │ +111 } │ │ │ │ │ +112 │ │ │ │ │ +126 template , int> = 0> │ │ │ │ │ +_1_2_8 _L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y (const _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t& refElement, │ │ │ │ │ +129 const LocalFiniteElement& localFE, │ │ │ │ │ +130 Param&& parametrization) │ │ │ │ │ +131 : refElement_(refElement) │ │ │ │ │ +132 , localFE_(localFE) │ │ │ │ │ +133 { │ │ │ │ │ +134 localFE_.localInterpolation().interpolate(parametrization, vertices_); │ │ │ │ │ +135 } │ │ │ │ │ +136 │ │ │ │ │ +143 template │ │ │ │ │ +_1_4_4 explicit _L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y (_G_e_o_m_e_t_r_y_T_y_p_e gt, Args&&... args) │ │ │ │ │ +145 : _L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y(_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s::general(gt), _s_t_d:: │ │ │ │ │ +forward(args)...) │ │ │ │ │ +146 {} │ │ │ │ │ +147 │ │ │ │ │ +_1_4_9 int _o_r_d_e_r () const │ │ │ │ │ +150 { │ │ │ │ │ +151 return _l_o_c_a_l_B_a_s_i_s().order(); │ │ │ │ │ +152 } │ │ │ │ │ +153 │ │ │ │ │ +_1_5_9 bool _a_f_f_i_n_e () const │ │ │ │ │ +160 { │ │ │ │ │ +161 if (!affine_) │ │ │ │ │ +162 affine_.emplace(affineImpl()); │ │ │ │ │ +163 return *affine_; │ │ │ │ │ +164 } │ │ │ │ │ +165 │ │ │ │ │ +_1_6_7 _G_e_o_m_e_t_r_y_T_y_p_e _t_y_p_e () const │ │ │ │ │ +168 { │ │ │ │ │ +169 return refElement_.type(); │ │ │ │ │ +170 } │ │ │ │ │ +171 │ │ │ │ │ +_1_7_3 int _c_o_r_n_e_r_s () const │ │ │ │ │ +174 { │ │ │ │ │ +175 return refElement_.size(_m_y_d_i_m_e_n_s_i_o_n); │ │ │ │ │ +176 } │ │ │ │ │ +177 │ │ │ │ │ +_1_7_9 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _c_o_r_n_e_r (int i) const │ │ │ │ │ +180 { │ │ │ │ │ +181 assert( (i >= 0) && (i < _c_o_r_n_e_r_s()) ); │ │ │ │ │ +182 return _g_l_o_b_a_l(refElement_.position(i, _m_y_d_i_m_e_n_s_i_o_n)); │ │ │ │ │ +183 } │ │ │ │ │ +184 │ │ │ │ │ +_1_8_6 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _c_e_n_t_e_r () const │ │ │ │ │ +187 { │ │ │ │ │ +188 return _g_l_o_b_a_l(refElement_.position(0, 0)); │ │ │ │ │ +189 } │ │ │ │ │ +190 │ │ │ │ │ +_2_0_2 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _g_l_o_b_a_l (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) const │ │ │ │ │ +203 { │ │ │ │ │ +204 thread_local std::vector shapeValues; │ │ │ │ │ +205 _l_o_c_a_l_B_a_s_i_s().evaluateFunction(_l_o_c_a_l, shapeValues); │ │ │ │ │ +206 assert(shapeValues.size() == vertices_.size()); │ │ │ │ │ +207 │ │ │ │ │ +208 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e out(0); │ │ │ │ │ +209 for (std::size_t i = 0; i < shapeValues.size(); ++i) │ │ │ │ │ +210 out.axpy(shapeValues[i], vertices_[i]); │ │ │ │ │ +211 │ │ │ │ │ +212 return out; │ │ │ │ │ +213 } │ │ │ │ │ +214 │ │ │ │ │ +_2_3_2 _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e _l_o_c_a_l (const _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e& y, Impl:: │ │ │ │ │ +GaussNewtonOptions opts = {}) const │ │ │ │ │ +233 { │ │ │ │ │ +234 _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e x = refElement_.position(0,0); │ │ │ │ │ +235 Impl::GaussNewtonErrorCode err = Impl::gaussNewton( │ │ │ │ │ +236 [&](const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) { return this->_g_l_o_b_a_l(local); }, │ │ │ │ │ +237 [&](const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) { return this->_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d(local); │ │ │ │ │ +}, │ │ │ │ │ +238 y, x, opts │ │ │ │ │ +239 ); │ │ │ │ │ +240 │ │ │ │ │ +241 if (err != Impl::GaussNewtonErrorCode::OK) │ │ │ │ │ +242 DUNE_THROW(Dune::Exception, │ │ │ │ │ +243 "Local coordinate can not be recovered from global coordinate, error code = │ │ │ │ │ +" << int(err) << "\n" │ │ │ │ │ +244 << " (global(x) - y).two_norm() = " << (_g_l_o_b_a_l(x) - y).two_norm() │ │ │ │ │ +245 << " > tol = " << opts.absTol); │ │ │ │ │ +246 │ │ │ │ │ +247 return x; │ │ │ │ │ +248 } │ │ │ │ │ +249 │ │ │ │ │ +_2_6_0 _c_t_y_p_e _i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) const │ │ │ │ │ +261 { │ │ │ │ │ +262 return MatrixHelper::sqrtDetAAT(_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d(_l_o_c_a_l)); │ │ │ │ │ +263 } │ │ │ │ │ +264 │ │ │ │ │ +_2_7_6 _V_o_l_u_m_e _v_o_l_u_m_e (Impl::ConvergenceOptions opts = {}) const │ │ │ │ │ +277 { │ │ │ │ │ +278 _V_o_l_u_m_e vol0 = _v_o_l_u_m_e(_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s_<_c_t_y_p_e_,_ _m_y_d_i_m_e_n_s_i_o_n_>_:_:_r_u_l_e(_t_y_p_e(), 1)); │ │ │ │ │ +279 if (_a_f_f_i_n_e()) │ │ │ │ │ +280 return vol0; │ │ │ │ │ +281 │ │ │ │ │ +282 using std::abs; │ │ │ │ │ +283 for (int p = 2; p < opts.maxIt; ++p) { │ │ │ │ │ +284 _V_o_l_u_m_e vol1 = _v_o_l_u_m_e(_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s_<_c_t_y_p_e_,_ _m_y_d_i_m_e_n_s_i_o_n_>_:_:_r_u_l_e(_t_y_p_e(), p)); │ │ │ │ │ +285 if (abs(vol1 - vol0) < opts.absTol) │ │ │ │ │ +286 return vol1; │ │ │ │ │ +287 │ │ │ │ │ +288 vol0 = vol1; │ │ │ │ │ +289 } │ │ │ │ │ +290 return vol0; │ │ │ │ │ +291 } │ │ │ │ │ +292 │ │ │ │ │ +_2_9_4 _V_o_l_u_m_e _v_o_l_u_m_e (const _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_<_c_t_y_p_e_,_ _m_y_d_i_m_e_n_s_i_o_n_>& quadRule) const │ │ │ │ │ +295 { │ │ │ │ │ +296 _V_o_l_u_m_e vol(0); │ │ │ │ │ +297 for (const auto& qp : quadRule) │ │ │ │ │ +298 vol += _i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t(qp.position()) * qp.weight(); │ │ │ │ │ +299 return vol; │ │ │ │ │ +300 } │ │ │ │ │ +301 │ │ │ │ │ +_3_0_7 _J_a_c_o_b_i_a_n _j_a_c_o_b_i_a_n (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) const │ │ │ │ │ +308 { │ │ │ │ │ +309 thread_local std::vector │ │ │ │ │ +shapeJacobians; │ │ │ │ │ +310 _l_o_c_a_l_B_a_s_i_s().evaluateJacobian(_l_o_c_a_l, shapeJacobians); │ │ │ │ │ +311 assert(shapeJacobians.size() == vertices_.size()); │ │ │ │ │ +312 │ │ │ │ │ +313 _J_a_c_o_b_i_a_n out(0); │ │ │ │ │ +314 for (std::size_t i = 0; i < shapeJacobians.size(); ++i) { │ │ │ │ │ +315 for (int j = 0; j < Jacobian::rows; ++j) { │ │ │ │ │ +316 shapeJacobians[i].umtv(vertices_[i][j], out[j]); │ │ │ │ │ +317 } │ │ │ │ │ +318 } │ │ │ │ │ +319 return out; │ │ │ │ │ +320 } │ │ │ │ │ +321 │ │ │ │ │ +_3_2_7 _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d _j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) const │ │ │ │ │ +328 { │ │ │ │ │ +329 return _j_a_c_o_b_i_a_n(_l_o_c_a_l).transposed(); │ │ │ │ │ +330 } │ │ │ │ │ +331 │ │ │ │ │ +_3_3_9 _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e _j_a_c_o_b_i_a_n_I_n_v_e_r_s_e (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) const │ │ │ │ │ +340 { │ │ │ │ │ +341 _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e out; │ │ │ │ │ +342 MatrixHelper::leftInvA(_j_a_c_o_b_i_a_n(_l_o_c_a_l), out); │ │ │ │ │ +343 return out; │ │ │ │ │ +344 } │ │ │ │ │ +345 │ │ │ │ │ +_3_5_3 _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d _j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& │ │ │ │ │ +_l_o_c_a_l) const │ │ │ │ │ +354 { │ │ │ │ │ +355 return _j_a_c_o_b_i_a_n_I_n_v_e_r_s_e(_l_o_c_a_l).transposed(); │ │ │ │ │ +356 } │ │ │ │ │ +357 │ │ │ │ │ +_3_5_9 friend _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t _r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t (const _L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y& │ │ │ │ │ +geometry) │ │ │ │ │ +360 { │ │ │ │ │ +361 return geometry.refElement_; │ │ │ │ │ +362 } │ │ │ │ │ +363 │ │ │ │ │ +_3_6_5 const LocalFiniteElement& _f_i_n_i_t_e_E_l_e_m_e_n_t () const │ │ │ │ │ +366 { │ │ │ │ │ +367 return localFE_; │ │ │ │ │ +368 } │ │ │ │ │ +369 │ │ │ │ │ +_3_7_1 const std::vector& _c_o_e_f_f_i_c_i_e_n_t_s () const │ │ │ │ │ +372 { │ │ │ │ │ +373 return vertices_; │ │ │ │ │ +374 } │ │ │ │ │ +375 │ │ │ │ │ +_3_7_7 const LocalBasis& _l_o_c_a_l_B_a_s_i_s () const │ │ │ │ │ +378 { │ │ │ │ │ +379 return localFE_.localBasis(); │ │ │ │ │ +380 } │ │ │ │ │ +381 │ │ │ │ │ +382private: │ │ │ │ │ +383 │ │ │ │ │ +384 bool affineImpl () const │ │ │ │ │ +385 { │ │ │ │ │ +386 if constexpr(_m_y_d_i_m_e_n_s_i_o_n == 0) │ │ │ │ │ +387 // point geometries are always affine mappings │ │ │ │ │ +388 return true; │ │ │ │ │ +389 else { │ │ │ │ │ +390 if (_o_r_d_e_r() > 1) │ │ │ │ │ +391 // higher-order parametrizations are by definition not affine │ │ │ │ │ +392 return false; │ │ │ │ │ +393 if constexpr(_m_y_d_i_m_e_n_s_i_o_n == 1) │ │ │ │ │ +394 // linear line geometries are affine mappings │ │ │ │ │ +395 return true; │ │ │ │ │ +396 else { │ │ │ │ │ +397 if (_t_y_p_e()._i_s_S_i_m_p_l_e_x()) │ │ │ │ │ +398 // linear simplex geometries are affine mappings │ │ │ │ │ +399 return true; │ │ │ │ │ +400 │ │ │ │ │ +401 // multi-linear mappings on non-simplex geometries might be affine │ │ │ │ │ +402 // as well. This is tested explicitly for all vertices by constructing │ │ │ │ │ +403 // an affine mapping from dim+1 affine-independent corners and evaluating │ │ │ │ │ +404 // at the other corners. │ │ │ │ │ +405 auto refSimplex = referenceElement(GeometryTypes:: │ │ │ │ │ +simplex(_m_y_d_i_m_e_n_s_i_o_n)); │ │ │ │ │ +406 auto simplexIndices = Dune::range(refSimplex.size(_m_y_d_i_m_e_n_s_i_o_n)); │ │ │ │ │ +407 auto simplexCorners = Dune::transformedRangeView(simplexIndices, │ │ │ │ │ +408 [&](int i) { return this->_g_l_o_b_a_l(refSimplex.position(i,_m_y_d_i_m_e_n_s_i_o_n)); }); │ │ │ │ │ +409 AffineGeometry affineGeo │ │ │ │ │ +(refSimplex,simplexCorners); │ │ │ │ │ +410 using std::sqrt; │ │ │ │ │ +411 const _c_t_y_p_e tol = sqrt(std::numeric_limits::epsilon()); │ │ │ │ │ +412 for (int i = 0; i < _c_o_r_n_e_r_s(); ++i) { │ │ │ │ │ +413 const auto _c_o_r_n_e_r = refElement_.position(i,_m_y_d_i_m_e_n_s_i_o_n); │ │ │ │ │ +414 if ((affineGeo.global(_c_o_r_n_e_r) - _g_l_o_b_a_l(_c_o_r_n_e_r)).two_norm() > tol) │ │ │ │ │ +415 return false; │ │ │ │ │ +416 } │ │ │ │ │ +417 return true; │ │ │ │ │ +418 } │ │ │ │ │ +419 } │ │ │ │ │ +420 } │ │ │ │ │ +421 │ │ │ │ │ +422private: │ │ │ │ │ +424 _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t refElement_{}; │ │ │ │ │ +425 │ │ │ │ │ +427 LocalFiniteElement localFE_{}; │ │ │ │ │ +428 │ │ │ │ │ +430 std::vector vertices_{}; │ │ │ │ │ +431 │ │ │ │ │ +432 mutable std::optional affine_ = std::nullopt; │ │ │ │ │ +433}; │ │ │ │ │ +434 │ │ │ │ │ +435namespace Impl { │ │ │ │ │ +436 │ │ │ │ │ +437// extract the LocalCoordinate type from a LocalFiniteElement │ │ │ │ │ +438template │ │ │ │ │ +439using LocalCoordinate_t │ │ │ │ │ +440 = FieldVector; │ │ │ │ │ +442 │ │ │ │ │ +443} // end namespace Impl │ │ │ │ │ +444 │ │ │ │ │ +445 │ │ │ │ │ +446// deduction guides │ │ │ │ │ +447template │ │ │ │ │ +_4_4_8_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y (_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_<_I_>, const LFE&, std:: │ │ │ │ │ +vector) │ │ │ │ │ +449 -> _L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_<_L_F_E_,_ _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e_:_:_d_i_m_e_n_s_i_o_n_>; │ │ │ │ │ +450 │ │ │ │ │ +451template >> │ │ │ │ │ +_4_5_3_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y (_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_<_I_>, const LFE&, const F&) │ │ │ │ │ +454 -> _L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_<_L_F_E_,_ _R_a_n_g_e_:_:_d_i_m_e_n_s_i_o_n_>; │ │ │ │ │ +455 │ │ │ │ │ +456template │ │ │ │ │ +_4_5_7_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y (_G_e_o_m_e_t_r_y_T_y_p_e, const LFE& localFE, std:: │ │ │ │ │ +vector) │ │ │ │ │ +458 -> _L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_<_L_F_E_,_ _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e_:_:_d_i_m_e_n_s_i_o_n_>; │ │ │ │ │ +459 │ │ │ │ │ +460template >> │ │ │ │ │ +_4_6_2_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y (_G_e_o_m_e_t_r_y_T_y_p_e, const LFE&, const F&) │ │ │ │ │ +463 -> _L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_<_L_F_E_,_ _R_a_n_g_e_:_:_d_i_m_e_n_s_i_o_n_>; │ │ │ │ │ +464 │ │ │ │ │ +465} // namespace Dune │ │ │ │ │ +466 │ │ │ │ │ +467#endif // DUNE_GEOMETRY_LOCALFINITEELEMENTGEOMETRY_HH │ │ │ │ │ +_t_y_p_e_._h_h │ │ │ │ │ +A unique label for each type of element that can occur in a grid. │ │ │ │ │ +_q_u_a_d_r_a_t_u_r_e_r_u_l_e_s_._h_h │ │ │ │ │ +_a_l_g_o_r_i_t_h_m_s_._h_h │ │ │ │ │ +_c_o_n_v_e_r_g_e_n_c_e_._h_h │ │ │ │ │ +_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h │ │ │ │ │ +_a_f_f_i_n_e_g_e_o_m_e_t_r_y_._h_h │ │ │ │ │ +An implementation of the Geometry interface for affine geometries. │ │ │ │ │ +_s_t_d │ │ │ │ │ +STL namespace. │ │ │ │ │ +_D_u_n_e │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:21 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ +This class provides access to geometric and topological properties of a │ │ │ │ │ +reference element. │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s │ │ │ │ │ +Class providing access to the singletons of the reference elements. │ │ │ │ │ +DDeeffiinniittiioonn referenceelements.hh:128 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ +typename Container::ReferenceElement ReferenceElement │ │ │ │ │ +The reference element type. │ │ │ │ │ +DDeeffiinniittiioonn referenceelements.hh:146 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y │ │ │ │ │ +Geometry implementation based on local-basis function parametrization. │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:40 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_t_y_p_e │ │ │ │ │ +GeometryType type() const │ │ │ │ │ +Obtain the name of the reference element. │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:167 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_V_o_l_u_m_e │ │ │ │ │ +decltype(power(std::declval< ctype >(), mydimension)) Volume │ │ │ │ │ +type of volume │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:62 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_l_o_c_a_l │ │ │ │ │ +LocalCoordinate local(const GlobalCoordinate &y, Impl::GaussNewtonOptions< │ │ │ │ │ +ctype > opts={}) const │ │ │ │ │ +Evaluate the inverse coordinate mapping. │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:232 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y │ │ │ │ │ +LocalFiniteElementGeometry(const ReferenceElement &refElement, const │ │ │ │ │ +LocalFiniteElement &localFE, std::vector< GlobalCoordinate > vertices) │ │ │ │ │ +Constructor from a vector of coefficients of the LocalBasis parametrizing the │ │ │ │ │ +geometry. │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:103 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ +JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const │ │ │ │ │ +Obtain the transposed of the Jacobian. │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:327 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_l_o_c_a_l_B_a_s_i_s │ │ │ │ │ +const LocalBasis & localBasis() const │ │ │ │ │ +The local basis of the stored local finite-element. │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:377 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_c_t_y_p_e │ │ │ │ │ +typename LocalBasisTraits::DomainFieldType ctype │ │ │ │ │ +coordinate type │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:47 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ +JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate │ │ │ │ │ +&local) const │ │ │ │ │ +Obtain the transposed of the Jacobian's inverse. │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:353 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ +friend ReferenceElement referenceElement(const LocalFiniteElementGeometry │ │ │ │ │ +&geometry) │ │ │ │ │ +Obtain the reference-element related to this geometry. │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:359 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y │ │ │ │ │ +LocalFiniteElementGeometry()=default │ │ │ │ │ +Default constructed geometry results in an empty/invalid representation. │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_a_f_f_i_n_e │ │ │ │ │ +bool affine() const │ │ │ │ │ +Is this mapping affine? Geometries of order 1 might be affine, but it needs to │ │ │ │ │ +be checked on non-simp... │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:159 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n │ │ │ │ │ +Jacobian jacobian(const LocalCoordinate &local) const │ │ │ │ │ +Obtain the Jacobian. │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:307 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_v_o_l_u_m_e │ │ │ │ │ +Volume volume(const QuadratureRule< ctype, mydimension > &quadRule) const │ │ │ │ │ +Obtain the volume of the mapping's image by given quadrature rules. │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:294 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_c_o_e_f_f_i_c_i_e_n_t_s │ │ │ │ │ +const std::vector< GlobalCoordinate > & coefficients() const │ │ │ │ │ +Obtain the coefficients of the parametrization. │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:371 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y │ │ │ │ │ +LocalFiniteElementGeometry(GeometryType gt, Args &&... args) │ │ │ │ │ +Constructor, forwarding to the other constructors that take a reference- │ │ │ │ │ +element. │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:144 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_c_o_o_r_d_d_i_m_e_n_s_i_o_n │ │ │ │ │ +static const int coorddimension │ │ │ │ │ +coordinate dimension │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:53 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_c_o_r_n_e_r_s │ │ │ │ │ +int corners() const │ │ │ │ │ +Obtain number of corners of the corresponding reference element. │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:173 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_c_e_n_t_e_r │ │ │ │ │ +GlobalCoordinate center() const │ │ │ │ │ +Obtain the centroid of the mapping's image. │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:186 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ +const LocalFiniteElement & finiteElement() const │ │ │ │ │ +Obtain the local finite-element. │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:365 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_g_l_o_b_a_l │ │ │ │ │ +GlobalCoordinate global(const LocalCoordinate &local) const │ │ │ │ │ +Evaluate the coordinate mapping. │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:202 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_M_a_t_r_i_x_H_e_l_p_e_r │ │ │ │ │ +Impl::FieldMatrixHelper< ctype > MatrixHelper │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:82 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ +typename ReferenceElements::ReferenceElement ReferenceElement │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:79 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_c_o_r_n_e_r │ │ │ │ │ +GlobalCoordinate corner(int i) const │ │ │ │ │ +Obtain coordinates of the i-th corner. │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:179 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_v_o_l_u_m_e │ │ │ │ │ +Volume volume(Impl::ConvergenceOptions< ctype > opts={}) const │ │ │ │ │ +Obtain the volume of the mapping's image. │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:276 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_m_y_d_i_m_e_n_s_i_o_n │ │ │ │ │ +static const int mydimension │ │ │ │ │ +geometry dimension │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:50 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e │ │ │ │ │ +JacobianInverse jacobianInverse(const LocalCoordinate &local) const │ │ │ │ │ +Obtain the Jacobian's inverse. │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:339 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ +FieldVector< ctype, coorddimension > GlobalCoordinate │ │ │ │ │ +type of global coordinates │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:59 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n │ │ │ │ │ +FieldMatrix< ctype, coorddimension, mydimension > Jacobian │ │ │ │ │ +type of jacobian │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:65 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ +FieldMatrix< ctype, coorddimension, mydimension > JacobianInverseTransposed │ │ │ │ │ +type of jacobian inverse transposed │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:74 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e │ │ │ │ │ +FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse │ │ │ │ │ +type of jacobian inverse │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:71 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t │ │ │ │ │ +ctype integrationElement(const LocalCoordinate &local) const │ │ │ │ │ +Obtain the integration element. │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:260 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_o_r_d_e_r │ │ │ │ │ +int order() const │ │ │ │ │ +Obtain the (highest) polynomial order of the parametrization. │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:149 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ +FieldVector< ctype, mydimension > LocalCoordinate │ │ │ │ │ +type of local coordinates │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:56 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ +FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed │ │ │ │ │ +type of jacobian transposed │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:68 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y │ │ │ │ │ +LocalFiniteElementGeometry(const ReferenceElement &refElement, const │ │ │ │ │ +LocalFiniteElement &localFE, Param &¶metrization) │ │ │ │ │ +Constructor from a local parametrization function, mapping local to (curved) │ │ │ │ │ +global coordinates. │ │ │ │ │ +DDeeffiinniittiioonn localfiniteelementgeometry.hh:128 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e │ │ │ │ │ +Abstract base class for quadrature rules. │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:214 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s │ │ │ │ │ +A container for all quadrature rules of dimension dim │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:260 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ +Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:114 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_S_i_m_p_l_e_x │ │ │ │ │ +constexpr bool isSimplex() const │ │ │ │ │ +Return true if entity is a simplex of any dimension. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:319 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00176.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: algorithms.hh File Reference │ │ │ │ +dune-geometry: generalvertexorder.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,40 +65,56 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Namespaces
│ │ │ │ -
algorithms.hh File Reference
│ │ │ │ +Classes | │ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
generalvertexorder.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │
#include <algorithm>
│ │ │ │ -#include <cmath>
│ │ │ │ -#include <limits>
│ │ │ │ -#include <optional>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <dune/common/debugstream.hh>
│ │ │ │ -#include <dune/common/fmatrix.hh>
│ │ │ │ -#include <dune/common/ftraits.hh>
│ │ │ │ -#include <dune/common/fvector.hh>
│ │ │ │ -#include <dune/geometry/affinegeometry.hh>
│ │ │ │ +#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...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ 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.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,25 +1,35 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ - * _u_t_i_l_i_t_y │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -algorithms.hh File Reference │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +generalvertexorder.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_a_f_f_i_n_e_g_e_o_m_e_t_r_y_._h_h> │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "_t_y_p_e_._h_h" │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +class   _D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_<_ _d_i_m_,_ _I_n_d_e_x___ _> │ │ │ │ │ +  Class providing information on the ordering of vertices. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_<_ _d_i_m_,_ _I_n_d_e_x___ _>_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ +  Iterate over the vertex indices of some sub-entity. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +void  _D_u_n_e_:_:_r_e_d_u_c_e_O_r_d_e_r (const InIterator &inBegin, const InIterator &inEnd, │ │ │ │ │ + OutIterator outIt) │ │ │ │ │ +  Algorithm to reduce vertex order information. │ │ │ │ │ +  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00176_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: algorithms.hh Source File │ │ │ │ +dune-geometry: generalvertexorder.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,124 +70,191 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
algorithms.hh
│ │ │ │ +
generalvertexorder.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 © 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_UTILITY_ALGORITHMS_HH
│ │ │ │ -
6#define DUNE_GEOMETRY_UTILITY_ALGORITHMS_HH
│ │ │ │ -
7
│ │ │ │ -
8#include <algorithm>
│ │ │ │ -
9#include <cmath>
│ │ │ │ -
10#include <limits>
│ │ │ │ -
11#include <optional>
│ │ │ │ -
12#include <type_traits>
│ │ │ │ -
13
│ │ │ │ -
14#include <dune/common/debugstream.hh>
│ │ │ │ -
15#include <dune/common/fmatrix.hh>
│ │ │ │ -
16#include <dune/common/ftraits.hh>
│ │ │ │ -
17#include <dune/common/fvector.hh>
│ │ │ │ -
18#include <dune/geometry/affinegeometry.hh> // for FieldMatrixHelper
│ │ │ │ +
5
│ │ │ │ +
6#ifndef DUNE_GEOMETRY_GENERALVERTEXORDER_HH
│ │ │ │ +
7#define DUNE_GEOMETRY_GENERALVERTEXORDER_HH
│ │ │ │ +
8
│ │ │ │ +
9#include <algorithm>
│ │ │ │ +
10#include <cassert>
│ │ │ │ +
11#include <cstddef>
│ │ │ │ +
12#include <iterator>
│ │ │ │ +
13#include <vector>
│ │ │ │ +
14
│ │ │ │ +
15#include <dune/common/iteratorfacades.hh>
│ │ │ │ +
16
│ │ │ │ +
17#include "type.hh"
│ │ │ │ + │ │ │ │
19
│ │ │ │
20namespace Dune {
│ │ │ │ -
21namespace Impl {
│ │ │ │ -
22
│ │ │ │ -
23template <class R = double>
│ │ │ │ -
24struct GaussNewtonOptions
│ │ │ │ -
25{
│ │ │ │ -
27 int maxIt = 100;
│ │ │ │ -
28
│ │ │ │ -
30 R absTol = []{ using std::sqrt; return sqrt(std::numeric_limits<R>::epsilon()); }();
│ │ │ │ -
31
│ │ │ │ -
33 int maxInnerIt = 10;
│ │ │ │ -
34
│ │ │ │ -
36 R theta = 0.5;
│ │ │ │ -
37};
│ │ │ │ -
38
│ │ │ │ -
39
│ │ │ │ -
41enum class GaussNewtonErrorCode
│ │ │ │ -
42{
│ │ │ │ -
43 OK = 0, //< A solution is found
│ │ │ │ -
44 JACOBIAN_NOT_INVERTIBLE, //< The Jacobian is not invertible at the current point
│ │ │ │ -
45 STAGNATION, //< No reduction of the residul norm possible
│ │ │ │ -
46 TOLERANCE_NOT_REACHED //< The break tolerance for the resodual norm is not reached
│ │ │ │ -
47};
│ │ │ │ -
48
│ │ │ │ +
21
│ │ │ │ +
39 template<class InIterator, class OutIterator>
│ │ │ │ +
│ │ │ │ +
40 void reduceOrder(const InIterator& inBegin, const InIterator& inEnd,
│ │ │ │ +
41 OutIterator outIt)
│ │ │ │ +
42 {
│ │ │ │ +
43 for(InIterator inIt = inBegin; inIt != inEnd; ++inIt, ++outIt)
│ │ │ │ +
44 *outIt = std::count_if(inBegin, inEnd, [&](const auto& v)
│ │ │ │ +
45 {
│ │ │ │ +
46 return v < *inIt;
│ │ │ │ +
47 });
│ │ │ │ +
48 }
│ │ │ │ +
│ │ │ │
49
│ │ │ │ -
62template <class F, class DF, class Domain,
│ │ │ │ -
63 class Range = std::invoke_result_t<F, Domain>,
│ │ │ │ -
64 class R = typename Dune::FieldTraits<Domain>::real_type>
│ │ │ │ -
65GaussNewtonErrorCode gaussNewton (const F& f, const DF& df, Range y, Domain& x0,
│ │ │ │ -
66 GaussNewtonOptions<R> opts = {})
│ │ │ │ -
67{
│ │ │ │ -
68 Domain x = x0;
│ │ │ │ -
69 Domain dx{};
│ │ │ │ -
70 Range dy = f(x0) - y;
│ │ │ │ -
71 R resNorm0 = dy.two_norm();
│ │ │ │ -
72 R resNorm = 0;
│ │ │ │ -
73
│ │ │ │ -
74 for (int i = 0; i < opts.maxIt; ++i)
│ │ │ │ -
75 {
│ │ │ │ -
76 // Get descent direction dx: (J^T*J)dx = J^T*dy
│ │ │ │ -
77 const bool invertible = FieldMatrixHelper<R>::xTRightInvA(df(x), dy, dx);
│ │ │ │ +
51
│ │ │ │ +
66 template<std::size_t dim, class Index_ = std::size_t>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
68 typedef ReferenceElements<double, dim> RefElems;
│ │ │ │ +
69 typedef typename RefElems::ReferenceElement RefElem;
│ │ │ │ +
70
│ │ │ │ +
71 RefElem refelem;
│ │ │ │ +
72 GeometryType gt;
│ │ │ │ +
73 std::vector<Index_> vertexOrder;
│ │ │ │ +
74
│ │ │ │ +
75 public:
│ │ │ │ +
77 typedef Index_ Index;
│ │ │ │
78
│ │ │ │ -
79 // break if jacobian is not invertible
│ │ │ │ -
80 if (!invertible)
│ │ │ │ -
81 return GaussNewtonErrorCode::JACOBIAN_NOT_INVERTIBLE;
│ │ │ │ -
82
│ │ │ │ -
83 // line-search procedure to update x with correction dx
│ │ │ │ -
84 R alpha = 1;
│ │ │ │ -
85 for (int j = 0; j < opts.maxInnerIt; ++j) {
│ │ │ │ -
86 x = x0 - alpha * dx;
│ │ │ │ -
87 dy = f(x) - y;
│ │ │ │ -
88 resNorm = dy.two_norm();
│ │ │ │ -
89
│ │ │ │ -
90 if (resNorm < resNorm0)
│ │ │ │ -
91 break;
│ │ │ │ -
92
│ │ │ │ -
93 alpha *= opts.theta;
│ │ │ │ -
94 }
│ │ │ │ -
95
│ │ │ │ -
96 // cannot reduce the residual
│ │ │ │ -
97 if (!(resNorm < resNorm0))
│ │ │ │ -
98 return GaussNewtonErrorCode::STAGNATION;
│ │ │ │ -
99
│ │ │ │ -
100 x0 = x;
│ │ │ │ -
101 resNorm0 = resNorm;
│ │ │ │ +
80 class iterator;
│ │ │ │ +
81
│ │ │ │ +
83 static const std::size_t dimension = dim;
│ │ │ │ +
85 const GeometryType &type() const { return gt; }
│ │ │ │ +
86
│ │ │ │ +
88
│ │ │ │ +
96 template<class InIterator>
│ │ │ │ +
│ │ │ │ +
97 GeneralVertexOrder(const GeometryType& gt_, const InIterator &inBegin,
│ │ │ │ +
98 const InIterator &inEnd) :
│ │ │ │ +
99 refelem(RefElems::general(gt_)), gt(gt_),
│ │ │ │ +
100 vertexOrder(refelem.size(dim))
│ │ │ │ +
101 { reduceOrder(inBegin, inEnd, vertexOrder.begin()); }
│ │ │ │ +
│ │ │ │
102
│ │ │ │ -
103 // break if tolerance is reached.
│ │ │ │ -
104 if (resNorm < opts.absTol)
│ │ │ │ -
105 return GaussNewtonErrorCode::OK;
│ │ │ │ -
106 }
│ │ │ │ -
107
│ │ │ │ -
108 // tolerance could not be reached
│ │ │ │ -
109 if (!(resNorm < opts.absTol))
│ │ │ │ -
110 return GaussNewtonErrorCode::TOLERANCE_NOT_REACHED;
│ │ │ │ +
104
│ │ │ │ +
│ │ │ │ +
108 iterator begin(std::size_t codim, std::size_t subEntity) const
│ │ │ │ +
109 { return iterator(*this, codim, subEntity); }
│ │ │ │ +
│ │ │ │
111
│ │ │ │ -
112 return GaussNewtonErrorCode::OK;
│ │ │ │ -
113}
│ │ │ │ -
114
│ │ │ │ -
115} // end namespace Impl
│ │ │ │ -
116} // end namespace Dune
│ │ │ │ -
117
│ │ │ │ -
118#endif // DUNE_GEOMETRY_UTILITY_ALGORITHMS_HH
│ │ │ │ -
An implementation of the Geometry interface for affine geometries.
│ │ │ │ +
│ │ │ │ +
115 iterator end(std::size_t codim, std::size_t subEntity) const {
│ │ │ │ +
116 return iterator(*this, codim, subEntity,
│ │ │ │ +
117 refelem.size(subEntity, codim, dim));
│ │ │ │ +
118 }
│ │ │ │ +
│ │ │ │ +
119
│ │ │ │ +
121
│ │ │ │ +
│ │ │ │ +
128 void getReduced(std::size_t codim, std::size_t subEntity,
│ │ │ │ +
129 std::vector<Index>& order) const
│ │ │ │ +
130 {
│ │ │ │ +
131 order.resize(refelem.size(subEntity, codim, dim));
│ │ │ │ +
132 reduceOrder(begin(codim, subEntity), end(codim, subEntity),
│ │ │ │ +
133 order.begin());
│ │ │ │ +
134 }
│ │ │ │ +
│ │ │ │ +
135 };
│ │ │ │ +
│ │ │ │ +
136
│ │ │ │ +
138
│ │ │ │ +
141 template<std::size_t dim, class Index_>
│ │ │ │ +
│ │ │ │ +
142 class GeneralVertexOrder<dim, Index_>::iterator :
│ │ │ │ +
143 public Dune::RandomAccessIteratorFacade<iterator, const Index_>
│ │ │ │ +
144 {
│ │ │ │ +
145 const GeneralVertexOrder *order;
│ │ │ │ +
146 std::size_t codim;
│ │ │ │ +
147 std::size_t subEntity;
│ │ │ │ +
148 std::size_t vertex;
│ │ │ │ +
149
│ │ │ │ +
150 iterator(const GeneralVertexOrder &order_, std::size_t codim_,
│ │ │ │ +
151 std::size_t subEntity_, std::size_t vertex_ = 0) :
│ │ │ │ +
152 order(&order_), codim(codim_), subEntity(subEntity_), vertex(vertex_)
│ │ │ │ +
153 { }
│ │ │ │ +
154
│ │ │ │ +
155 public:
│ │ │ │ +
│ │ │ │ +
156 const Index &dereference() const {
│ │ │ │ +
157 return order->vertexOrder[order->refelem.subEntity(subEntity, codim,
│ │ │ │ +
158 vertex, dim)];
│ │ │ │ +
159 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
160 const Index &elementAt(std::ptrdiff_t n) const {
│ │ │ │ +
161 return order->vertexOrder[order->refelem.subEntity(subEntity, codim,
│ │ │ │ +
162 vertex+n, dim)];
│ │ │ │ +
163 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
164 bool equals(const iterator &other) const {
│ │ │ │ +
165 return order == other.order && codim == other.codim &&
│ │ │ │ +
166 subEntity == other.subEntity && vertex == other.vertex;
│ │ │ │ +
167 }
│ │ │ │ +
│ │ │ │ +
168 void increment() { ++vertex; }
│ │ │ │ +
169 void decrement() { --vertex; }
│ │ │ │ +
170 void advance(std::ptrdiff_t n) { vertex += n; }
│ │ │ │ +
│ │ │ │ +
171 std::ptrdiff_t distanceTo(const iterator &other) const {
│ │ │ │ +
172 // make sure we reference the same container
│ │ │ │ +
173 assert(order == other.order && codim == other.codim &&
│ │ │ │ +
174 subEntity == other.subEntity);
│ │ │ │ +
175 if(vertex < other.vertex) return other.vertex - vertex;
│ │ │ │ +
176 else return -static_cast<std::ptrdiff_t>(vertex - other.vertex);
│ │ │ │ +
177 }
│ │ │ │ +
│ │ │ │ +
178
│ │ │ │ +
179 friend class GeneralVertexOrder<dim, Index>;
│ │ │ │ +
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.
│ │ │ │ + │ │ │ │
Definition affinegeometry.hh:21
│ │ │ │ +
void reduceOrder(const InIterator &inBegin, const InIterator &inEnd, OutIterator outIt)
Algorithm to reduce vertex order information.
Definition generalvertexorder.hh:40
│ │ │ │ +
Class providing access to the singletons of the reference elements.
Definition referenceelements.hh:128
│ │ │ │ +
typename Container::ReferenceElement ReferenceElement
The reference element type.
Definition referenceelements.hh:146
│ │ │ │ +
Class providing information on the ordering of vertices.
Definition generalvertexorder.hh:67
│ │ │ │ +
Index_ Index
Type of indices.
Definition generalvertexorder.hh:77
│ │ │ │ +
const GeometryType & type() const
get type of the entity's geometry
Definition generalvertexorder.hh:85
│ │ │ │ +
static const std::size_t dimension
export the dimension of the entity we provide information for
Definition generalvertexorder.hh:83
│ │ │ │ +
void getReduced(std::size_t codim, std::size_t subEntity, std::vector< Index > &order) const
get a vector of reduced indices for some sub-entity
Definition generalvertexorder.hh:128
│ │ │ │ +
iterator end(std::size_t codim, std::size_t subEntity) const
get end iterator for the vertex indices of some sub-entity
Definition generalvertexorder.hh:115
│ │ │ │ +
GeneralVertexOrder(const GeometryType &gt_, const InIterator &inBegin, const InIterator &inEnd)
construct a GeneralVertexOrder
Definition generalvertexorder.hh:97
│ │ │ │ +
iterator begin(std::size_t codim, std::size_t subEntity) const
get begin iterator for the vertex indices of some sub-entity
Definition generalvertexorder.hh:108
│ │ │ │ +
Iterate over the vertex indices of some sub-entity.
Definition generalvertexorder.hh:144
│ │ │ │ +
iterator()
public default constructor
Definition generalvertexorder.hh:187
│ │ │ │ +
void decrement()
Definition generalvertexorder.hh:169
│ │ │ │ +
void advance(std::ptrdiff_t n)
Definition generalvertexorder.hh:170
│ │ │ │ +
const Index & dereference() const
Definition generalvertexorder.hh:156
│ │ │ │ +
void increment()
Definition generalvertexorder.hh:168
│ │ │ │ +
bool equals(const iterator &other) const
Definition generalvertexorder.hh:164
│ │ │ │ +
std::ptrdiff_t distanceTo(const iterator &other) const
Definition generalvertexorder.hh:171
│ │ │ │ +
const Index & elementAt(std::ptrdiff_t n) const
Definition generalvertexorder.hh:160
│ │ │ │ +
Unique label for each type of entities that can occur in DUNE grids.
Definition type.hh:114
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,121 +1,216 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ - * _u_t_i_l_i_t_y │ │ │ │ │ -algorithms.hh │ │ │ │ │ +generalvertexorder.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 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 © 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_UTILITY_ALGORITHMS_HH │ │ │ │ │ -6#define DUNE_GEOMETRY_UTILITY_ALGORITHMS_HH │ │ │ │ │ -7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13 │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ -17#include │ │ │ │ │ -18#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_a_f_f_i_n_e_g_e_o_m_e_t_r_y_._h_h> // for FieldMatrixHelper │ │ │ │ │ +5 │ │ │ │ │ +6#ifndef DUNE_GEOMETRY_GENERALVERTEXORDER_HH │ │ │ │ │ +7#define DUNE_GEOMETRY_GENERALVERTEXORDER_HH │ │ │ │ │ +8 │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14 │ │ │ │ │ +15#include │ │ │ │ │ +16 │ │ │ │ │ +17#include "_t_y_p_e_._h_h" │ │ │ │ │ +18#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ 19 │ │ │ │ │ 20namespace _D_u_n_e { │ │ │ │ │ -21namespace Impl { │ │ │ │ │ -22 │ │ │ │ │ -23template │ │ │ │ │ -24struct GaussNewtonOptions │ │ │ │ │ -25{ │ │ │ │ │ -27 int maxIt = 100; │ │ │ │ │ -28 │ │ │ │ │ -30 R absTol = []{ using std::sqrt; return sqrt(std::numeric_limits::epsilon │ │ │ │ │ -()); }(); │ │ │ │ │ -31 │ │ │ │ │ -33 int maxInnerIt = 10; │ │ │ │ │ -34 │ │ │ │ │ -36 R theta = 0.5; │ │ │ │ │ -37}; │ │ │ │ │ -38 │ │ │ │ │ -39 │ │ │ │ │ -41enum class GaussNewtonErrorCode │ │ │ │ │ -42{ │ │ │ │ │ -43 OK = 0, //< A solution is found │ │ │ │ │ -44 JACOBIAN_NOT_INVERTIBLE, //< The Jacobian is not invertible at the current │ │ │ │ │ -point │ │ │ │ │ -45 STAGNATION, //< No reduction of the residul norm possible │ │ │ │ │ -46 TOLERANCE_NOT_REACHED //< The break tolerance for the resodual norm is not │ │ │ │ │ -reached │ │ │ │ │ -47}; │ │ │ │ │ -48 │ │ │ │ │ +21 │ │ │ │ │ +39 template │ │ │ │ │ +_4_0 void _r_e_d_u_c_e_O_r_d_e_r(const InIterator& inBegin, const InIterator& inEnd, │ │ │ │ │ +41 OutIterator outIt) │ │ │ │ │ +42 { │ │ │ │ │ +43 for(InIterator inIt = inBegin; inIt != inEnd; ++inIt, ++outIt) │ │ │ │ │ +44 *outIt = std::count_if(inBegin, inEnd, [&](const auto& v) │ │ │ │ │ +45 { │ │ │ │ │ +46 return v < *inIt; │ │ │ │ │ +47 }); │ │ │ │ │ +48 } │ │ │ │ │ 49 │ │ │ │ │ -62template , │ │ │ │ │ -64 class R = typename Dune::FieldTraits::real_type> │ │ │ │ │ -65GaussNewtonErrorCode gaussNewton (const F& f, const DF& df, Range y, Domain& │ │ │ │ │ -x0, │ │ │ │ │ -66 GaussNewtonOptions opts = {}) │ │ │ │ │ -67{ │ │ │ │ │ -68 Domain x = x0; │ │ │ │ │ -69 Domain dx{}; │ │ │ │ │ -70 Range dy = f(x0) - y; │ │ │ │ │ -71 R resNorm0 = dy.two_norm(); │ │ │ │ │ -72 R resNorm = 0; │ │ │ │ │ -73 │ │ │ │ │ -74 for (int i = 0; i < opts.maxIt; ++i) │ │ │ │ │ -75 { │ │ │ │ │ -76 // Get descent direction dx: (J^T*J)dx = J^T*dy │ │ │ │ │ -77 const bool invertible = FieldMatrixHelper::xTRightInvA(df(x), dy, dx); │ │ │ │ │ +51 │ │ │ │ │ +66 template │ │ │ │ │ +_6_7 class _G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r { │ │ │ │ │ +68 typedef _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_<_d_o_u_b_l_e_,_ _d_i_m_> RefElems; │ │ │ │ │ +69 typedef typename _R_e_f_E_l_e_m_s_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t RefElem; │ │ │ │ │ +70 │ │ │ │ │ +71 RefElem refelem; │ │ │ │ │ +72 _G_e_o_m_e_t_r_y_T_y_p_e gt; │ │ │ │ │ +73 std::vector vertexOrder; │ │ │ │ │ +74 │ │ │ │ │ +75 public: │ │ │ │ │ +_7_7 typedef Index_ _I_n_d_e_x; │ │ │ │ │ 78 │ │ │ │ │ -79 // break if jacobian is not invertible │ │ │ │ │ -80 if (!invertible) │ │ │ │ │ -81 return GaussNewtonErrorCode::JACOBIAN_NOT_INVERTIBLE; │ │ │ │ │ -82 │ │ │ │ │ -83 // line-search procedure to update x with correction dx │ │ │ │ │ -84 R alpha = 1; │ │ │ │ │ -85 for (int j = 0; j < opts.maxInnerIt; ++j) { │ │ │ │ │ -86 x = x0 - alpha * dx; │ │ │ │ │ -87 dy = f(x) - y; │ │ │ │ │ -88 resNorm = dy.two_norm(); │ │ │ │ │ -89 │ │ │ │ │ -90 if (resNorm < resNorm0) │ │ │ │ │ -91 break; │ │ │ │ │ -92 │ │ │ │ │ -93 alpha *= opts.theta; │ │ │ │ │ -94 } │ │ │ │ │ -95 │ │ │ │ │ -96 // cannot reduce the residual │ │ │ │ │ -97 if (!(resNorm < resNorm0)) │ │ │ │ │ -98 return GaussNewtonErrorCode::STAGNATION; │ │ │ │ │ -99 │ │ │ │ │ -100 x0 = x; │ │ │ │ │ -101 resNorm0 = resNorm; │ │ │ │ │ +80 class _i_t_e_r_a_t_o_r; │ │ │ │ │ +81 │ │ │ │ │ +_8_3 static const std::size_t _d_i_m_e_n_s_i_o_n = dim; │ │ │ │ │ +_8_5 const _G_e_o_m_e_t_r_y_T_y_p_e &_t_y_p_e() const { return gt; } │ │ │ │ │ +86 │ │ │ │ │ +88 │ │ │ │ │ +96 template │ │ │ │ │ +_9_7 _G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r(const _G_e_o_m_e_t_r_y_T_y_p_e& gt_, const InIterator &inBegin, │ │ │ │ │ +98 const InIterator &inEnd) : │ │ │ │ │ +99 refelem(RefElems::general(gt_)), gt(gt_), │ │ │ │ │ +100 vertexOrder(refelem.size(dim)) │ │ │ │ │ +101 { _r_e_d_u_c_e_O_r_d_e_r(inBegin, inEnd, vertexOrder.begin()); } │ │ │ │ │ 102 │ │ │ │ │ -103 // break if tolerance is reached. │ │ │ │ │ -104 if (resNorm < opts.absTol) │ │ │ │ │ -105 return GaussNewtonErrorCode::OK; │ │ │ │ │ -106 } │ │ │ │ │ -107 │ │ │ │ │ -108 // tolerance could not be reached │ │ │ │ │ -109 if (!(resNorm < opts.absTol)) │ │ │ │ │ -110 return GaussNewtonErrorCode::TOLERANCE_NOT_REACHED; │ │ │ │ │ +104 │ │ │ │ │ +_1_0_8 _i_t_e_r_a_t_o_r _b_e_g_i_n(std::size_t codim, std::size_t subEntity) const │ │ │ │ │ +109 { return _i_t_e_r_a_t_o_r(*this, codim, subEntity); } │ │ │ │ │ 111 │ │ │ │ │ -112 return GaussNewtonErrorCode::OK; │ │ │ │ │ -113} │ │ │ │ │ -114 │ │ │ │ │ -115} // end namespace Impl │ │ │ │ │ -116} // end namespace Dune │ │ │ │ │ -117 │ │ │ │ │ -118#endif // DUNE_GEOMETRY_UTILITY_ALGORITHMS_HH │ │ │ │ │ -_a_f_f_i_n_e_g_e_o_m_e_t_r_y_._h_h │ │ │ │ │ -An implementation of the Geometry interface for affine geometries. │ │ │ │ │ +_1_1_5 _i_t_e_r_a_t_o_r _e_n_d(std::size_t codim, std::size_t subEntity) const { │ │ │ │ │ +116 return _i_t_e_r_a_t_o_r(*this, codim, subEntity, │ │ │ │ │ +117 refelem.size(subEntity, codim, dim)); │ │ │ │ │ +118 } │ │ │ │ │ +119 │ │ │ │ │ +121 │ │ │ │ │ +_1_2_8 void _g_e_t_R_e_d_u_c_e_d(std::size_t codim, std::size_t subEntity, │ │ │ │ │ +129 std::vector& order) const │ │ │ │ │ +130 { │ │ │ │ │ +131 order.resize(refelem.size(subEntity, codim, dim)); │ │ │ │ │ +132 _r_e_d_u_c_e_O_r_d_e_r(_b_e_g_i_n(codim, subEntity), _e_n_d(codim, subEntity), │ │ │ │ │ +133 order.begin()); │ │ │ │ │ +134 } │ │ │ │ │ +135 }; │ │ │ │ │ +136 │ │ │ │ │ +138 │ │ │ │ │ +141 template │ │ │ │ │ +_1_4_2 class _G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r::_i_t_e_r_a_t_o_r : │ │ │ │ │ +143 public Dune::RandomAccessIteratorFacade │ │ │ │ │ +144 { │ │ │ │ │ +145 const _G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r *order; │ │ │ │ │ +146 std::size_t codim; │ │ │ │ │ +147 std::size_t subEntity; │ │ │ │ │ +148 std::size_t vertex; │ │ │ │ │ +149 │ │ │ │ │ +150 _i_t_e_r_a_t_o_r(const _G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r &order_, std::size_t codim_, │ │ │ │ │ +151 std::size_t subEntity_, std::size_t vertex_ = 0) : │ │ │ │ │ +152 order(&order_), codim(codim_), subEntity(subEntity_), vertex(vertex_) │ │ │ │ │ +153 { } │ │ │ │ │ +154 │ │ │ │ │ +155 public: │ │ │ │ │ +_1_5_6 const _I_n_d_e_x &_d_e_r_e_f_e_r_e_n_c_e() const { │ │ │ │ │ +157 return order->vertexOrder[order->refelem.subEntity(subEntity, codim, │ │ │ │ │ +158 vertex, dim)]; │ │ │ │ │ +159 } │ │ │ │ │ +_1_6_0 const _I_n_d_e_x &_e_l_e_m_e_n_t_A_t(std::ptrdiff_t n) const { │ │ │ │ │ +161 return order->vertexOrder[order->refelem.subEntity(subEntity, codim, │ │ │ │ │ +162 vertex+n, dim)]; │ │ │ │ │ +163 } │ │ │ │ │ +_1_6_4 bool _e_q_u_a_l_s(const _i_t_e_r_a_t_o_r &other) const { │ │ │ │ │ +165 return order == other.order && codim == other.codim && │ │ │ │ │ +166 subEntity == other.subEntity && vertex == other.vertex; │ │ │ │ │ +167 } │ │ │ │ │ +_1_6_8 void _i_n_c_r_e_m_e_n_t() { ++vertex; } │ │ │ │ │ +_1_6_9 void _d_e_c_r_e_m_e_n_t() { --vertex; } │ │ │ │ │ +_1_7_0 void _a_d_v_a_n_c_e(std::ptrdiff_t n) { vertex += n; } │ │ │ │ │ +_1_7_1 std::ptrdiff_t _d_i_s_t_a_n_c_e_T_o(const _i_t_e_r_a_t_o_r &other) const { │ │ │ │ │ +172 // make sure we reference the same container │ │ │ │ │ +173 assert(order == other.order && codim == other.codim && │ │ │ │ │ +174 subEntity == other.subEntity); │ │ │ │ │ +175 if(vertex < other.vertex) return other.vertex - vertex; │ │ │ │ │ +176 else return -static_cast(vertex - other.vertex); │ │ │ │ │ +177 } │ │ │ │ │ +178 │ │ │ │ │ +179 friend class _G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r; │ │ │ │ │ +180 │ │ │ │ │ +182 │ │ │ │ │ +_1_8_7 _i_t_e_r_a_t_o_r() { } │ │ │ │ │ +188 }; │ │ │ │ │ +189} // namespace Dune │ │ │ │ │ +190 │ │ │ │ │ +191#endif // DUNE_GEOMETRY_GENERALVERTEXORDER_HH │ │ │ │ │ +_t_y_p_e_._h_h │ │ │ │ │ +A unique label for each type of element that can occur in a grid. │ │ │ │ │ +_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn affinegeometry.hh:21 │ │ │ │ │ +_D_u_n_e_:_:_r_e_d_u_c_e_O_r_d_e_r │ │ │ │ │ +void reduceOrder(const InIterator &inBegin, const InIterator &inEnd, │ │ │ │ │ +OutIterator outIt) │ │ │ │ │ +Algorithm to reduce vertex order information. │ │ │ │ │ +DDeeffiinniittiioonn generalvertexorder.hh:40 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s │ │ │ │ │ +Class providing access to the singletons of the reference elements. │ │ │ │ │ +DDeeffiinniittiioonn referenceelements.hh:128 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ +typename Container::ReferenceElement ReferenceElement │ │ │ │ │ +The reference element type. │ │ │ │ │ +DDeeffiinniittiioonn referenceelements.hh:146 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r │ │ │ │ │ +Class providing information on the ordering of vertices. │ │ │ │ │ +DDeeffiinniittiioonn generalvertexorder.hh:67 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_I_n_d_e_x │ │ │ │ │ +Index_ Index │ │ │ │ │ +Type of indices. │ │ │ │ │ +DDeeffiinniittiioonn generalvertexorder.hh:77 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_t_y_p_e │ │ │ │ │ +const GeometryType & type() const │ │ │ │ │ +get type of the entity's geometry │ │ │ │ │ +DDeeffiinniittiioonn generalvertexorder.hh:85 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ +static const std::size_t dimension │ │ │ │ │ +export the dimension of the entity we provide information for │ │ │ │ │ +DDeeffiinniittiioonn generalvertexorder.hh:83 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_g_e_t_R_e_d_u_c_e_d │ │ │ │ │ +void getReduced(std::size_t codim, std::size_t subEntity, std::vector< Index > │ │ │ │ │ +&order) const │ │ │ │ │ +get a vector of reduced indices for some sub-entity │ │ │ │ │ +DDeeffiinniittiioonn generalvertexorder.hh:128 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_e_n_d │ │ │ │ │ +iterator end(std::size_t codim, std::size_t subEntity) const │ │ │ │ │ +get end iterator for the vertex indices of some sub-entity │ │ │ │ │ +DDeeffiinniittiioonn generalvertexorder.hh:115 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r │ │ │ │ │ +GeneralVertexOrder(const GeometryType >_, const InIterator &inBegin, const │ │ │ │ │ +InIterator &inEnd) │ │ │ │ │ +construct a GeneralVertexOrder │ │ │ │ │ +DDeeffiinniittiioonn generalvertexorder.hh:97 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_b_e_g_i_n │ │ │ │ │ +iterator begin(std::size_t codim, std::size_t subEntity) const │ │ │ │ │ +get begin iterator for the vertex indices of some sub-entity │ │ │ │ │ +DDeeffiinniittiioonn generalvertexorder.hh:108 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ +Iterate over the vertex indices of some sub-entity. │ │ │ │ │ +DDeeffiinniittiioonn generalvertexorder.hh:144 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_i_t_e_r_a_t_o_r_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ +iterator() │ │ │ │ │ +public default constructor │ │ │ │ │ +DDeeffiinniittiioonn generalvertexorder.hh:187 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_i_t_e_r_a_t_o_r_:_:_d_e_c_r_e_m_e_n_t │ │ │ │ │ +void decrement() │ │ │ │ │ +DDeeffiinniittiioonn generalvertexorder.hh:169 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_i_t_e_r_a_t_o_r_:_:_a_d_v_a_n_c_e │ │ │ │ │ +void advance(std::ptrdiff_t n) │ │ │ │ │ +DDeeffiinniittiioonn generalvertexorder.hh:170 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_i_t_e_r_a_t_o_r_:_:_d_e_r_e_f_e_r_e_n_c_e │ │ │ │ │ +const Index & dereference() const │ │ │ │ │ +DDeeffiinniittiioonn generalvertexorder.hh:156 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_i_t_e_r_a_t_o_r_:_:_i_n_c_r_e_m_e_n_t │ │ │ │ │ +void increment() │ │ │ │ │ +DDeeffiinniittiioonn generalvertexorder.hh:168 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_i_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ +bool equals(const iterator &other) const │ │ │ │ │ +DDeeffiinniittiioonn generalvertexorder.hh:164 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_i_t_e_r_a_t_o_r_:_:_d_i_s_t_a_n_c_e_T_o │ │ │ │ │ +std::ptrdiff_t distanceTo(const iterator &other) const │ │ │ │ │ +DDeeffiinniittiioonn generalvertexorder.hh:171 │ │ │ │ │ +_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_i_t_e_r_a_t_o_r_:_:_e_l_e_m_e_n_t_A_t │ │ │ │ │ +const Index & elementAt(std::ptrdiff_t n) const │ │ │ │ │ +DDeeffiinniittiioonn generalvertexorder.hh:160 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ +Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:114 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00179.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: typefromvertexcount.hh File Reference │ │ │ │ +dune-geometry: referenceelementimplementation.cc File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,38 +65,31 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
typefromvertexcount.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
referenceelementimplementation.cc File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <dune/geometry/type.hh>
│ │ │ │ -
│ │ │ │ -

Go to the source code of this file.

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

│ │ │ │ Namespaces

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

│ │ │ │ -Functions

GeometryType Dune::geometryTypeFromVertexCount (unsigned int dim, unsigned int vertices)
 Utility function to construct the correct geometry type given the dimension and the number of vertices.
 
namespace  Dune::Geo
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,22 +1,16 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ - * _u_t_i_l_i_t_y │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -typefromvertexcount.hh File Reference │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ -_G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +_N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +referenceelementimplementation.cc File Reference │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_i_m_p_l_e_m_e_n_t_a_t_i_o_n_._h_h> │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -_G_e_o_m_e_t_r_y_T_y_p_e  _D_u_n_e_:_:_g_e_o_m_e_t_r_y_T_y_p_e_F_r_o_m_V_e_r_t_e_x_C_o_u_n_t (unsigned int dim, unsigned int │ │ │ │ │ - vertices) │ │ │ │ │ -  Utility function to construct the correct geometry type given the │ │ │ │ │ - dimension and the number of vertices. │ │ │ │ │ +namespace   _D_u_n_e_:_:_G_e_o │ │ │ │ │   │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00182.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: localfiniteelementgeometry.hh File Reference │ │ │ │ +dune-geometry: axisalignedcubegeometry.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,64 +71,43 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
localfiniteelementgeometry.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
axisalignedcubegeometry.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <cassert>
│ │ │ │ -#include <functional>
│ │ │ │ -#include <limits>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <vector>
│ │ │ │ -#include <dune/common/fmatrix.hh>
│ │ │ │ + │ │ │ │ +

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

│ │ │ │ +
#include <bitset>
│ │ │ │ #include <dune/common/fvector.hh>
│ │ │ │ -#include <dune/common/math.hh>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ -#include <dune/common/std/type_traits.hh>
│ │ │ │ -#include <dune/geometry/affinegeometry.hh>
│ │ │ │ -#include <dune/geometry/quadraturerules.hh>
│ │ │ │ -#include <dune/geometry/referenceelements.hh>
│ │ │ │ -#include <dune/geometry/type.hh>
│ │ │ │ -#include <dune/geometry/utility/algorithms.hh>
│ │ │ │ -#include <dune/geometry/utility/convergence.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::LocalFiniteElementGeometry< LFE, cdim >
 Geometry implementation based on local-basis function parametrization. More...
class  Dune::AxisAlignedCubeGeometry< CoordType, dim, coorddim >
 A geometry implementation for axis-aligned hypercubes. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

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

│ │ │ │ -Functions

template<class I , class LFE , class GlobalCoordinate >
 Dune::LocalFiniteElementGeometry (Geo::ReferenceElement< I >, const LFE &, std::vector< GlobalCoordinate >) -> LocalFiniteElementGeometry< LFE, GlobalCoordinate::dimension >
 
template<class I , class LFE , class F , class Range = std::invoke_result_t<F,Impl::LocalCoordinate_t<LFE>>>
 Dune::LocalFiniteElementGeometry (Geo::ReferenceElement< I >, const LFE &, const F &) -> LocalFiniteElementGeometry< LFE, Range::dimension >
 
template<class LFE , class GlobalCoordinate >
 Dune::LocalFiniteElementGeometry (GeometryType, const LFE &localFE, std::vector< GlobalCoordinate >) -> LocalFiniteElementGeometry< LFE, GlobalCoordinate::dimension >
 
template<class LFE , class F , class Range = std::invoke_result_t<F,Impl::LocalCoordinate_t<LFE>>>
 Dune::LocalFiniteElementGeometry (GeometryType, const LFE &, const F &) -> LocalFiniteElementGeometry< LFE, Range::dimension >
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

A geometry implementation for axis-aligned hypercubes.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,56 +1,27 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -localfiniteelementgeometry.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +axisalignedcubegeometry.hh File Reference │ │ │ │ │ +A geometry implementation for axis-aligned hypercubes. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_a_f_f_i_n_e_g_e_o_m_e_t_r_y_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_q_u_a_d_r_a_t_u_r_e_r_u_l_e_s_._h_h> │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_u_t_i_l_i_t_y_/_a_l_g_o_r_i_t_h_m_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_u_t_i_l_i_t_y_/_c_o_n_v_e_r_g_e_n_c_e_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_<_ _L_F_E_,_ _c_d_i_m_ _> │ │ │ │ │ -  Geometry implementation based on local-basis function parametrization. │ │ │ │ │ - _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_<_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_,_ _c_o_o_r_d_d_i_m_ _> │ │ │ │ │ +  A geometry implementation for axis-aligned hypercubes. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -  _D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y (_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t< I >, const LFE &, │ │ │ │ │ - std::vector< GlobalCoordinate >) -> _L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y< LFE, │ │ │ │ │ - GlobalCoordinate::dimension > │ │ │ │ │ -  │ │ │ │ │ -template>> │ │ │ │ │ -  _D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y (_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t< I >, const LFE &, │ │ │ │ │ - const F &) -> _L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y< LFE, Range::dimension > │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -  _D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y (_G_e_o_m_e_t_r_y_T_y_p_e, const LFE &localFE, std:: │ │ │ │ │ - vector< GlobalCoordinate >) -> _L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y< LFE, │ │ │ │ │ - GlobalCoordinate::dimension > │ │ │ │ │ -  │ │ │ │ │ -template>> │ │ │ │ │ -  _D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y (_G_e_o_m_e_t_r_y_T_y_p_e, const LFE &, const F &) - │ │ │ │ │ - > _L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y< LFE, Range::dimension > │ │ │ │ │ -  │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +A geometry implementation for axis-aligned hypercubes. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00182_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: localfiniteelementgeometry.hh Source File │ │ │ │ +dune-geometry: axisalignedcubegeometry.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,435 +74,360 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
localfiniteelementgeometry.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 © 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_LOCALFINITEELEMENTGEOMETRY_HH
│ │ │ │ -
6#define DUNE_GEOMETRY_LOCALFINITEELEMENTGEOMETRY_HH
│ │ │ │ -
7
│ │ │ │ -
8#include <cassert>
│ │ │ │ -
9#include <functional>
│ │ │ │ -
10#include <limits>
│ │ │ │ -
11#include <type_traits>
│ │ │ │ -
12#include <vector>
│ │ │ │ -
13
│ │ │ │ -
14#include <dune/common/fmatrix.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/math.hh>
│ │ │ │ -
17#include <dune/common/typetraits.hh>
│ │ │ │ -
18#include <dune/common/std/type_traits.hh>
│ │ │ │ -
19
│ │ │ │ -
20#include <dune/geometry/affinegeometry.hh> // for FieldMatrixHelper
│ │ │ │ - │ │ │ │ - │ │ │ │ -
23#include <dune/geometry/type.hh>
│ │ │ │ - │ │ │ │ - │ │ │ │ -
26
│ │ │ │ -
27namespace Dune {
│ │ │ │ -
28
│ │ │ │ -
38template <class LFE, int cdim>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
40{
│ │ │ │ -
41 using LocalFiniteElement = LFE;
│ │ │ │ -
42 using LocalBasis = typename LFE::Traits::LocalBasisType;
│ │ │ │ -
43 using LocalBasisTraits = typename LocalBasis::Traits;
│ │ │ │ -
44
│ │ │ │ -
45public:
│ │ │ │ -
47 using ctype = typename LocalBasisTraits::DomainFieldType;
│ │ │ │ -
48
│ │ │ │ -
50 static const int mydimension = LocalBasisTraits::dimDomain;
│ │ │ │ +
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 {
│ │ │ │
51
│ │ │ │ -
53 static const int coorddimension = cdim;
│ │ │ │ +
52
│ │ │ │ +
53 public:
│ │ │ │
54
│ │ │ │ -
56 using LocalCoordinate = FieldVector<ctype, mydimension>;
│ │ │ │ +
56 constexpr static int mydimension = dim;
│ │ │ │
57
│ │ │ │ -
59 using GlobalCoordinate = FieldVector<ctype, coorddimension>;
│ │ │ │ +
59 constexpr static int coorddimension = coorddim;
│ │ │ │
60
│ │ │ │ -
62 using Volume = decltype(power(std::declval<ctype>(),mydimension));
│ │ │ │ +
62 typedef CoordType ctype;
│ │ │ │
63
│ │ │ │ -
65 using Jacobian = FieldMatrix<ctype, coorddimension, mydimension>;
│ │ │ │ +
65 typedef FieldVector<ctype,dim> LocalCoordinate;
│ │ │ │
66
│ │ │ │ -
68 using JacobianTransposed = FieldMatrix<ctype, mydimension, coorddimension>;
│ │ │ │ +
68 typedef FieldVector<ctype,coorddim> GlobalCoordinate;
│ │ │ │
69
│ │ │ │ -
71 using JacobianInverse = FieldMatrix<ctype, mydimension, coorddimension>;
│ │ │ │ +
71 typedef ctype Volume;
│ │ │ │
72
│ │ │ │ -
74 using JacobianInverseTransposed = FieldMatrix<ctype, coorddimension, mydimension>;
│ │ │ │ -
75
│ │ │ │ -
76public:
│ │ │ │ - │ │ │ │ - │ │ │ │ -
80
│ │ │ │ -
81protected:
│ │ │ │ -
82 using MatrixHelper = Impl::FieldMatrixHelper<ctype>;
│ │ │ │ -
83
│ │ │ │ -
84public:
│ │ │ │ - │ │ │ │ -
87
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
104 const LocalFiniteElement& localFE,
│ │ │ │ -
105 std::vector<GlobalCoordinate> vertices)
│ │ │ │ -
106 : refElement_(refElement)
│ │ │ │ -
107 , localFE_(localFE)
│ │ │ │ -
108 , vertices_(std::move(vertices))
│ │ │ │ -
109 {
│ │ │ │ -
110 assert(localFE_.size() == vertices_.size());
│ │ │ │ -
111 }
│ │ │ │ -
│ │ │ │ -
112
│ │ │ │ -
126 template <class Param,
│ │ │ │ -
127 std::enable_if_t<std::is_invocable_r_v<GlobalCoordinate,Param,LocalCoordinate>, int> = 0>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
129 const LocalFiniteElement& localFE,
│ │ │ │ -
130 Param&& parametrization)
│ │ │ │ -
131 : refElement_(refElement)
│ │ │ │ -
132 , localFE_(localFE)
│ │ │ │ -
133 {
│ │ │ │ -
134 localFE_.localInterpolation().interpolate(parametrization, vertices_);
│ │ │ │ -
135 }
│ │ │ │ -
│ │ │ │ -
136
│ │ │ │ -
143 template <class... Args>
│ │ │ │ -
│ │ │ │ -
144 explicit LocalFiniteElementGeometry (GeometryType gt, Args&&... args)
│ │ │ │ -
145 : LocalFiniteElementGeometry(ReferenceElements::general(gt), std::forward<Args>(args)...)
│ │ │ │ -
146 {}
│ │ │ │ -
│ │ │ │ -
147
│ │ │ │ -
│ │ │ │ -
149 int order () const
│ │ │ │ -
150 {
│ │ │ │ -
151 return localBasis().order();
│ │ │ │ -
152 }
│ │ │ │ +
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
│ │ │ │ + │ │ │ │ +
119
│ │ │ │ +
│ │ │ │ +
124 AxisAlignedCubeGeometry(const Dune::FieldVector<ctype,coorddim> lower,
│ │ │ │ +
125 const Dune::FieldVector<ctype,coorddim> upper)
│ │ │ │ +
126 : lower_(lower),
│ │ │ │ +
127 upper_(upper),
│ │ │ │ +
128 axes_()
│ │ │ │ +
129 {
│ │ │ │ +
130 static_assert(dim==coorddim, "Use this constructor only if dim==coorddim!");
│ │ │ │ +
131 // all 'true', but is never actually used
│ │ │ │ +
132 axes_ = (1<<coorddim)-1;
│ │ │ │ +
133 }
│ │ │ │ +
│ │ │ │ +
134
│ │ │ │ +
│ │ │ │ +
142 AxisAlignedCubeGeometry(const Dune::FieldVector<ctype,coorddim> lower,
│ │ │ │ +
143 const Dune::FieldVector<ctype,coorddim> upper,
│ │ │ │ +
144 const std::bitset<coorddim>& axes)
│ │ │ │ +
145 : lower_(lower),
│ │ │ │ +
146 upper_(upper),
│ │ │ │ +
147 axes_(axes)
│ │ │ │ +
148 {
│ │ │ │ +
149 assert(axes.count()==dim);
│ │ │ │ +
150 for (size_t i=0; i<coorddim; i++)
│ │ │ │ +
151 if (not axes_[i])
│ │ │ │ +
152 upper_[i] = lower_[i];
│ │ │ │ +
153 }
│ │ │ │
│ │ │ │ -
153
│ │ │ │ +
154
│ │ │ │
│ │ │ │ -
159 bool affine () const
│ │ │ │ -
160 {
│ │ │ │ -
161 if (!affine_)
│ │ │ │ -
162 affine_.emplace(affineImpl());
│ │ │ │ -
163 return *affine_;
│ │ │ │ -
164 }
│ │ │ │ -
│ │ │ │ -
165
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
168 {
│ │ │ │ -
169 return refElement_.type();
│ │ │ │ -
170 }
│ │ │ │ -
│ │ │ │ -
171
│ │ │ │ -
│ │ │ │ -
173 int corners () const
│ │ │ │ -
174 {
│ │ │ │ -
175 return refElement_.size(mydimension);
│ │ │ │ -
176 }
│ │ │ │ -
│ │ │ │ -
177
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
180 {
│ │ │ │ -
181 assert( (i >= 0) && (i < corners()) );
│ │ │ │ -
182 return global(refElement_.position(i, mydimension));
│ │ │ │ -
183 }
│ │ │ │ -
│ │ │ │ -
184
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
187 {
│ │ │ │ -
188 return global(refElement_.position(0, 0));
│ │ │ │ -
189 }
│ │ │ │ -
│ │ │ │ -
190
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
203 {
│ │ │ │ -
204 thread_local std::vector<typename LocalBasisTraits::RangeType> shapeValues;
│ │ │ │ -
205 localBasis().evaluateFunction(local, shapeValues);
│ │ │ │ -
206 assert(shapeValues.size() == vertices_.size());
│ │ │ │ -
207
│ │ │ │ -
208 GlobalCoordinate out(0);
│ │ │ │ -
209 for (std::size_t i = 0; i < shapeValues.size(); ++i)
│ │ │ │ -
210 out.axpy(shapeValues[i], vertices_[i]);
│ │ │ │ -
211
│ │ │ │ -
212 return out;
│ │ │ │ -
213 }
│ │ │ │ -
│ │ │ │ -
214
│ │ │ │ -
│ │ │ │ -
232 LocalCoordinate local (const GlobalCoordinate& y, Impl::GaussNewtonOptions<ctype> opts = {}) const
│ │ │ │ -
233 {
│ │ │ │ -
234 LocalCoordinate x = refElement_.position(0,0);
│ │ │ │ -
235 Impl::GaussNewtonErrorCode err = Impl::gaussNewton(
│ │ │ │ -
236 [&](const LocalCoordinate& local) { return this->global(local); },
│ │ │ │ -
237 [&](const LocalCoordinate& local) { return this->jacobianTransposed(local); },
│ │ │ │ -
238 y, x, opts
│ │ │ │ -
239 );
│ │ │ │ -
240
│ │ │ │ -
241 if (err != Impl::GaussNewtonErrorCode::OK)
│ │ │ │ -
242 DUNE_THROW(Dune::Exception,
│ │ │ │ -
243 "Local coordinate can not be recovered from global coordinate, error code = " << int(err) << "\n"
│ │ │ │ -
244 << " (global(x) - y).two_norm() = " << (global(x) - y).two_norm()
│ │ │ │ -
245 << " > tol = " << opts.absTol);
│ │ │ │ -
246
│ │ │ │ -
247 return x;
│ │ │ │ -
248 }
│ │ │ │ -
│ │ │ │ -
249
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
261 {
│ │ │ │ -
262 return MatrixHelper::sqrtDetAAT(jacobianTransposed(local));
│ │ │ │ -
263 }
│ │ │ │ -
│ │ │ │ -
264
│ │ │ │ -
│ │ │ │ -
276 Volume volume (Impl::ConvergenceOptions<ctype> opts = {}) const
│ │ │ │ -
277 {
│ │ │ │ - │ │ │ │ -
279 if (affine())
│ │ │ │ -
280 return vol0;
│ │ │ │ -
281
│ │ │ │ -
282 using std::abs;
│ │ │ │ -
283 for (int p = 2; p < opts.maxIt; ++p) {
│ │ │ │ - │ │ │ │ -
285 if (abs(vol1 - vol0) < opts.absTol)
│ │ │ │ -
286 return vol1;
│ │ │ │ -
287
│ │ │ │ -
288 vol0 = vol1;
│ │ │ │ -
289 }
│ │ │ │ -
290 return vol0;
│ │ │ │ -
291 }
│ │ │ │ -
│ │ │ │ -
292
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
295 {
│ │ │ │ -
296 Volume vol(0);
│ │ │ │ -
297 for (const auto& qp : quadRule)
│ │ │ │ -
298 vol += integrationElement(qp.position()) * qp.weight();
│ │ │ │ -
299 return vol;
│ │ │ │ -
300 }
│ │ │ │ -
│ │ │ │ -
301
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
308 {
│ │ │ │ -
309 thread_local std::vector<typename LocalBasisTraits::JacobianType> shapeJacobians;
│ │ │ │ -
310 localBasis().evaluateJacobian(local, shapeJacobians);
│ │ │ │ -
311 assert(shapeJacobians.size() == vertices_.size());
│ │ │ │ -
312
│ │ │ │ -
313 Jacobian out(0);
│ │ │ │ -
314 for (std::size_t i = 0; i < shapeJacobians.size(); ++i) {
│ │ │ │ -
315 for (int j = 0; j < Jacobian::rows; ++j) {
│ │ │ │ -
316 shapeJacobians[i].umtv(vertices_[i][j], out[j]);
│ │ │ │ -
317 }
│ │ │ │ -
318 }
│ │ │ │ -
319 return out;
│ │ │ │ -
320 }
│ │ │ │ -
│ │ │ │ -
321
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
328 {
│ │ │ │ -
329 return jacobian(local).transposed();
│ │ │ │ -
330 }
│ │ │ │ -
│ │ │ │ -
331
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
340 {
│ │ │ │ -
341 JacobianInverse out;
│ │ │ │ -
342 MatrixHelper::leftInvA(jacobian(local), out);
│ │ │ │ -
343 return out;
│ │ │ │ -
344 }
│ │ │ │ -
│ │ │ │ -
345
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
354 {
│ │ │ │ -
355 return jacobianInverse(local).transposed();
│ │ │ │ -
356 }
│ │ │ │ -
│ │ │ │ -
357
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
360 {
│ │ │ │ -
361 return geometry.refElement_;
│ │ │ │ -
362 }
│ │ │ │ -
│ │ │ │ +
159 AxisAlignedCubeGeometry(const Dune::FieldVector<ctype,coorddim> lower)
│ │ │ │ +
160 : lower_(lower)
│ │ │ │ +
161 {}
│ │ │ │ +
│ │ │ │ +
162
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
165 {
│ │ │ │ +
166 return GeometryTypes::cube(dim);
│ │ │ │ +
167 }
│ │ │ │ +
│ │ │ │ +
168
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
171 {
│ │ │ │ +
172 GlobalCoordinate result;
│ │ │ │ +
173 if (dim == coorddim) { // fast case
│ │ │ │ +
174 for (size_t i=0; i<coorddim; i++)
│ │ │ │ +
175 result[i] = lower_[i] + local[i]*(upper_[i] - lower_[i]);
│ │ │ │ +
176 } else if (dim == 0) { // a vertex -- the other fast case
│ │ │ │ +
177 result = lower_; // hope for named-return-type-optimization
│ │ │ │ +
178 } else { // slow case
│ │ │ │ +
179 size_t lc=0;
│ │ │ │ +
180 for (size_t i=0; i<coorddim; i++)
│ │ │ │ +
181 result[i] = (axes_[i])
│ │ │ │ +
182 ? lower_[i] + local[lc++]*(upper_[i] - lower_[i])
│ │ │ │ +
183 : lower_[i];
│ │ │ │ +
184 }
│ │ │ │ +
185 return result;
│ │ │ │ +
186 }
│ │ │ │ +
│ │ │ │ +
187
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
190 {
│ │ │ │ +
191 LocalCoordinate result;
│ │ │ │ +
192 if (dim == coorddim) { // fast case
│ │ │ │ +
193 for (size_t i=0; i<dim; i++)
│ │ │ │ +
194 result[i] = (global[i] - lower_[i]) / (upper_[i] - lower_[i]);
│ │ │ │ +
195 } else if (dim != 0) { // slow case
│ │ │ │ +
196 size_t lc=0;
│ │ │ │ +
197 for (size_t i=0; i<coorddim; i++)
│ │ │ │ +
198 if (axes_[i])
│ │ │ │ +
199 result[lc++] = (global[i] - lower_[i]) / (upper_[i] - lower_[i]);
│ │ │ │ +
200 }
│ │ │ │ +
201 return result;
│ │ │ │ +
202 }
│ │ │ │ +
│ │ │ │ +
203
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
206 {
│ │ │ │ +
207 JacobianTransposed result;
│ │ │ │ +
208
│ │ │ │ +
209 // Actually compute the result. Uses different methods depending
│ │ │ │ +
210 // on what kind of matrix JacobianTransposed is.
│ │ │ │ +
211 jacobianTransposed(result);
│ │ │ │ +
212
│ │ │ │ +
213 return result;
│ │ │ │ +
214 }
│ │ │ │ +
│ │ │ │ +
215
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
218 {
│ │ │ │ + │ │ │ │ +
220
│ │ │ │ +
221 // Actually compute the result. Uses different methods depending
│ │ │ │ +
222 // on what kind of matrix JacobianTransposed is.
│ │ │ │ + │ │ │ │ +
224
│ │ │ │ +
225 return result;
│ │ │ │ +
226 }
│ │ │ │ +
│ │ │ │ +
227
│ │ │ │ +
│ │ │ │ +
229 Jacobian jacobian([[maybe_unused]] const LocalCoordinate& local) const
│ │ │ │ +
230 {
│ │ │ │ +
231 return jacobianTransposed(local).transposed();
│ │ │ │ +
232 }
│ │ │ │ +
│ │ │ │ +
233
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
236 {
│ │ │ │ +
237 return jacobianInverseTransposed(local).transposed();
│ │ │ │ +
238 }
│ │ │ │ +
│ │ │ │ +
239
│ │ │ │ +
│ │ │ │ +
243 Volume integrationElement([[maybe_unused]] const LocalCoordinate& local) const
│ │ │ │ +
244 {
│ │ │ │ +
245 return volume();
│ │ │ │ +
246 }
│ │ │ │ +
│ │ │ │ +
247
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
250 {
│ │ │ │ +
251 GlobalCoordinate result;
│ │ │ │ +
252 if (dim==0)
│ │ │ │ +
253 result = lower_;
│ │ │ │ +
254 else {
│ │ │ │ +
255 // Since lower_==upper_ for unused coordinates, this always does the right thing
│ │ │ │ +
256 for (size_t i=0; i<coorddim; i++)
│ │ │ │ +
257 result[i] = CoordType(0.5) * (lower_[i] + upper_[i]);
│ │ │ │ +
258 }
│ │ │ │ +
259 return result;
│ │ │ │ +
260 }
│ │ │ │ +
│ │ │ │ +
261
│ │ │ │ +
│ │ │ │ +
263 int corners() const
│ │ │ │ +
264 {
│ │ │ │ +
265 return 1<<dim;
│ │ │ │ +
266 }
│ │ │ │ +
│ │ │ │ +
267
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
270 {
│ │ │ │ +
271 GlobalCoordinate result;
│ │ │ │ +
272 if (dim == coorddim) { // fast case
│ │ │ │ +
273 for (size_t i=0; i<coorddim; i++)
│ │ │ │ +
274 result[i] = (k & (1<<i)) ? upper_[i] : lower_[i];
│ │ │ │ +
275 } else if (dim == 0) { // vertex
│ │ │ │ +
276 result = lower_; // rely on named return-type optimization
│ │ │ │ +
277 } else { // slow case
│ │ │ │ +
278 unsigned int mask = 1;
│ │ │ │ +
279
│ │ │ │ +
280 for (size_t i=0; i<coorddim; i++) {
│ │ │ │ +
281 if (not axes_[i])
│ │ │ │ +
282 result[i] = lower_[i];
│ │ │ │ +
283 else {
│ │ │ │ +
284 result[i] = (k & mask) ? upper_[i] : lower_[i];
│ │ │ │ +
285 mask = (mask<<1);
│ │ │ │ +
286 }
│ │ │ │ +
287 }
│ │ │ │ +
288 }
│ │ │ │ +
289
│ │ │ │ +
290
│ │ │ │ +
291 return result;
│ │ │ │ +
292 }
│ │ │ │ +
│ │ │ │ +
293
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
296 {
│ │ │ │ +
297 ctype vol = 1;
│ │ │ │ +
298 if (dim == coorddim) { // fast case
│ │ │ │ +
299 for (size_t i=0; i<dim; i++)
│ │ │ │ +
300 vol *= upper_[i] - lower_[i];
│ │ │ │ +
301 // do nothing if dim == 0
│ │ │ │ +
302 } else if (dim != 0) { // slow case
│ │ │ │ +
303 for (size_t i=0; i<coorddim; i++)
│ │ │ │ +
304 if (axes_[i])
│ │ │ │ +
305 vol *= upper_[i] - lower_[i];
│ │ │ │ +
306 }
│ │ │ │ +
307 return vol;
│ │ │ │ +
308 }
│ │ │ │ +
│ │ │ │ +
309
│ │ │ │ +
│ │ │ │ +
311 bool affine() const
│ │ │ │ +
312 {
│ │ │ │ +
313 return true;
│ │ │ │ +
314 }
│ │ │ │ +
│ │ │ │ +
315
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
317 {
│ │ │ │ + │ │ │ │ +
319 }
│ │ │ │ +
│ │ │ │ +
320
│ │ │ │ +
321 private:
│ │ │ │ +
322 // jacobianTransposed: fast case --> diagonal matrix
│ │ │ │ +
323 void jacobianTransposed ( DiagonalMatrix<ctype,dim> &jacobianTransposed ) const
│ │ │ │ +
324 {
│ │ │ │ +
325 for (size_t i=0; i<dim; i++)
│ │ │ │ +
326 jacobianTransposed.diagonal()[i] = upper_[i] - lower_[i];
│ │ │ │ +
327 }
│ │ │ │ +
328
│ │ │ │ +
329 // jacobianTransposed: slow case --> dense matrix
│ │ │ │ +
330 void jacobianTransposed ( FieldMatrix<ctype,dim,coorddim> &jacobianTransposed ) const
│ │ │ │ +
331 {
│ │ │ │ +
332 if (dim==0)
│ │ │ │ +
333 return;
│ │ │ │ +
334
│ │ │ │ +
335 size_t lc = 0;
│ │ │ │ +
336 for (size_t i=0; i<coorddim; i++)
│ │ │ │ +
337 if (axes_[i])
│ │ │ │ +
338 jacobianTransposed[lc++][i] = upper_[i] - lower_[i];
│ │ │ │ +
339 }
│ │ │ │ +
340
│ │ │ │ +
341 // jacobianInverseTransposed: fast case --> diagonal matrix
│ │ │ │ +
342 void jacobianInverseTransposed ( DiagonalMatrix<ctype,dim> &jacobianInverseTransposed ) const
│ │ │ │ +
343 {
│ │ │ │ +
344 for (size_t i=0; i<dim; i++)
│ │ │ │ +
345 jacobianInverseTransposed.diagonal()[i] = CoordType(1.0) / (upper_[i] - lower_[i]);
│ │ │ │ +
346 }
│ │ │ │ +
347
│ │ │ │ +
348 // jacobianInverseTransposed: slow case --> dense matrix
│ │ │ │ +
349 void jacobianInverseTransposed ( FieldMatrix<ctype,coorddim,dim> &jacobianInverseTransposed ) const
│ │ │ │ +
350 {
│ │ │ │ +
351 if (dim==0)
│ │ │ │ +
352 return;
│ │ │ │ +
353
│ │ │ │ +
354 size_t lc = 0;
│ │ │ │ +
355 for (size_t i=0; i<coorddim; i++)
│ │ │ │ +
356 if (axes_[i])
│ │ │ │ +
357 jacobianInverseTransposed[i][lc++] = CoordType(1.0) / (upper_[i] - lower_[i]);
│ │ │ │ +
358 }
│ │ │ │ +
359
│ │ │ │ +
360 Dune::FieldVector<ctype,coorddim> lower_;
│ │ │ │ +
361
│ │ │ │ +
362 Dune::FieldVector<ctype,coorddim> upper_;
│ │ │ │
363
│ │ │ │ -
│ │ │ │ -
365 const LocalFiniteElement& finiteElement () const
│ │ │ │ -
366 {
│ │ │ │ -
367 return localFE_;
│ │ │ │ -
368 }
│ │ │ │ -
│ │ │ │ -
369
│ │ │ │ -
│ │ │ │ -
371 const std::vector<GlobalCoordinate>& coefficients () const
│ │ │ │ -
372 {
│ │ │ │ -
373 return vertices_;
│ │ │ │ -
374 }
│ │ │ │ -
│ │ │ │ -
375
│ │ │ │ -
│ │ │ │ -
377 const LocalBasis& localBasis () const
│ │ │ │ -
378 {
│ │ │ │ -
379 return localFE_.localBasis();
│ │ │ │ -
380 }
│ │ │ │ -
│ │ │ │ -
381
│ │ │ │ -
382private:
│ │ │ │ -
383
│ │ │ │ -
384 bool affineImpl () const
│ │ │ │ -
385 {
│ │ │ │ -
386 if constexpr(mydimension == 0)
│ │ │ │ -
387 // point geometries are always affine mappings
│ │ │ │ -
388 return true;
│ │ │ │ -
389 else {
│ │ │ │ -
390 if (order() > 1)
│ │ │ │ -
391 // higher-order parametrizations are by definition not affine
│ │ │ │ -
392 return false;
│ │ │ │ -
393 if constexpr(mydimension == 1)
│ │ │ │ -
394 // linear line geometries are affine mappings
│ │ │ │ -
395 return true;
│ │ │ │ -
396 else {
│ │ │ │ -
397 if (type().isSimplex())
│ │ │ │ -
398 // linear simplex geometries are affine mappings
│ │ │ │ -
399 return true;
│ │ │ │ -
400
│ │ │ │ -
401 // multi-linear mappings on non-simplex geometries might be affine
│ │ │ │ -
402 // as well. This is tested explicitly for all vertices by constructing
│ │ │ │ -
403 // an affine mapping from dim+1 affine-independent corners and evaluating
│ │ │ │ -
404 // at the other corners.
│ │ │ │ -
405 auto refSimplex = referenceElement<ctype,mydimension>(GeometryTypes::simplex(mydimension));
│ │ │ │ -
406 auto simplexIndices = Dune::range(refSimplex.size(mydimension));
│ │ │ │ -
407 auto simplexCorners = Dune::transformedRangeView(simplexIndices,
│ │ │ │ -
408 [&](int i) { return this->global(refSimplex.position(i,mydimension)); });
│ │ │ │ -
409 AffineGeometry<ctype,mydimension,coorddimension> affineGeo(refSimplex,simplexCorners);
│ │ │ │ -
410 using std::sqrt;
│ │ │ │ -
411 const ctype tol = sqrt(std::numeric_limits<ctype>::epsilon());
│ │ │ │ -
412 for (int i = 0; i < corners(); ++i) {
│ │ │ │ -
413 const auto corner = refElement_.position(i,mydimension);
│ │ │ │ -
414 if ((affineGeo.global(corner) - global(corner)).two_norm() > tol)
│ │ │ │ -
415 return false;
│ │ │ │ -
416 }
│ │ │ │ -
417 return true;
│ │ │ │ -
418 }
│ │ │ │ -
419 }
│ │ │ │ -
420 }
│ │ │ │ -
421
│ │ │ │ -
422private:
│ │ │ │ -
424 ReferenceElement refElement_{};
│ │ │ │ -
425
│ │ │ │ -
427 LocalFiniteElement localFE_{};
│ │ │ │ -
428
│ │ │ │ -
430 std::vector<GlobalCoordinate> vertices_{};
│ │ │ │ -
431
│ │ │ │ -
432 mutable std::optional<bool> affine_ = std::nullopt;
│ │ │ │ -
433};
│ │ │ │ -
│ │ │ │ -
434
│ │ │ │ -
435namespace Impl {
│ │ │ │ -
436
│ │ │ │ -
437// extract the LocalCoordinate type from a LocalFiniteElement
│ │ │ │ -
438template <class LFE>
│ │ │ │ -
439using LocalCoordinate_t
│ │ │ │ -
440 = FieldVector<typename LFE::Traits::LocalBasisType::Traits::DomainFieldType,
│ │ │ │ -
441 LFE::Traits::LocalBasisType::Traits::dimDomain>;
│ │ │ │ -
442
│ │ │ │ -
443} // end namespace Impl
│ │ │ │ -
444
│ │ │ │ -
445
│ │ │ │ -
446// deduction guides
│ │ │ │ -
447template <class I, class LFE, class GlobalCoordinate>
│ │ │ │ -
448LocalFiniteElementGeometry (Geo::ReferenceElement<I>, const LFE&, std::vector<GlobalCoordinate>)
│ │ │ │ - │ │ │ │ -
450
│ │ │ │ -
451template <class I, class LFE, class F,
│ │ │ │ -
452 class Range = std::invoke_result_t<F,Impl::LocalCoordinate_t<LFE>>>
│ │ │ │ - │ │ │ │ - │ │ │ │ -
455
│ │ │ │ -
456template <class LFE, class GlobalCoordinate>
│ │ │ │ -
457LocalFiniteElementGeometry (GeometryType, const LFE& localFE, std::vector<GlobalCoordinate>)
│ │ │ │ - │ │ │ │ -
459
│ │ │ │ -
460template <class LFE, class F,
│ │ │ │ -
461 class Range = std::invoke_result_t<F,Impl::LocalCoordinate_t<LFE>>>
│ │ │ │ - │ │ │ │ - │ │ │ │ -
464
│ │ │ │ -
465} // namespace Dune
│ │ │ │ -
466
│ │ │ │ -
467#endif // DUNE_GEOMETRY_LOCALFINITEELEMENTGEOMETRY_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
An implementation of the Geometry interface for affine geometries.
│ │ │ │ -
A unique label for each type of element that can occur in a grid.
│ │ │ │ -
STL namespace.
│ │ │ │ +
364 std::bitset<coorddim> axes_;
│ │ │ │ +
365 };
│ │ │ │ +
│ │ │ │ +
366
│ │ │ │ +
367} // namespace Dune
│ │ │ │ +
368#endif
│ │ │ │ +
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:128
│ │ │ │
typename Container::ReferenceElement ReferenceElement
The reference element type.
Definition referenceelements.hh:146
│ │ │ │ -
Geometry implementation based on local-basis function parametrization.
Definition localfiniteelementgeometry.hh:40
│ │ │ │ -
GeometryType type() const
Obtain the name of the reference element.
Definition localfiniteelementgeometry.hh:167
│ │ │ │ -
decltype(power(std::declval< ctype >(), mydimension)) Volume
type of volume
Definition localfiniteelementgeometry.hh:62
│ │ │ │ -
LocalCoordinate local(const GlobalCoordinate &y, Impl::GaussNewtonOptions< ctype > opts={}) const
Evaluate the inverse coordinate mapping.
Definition localfiniteelementgeometry.hh:232
│ │ │ │ -
LocalFiniteElementGeometry(const ReferenceElement &refElement, const LocalFiniteElement &localFE, std::vector< GlobalCoordinate > vertices)
Constructor from a vector of coefficients of the LocalBasis parametrizing the geometry.
Definition localfiniteelementgeometry.hh:103
│ │ │ │ -
JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const
Obtain the transposed of the Jacobian.
Definition localfiniteelementgeometry.hh:327
│ │ │ │ -
const LocalBasis & localBasis() const
The local basis of the stored local finite-element.
Definition localfiniteelementgeometry.hh:377
│ │ │ │ -
typename LocalBasisTraits::DomainFieldType ctype
coordinate type
Definition localfiniteelementgeometry.hh:47
│ │ │ │ -
JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate &local) const
Obtain the transposed of the Jacobian's inverse.
Definition localfiniteelementgeometry.hh:353
│ │ │ │ -
friend ReferenceElement referenceElement(const LocalFiniteElementGeometry &geometry)
Obtain the reference-element related to this geometry.
Definition localfiniteelementgeometry.hh:359
│ │ │ │ -
LocalFiniteElementGeometry()=default
Default constructed geometry results in an empty/invalid representation.
│ │ │ │ -
bool affine() const
Is this mapping affine? Geometries of order 1 might be affine, but it needs to be checked on non-simp...
Definition localfiniteelementgeometry.hh:159
│ │ │ │ -
Jacobian jacobian(const LocalCoordinate &local) const
Obtain the Jacobian.
Definition localfiniteelementgeometry.hh:307
│ │ │ │ -
Volume volume(const QuadratureRule< ctype, mydimension > &quadRule) const
Obtain the volume of the mapping's image by given quadrature rules.
Definition localfiniteelementgeometry.hh:294
│ │ │ │ -
const std::vector< GlobalCoordinate > & coefficients() const
Obtain the coefficients of the parametrization.
Definition localfiniteelementgeometry.hh:371
│ │ │ │ -
LocalFiniteElementGeometry(GeometryType gt, Args &&... args)
Constructor, forwarding to the other constructors that take a reference-element.
Definition localfiniteelementgeometry.hh:144
│ │ │ │ -
static const int coorddimension
coordinate dimension
Definition localfiniteelementgeometry.hh:53
│ │ │ │ -
int corners() const
Obtain number of corners of the corresponding reference element.
Definition localfiniteelementgeometry.hh:173
│ │ │ │ -
GlobalCoordinate center() const
Obtain the centroid of the mapping's image.
Definition localfiniteelementgeometry.hh:186
│ │ │ │ -
const LocalFiniteElement & finiteElement() const
Obtain the local finite-element.
Definition localfiniteelementgeometry.hh:365
│ │ │ │ -
GlobalCoordinate global(const LocalCoordinate &local) const
Evaluate the coordinate mapping.
Definition localfiniteelementgeometry.hh:202
│ │ │ │ -
Impl::FieldMatrixHelper< ctype > MatrixHelper
Definition localfiniteelementgeometry.hh:82
│ │ │ │ -
typename ReferenceElements::ReferenceElement ReferenceElement
Definition localfiniteelementgeometry.hh:79
│ │ │ │ -
GlobalCoordinate corner(int i) const
Obtain coordinates of the i-th corner.
Definition localfiniteelementgeometry.hh:179
│ │ │ │ -
Volume volume(Impl::ConvergenceOptions< ctype > opts={}) const
Obtain the volume of the mapping's image.
Definition localfiniteelementgeometry.hh:276
│ │ │ │ -
static const int mydimension
geometry dimension
Definition localfiniteelementgeometry.hh:50
│ │ │ │ -
JacobianInverse jacobianInverse(const LocalCoordinate &local) const
Obtain the Jacobian's inverse.
Definition localfiniteelementgeometry.hh:339
│ │ │ │ -
FieldVector< ctype, coorddimension > GlobalCoordinate
type of global coordinates
Definition localfiniteelementgeometry.hh:59
│ │ │ │ -
FieldMatrix< ctype, coorddimension, mydimension > Jacobian
type of jacobian
Definition localfiniteelementgeometry.hh:65
│ │ │ │ -
FieldMatrix< ctype, coorddimension, mydimension > JacobianInverseTransposed
type of jacobian inverse transposed
Definition localfiniteelementgeometry.hh:74
│ │ │ │ -
FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse
type of jacobian inverse
Definition localfiniteelementgeometry.hh:71
│ │ │ │ -
ctype integrationElement(const LocalCoordinate &local) const
Obtain the integration element.
Definition localfiniteelementgeometry.hh:260
│ │ │ │ -
int order() const
Obtain the (highest) polynomial order of the parametrization.
Definition localfiniteelementgeometry.hh:149
│ │ │ │ -
FieldVector< ctype, mydimension > LocalCoordinate
type of local coordinates
Definition localfiniteelementgeometry.hh:56
│ │ │ │ -
FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed
type of jacobian transposed
Definition localfiniteelementgeometry.hh:68
│ │ │ │ -
LocalFiniteElementGeometry(const ReferenceElement &refElement, const LocalFiniteElement &localFE, Param &&parametrization)
Constructor from a local parametrization function, mapping local to (curved) global coordinates.
Definition localfiniteelementgeometry.hh:128
│ │ │ │ -
Abstract base class for quadrature rules.
Definition quadraturerules.hh:214
│ │ │ │ -
A container for all quadrature rules of dimension dim
Definition quadraturerules.hh:260
│ │ │ │ +
static const ReferenceElement & cube()
get hypercube reference elements
Definition referenceelements.hh:168
│ │ │ │ +
A geometry implementation for axis-aligned hypercubes.
Definition axisalignedcubegeometry.hh:50
│ │ │ │ +
Volume volume() const
Return the element volume.
Definition axisalignedcubegeometry.hh:295
│ │ │ │ +
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:142
│ │ │ │ +
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:124
│ │ │ │ +
JacobianInverse jacobianInverse(const LocalCoordinate &local) const
Inverse Jacobian of the transformation from local to global coordinates.
Definition axisalignedcubegeometry.hh:235
│ │ │ │ +
JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate &local) const
Inverse Jacobian transposed of the transformation from local to global coordinates.
Definition axisalignedcubegeometry.hh:217
│ │ │ │ +
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:159
│ │ │ │ +
static constexpr int mydimension
Dimension of the cube element.
Definition axisalignedcubegeometry.hh:56
│ │ │ │ +
friend Dune::ReferenceElements< ctype, dim >::ReferenceElement referenceElement(const AxisAlignedCubeGeometry &)
Definition axisalignedcubegeometry.hh:316
│ │ │ │ +
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:269
│ │ │ │ +
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
│ │ │ │ +
JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const
Jacobian transposed of the transformation from local to global coordinates.
Definition axisalignedcubegeometry.hh:205
│ │ │ │ +
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:189
│ │ │ │ +
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:164
│ │ │ │ +
int corners() const
Return the number of corners of the element.
Definition axisalignedcubegeometry.hh:263
│ │ │ │ +
Jacobian jacobian(const LocalCoordinate &local) const
Jacobian of the transformation from local to global coordinates.
Definition axisalignedcubegeometry.hh:229
│ │ │ │ +
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:243
│ │ │ │ +
GlobalCoordinate center() const
Return center of mass of the element.
Definition axisalignedcubegeometry.hh:249
│ │ │ │ +
AxisAlignedCubeGeometry()=default
Constructs an empty geometry.
│ │ │ │ +
bool affine() const
Return if the element is affine. Here: yes.
Definition axisalignedcubegeometry.hh:311
│ │ │ │ +
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:170
│ │ │ │
Unique label for each type of entities that can occur in DUNE grids.
Definition type.hh:114
│ │ │ │ -
constexpr bool isSimplex() const
Return true if entity is a simplex of any dimension.
Definition type.hh:319
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,531 +1,438 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -localfiniteelementgeometry.hh │ │ │ │ │ +axisalignedcubegeometry.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 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 © 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_LOCALFINITEELEMENTGEOMETRY_HH │ │ │ │ │ -6#define DUNE_GEOMETRY_LOCALFINITEELEMENTGEOMETRY_HH │ │ │ │ │ -7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13 │ │ │ │ │ -14#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#include │ │ │ │ │ -19 │ │ │ │ │ -20#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_a_f_f_i_n_e_g_e_o_m_e_t_r_y_._h_h> // for FieldMatrixHelper │ │ │ │ │ -21#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_q_u_a_d_r_a_t_u_r_e_r_u_l_e_s_._h_h> │ │ │ │ │ -22#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ -23#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ -24#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_u_t_i_l_i_t_y_/_a_l_g_o_r_i_t_h_m_s_._h_h> │ │ │ │ │ -25#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_u_t_i_l_i_t_y_/_c_o_n_v_e_r_g_e_n_c_e_._h_h> │ │ │ │ │ -26 │ │ │ │ │ -27namespace _D_u_n_e { │ │ │ │ │ -28 │ │ │ │ │ -38template │ │ │ │ │ -_3_9class _L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y │ │ │ │ │ -40{ │ │ │ │ │ -41 using LocalFiniteElement = LFE; │ │ │ │ │ -42 using LocalBasis = typename LFE::Traits::LocalBasisType; │ │ │ │ │ -43 using LocalBasisTraits = typename LocalBasis::Traits; │ │ │ │ │ -44 │ │ │ │ │ -45public: │ │ │ │ │ -_4_7 using _c_t_y_p_e = typename LocalBasisTraits::DomainFieldType; │ │ │ │ │ -48 │ │ │ │ │ -_5_0 static const int _m_y_d_i_m_e_n_s_i_o_n = LocalBasisTraits::dimDomain; │ │ │ │ │ +16#include │ │ │ │ │ +17#include │ │ │ │ │ +18 │ │ │ │ │ +19#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ +20#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ +21 │ │ │ │ │ +22 │ │ │ │ │ +23namespace _D_u_n_e { │ │ │ │ │ +24 │ │ │ │ │ +48 template │ │ │ │ │ +_4_9 class _A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y │ │ │ │ │ +50 { │ │ │ │ │ 51 │ │ │ │ │ -_5_3 static const int _c_o_o_r_d_d_i_m_e_n_s_i_o_n = cdim; │ │ │ │ │ +52 │ │ │ │ │ +53 public: │ │ │ │ │ 54 │ │ │ │ │ -_5_6 using _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e = FieldVector; │ │ │ │ │ +_5_6 constexpr static int _m_y_d_i_m_e_n_s_i_o_n = dim; │ │ │ │ │ 57 │ │ │ │ │ -_5_9 using _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e = FieldVector; │ │ │ │ │ +_5_9 constexpr static int _c_o_o_r_d_d_i_m_e_n_s_i_o_n = coorddim; │ │ │ │ │ 60 │ │ │ │ │ -_6_2 using _V_o_l_u_m_e = decltype(power(std::declval(),_m_y_d_i_m_e_n_s_i_o_n)); │ │ │ │ │ +_6_2 typedef CoordType _c_t_y_p_e; │ │ │ │ │ 63 │ │ │ │ │ -_6_5 using _J_a_c_o_b_i_a_n = FieldMatrix; │ │ │ │ │ +_6_5 typedef FieldVector _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ 66 │ │ │ │ │ -_6_8 using _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d = FieldMatrix; │ │ │ │ │ +_6_8 typedef FieldVector _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ 69 │ │ │ │ │ -_7_1 using _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e = FieldMatrix; │ │ │ │ │ +_7_1 typedef _c_t_y_p_e _V_o_l_u_m_e; │ │ │ │ │ 72 │ │ │ │ │ -_7_4 using _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d = FieldMatrix; │ │ │ │ │ -75 │ │ │ │ │ -76public: │ │ │ │ │ -_7_8 using _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s = _D_u_n_e_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_<_c_t_y_p_e_,_ _m_y_d_i_m_e_n_s_i_o_n_>; │ │ │ │ │ -_7_9 using _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t = typename _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t; │ │ │ │ │ -80 │ │ │ │ │ -81protected: │ │ │ │ │ -_8_2 using _M_a_t_r_i_x_H_e_l_p_e_r = Impl::FieldMatrixHelper; │ │ │ │ │ -83 │ │ │ │ │ -84public: │ │ │ │ │ -_8_6 _L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y () = default; │ │ │ │ │ -87 │ │ │ │ │ -_1_0_3 _L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y (const _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t& refElement, │ │ │ │ │ -104 const LocalFiniteElement& localFE, │ │ │ │ │ -105 std::vector vertices) │ │ │ │ │ -106 : refElement_(refElement) │ │ │ │ │ -107 , localFE_(localFE) │ │ │ │ │ -108 , vertices_(_s_t_d::move(vertices)) │ │ │ │ │ -109 { │ │ │ │ │ -110 assert(localFE_.size() == vertices_.size()); │ │ │ │ │ -111 } │ │ │ │ │ -112 │ │ │ │ │ -126 template , int> = 0> │ │ │ │ │ -_1_2_8 _L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y (const _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t& refElement, │ │ │ │ │ -129 const LocalFiniteElement& localFE, │ │ │ │ │ -130 Param&& parametrization) │ │ │ │ │ -131 : refElement_(refElement) │ │ │ │ │ -132 , localFE_(localFE) │ │ │ │ │ -133 { │ │ │ │ │ -134 localFE_.localInterpolation().interpolate(parametrization, vertices_); │ │ │ │ │ -135 } │ │ │ │ │ -136 │ │ │ │ │ -143 template │ │ │ │ │ -_1_4_4 explicit _L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y (_G_e_o_m_e_t_r_y_T_y_p_e gt, Args&&... args) │ │ │ │ │ -145 : _L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y(_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s::general(gt), _s_t_d:: │ │ │ │ │ -forward(args)...) │ │ │ │ │ -146 {} │ │ │ │ │ -147 │ │ │ │ │ -_1_4_9 int _o_r_d_e_r () const │ │ │ │ │ -150 { │ │ │ │ │ -151 return _l_o_c_a_l_B_a_s_i_s().order(); │ │ │ │ │ -152 } │ │ │ │ │ -153 │ │ │ │ │ -_1_5_9 bool _a_f_f_i_n_e () const │ │ │ │ │ -160 { │ │ │ │ │ -161 if (!affine_) │ │ │ │ │ -162 affine_.emplace(affineImpl()); │ │ │ │ │ -163 return *affine_; │ │ │ │ │ -164 } │ │ │ │ │ -165 │ │ │ │ │ -_1_6_7 _G_e_o_m_e_t_r_y_T_y_p_e _t_y_p_e () const │ │ │ │ │ -168 { │ │ │ │ │ -169 return refElement_.type(); │ │ │ │ │ -170 } │ │ │ │ │ -171 │ │ │ │ │ -_1_7_3 int _c_o_r_n_e_r_s () const │ │ │ │ │ -174 { │ │ │ │ │ -175 return refElement_.size(_m_y_d_i_m_e_n_s_i_o_n); │ │ │ │ │ -176 } │ │ │ │ │ -177 │ │ │ │ │ -_1_7_9 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _c_o_r_n_e_r (int i) const │ │ │ │ │ -180 { │ │ │ │ │ -181 assert( (i >= 0) && (i < _c_o_r_n_e_r_s()) ); │ │ │ │ │ -182 return _g_l_o_b_a_l(refElement_.position(i, _m_y_d_i_m_e_n_s_i_o_n)); │ │ │ │ │ -183 } │ │ │ │ │ -184 │ │ │ │ │ -_1_8_6 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _c_e_n_t_e_r () const │ │ │ │ │ -187 { │ │ │ │ │ -188 return _g_l_o_b_a_l(refElement_.position(0, 0)); │ │ │ │ │ -189 } │ │ │ │ │ -190 │ │ │ │ │ -_2_0_2 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _g_l_o_b_a_l (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) const │ │ │ │ │ -203 { │ │ │ │ │ -204 thread_local std::vector shapeValues; │ │ │ │ │ -205 _l_o_c_a_l_B_a_s_i_s().evaluateFunction(_l_o_c_a_l, shapeValues); │ │ │ │ │ -206 assert(shapeValues.size() == vertices_.size()); │ │ │ │ │ -207 │ │ │ │ │ -208 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e out(0); │ │ │ │ │ -209 for (std::size_t i = 0; i < shapeValues.size(); ++i) │ │ │ │ │ -210 out.axpy(shapeValues[i], vertices_[i]); │ │ │ │ │ -211 │ │ │ │ │ -212 return out; │ │ │ │ │ -213 } │ │ │ │ │ -214 │ │ │ │ │ -_2_3_2 _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e _l_o_c_a_l (const _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e& y, Impl:: │ │ │ │ │ -GaussNewtonOptions opts = {}) const │ │ │ │ │ -233 { │ │ │ │ │ -234 _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e x = refElement_.position(0,0); │ │ │ │ │ -235 Impl::GaussNewtonErrorCode err = Impl::gaussNewton( │ │ │ │ │ -236 [&](const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) { return this->_g_l_o_b_a_l(local); }, │ │ │ │ │ -237 [&](const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) { return this->_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d(local); │ │ │ │ │ -}, │ │ │ │ │ -238 y, x, opts │ │ │ │ │ -239 ); │ │ │ │ │ -240 │ │ │ │ │ -241 if (err != Impl::GaussNewtonErrorCode::OK) │ │ │ │ │ -242 DUNE_THROW(Dune::Exception, │ │ │ │ │ -243 "Local coordinate can not be recovered from global coordinate, error code = │ │ │ │ │ -" << int(err) << "\n" │ │ │ │ │ -244 << " (global(x) - y).two_norm() = " << (_g_l_o_b_a_l(x) - y).two_norm() │ │ │ │ │ -245 << " > tol = " << opts.absTol); │ │ │ │ │ -246 │ │ │ │ │ -247 return x; │ │ │ │ │ -248 } │ │ │ │ │ -249 │ │ │ │ │ -_2_6_0 _c_t_y_p_e _i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) const │ │ │ │ │ -261 { │ │ │ │ │ -262 return MatrixHelper::sqrtDetAAT(_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d(_l_o_c_a_l)); │ │ │ │ │ -263 } │ │ │ │ │ -264 │ │ │ │ │ -_2_7_6 _V_o_l_u_m_e _v_o_l_u_m_e (Impl::ConvergenceOptions opts = {}) const │ │ │ │ │ -277 { │ │ │ │ │ -278 _V_o_l_u_m_e vol0 = _v_o_l_u_m_e(_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s_<_c_t_y_p_e_,_ _m_y_d_i_m_e_n_s_i_o_n_>_:_:_r_u_l_e(_t_y_p_e(), 1)); │ │ │ │ │ -279 if (_a_f_f_i_n_e()) │ │ │ │ │ -280 return vol0; │ │ │ │ │ -281 │ │ │ │ │ -282 using std::abs; │ │ │ │ │ -283 for (int p = 2; p < opts.maxIt; ++p) { │ │ │ │ │ -284 _V_o_l_u_m_e vol1 = _v_o_l_u_m_e(_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s_<_c_t_y_p_e_,_ _m_y_d_i_m_e_n_s_i_o_n_>_:_:_r_u_l_e(_t_y_p_e(), p)); │ │ │ │ │ -285 if (abs(vol1 - vol0) < opts.absTol) │ │ │ │ │ -286 return vol1; │ │ │ │ │ -287 │ │ │ │ │ -288 vol0 = vol1; │ │ │ │ │ -289 } │ │ │ │ │ -290 return vol0; │ │ │ │ │ -291 } │ │ │ │ │ -292 │ │ │ │ │ -_2_9_4 _V_o_l_u_m_e _v_o_l_u_m_e (const _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_<_c_t_y_p_e_,_ _m_y_d_i_m_e_n_s_i_o_n_>& quadRule) const │ │ │ │ │ -295 { │ │ │ │ │ -296 _V_o_l_u_m_e vol(0); │ │ │ │ │ -297 for (const auto& qp : quadRule) │ │ │ │ │ -298 vol += _i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t(qp.position()) * qp.weight(); │ │ │ │ │ -299 return vol; │ │ │ │ │ -300 } │ │ │ │ │ -301 │ │ │ │ │ -_3_0_7 _J_a_c_o_b_i_a_n _j_a_c_o_b_i_a_n (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) const │ │ │ │ │ -308 { │ │ │ │ │ -309 thread_local std::vector │ │ │ │ │ -shapeJacobians; │ │ │ │ │ -310 _l_o_c_a_l_B_a_s_i_s().evaluateJacobian(_l_o_c_a_l, shapeJacobians); │ │ │ │ │ -311 assert(shapeJacobians.size() == vertices_.size()); │ │ │ │ │ -312 │ │ │ │ │ -313 _J_a_c_o_b_i_a_n out(0); │ │ │ │ │ -314 for (std::size_t i = 0; i < shapeJacobians.size(); ++i) { │ │ │ │ │ -315 for (int j = 0; j < Jacobian::rows; ++j) { │ │ │ │ │ -316 shapeJacobians[i].umtv(vertices_[i][j], out[j]); │ │ │ │ │ -317 } │ │ │ │ │ -318 } │ │ │ │ │ -319 return out; │ │ │ │ │ -320 } │ │ │ │ │ -321 │ │ │ │ │ -_3_2_7 _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d _j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) const │ │ │ │ │ -328 { │ │ │ │ │ -329 return _j_a_c_o_b_i_a_n(_l_o_c_a_l).transposed(); │ │ │ │ │ -330 } │ │ │ │ │ -331 │ │ │ │ │ -_3_3_9 _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e _j_a_c_o_b_i_a_n_I_n_v_e_r_s_e (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) const │ │ │ │ │ -340 { │ │ │ │ │ -341 _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e out; │ │ │ │ │ -342 MatrixHelper::leftInvA(_j_a_c_o_b_i_a_n(_l_o_c_a_l), out); │ │ │ │ │ -343 return out; │ │ │ │ │ -344 } │ │ │ │ │ -345 │ │ │ │ │ -_3_5_3 _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d _j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& │ │ │ │ │ +79 typedef typename std::conditional, │ │ │ │ │ +_8_1 FieldMatrix >_:_:_t_y_p_e _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d; │ │ │ │ │ +82 │ │ │ │ │ +89 typedef typename std::conditional, │ │ │ │ │ +_9_1 FieldMatrix >_:_:_t_y_p_e _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d; │ │ │ │ │ +92 │ │ │ │ │ +_1_0_0 using _J_a_c_o_b_i_a_n = std::conditional_t, FieldMatrix >; │ │ │ │ │ +101 │ │ │ │ │ +_1_0_9 using _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e = std::conditional_t, FieldMatrix >; │ │ │ │ │ +110 │ │ │ │ │ +_1_1_8 _A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y () = default; │ │ │ │ │ +119 │ │ │ │ │ +_1_2_4 _A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y(const Dune::FieldVector lower, │ │ │ │ │ +125 const Dune::FieldVector upper) │ │ │ │ │ +126 : lower_(lower), │ │ │ │ │ +127 upper_(upper), │ │ │ │ │ +128 axes_() │ │ │ │ │ +129 { │ │ │ │ │ +130 static_assert(dim==coorddim, "Use this constructor only if │ │ │ │ │ +dim==coorddim!"); │ │ │ │ │ +131 // all 'true', but is never actually used │ │ │ │ │ +132 axes_ = (1< lower, │ │ │ │ │ +143 const Dune::FieldVector upper, │ │ │ │ │ +144 const std::bitset& axes) │ │ │ │ │ +145 : lower_(lower), │ │ │ │ │ +146 upper_(upper), │ │ │ │ │ +147 axes_(axes) │ │ │ │ │ +148 { │ │ │ │ │ +149 assert(axes.count()==dim); │ │ │ │ │ +150 for (size_t i=0; i lower) │ │ │ │ │ +160 : lower_(lower) │ │ │ │ │ +161 {} │ │ │ │ │ +162 │ │ │ │ │ +_1_6_4 _G_e_o_m_e_t_r_y_T_y_p_e _t_y_p_e() const │ │ │ │ │ +165 { │ │ │ │ │ +166 return GeometryTypes::cube(dim); │ │ │ │ │ +167 } │ │ │ │ │ +168 │ │ │ │ │ +_1_7_0 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _g_l_o_b_a_l(const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) const │ │ │ │ │ +171 { │ │ │ │ │ +172 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e result; │ │ │ │ │ +173 if (dim == coorddim) { // fast case │ │ │ │ │ +174 for (size_t i=0; i_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ +_r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t ( const _A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y & /* geometry */ ) │ │ │ │ │ +317 { │ │ │ │ │ +318 return _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_<_ _c_t_y_p_e_,_ _d_i_m_ _>_:_:_c_u_b_e(); │ │ │ │ │ +319 } │ │ │ │ │ +320 │ │ │ │ │ +321 private: │ │ │ │ │ +322 // jacobianTransposed: fast case --> diagonal matrix │ │ │ │ │ +323 void _j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d ( DiagonalMatrix &_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d ) │ │ │ │ │ +const │ │ │ │ │ +324 { │ │ │ │ │ +325 for (size_t i=0; i dense matrix │ │ │ │ │ +330 void _j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d ( FieldMatrix │ │ │ │ │ +&_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d ) const │ │ │ │ │ +331 { │ │ │ │ │ +332 if (dim==0) │ │ │ │ │ +333 return; │ │ │ │ │ +334 │ │ │ │ │ +335 size_t lc = 0; │ │ │ │ │ +336 for (size_t i=0; i diagonal matrix │ │ │ │ │ +342 void _j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d ( DiagonalMatrix │ │ │ │ │ +&_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d ) const │ │ │ │ │ +343 { │ │ │ │ │ +344 for (size_t i=0; i dense matrix │ │ │ │ │ +349 void _j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d ( FieldMatrix │ │ │ │ │ +&_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d ) const │ │ │ │ │ +350 { │ │ │ │ │ +351 if (dim==0) │ │ │ │ │ +352 return; │ │ │ │ │ +353 │ │ │ │ │ +354 size_t lc = 0; │ │ │ │ │ +355 for (size_t i=0; i lower_; │ │ │ │ │ +361 │ │ │ │ │ +362 Dune::FieldVector upper_; │ │ │ │ │ 363 │ │ │ │ │ -_3_6_5 const LocalFiniteElement& _f_i_n_i_t_e_E_l_e_m_e_n_t () const │ │ │ │ │ -366 { │ │ │ │ │ -367 return localFE_; │ │ │ │ │ -368 } │ │ │ │ │ -369 │ │ │ │ │ -_3_7_1 const std::vector& _c_o_e_f_f_i_c_i_e_n_t_s () const │ │ │ │ │ -372 { │ │ │ │ │ -373 return vertices_; │ │ │ │ │ -374 } │ │ │ │ │ -375 │ │ │ │ │ -_3_7_7 const LocalBasis& _l_o_c_a_l_B_a_s_i_s () const │ │ │ │ │ -378 { │ │ │ │ │ -379 return localFE_.localBasis(); │ │ │ │ │ -380 } │ │ │ │ │ -381 │ │ │ │ │ -382private: │ │ │ │ │ -383 │ │ │ │ │ -384 bool affineImpl () const │ │ │ │ │ -385 { │ │ │ │ │ -386 if constexpr(_m_y_d_i_m_e_n_s_i_o_n == 0) │ │ │ │ │ -387 // point geometries are always affine mappings │ │ │ │ │ -388 return true; │ │ │ │ │ -389 else { │ │ │ │ │ -390 if (_o_r_d_e_r() > 1) │ │ │ │ │ -391 // higher-order parametrizations are by definition not affine │ │ │ │ │ -392 return false; │ │ │ │ │ -393 if constexpr(_m_y_d_i_m_e_n_s_i_o_n == 1) │ │ │ │ │ -394 // linear line geometries are affine mappings │ │ │ │ │ -395 return true; │ │ │ │ │ -396 else { │ │ │ │ │ -397 if (_t_y_p_e()._i_s_S_i_m_p_l_e_x()) │ │ │ │ │ -398 // linear simplex geometries are affine mappings │ │ │ │ │ -399 return true; │ │ │ │ │ -400 │ │ │ │ │ -401 // multi-linear mappings on non-simplex geometries might be affine │ │ │ │ │ -402 // as well. This is tested explicitly for all vertices by constructing │ │ │ │ │ -403 // an affine mapping from dim+1 affine-independent corners and evaluating │ │ │ │ │ -404 // at the other corners. │ │ │ │ │ -405 auto refSimplex = referenceElement(GeometryTypes:: │ │ │ │ │ -simplex(_m_y_d_i_m_e_n_s_i_o_n)); │ │ │ │ │ -406 auto simplexIndices = Dune::range(refSimplex.size(_m_y_d_i_m_e_n_s_i_o_n)); │ │ │ │ │ -407 auto simplexCorners = Dune::transformedRangeView(simplexIndices, │ │ │ │ │ -408 [&](int i) { return this->_g_l_o_b_a_l(refSimplex.position(i,_m_y_d_i_m_e_n_s_i_o_n)); }); │ │ │ │ │ -409 AffineGeometry affineGeo │ │ │ │ │ -(refSimplex,simplexCorners); │ │ │ │ │ -410 using std::sqrt; │ │ │ │ │ -411 const _c_t_y_p_e tol = sqrt(std::numeric_limits::epsilon()); │ │ │ │ │ -412 for (int i = 0; i < _c_o_r_n_e_r_s(); ++i) { │ │ │ │ │ -413 const auto _c_o_r_n_e_r = refElement_.position(i,_m_y_d_i_m_e_n_s_i_o_n); │ │ │ │ │ -414 if ((affineGeo.global(_c_o_r_n_e_r) - _g_l_o_b_a_l(_c_o_r_n_e_r)).two_norm() > tol) │ │ │ │ │ -415 return false; │ │ │ │ │ -416 } │ │ │ │ │ -417 return true; │ │ │ │ │ -418 } │ │ │ │ │ -419 } │ │ │ │ │ -420 } │ │ │ │ │ -421 │ │ │ │ │ -422private: │ │ │ │ │ -424 _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t refElement_{}; │ │ │ │ │ -425 │ │ │ │ │ -427 LocalFiniteElement localFE_{}; │ │ │ │ │ -428 │ │ │ │ │ -430 std::vector vertices_{}; │ │ │ │ │ -431 │ │ │ │ │ -432 mutable std::optional affine_ = std::nullopt; │ │ │ │ │ -433}; │ │ │ │ │ -434 │ │ │ │ │ -435namespace Impl { │ │ │ │ │ -436 │ │ │ │ │ -437// extract the LocalCoordinate type from a LocalFiniteElement │ │ │ │ │ -438template │ │ │ │ │ -439using LocalCoordinate_t │ │ │ │ │ -440 = FieldVector; │ │ │ │ │ -442 │ │ │ │ │ -443} // end namespace Impl │ │ │ │ │ -444 │ │ │ │ │ -445 │ │ │ │ │ -446// deduction guides │ │ │ │ │ -447template │ │ │ │ │ -_4_4_8_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y (_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_<_I_>, const LFE&, std:: │ │ │ │ │ -vector) │ │ │ │ │ -449 -> _L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_<_L_F_E_,_ _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e_:_:_d_i_m_e_n_s_i_o_n_>; │ │ │ │ │ -450 │ │ │ │ │ -451template >> │ │ │ │ │ -_4_5_3_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y (_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_<_I_>, const LFE&, const F&) │ │ │ │ │ -454 -> _L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_<_L_F_E_,_ _R_a_n_g_e_:_:_d_i_m_e_n_s_i_o_n_>; │ │ │ │ │ -455 │ │ │ │ │ -456template │ │ │ │ │ -_4_5_7_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y (_G_e_o_m_e_t_r_y_T_y_p_e, const LFE& localFE, std:: │ │ │ │ │ -vector) │ │ │ │ │ -458 -> _L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_<_L_F_E_,_ _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e_:_:_d_i_m_e_n_s_i_o_n_>; │ │ │ │ │ -459 │ │ │ │ │ -460template >> │ │ │ │ │ -_4_6_2_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y (_G_e_o_m_e_t_r_y_T_y_p_e, const LFE&, const F&) │ │ │ │ │ -463 -> _L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_<_L_F_E_,_ _R_a_n_g_e_:_:_d_i_m_e_n_s_i_o_n_>; │ │ │ │ │ -464 │ │ │ │ │ -465} // namespace Dune │ │ │ │ │ -466 │ │ │ │ │ -467#endif // DUNE_GEOMETRY_LOCALFINITEELEMENTGEOMETRY_HH │ │ │ │ │ -_c_o_n_v_e_r_g_e_n_c_e_._h_h │ │ │ │ │ -_a_l_g_o_r_i_t_h_m_s_._h_h │ │ │ │ │ -_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h │ │ │ │ │ -_q_u_a_d_r_a_t_u_r_e_r_u_l_e_s_._h_h │ │ │ │ │ -_a_f_f_i_n_e_g_e_o_m_e_t_r_y_._h_h │ │ │ │ │ -An implementation of the Geometry interface for affine geometries. │ │ │ │ │ +364 std::bitset axes_; │ │ │ │ │ +365 }; │ │ │ │ │ +366 │ │ │ │ │ +367} // namespace Dune │ │ │ │ │ +368#endif │ │ │ │ │ _t_y_p_e_._h_h │ │ │ │ │ A unique label for each type of element that can occur in a grid. │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ +_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn affinegeometry.hh:21 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ -This class provides access to geometric and topological properties of a │ │ │ │ │ -reference element. │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s │ │ │ │ │ -Class providing access to the singletons of the reference elements. │ │ │ │ │ -DDeeffiinniittiioonn referenceelements.hh:128 │ │ │ │ │ _D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ typename Container::ReferenceElement ReferenceElement │ │ │ │ │ The reference element type. │ │ │ │ │ DDeeffiinniittiioonn referenceelements.hh:146 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y │ │ │ │ │ -Geometry implementation based on local-basis function parametrization. │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:40 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_t_y_p_e │ │ │ │ │ -GeometryType type() const │ │ │ │ │ -Obtain the name of the reference element. │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:167 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_V_o_l_u_m_e │ │ │ │ │ -decltype(power(std::declval< ctype >(), mydimension)) Volume │ │ │ │ │ -type of volume │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:62 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_l_o_c_a_l │ │ │ │ │ -LocalCoordinate local(const GlobalCoordinate &y, Impl::GaussNewtonOptions< │ │ │ │ │ -ctype > opts={}) const │ │ │ │ │ -Evaluate the inverse coordinate mapping. │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:232 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y │ │ │ │ │ -LocalFiniteElementGeometry(const ReferenceElement &refElement, const │ │ │ │ │ -LocalFiniteElement &localFE, std::vector< GlobalCoordinate > vertices) │ │ │ │ │ -Constructor from a vector of coefficients of the LocalBasis parametrizing the │ │ │ │ │ -geometry. │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:103 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const │ │ │ │ │ -Obtain the transposed of the Jacobian. │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:327 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_l_o_c_a_l_B_a_s_i_s │ │ │ │ │ -const LocalBasis & localBasis() const │ │ │ │ │ -The local basis of the stored local finite-element. │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:377 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_c_t_y_p_e │ │ │ │ │ -typename LocalBasisTraits::DomainFieldType ctype │ │ │ │ │ -coordinate type │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:47 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_c_u_b_e │ │ │ │ │ +static const ReferenceElement & cube() │ │ │ │ │ +get hypercube reference elements │ │ │ │ │ +DDeeffiinniittiioonn referenceelements.hh:168 │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y │ │ │ │ │ +A geometry implementation for axis-aligned hypercubes. │ │ │ │ │ +DDeeffiinniittiioonn axisalignedcubegeometry.hh:50 │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_v_o_l_u_m_e │ │ │ │ │ +Volume volume() const │ │ │ │ │ +Return the element volume. │ │ │ │ │ +DDeeffiinniittiioonn axisalignedcubegeometry.hh:295 │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y │ │ │ │ │ +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. │ │ │ │ │ +DDeeffiinniittiioonn axisalignedcubegeometry.hh:142 │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y │ │ │ │ │ +AxisAlignedCubeGeometry(const Dune::FieldVector< ctype, coorddim > lower, const │ │ │ │ │ +Dune::FieldVector< ctype, coorddim > upper) │ │ │ │ │ +Constructor from a lower left and an upper right corner. │ │ │ │ │ +DDeeffiinniittiioonn axisalignedcubegeometry.hh:124 │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e │ │ │ │ │ +JacobianInverse jacobianInverse(const LocalCoordinate &local) const │ │ │ │ │ +Inverse Jacobian of the transformation from local to global coordinates. │ │ │ │ │ +DDeeffiinniittiioonn axisalignedcubegeometry.hh:235 │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate │ │ │ │ │ &local) const │ │ │ │ │ -Obtain the transposed of the Jacobian's inverse. │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:353 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ -friend ReferenceElement referenceElement(const LocalFiniteElementGeometry │ │ │ │ │ -&geometry) │ │ │ │ │ -Obtain the reference-element related to this geometry. │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:359 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y │ │ │ │ │ -LocalFiniteElementGeometry()=default │ │ │ │ │ -Default constructed geometry results in an empty/invalid representation. │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_a_f_f_i_n_e │ │ │ │ │ -bool affine() const │ │ │ │ │ -Is this mapping affine? Geometries of order 1 might be affine, but it needs to │ │ │ │ │ -be checked on non-simp... │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:159 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n │ │ │ │ │ -Jacobian jacobian(const LocalCoordinate &local) const │ │ │ │ │ -Obtain the Jacobian. │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:307 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_v_o_l_u_m_e │ │ │ │ │ -Volume volume(const QuadratureRule< ctype, mydimension > &quadRule) const │ │ │ │ │ -Obtain the volume of the mapping's image by given quadrature rules. │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:294 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_c_o_e_f_f_i_c_i_e_n_t_s │ │ │ │ │ -const std::vector< GlobalCoordinate > & coefficients() const │ │ │ │ │ -Obtain the coefficients of the parametrization. │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:371 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y │ │ │ │ │ -LocalFiniteElementGeometry(GeometryType gt, Args &&... args) │ │ │ │ │ -Constructor, forwarding to the other constructors that take a reference- │ │ │ │ │ -element. │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:144 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_c_o_o_r_d_d_i_m_e_n_s_i_o_n │ │ │ │ │ -static const int coorddimension │ │ │ │ │ -coordinate dimension │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:53 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_c_o_r_n_e_r_s │ │ │ │ │ +Inverse Jacobian transposed of the transformation from local to global │ │ │ │ │ +coordinates. │ │ │ │ │ +DDeeffiinniittiioonn axisalignedcubegeometry.hh:217 │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ +std::conditional< dim==coorddim, DiagonalMatrix< ctype, dim >, FieldMatrix< │ │ │ │ │ +ctype, dim, coorddim > >::type JacobianTransposed │ │ │ │ │ +Return type of jacobianTransposed. │ │ │ │ │ +DDeeffiinniittiioonn axisalignedcubegeometry.hh:81 │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y │ │ │ │ │ +AxisAlignedCubeGeometry(const Dune::FieldVector< ctype, coorddim > lower) │ │ │ │ │ +Constructor from a single point only. │ │ │ │ │ +DDeeffiinniittiioonn axisalignedcubegeometry.hh:159 │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_m_y_d_i_m_e_n_s_i_o_n │ │ │ │ │ +static constexpr int mydimension │ │ │ │ │ +Dimension of the cube element. │ │ │ │ │ +DDeeffiinniittiioonn axisalignedcubegeometry.hh:56 │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ +friend Dune::ReferenceElements< ctype, dim >::ReferenceElement referenceElement │ │ │ │ │ +(const AxisAlignedCubeGeometry &) │ │ │ │ │ +DDeeffiinniittiioonn axisalignedcubegeometry.hh:316 │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_c_o_o_r_d_d_i_m_e_n_s_i_o_n │ │ │ │ │ +static constexpr int coorddimension │ │ │ │ │ +Dimension of the world space that the cube element is embedded in. │ │ │ │ │ +DDeeffiinniittiioonn axisalignedcubegeometry.hh:59 │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_c_o_r_n_e_r │ │ │ │ │ +GlobalCoordinate corner(int k) const │ │ │ │ │ +Return world coordinates of the k-th corner of the element. │ │ │ │ │ +DDeeffiinniittiioonn axisalignedcubegeometry.hh:269 │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_V_o_l_u_m_e │ │ │ │ │ +ctype Volume │ │ │ │ │ +Type used for volume. │ │ │ │ │ +DDeeffiinniittiioonn axisalignedcubegeometry.hh:71 │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ +FieldVector< ctype, dim > LocalCoordinate │ │ │ │ │ +Type used for a vector of element coordinates. │ │ │ │ │ +DDeeffiinniittiioonn axisalignedcubegeometry.hh:65 │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ +JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const │ │ │ │ │ +Jacobian transposed of the transformation from local to global coordinates. │ │ │ │ │ +DDeeffiinniittiioonn axisalignedcubegeometry.hh:205 │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ +FieldVector< ctype, coorddim > GlobalCoordinate │ │ │ │ │ +Type used for a vector of world coordinates. │ │ │ │ │ +DDeeffiinniittiioonn axisalignedcubegeometry.hh:68 │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_l_o_c_a_l │ │ │ │ │ +LocalCoordinate local(const GlobalCoordinate &global) const │ │ │ │ │ +Map a point in global (world) coordinates to element coordinates. │ │ │ │ │ +DDeeffiinniittiioonn axisalignedcubegeometry.hh:189 │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_c_t_y_p_e │ │ │ │ │ +CoordType ctype │ │ │ │ │ +Type used for single coordinate coefficients. │ │ │ │ │ +DDeeffiinniittiioonn axisalignedcubegeometry.hh:62 │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n │ │ │ │ │ +std::conditional_t< dim==coorddim, DiagonalMatrix< ctype, dim >, FieldMatrix< │ │ │ │ │ +ctype, coorddim, dim > > Jacobian │ │ │ │ │ +Return type of jacobian. │ │ │ │ │ +DDeeffiinniittiioonn axisalignedcubegeometry.hh:100 │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_t_y_p_e │ │ │ │ │ +GeometryType type() const │ │ │ │ │ +Type of the cube. Here: a hypercube of the correct dimension. │ │ │ │ │ +DDeeffiinniittiioonn axisalignedcubegeometry.hh:164 │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_c_o_r_n_e_r_s │ │ │ │ │ int corners() const │ │ │ │ │ -Obtain number of corners of the corresponding reference element. │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:173 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_c_e_n_t_e_r │ │ │ │ │ +Return the number of corners of the element. │ │ │ │ │ +DDeeffiinniittiioonn axisalignedcubegeometry.hh:263 │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n │ │ │ │ │ +Jacobian jacobian(const LocalCoordinate &local) const │ │ │ │ │ +Jacobian of the transformation from local to global coordinates. │ │ │ │ │ +DDeeffiinniittiioonn axisalignedcubegeometry.hh:229 │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ +std::conditional< dim==coorddim, DiagonalMatrix< ctype, dim >, FieldMatrix< │ │ │ │ │ +ctype, coorddim, dim > >::type JacobianInverseTransposed │ │ │ │ │ +Return type of jacobianInverseTransposed. │ │ │ │ │ +DDeeffiinniittiioonn axisalignedcubegeometry.hh:91 │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t │ │ │ │ │ +Volume integrationElement(const LocalCoordinate &local) const │ │ │ │ │ +Return the integration element, i.e., the determinant term in the integral │ │ │ │ │ +transformation formula. │ │ │ │ │ +DDeeffiinniittiioonn axisalignedcubegeometry.hh:243 │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_c_e_n_t_e_r │ │ │ │ │ GlobalCoordinate center() const │ │ │ │ │ -Obtain the centroid of the mapping's image. │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:186 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_f_i_n_i_t_e_E_l_e_m_e_n_t │ │ │ │ │ -const LocalFiniteElement & finiteElement() const │ │ │ │ │ -Obtain the local finite-element. │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:365 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_g_l_o_b_a_l │ │ │ │ │ +Return center of mass of the element. │ │ │ │ │ +DDeeffiinniittiioonn axisalignedcubegeometry.hh:249 │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y │ │ │ │ │ +AxisAlignedCubeGeometry()=default │ │ │ │ │ +Constructs an empty geometry. │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_a_f_f_i_n_e │ │ │ │ │ +bool affine() const │ │ │ │ │ +Return if the element is affine. Here: yes. │ │ │ │ │ +DDeeffiinniittiioonn axisalignedcubegeometry.hh:311 │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e │ │ │ │ │ +std::conditional_t< dim==coorddim, DiagonalMatrix< ctype, dim >, FieldMatrix< │ │ │ │ │ +ctype, dim, coorddim > > JacobianInverse │ │ │ │ │ +Return type of jacobianInverse. │ │ │ │ │ +DDeeffiinniittiioonn axisalignedcubegeometry.hh:109 │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_g_l_o_b_a_l │ │ │ │ │ GlobalCoordinate global(const LocalCoordinate &local) const │ │ │ │ │ -Evaluate the coordinate mapping. │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:202 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_M_a_t_r_i_x_H_e_l_p_e_r │ │ │ │ │ -Impl::FieldMatrixHelper< ctype > MatrixHelper │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:82 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ -typename ReferenceElements::ReferenceElement ReferenceElement │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:79 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_c_o_r_n_e_r │ │ │ │ │ -GlobalCoordinate corner(int i) const │ │ │ │ │ -Obtain coordinates of the i-th corner. │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:179 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_v_o_l_u_m_e │ │ │ │ │ -Volume volume(Impl::ConvergenceOptions< ctype > opts={}) const │ │ │ │ │ -Obtain the volume of the mapping's image. │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:276 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_m_y_d_i_m_e_n_s_i_o_n │ │ │ │ │ -static const int mydimension │ │ │ │ │ -geometry dimension │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:50 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e │ │ │ │ │ -JacobianInverse jacobianInverse(const LocalCoordinate &local) const │ │ │ │ │ -Obtain the Jacobian's inverse. │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:339 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ -FieldVector< ctype, coorddimension > GlobalCoordinate │ │ │ │ │ -type of global coordinates │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:59 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n │ │ │ │ │ -FieldMatrix< ctype, coorddimension, mydimension > Jacobian │ │ │ │ │ -type of jacobian │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:65 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -FieldMatrix< ctype, coorddimension, mydimension > JacobianInverseTransposed │ │ │ │ │ -type of jacobian inverse transposed │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:74 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e │ │ │ │ │ -FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse │ │ │ │ │ -type of jacobian inverse │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:71 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t │ │ │ │ │ -ctype integrationElement(const LocalCoordinate &local) const │ │ │ │ │ -Obtain the integration element. │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:260 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_o_r_d_e_r │ │ │ │ │ -int order() const │ │ │ │ │ -Obtain the (highest) polynomial order of the parametrization. │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:149 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ -FieldVector< ctype, mydimension > LocalCoordinate │ │ │ │ │ -type of local coordinates │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:56 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed │ │ │ │ │ -type of jacobian transposed │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:68 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y_:_:_L_o_c_a_l_F_i_n_i_t_e_E_l_e_m_e_n_t_G_e_o_m_e_t_r_y │ │ │ │ │ -LocalFiniteElementGeometry(const ReferenceElement &refElement, const │ │ │ │ │ -LocalFiniteElement &localFE, Param &¶metrization) │ │ │ │ │ -Constructor from a local parametrization function, mapping local to (curved) │ │ │ │ │ -global coordinates. │ │ │ │ │ -DDeeffiinniittiioonn localfiniteelementgeometry.hh:128 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e │ │ │ │ │ -Abstract base class for quadrature rules. │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:214 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s │ │ │ │ │ -A container for all quadrature rules of dimension dim │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:260 │ │ │ │ │ +Map a point in local (element) coordinates to world coordinates. │ │ │ │ │ +DDeeffiinniittiioonn axisalignedcubegeometry.hh:170 │ │ │ │ │ _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ DDeeffiinniittiioonn type.hh:114 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_S_i_m_p_l_e_x │ │ │ │ │ -constexpr bool isSimplex() const │ │ │ │ │ -Return true if entity is a simplex of any dimension. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:319 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00185.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: mappedgeometry.hh File Reference │ │ │ │ +dune-geometry: virtualrefinement.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -73,57 +73,51 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
mappedgeometry.hh File Reference
│ │ │ │ +
virtualrefinement.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <cassert>
│ │ │ │ -#include <limits>
│ │ │ │ -#include <optional>
│ │ │ │ -#include <stdexcept>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <dune/common/copyableoptional.hh>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/common/fmatrix.hh>
│ │ │ │ + │ │ │ │ +

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

│ │ │ │ +
#include <vector>
│ │ │ │ #include <dune/common/fvector.hh>
│ │ │ │ -#include <dune/common/math.hh>
│ │ │ │ -#include <dune/common/transpose.hh>
│ │ │ │ -#include <dune/geometry/affinegeometry.hh>
│ │ │ │ -#include <dune/geometry/quadraturerules.hh>
│ │ │ │ -#include <dune/geometry/referenceelements.hh>
│ │ │ │ -#include <dune/geometry/type.hh>
│ │ │ │ -#include <dune/geometry/utility/algorithms.hh>
│ │ │ │ -#include <dune/geometry/utility/convergence.hh>
│ │ │ │ +#include "refinement.hh"
│ │ │ │ +#include "type.hh"
│ │ │ │ +#include "virtualrefinement.cc"
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::MappedGeometry< Map, Geo >
 Geometry parametrized by a LocalFunction and a LocalGeometry. More...
class  Dune::VirtualRefinement< dimension, CoordType >
 VirtualRefinement base class. More...
 
struct  Dune::VirtualRefinement< dimension, CoordType >::Codim< codimension >
 codim database of VirtualRefinement More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ Functions

template<class Map , class Geo >
 Dune::MappedGeometry (const Map &, const Geo &) -> MappedGeometry< Map, Geo >
 
template<class Map , class Geo >
 Dune::MappedGeometry (const Map &, const Geo &, bool) -> MappedGeometry< Map, Geo >
 
template<int dimension, class CoordType >
VirtualRefinement< dimension, CoordType > & Dune::buildRefinement (GeometryType geometryType, GeometryType coerceTo)
 return a reference to the VirtualRefinement according to the parameters
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

This file contains the virtual wrapper around refinement.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,43 +1,37 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -mappedgeometry.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +virtualrefinement.hh File Reference │ │ │ │ │ +This file contains the virtual wrapper around refinement. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_a_f_f_i_n_e_g_e_o_m_e_t_r_y_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_q_u_a_d_r_a_t_u_r_e_r_u_l_e_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_u_t_i_l_i_t_y_/_a_l_g_o_r_i_t_h_m_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_u_t_i_l_i_t_y_/_c_o_n_v_e_r_g_e_n_c_e_._h_h> │ │ │ │ │ +#include "_r_e_f_i_n_e_m_e_n_t_._h_h" │ │ │ │ │ +#include "_t_y_p_e_._h_h" │ │ │ │ │ +#include "_v_i_r_t_u_a_l_r_e_f_i_n_e_m_e_n_t_._c_c" │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_<_ _M_a_p_,_ _G_e_o_ _> │ │ │ │ │ -  Geometry parametrized by a LocalFunction and a LocalGeometry. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_ _> │ │ │ │ │ +  _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t base class. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_ _>_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ +  codim database of _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -  _D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y (const Map &, const Geo &) -> _M_a_p_p_e_d_G_e_o_m_e_t_r_y< Map, Geo > │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -  _D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y (const Map &, const Geo &, bool) -> _M_a_p_p_e_d_G_e_o_m_e_t_r_y< Map, │ │ │ │ │ - Geo > │ │ │ │ │ +template │ │ │ │ │ +_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t< dimension, CoordType > _D_u_n_e_:_:_b_u_i_l_d_R_e_f_i_n_e_m_e_n_t (_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ + &  geometryType, _G_e_o_m_e_t_r_y_T_y_p_e coerceTo) │ │ │ │ │ + return a reference to the │ │ │ │ │ +  _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t according to the │ │ │ │ │ + parameters │ │ │ │ │   │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +This file contains the virtual wrapper around refinement. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00185_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: mappedgeometry.hh Source File │ │ │ │ +dune-geometry: virtualrefinement.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,327 +74,135 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
mappedgeometry.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 © 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_MAPPEDGEOMETRY_HH
│ │ │ │ -
6#define DUNE_GEOMETRY_MAPPEDGEOMETRY_HH
│ │ │ │ +
5#ifndef DUNE_GEOMETRY_VIRTUALREFINEMENT_HH
│ │ │ │ +
6#define DUNE_GEOMETRY_VIRTUALREFINEMENT_HH
│ │ │ │
7
│ │ │ │ -
8#include <cassert>
│ │ │ │ -
9#include <limits>
│ │ │ │ -
10#include <optional>
│ │ │ │ -
11#include <stdexcept>
│ │ │ │ -
12#include <type_traits>
│ │ │ │ -
13
│ │ │ │ -
14#include <dune/common/copyableoptional.hh>
│ │ │ │ -
15#include <dune/common/exceptions.hh>
│ │ │ │ -
16#include <dune/common/fmatrix.hh>
│ │ │ │ -
17#include <dune/common/fvector.hh>
│ │ │ │ -
18#include <dune/common/math.hh>
│ │ │ │ -
19#include <dune/common/transpose.hh>
│ │ │ │ -
20#include <dune/geometry/affinegeometry.hh> // for FieldMatrixHelper
│ │ │ │ - │ │ │ │ - │ │ │ │ -
23#include <dune/geometry/type.hh>
│ │ │ │ - │ │ │ │ - │ │ │ │ -
26
│ │ │ │ -
27namespace Dune {
│ │ │ │ -
28
│ │ │ │ -
63template <class Map, class Geo>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
65{
│ │ │ │ -
66public:
│ │ │ │ -
68 using LocalCoordinate = typename Geo::LocalCoordinate;
│ │ │ │ -
69
│ │ │ │ -
71 using GlobalCoordinate = std::remove_reference_t<decltype(std::declval<Map>()(std::declval<typename Geo::GlobalCoordinate>()))>;
│ │ │ │ -
72
│ │ │ │ -
74 using ctype = typename Geo::ctype;
│ │ │ │ -
75
│ │ │ │ -
77 static constexpr int mydimension = LocalCoordinate::size();
│ │ │ │ -
78
│ │ │ │ -
80 static constexpr int coorddimension = GlobalCoordinate::size();
│ │ │ │ -
81
│ │ │ │ -
83 using Volume = std::remove_reference_t<decltype(Dune::power(std::declval<ctype>(),mydimension))>;
│ │ │ │ -
84
│ │ │ │ -
86 using Jacobian = FieldMatrix<ctype, coorddimension, mydimension>;
│ │ │ │ -
87
│ │ │ │ -
89 using JacobianTransposed = FieldMatrix<ctype, mydimension, coorddimension>;
│ │ │ │ -
90
│ │ │ │ -
92 using JacobianInverse = FieldMatrix<ctype, mydimension, coorddimension>;
│ │ │ │ -
93
│ │ │ │ -
95 using JacobianInverseTransposed = FieldMatrix<ctype, coorddimension, mydimension>;
│ │ │ │ -
96
│ │ │ │ -
97private:
│ │ │ │ - │ │ │ │ -
99 using ReferenceElement = typename ReferenceElements::ReferenceElement;
│ │ │ │ -
100
│ │ │ │ -
101protected:
│ │ │ │ -
102 using MatrixHelper = Impl::FieldMatrixHelper<ctype>;
│ │ │ │ -
103
│ │ │ │ -
104 // type of the mapping representation the geometry parametrization
│ │ │ │ -
105 using Mapping = Map;
│ │ │ │ -
106
│ │ │ │ -
107 // type of the geometry that is wrapped
│ │ │ │ -
108 using Geometry = Geo;
│ │ │ │ -
109
│ │ │ │ -
110 // type of a mapping representing the derivative of `Map` w.r.t. `GlobalCoordinate`
│ │ │ │ -
111 using DerivativeMapping = std::remove_reference_t<decltype(derivative(std::declval<Map>()))>;
│ │ │ │ -
112
│ │ │ │ -
113public:
│ │ │ │ -
122 template <class Geo_, class Map_,
│ │ │ │ -
123 std::enable_if_t<Dune::IsInteroperable<Map, Map_>::value, int> = 0,
│ │ │ │ -
124 std::enable_if_t<Dune::IsInteroperable<Geo, Geo_>::value, int> = 0>
│ │ │ │ -
│ │ │ │ -
125 MappedGeometry (Map_&& mapping, Geo_&& geometry, bool affine = false)
│ │ │ │ -
126 : mapping_(std::forward<Map_>(mapping))
│ │ │ │ -
127 , dMapping_(derivative(*mapping_))
│ │ │ │ -
128 , geometry_(std::forward<Geo_>(geometry))
│ │ │ │ -
129 , affine_(affine)
│ │ │ │ -
130 {}
│ │ │ │ -
│ │ │ │ -
131
│ │ │ │ -
│ │ │ │ -
137 bool affine () const
│ │ │ │ -
138 {
│ │ │ │ -
139 return affine_;
│ │ │ │ -
140 }
│ │ │ │ -
│ │ │ │ -
141
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
144 {
│ │ │ │ -
145 return geometry_.type();
│ │ │ │ -
146 }
│ │ │ │ -
│ │ │ │ -
147
│ │ │ │ -
│ │ │ │ -
149 int corners () const
│ │ │ │ -
150 {
│ │ │ │ -
151 return geometry_.corners();
│ │ │ │ -
152 }
│ │ │ │ -
│ │ │ │ -
153
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
156 {
│ │ │ │ -
157 assert( (i >= 0) && (i < corners()) );
│ │ │ │ -
158 return mapping()(geometry_.corner(i));
│ │ │ │ -
159 }
│ │ │ │ -
│ │ │ │ -
160
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
163 {
│ │ │ │ -
164 return mapping()(geometry_.center());
│ │ │ │ -
165 }
│ │ │ │ -
│ │ │ │ -
166
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
177 {
│ │ │ │ -
178 return mapping()(geometry_.global(local));
│ │ │ │ -
179 }
│ │ │ │ -
│ │ │ │ -
180
│ │ │ │ -
│ │ │ │ -
197 LocalCoordinate local (const GlobalCoordinate& y, Impl::GaussNewtonOptions<ctype> opts = {}) const
│ │ │ │ -
198 {
│ │ │ │ -
199 LocalCoordinate x = refElement().position(0,0);
│ │ │ │ -
200 Impl::GaussNewtonErrorCode err = Impl::gaussNewton(
│ │ │ │ -
201 [&](const LocalCoordinate& local) { return this->global(local); },
│ │ │ │ -
202 [&](const LocalCoordinate& local) { return this->jacobianTransposed(local); },
│ │ │ │ -
203 y, x, opts
│ │ │ │ -
204 );
│ │ │ │ -
205
│ │ │ │ -
206 if (err != Impl::GaussNewtonErrorCode::OK)
│ │ │ │ -
207 DUNE_THROW(Dune::Exception,
│ │ │ │ -
208 "Local coordinate can not be recovered from global coordinate, error code = " << int(err) << "\n"
│ │ │ │ -
209 << " (global(x) - y).two_norm() = " << (global(x) - y).two_norm()
│ │ │ │ -
210 << " > tol = " << opts.absTol);
│ │ │ │ -
211
│ │ │ │ -
212 return x;
│ │ │ │ -
213 }
│ │ │ │ -
│ │ │ │ -
214
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
226 {
│ │ │ │ -
227 return MatrixHelper::sqrtDetAAT(jacobianTransposed(local));
│ │ │ │ -
228 }
│ │ │ │ -
│ │ │ │ -
229
│ │ │ │ -
│ │ │ │ -
241 Volume volume (Impl::ConvergenceOptions<ctype> opts = {}) const
│ │ │ │ -
242 {
│ │ │ │ - │ │ │ │ -
244 if (affine())
│ │ │ │ -
245 return vol0;
│ │ │ │ -
246
│ │ │ │ -
247 using std::abs;
│ │ │ │ -
248 for (int p = 2; p < opts.maxIt; ++p) {
│ │ │ │ - │ │ │ │ -
250 if (abs(vol1 - vol0) < opts.absTol)
│ │ │ │ -
251 return vol1;
│ │ │ │ -
252
│ │ │ │ -
253 vol0 = vol1;
│ │ │ │ -
254 }
│ │ │ │ -
255 return vol0;
│ │ │ │ -
256 }
│ │ │ │ -
│ │ │ │ -
257
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
260 {
│ │ │ │ -
261 Volume vol(0);
│ │ │ │ -
262 for (const auto& qp : quadRule)
│ │ │ │ -
263 vol += integrationElement(qp.position()) * qp.weight();
│ │ │ │ -
264 return vol;
│ │ │ │ -
265 }
│ │ │ │ -
│ │ │ │ -
266
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
273 {
│ │ │ │ -
274 auto&& jLocal = geometry_.jacobian(local);
│ │ │ │ -
275 auto&& jMapping = (*dMapping_)(geometry_.global(local));
│ │ │ │ -
276 return jMapping * jLocal;
│ │ │ │ -
277 }
│ │ │ │ -
│ │ │ │ -
278
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
285 {
│ │ │ │ -
286 return transpose(jacobian(local));
│ │ │ │ -
287 }
│ │ │ │ -
│ │ │ │ -
288
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
297 {
│ │ │ │ -
298 JacobianInverse out;
│ │ │ │ -
299 MatrixHelper::leftInvA(jacobian(local), out);
│ │ │ │ -
300 return out;
│ │ │ │ -
301 }
│ │ │ │ -
│ │ │ │ -
302
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
311 {
│ │ │ │ -
312 return transpose(jacobianInverse(local));
│ │ │ │ -
313 }
│ │ │ │ -
│ │ │ │ -
314
│ │ │ │ -
│ │ │ │ -
316 friend ReferenceElement referenceElement (const MappedGeometry& geometry)
│ │ │ │ -
317 {
│ │ │ │ -
318 return geometry.refElement();
│ │ │ │ -
319 }
│ │ │ │ -
│ │ │ │ -
320
│ │ │ │ -
321protected:
│ │ │ │ -
322 // the internal stored reference element
│ │ │ │ -
│ │ │ │ -
323 ReferenceElement refElement () const
│ │ │ │ -
324 {
│ │ │ │ -
325 return referenceElement(geometry_);
│ │ │ │ -
326 }
│ │ │ │ -
│ │ │ │ -
327
│ │ │ │ -
328private:
│ │ │ │ -
329 // internal reference to the stored mapping
│ │ │ │ -
330 const Mapping& mapping () const
│ │ │ │ -
331 {
│ │ │ │ -
332 return *mapping_;
│ │ │ │ -
333 }
│ │ │ │ -
334
│ │ │ │ -
335 // internal reference to the wrapped geometry
│ │ │ │ -
336 const Geometry& geometry () const
│ │ │ │ -
337 {
│ │ │ │ -
338 return geometry_;
│ │ │ │ -
339 }
│ │ │ │ -
340
│ │ │ │ -
341private:
│ │ │ │ -
343 CopyableOptional<Mapping> mapping_;
│ │ │ │ +
257#include <vector>
│ │ │ │ +
258
│ │ │ │ +
259#include <dune/common/fvector.hh>
│ │ │ │ +
260
│ │ │ │ +
261#include "refinement.hh"
│ │ │ │ +
262#include "type.hh"
│ │ │ │ +
263
│ │ │ │ +
264namespace Dune
│ │ │ │ +
265{
│ │ │ │ +
266 // //////////////////////////////////////////
│ │ │ │ +
267 //
│ │ │ │ +
268 // The virtual base class and its iterators
│ │ │ │ +
269 //
│ │ │ │ +
270
│ │ │ │ +
271 //
│ │ │ │ +
272 // Refinement
│ │ │ │ +
273 //
│ │ │ │ +
274
│ │ │ │ +
281 template<int dimension, class CoordType>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
283 {
│ │ │ │ +
284 public:
│ │ │ │ +
285 template<int codimension>
│ │ │ │ +
286 struct Codim;
│ │ │ │ + │ │ │ │ + │ │ │ │ +
291
│ │ │ │ +
297 typedef FieldVector<CoordType, dimension> CoordVector;
│ │ │ │ +
303 typedef std::vector<int> IndexVector;
│ │ │ │ +
304
│ │ │ │ +
305 template<int codimension>
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
309
│ │ │ │ +
315 virtual int nVertices(Dune::RefinementIntervals tag) const = 0;
│ │ │ │ +
316
│ │ │ │ + │ │ │ │ +
323
│ │ │ │ + │ │ │ │ +
330
│ │ │ │ +
336 virtual int nElements(Dune::RefinementIntervals tag) const = 0;
│ │ │ │ +
337
│ │ │ │ + │ │ │ │
344
│ │ │ │ -
346 CopyableOptional<DerivativeMapping> dMapping_;
│ │ │ │ -
347
│ │ │ │ -
349 Geometry geometry_;
│ │ │ │ -
350
│ │ │ │ -
352 bool affine_;
│ │ │ │ -
353};
│ │ │ │ -
│ │ │ │ -
354
│ │ │ │ -
355// deduction guides
│ │ │ │ -
356template <class Map, class Geo>
│ │ │ │ -
357MappedGeometry (const Map&, const Geo&)
│ │ │ │ - │ │ │ │ -
359
│ │ │ │ -
360template <class Map, class Geo>
│ │ │ │ -
361MappedGeometry (const Map&, const Geo&, bool)
│ │ │ │ - │ │ │ │ -
363
│ │ │ │ -
364} // end namespace Dune
│ │ │ │ -
365
│ │ │ │ -
366#endif // DUNE_GEOMETRY_MAPPEDGEOMETRY_HH
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
An implementation of the Geometry interface for affine geometries.
│ │ │ │ -
A unique label for each type of element that can occur in a grid.
│ │ │ │ -
STL namespace.
│ │ │ │ + │ │ │ │ +
351
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
354 {}
│ │ │ │ +
│ │ │ │ +
355
│ │ │ │ +
356 protected:
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
361 };
│ │ │ │ +
│ │ │ │ +
362
│ │ │ │ +
364 template<int dimension, class CoordType>
│ │ │ │ +
365 template<int codimension>
│ │ │ │ +
│ │ │ │ +
366 struct VirtualRefinement<dimension, CoordType>::Codim
│ │ │ │ +
367 {
│ │ │ │ +
368 class SubEntityIterator;
│ │ │ │ +
369 };
│ │ │ │ +
│ │ │ │ +
370
│ │ │ │ +
371 // ////////////////////////
│ │ │ │ +
372 //
│ │ │ │ +
373 // The refinement builder
│ │ │ │ +
374 //
│ │ │ │ +
375
│ │ │ │ +
376 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
378 buildRefinement(GeometryType geometryType, GeometryType coerceTo);
│ │ │ │ +
379
│ │ │ │ +
380} // namespace Dune
│ │ │ │ +
381
│ │ │ │ +
382#include "virtualrefinement.cc"
│ │ │ │ +
383
│ │ │ │ +
384#endif // DUNE_GEOMETRY_VIRTUALREFINEMENT_HH
│ │ │ │ +
This file simply includes all Refinement implementations so you don't have to do them separately.
│ │ │ │ +
This file contains the virtual wrapper around refinement.
│ │ │ │ +
A unique label for each type of element that can occur in a grid.
│ │ │ │
Definition affinegeometry.hh:21
│ │ │ │ -
Class providing access to the singletons of the reference elements.
Definition referenceelements.hh:128
│ │ │ │ -
typename Container::ReferenceElement ReferenceElement
The reference element type.
Definition referenceelements.hh:146
│ │ │ │ -
Geometry parametrized by a LocalFunction and a LocalGeometry.
Definition mappedgeometry.hh:65
│ │ │ │ -
std::remove_reference_t< decltype(std::declval< Map >()(std::declval< typename Geo::GlobalCoordinate >()))> GlobalCoordinate
type of global coordinates
Definition mappedgeometry.hh:71
│ │ │ │ -
GlobalCoordinate center() const
Map the center of the wrapped geometry.
Definition mappedgeometry.hh:162
│ │ │ │ -
JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate &local) const
Obtain the transposed of the Jacobian's inverse.
Definition mappedgeometry.hh:310
│ │ │ │ -
JacobianInverse jacobianInverse(const LocalCoordinate &local) const
Obtain the Jacobian's inverse.
Definition mappedgeometry.hh:296
│ │ │ │ -
JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const
Obtain the transposed of the Jacobian.
Definition mappedgeometry.hh:284
│ │ │ │ -
MappedGeometry(Map_ &&mapping, Geo_ &&geometry, bool affine=false)
Constructor from mapping to parametrize the geometry.
Definition mappedgeometry.hh:125
│ │ │ │ -
FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed
type of jacobian transposed
Definition mappedgeometry.hh:89
│ │ │ │ -
static constexpr int mydimension
geometry dimension
Definition mappedgeometry.hh:77
│ │ │ │ -
GeometryType type() const
Obtain the geometry type from the reference element.
Definition mappedgeometry.hh:143
│ │ │ │ -
typename Geo::LocalCoordinate LocalCoordinate
type of local coordinates
Definition mappedgeometry.hh:68
│ │ │ │ -
typename Geo::ctype ctype
coordinate type
Definition mappedgeometry.hh:74
│ │ │ │ -
LocalCoordinate local(const GlobalCoordinate &y, Impl::GaussNewtonOptions< ctype > opts={}) const
Evaluate the inverse coordinate mapping.
Definition mappedgeometry.hh:197
│ │ │ │ -
Geo Geometry
Definition mappedgeometry.hh:108
│ │ │ │ -
GlobalCoordinate corner(int i) const
Obtain coordinates of the i-th corner.
Definition mappedgeometry.hh:155
│ │ │ │ -
static constexpr int coorddimension
coordinate dimension
Definition mappedgeometry.hh:80
│ │ │ │ -
FieldMatrix< ctype, coorddimension, mydimension > JacobianInverseTransposed
type of jacobian inverse transposed
Definition mappedgeometry.hh:95
│ │ │ │ -
Map Mapping
Definition mappedgeometry.hh:105
│ │ │ │ -
GlobalCoordinate global(const LocalCoordinate &local) const
Evaluate the coordinate mapping.
Definition mappedgeometry.hh:176
│ │ │ │ -
ReferenceElement refElement() const
Definition mappedgeometry.hh:323
│ │ │ │ -
Volume volume(const QuadratureRule< ctype, mydimension > &quadRule) const
Obtain the volume of the mapping's image by given quadrature rules.
Definition mappedgeometry.hh:259
│ │ │ │ -
int corners() const
Obtain number of corners of the corresponding reference element.
Definition mappedgeometry.hh:149
│ │ │ │ -
FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse
type of jacobian inverse
Definition mappedgeometry.hh:92
│ │ │ │ -
friend ReferenceElement referenceElement(const MappedGeometry &geometry)
Obtain the reference-element related to this geometry.
Definition mappedgeometry.hh:316
│ │ │ │ -
Volume volume(Impl::ConvergenceOptions< ctype > opts={}) const
Obtain the volume of the mapping's image.
Definition mappedgeometry.hh:241
│ │ │ │ -
std::remove_reference_t< decltype(Dune::power(std::declval< ctype >(), mydimension))> Volume
type of volume
Definition mappedgeometry.hh:83
│ │ │ │ -
bool affine() const
Is this mapping affine? Not in general, since we don't know anything about the mapping....
Definition mappedgeometry.hh:137
│ │ │ │ -
std::remove_reference_t< decltype(derivative(std::declval< Map >()))> DerivativeMapping
Definition mappedgeometry.hh:111
│ │ │ │ -
Jacobian jacobian(const LocalCoordinate &local) const
Obtain the Jacobian.
Definition mappedgeometry.hh:272
│ │ │ │ -
Impl::FieldMatrixHelper< ctype > MatrixHelper
Definition mappedgeometry.hh:102
│ │ │ │ -
FieldMatrix< ctype, coorddimension, mydimension > Jacobian
type of jacobian
Definition mappedgeometry.hh:86
│ │ │ │ -
ctype integrationElement(const LocalCoordinate &local) const
Obtain the integration element.
Definition mappedgeometry.hh:225
│ │ │ │ -
Abstract base class for quadrature rules.
Definition quadraturerules.hh:214
│ │ │ │ -
A container for all quadrature rules of dimension dim
Definition quadraturerules.hh:260
│ │ │ │ +
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:114
│ │ │ │ +
Definition virtualrefinement.cc:231
│ │ │ │ +
VirtualRefinement base class.
Definition virtualrefinement.hh:283
│ │ │ │ +
SubEntityIteratorBack< dimension > VertexIteratorBack
Definition virtualrefinement.hh:307
│ │ │ │ +
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:290
│ │ │ │ +
virtual ~VirtualRefinement()
Destructor.
Definition virtualrefinement.hh:353
│ │ │ │ +
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:297
│ │ │ │ +
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:303
│ │ │ │ +
Codim< dimension >::SubEntityIterator VertexIterator
The VertexIterator of the VirtualRefinement.
Definition virtualrefinement.hh:288
│ │ │ │ +
virtual VertexIteratorBack * vEndBack(Dune::RefinementIntervals tag) const =0
│ │ │ │ +
SubEntityIteratorBack< 0 > ElementIteratorBack
Definition virtualrefinement.hh:308
│ │ │ │ +
virtual ElementIteratorBack * eBeginBack(Dune::RefinementIntervals tag) const =0
│ │ │ │ +
virtual VertexIteratorBack * vBeginBack(Dune::RefinementIntervals tag) const =0
│ │ │ │ +
codim database of VirtualRefinement
Definition virtualrefinement.hh:367
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,405 +1,186 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -mappedgeometry.hh │ │ │ │ │ +virtualrefinement.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 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 © 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_MAPPEDGEOMETRY_HH │ │ │ │ │ -6#define DUNE_GEOMETRY_MAPPEDGEOMETRY_HH │ │ │ │ │ +5#ifndef DUNE_GEOMETRY_VIRTUALREFINEMENT_HH │ │ │ │ │ +6#define DUNE_GEOMETRY_VIRTUALREFINEMENT_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13 │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ -17#include │ │ │ │ │ -18#include │ │ │ │ │ -19#include │ │ │ │ │ -20#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_a_f_f_i_n_e_g_e_o_m_e_t_r_y_._h_h> // for FieldMatrixHelper │ │ │ │ │ -21#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_q_u_a_d_r_a_t_u_r_e_r_u_l_e_s_._h_h> │ │ │ │ │ -22#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ -23#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ -24#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_u_t_i_l_i_t_y_/_a_l_g_o_r_i_t_h_m_s_._h_h> │ │ │ │ │ -25#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_u_t_i_l_i_t_y_/_c_o_n_v_e_r_g_e_n_c_e_._h_h> │ │ │ │ │ -26 │ │ │ │ │ -27namespace _D_u_n_e { │ │ │ │ │ -28 │ │ │ │ │ -63template │ │ │ │ │ -_6_4class _M_a_p_p_e_d_G_e_o_m_e_t_r_y │ │ │ │ │ -65{ │ │ │ │ │ -66public: │ │ │ │ │ -_6_8 using _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e = typename Geo::LocalCoordinate; │ │ │ │ │ -69 │ │ │ │ │ -_7_1 using _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e = std::remove_reference_t │ │ │ │ │ -()(std::declval()))>; │ │ │ │ │ -72 │ │ │ │ │ -_7_4 using _c_t_y_p_e = typename Geo::ctype; │ │ │ │ │ -75 │ │ │ │ │ -_7_7 static constexpr int _m_y_d_i_m_e_n_s_i_o_n = LocalCoordinate::size(); │ │ │ │ │ -78 │ │ │ │ │ -_8_0 static constexpr int _c_o_o_r_d_d_i_m_e_n_s_i_o_n = GlobalCoordinate::size(); │ │ │ │ │ -81 │ │ │ │ │ -_8_3 using _V_o_l_u_m_e = std::remove_reference_t(),_m_y_d_i_m_e_n_s_i_o_n))>; │ │ │ │ │ -84 │ │ │ │ │ -_8_6 using _J_a_c_o_b_i_a_n = FieldMatrix; │ │ │ │ │ -87 │ │ │ │ │ -_8_9 using _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d = FieldMatrix; │ │ │ │ │ -90 │ │ │ │ │ -_9_2 using _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e = FieldMatrix; │ │ │ │ │ -93 │ │ │ │ │ -_9_5 using _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d = FieldMatrix; │ │ │ │ │ -96 │ │ │ │ │ -97private: │ │ │ │ │ -98 using _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s = _D_u_n_e_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_<_c_t_y_p_e_,_ _m_y_d_i_m_e_n_s_i_o_n_>; │ │ │ │ │ -99 using ReferenceElement = typename _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t; │ │ │ │ │ -100 │ │ │ │ │ -101protected: │ │ │ │ │ -_1_0_2 using _M_a_t_r_i_x_H_e_l_p_e_r = Impl::FieldMatrixHelper; │ │ │ │ │ -103 │ │ │ │ │ -104 // type of the mapping representation the geometry parametrization │ │ │ │ │ -_1_0_5 using _M_a_p_p_i_n_g = Map; │ │ │ │ │ -106 │ │ │ │ │ -107 // type of the geometry that is wrapped │ │ │ │ │ -_1_0_8 using _G_e_o_m_e_t_r_y = Geo; │ │ │ │ │ -109 │ │ │ │ │ -110 // type of a mapping representing the derivative of `Map` w.r.t. │ │ │ │ │ -`GlobalCoordinate` │ │ │ │ │ -_1_1_1 using _D_e_r_i_v_a_t_i_v_e_M_a_p_p_i_n_g = std::remove_reference_t()))>; │ │ │ │ │ -112 │ │ │ │ │ -113public: │ │ │ │ │ -122 template ::value, int> = 0, │ │ │ │ │ -124 std::enable_if_t::value, int> = 0> │ │ │ │ │ -_1_2_5 _M_a_p_p_e_d_G_e_o_m_e_t_r_y (Map_&& mapping, Geo_&& geometry, bool _a_f_f_i_n_e = false) │ │ │ │ │ -126 : mapping_(_s_t_d::forward(mapping)) │ │ │ │ │ -127 , dMapping_(derivative(*mapping_)) │ │ │ │ │ -128 , geometry_(_s_t_d::forward(geometry)) │ │ │ │ │ -129 , affine_(_a_f_f_i_n_e) │ │ │ │ │ -130 {} │ │ │ │ │ -131 │ │ │ │ │ -_1_3_7 bool _a_f_f_i_n_e () const │ │ │ │ │ -138 { │ │ │ │ │ -139 return affine_; │ │ │ │ │ -140 } │ │ │ │ │ -141 │ │ │ │ │ -_1_4_3 _G_e_o_m_e_t_r_y_T_y_p_e _t_y_p_e () const │ │ │ │ │ -144 { │ │ │ │ │ -145 return geometry_.type(); │ │ │ │ │ -146 } │ │ │ │ │ -147 │ │ │ │ │ -_1_4_9 int _c_o_r_n_e_r_s () const │ │ │ │ │ -150 { │ │ │ │ │ -151 return geometry_.corners(); │ │ │ │ │ -152 } │ │ │ │ │ -153 │ │ │ │ │ -_1_5_5 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _c_o_r_n_e_r (int i) const │ │ │ │ │ -156 { │ │ │ │ │ -157 assert( (i >= 0) && (i < _c_o_r_n_e_r_s()) ); │ │ │ │ │ -158 return mapping()(geometry_.corner(i)); │ │ │ │ │ -159 } │ │ │ │ │ -160 │ │ │ │ │ -_1_6_2 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _c_e_n_t_e_r () const │ │ │ │ │ -163 { │ │ │ │ │ -164 return mapping()(geometry_.center()); │ │ │ │ │ -165 } │ │ │ │ │ -166 │ │ │ │ │ -_1_7_6 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _g_l_o_b_a_l (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) const │ │ │ │ │ -177 { │ │ │ │ │ -178 return mapping()(geometry_.global(_l_o_c_a_l)); │ │ │ │ │ -179 } │ │ │ │ │ -180 │ │ │ │ │ -_1_9_7 _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e _l_o_c_a_l (const _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e& y, Impl:: │ │ │ │ │ -GaussNewtonOptions opts = {}) const │ │ │ │ │ -198 { │ │ │ │ │ -199 _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e x = _r_e_f_E_l_e_m_e_n_t().position(0,0); │ │ │ │ │ -200 Impl::GaussNewtonErrorCode err = Impl::gaussNewton( │ │ │ │ │ -201 [&](const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) { return this->_g_l_o_b_a_l(local); }, │ │ │ │ │ -202 [&](const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) { return this->_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d(local); │ │ │ │ │ -}, │ │ │ │ │ -203 y, x, opts │ │ │ │ │ -204 ); │ │ │ │ │ -205 │ │ │ │ │ -206 if (err != Impl::GaussNewtonErrorCode::OK) │ │ │ │ │ -207 DUNE_THROW(Dune::Exception, │ │ │ │ │ -208 "Local coordinate can not be recovered from global coordinate, error code = │ │ │ │ │ -" << int(err) << "\n" │ │ │ │ │ -209 << " (global(x) - y).two_norm() = " << (_g_l_o_b_a_l(x) - y).two_norm() │ │ │ │ │ -210 << " > tol = " << opts.absTol); │ │ │ │ │ -211 │ │ │ │ │ -212 return x; │ │ │ │ │ -213 } │ │ │ │ │ -214 │ │ │ │ │ -_2_2_5 _c_t_y_p_e _i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) const │ │ │ │ │ -226 { │ │ │ │ │ -227 return MatrixHelper::sqrtDetAAT(_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d(_l_o_c_a_l)); │ │ │ │ │ -228 } │ │ │ │ │ -229 │ │ │ │ │ -_2_4_1 _V_o_l_u_m_e _v_o_l_u_m_e (Impl::ConvergenceOptions opts = {}) const │ │ │ │ │ -242 { │ │ │ │ │ -243 _V_o_l_u_m_e vol0 = _v_o_l_u_m_e(_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s_<_c_t_y_p_e_,_ _m_y_d_i_m_e_n_s_i_o_n_>_:_:_r_u_l_e(_t_y_p_e(), 1)); │ │ │ │ │ -244 if (_a_f_f_i_n_e()) │ │ │ │ │ -245 return vol0; │ │ │ │ │ -246 │ │ │ │ │ -247 using std::abs; │ │ │ │ │ -248 for (int p = 2; p < opts.maxIt; ++p) { │ │ │ │ │ -249 _V_o_l_u_m_e vol1 = _v_o_l_u_m_e(_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s_<_c_t_y_p_e_,_ _m_y_d_i_m_e_n_s_i_o_n_>_:_:_r_u_l_e(_t_y_p_e(), p)); │ │ │ │ │ -250 if (abs(vol1 - vol0) < opts.absTol) │ │ │ │ │ -251 return vol1; │ │ │ │ │ -252 │ │ │ │ │ -253 vol0 = vol1; │ │ │ │ │ -254 } │ │ │ │ │ -255 return vol0; │ │ │ │ │ -256 } │ │ │ │ │ -257 │ │ │ │ │ -_2_5_9 _V_o_l_u_m_e _v_o_l_u_m_e (const _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_<_c_t_y_p_e_,_ _m_y_d_i_m_e_n_s_i_o_n_>& quadRule) const │ │ │ │ │ -260 { │ │ │ │ │ -261 _V_o_l_u_m_e vol(0); │ │ │ │ │ -262 for (const auto& qp : quadRule) │ │ │ │ │ -263 vol += _i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t(qp.position()) * qp.weight(); │ │ │ │ │ -264 return vol; │ │ │ │ │ -265 } │ │ │ │ │ -266 │ │ │ │ │ -_2_7_2 _J_a_c_o_b_i_a_n _j_a_c_o_b_i_a_n (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) const │ │ │ │ │ -273 { │ │ │ │ │ -274 auto&& jLocal = geometry_.jacobian(_l_o_c_a_l); │ │ │ │ │ -275 auto&& jMapping = (*dMapping_)(geometry_.global(_l_o_c_a_l)); │ │ │ │ │ -276 return jMapping * jLocal; │ │ │ │ │ -277 } │ │ │ │ │ -278 │ │ │ │ │ -_2_8_4 _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d _j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) const │ │ │ │ │ -285 { │ │ │ │ │ -286 return transpose(_j_a_c_o_b_i_a_n(_l_o_c_a_l)); │ │ │ │ │ -287 } │ │ │ │ │ -288 │ │ │ │ │ -_2_9_6 _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e _j_a_c_o_b_i_a_n_I_n_v_e_r_s_e (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) const │ │ │ │ │ -297 { │ │ │ │ │ -298 _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e out; │ │ │ │ │ -299 MatrixHelper::leftInvA(_j_a_c_o_b_i_a_n(_l_o_c_a_l), out); │ │ │ │ │ -300 return out; │ │ │ │ │ -301 } │ │ │ │ │ -302 │ │ │ │ │ -_3_1_0 _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d _j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& │ │ │ │ │ -_l_o_c_a_l) const │ │ │ │ │ -311 { │ │ │ │ │ -312 return transpose(_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e(_l_o_c_a_l)); │ │ │ │ │ -313 } │ │ │ │ │ -314 │ │ │ │ │ -_3_1_6 friend ReferenceElement _r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t (const _M_a_p_p_e_d_G_e_o_m_e_t_r_y& geometry) │ │ │ │ │ -317 { │ │ │ │ │ -318 return geometry._r_e_f_E_l_e_m_e_n_t(); │ │ │ │ │ -319 } │ │ │ │ │ -320 │ │ │ │ │ -321protected: │ │ │ │ │ -322 // the internal stored reference element │ │ │ │ │ -_3_2_3 ReferenceElement _r_e_f_E_l_e_m_e_n_t () const │ │ │ │ │ -324 { │ │ │ │ │ -325 return _r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t(geometry_); │ │ │ │ │ -326 } │ │ │ │ │ -327 │ │ │ │ │ -328private: │ │ │ │ │ -329 // internal reference to the stored mapping │ │ │ │ │ -330 const _M_a_p_p_i_n_g& mapping () const │ │ │ │ │ -331 { │ │ │ │ │ -332 return *mapping_; │ │ │ │ │ -333 } │ │ │ │ │ -334 │ │ │ │ │ -335 // internal reference to the wrapped geometry │ │ │ │ │ -336 const _G_e_o_m_e_t_r_y& geometry () const │ │ │ │ │ -337 { │ │ │ │ │ -338 return geometry_; │ │ │ │ │ -339 } │ │ │ │ │ -340 │ │ │ │ │ -341private: │ │ │ │ │ -343 CopyableOptional mapping_; │ │ │ │ │ +257#include │ │ │ │ │ +258 │ │ │ │ │ +259#include │ │ │ │ │ +260 │ │ │ │ │ +261#include "_r_e_f_i_n_e_m_e_n_t_._h_h" │ │ │ │ │ +262#include "_t_y_p_e_._h_h" │ │ │ │ │ +263 │ │ │ │ │ +264namespace _D_u_n_e │ │ │ │ │ +265{ │ │ │ │ │ +266 // ////////////////////////////////////////// │ │ │ │ │ +267 // │ │ │ │ │ +268 // The virtual base class and its iterators │ │ │ │ │ +269 // │ │ │ │ │ +270 │ │ │ │ │ +271 // │ │ │ │ │ +272 // Refinement │ │ │ │ │ +273 // │ │ │ │ │ +274 │ │ │ │ │ +281 template │ │ │ │ │ +_2_8_2 class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +283 { │ │ │ │ │ +284 public: │ │ │ │ │ +285 template │ │ │ │ │ +286 struct _C_o_d_i_m; │ │ │ │ │ +_2_8_8 typedef typename _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _V_e_r_t_e_x_I_t_e_r_a_t_o_r; │ │ │ │ │ +_2_9_0 typedef typename _C_o_d_i_m_<_0_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r; │ │ │ │ │ +291 │ │ │ │ │ +_2_9_7 typedef FieldVector _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ +_3_0_3 typedef std::vector _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ +304 │ │ │ │ │ +305 template │ │ │ │ │ +306 class _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k; │ │ │ │ │ +_3_0_7 typedef _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_d_i_m_e_n_s_i_o_n_> _V_e_r_t_e_x_I_t_e_r_a_t_o_r_B_a_c_k; │ │ │ │ │ +_3_0_8 typedef _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_0_> _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r_B_a_c_k; │ │ │ │ │ +309 │ │ │ │ │ +_3_1_5 virtual int _n_V_e_r_t_i_c_e_s(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const = 0; │ │ │ │ │ +316 │ │ │ │ │ +322 _V_e_r_t_e_x_I_t_e_r_a_t_o_r _v_B_e_g_i_n(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const; │ │ │ │ │ +323 │ │ │ │ │ +329 _V_e_r_t_e_x_I_t_e_r_a_t_o_r _v_E_n_d(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const; │ │ │ │ │ +330 │ │ │ │ │ +_3_3_6 virtual int _n_E_l_e_m_e_n_t_s(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const = 0; │ │ │ │ │ +337 │ │ │ │ │ +343 _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r _e_B_e_g_i_n(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const; │ │ │ │ │ 344 │ │ │ │ │ -346 CopyableOptional dMapping_; │ │ │ │ │ -347 │ │ │ │ │ -349 _G_e_o_m_e_t_r_y geometry_; │ │ │ │ │ -350 │ │ │ │ │ -352 bool affine_; │ │ │ │ │ -353}; │ │ │ │ │ -354 │ │ │ │ │ -355// deduction guides │ │ │ │ │ -356template │ │ │ │ │ -_3_5_7_M_a_p_p_e_d_G_e_o_m_e_t_r_y (const Map&, const Geo&) │ │ │ │ │ -358 -> _M_a_p_p_e_d_G_e_o_m_e_t_r_y_<_M_a_p_,_G_e_o_>; │ │ │ │ │ -359 │ │ │ │ │ -360template │ │ │ │ │ -_3_6_1_M_a_p_p_e_d_G_e_o_m_e_t_r_y (const Map&, const Geo&, bool) │ │ │ │ │ -362 -> _M_a_p_p_e_d_G_e_o_m_e_t_r_y_<_M_a_p_,_G_e_o_>; │ │ │ │ │ -363 │ │ │ │ │ -364} // end namespace Dune │ │ │ │ │ -365 │ │ │ │ │ -366#endif // DUNE_GEOMETRY_MAPPEDGEOMETRY_HH │ │ │ │ │ -_c_o_n_v_e_r_g_e_n_c_e_._h_h │ │ │ │ │ -_a_l_g_o_r_i_t_h_m_s_._h_h │ │ │ │ │ -_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h │ │ │ │ │ -_q_u_a_d_r_a_t_u_r_e_r_u_l_e_s_._h_h │ │ │ │ │ -_a_f_f_i_n_e_g_e_o_m_e_t_r_y_._h_h │ │ │ │ │ -An implementation of the Geometry interface for affine geometries. │ │ │ │ │ +350 _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r _e_E_n_d(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const; │ │ │ │ │ +351 │ │ │ │ │ +_3_5_3 virtual _~_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t() │ │ │ │ │ +354 {} │ │ │ │ │ +355 │ │ │ │ │ +356 protected: │ │ │ │ │ +_3_5_7 virtual _V_e_r_t_e_x_I_t_e_r_a_t_o_r_B_a_c_k *_v_B_e_g_i_n_B_a_c_k(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const │ │ │ │ │ += 0; │ │ │ │ │ +_3_5_8 virtual _V_e_r_t_e_x_I_t_e_r_a_t_o_r_B_a_c_k *_v_E_n_d_B_a_c_k(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const = │ │ │ │ │ +0; │ │ │ │ │ +_3_5_9 virtual _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r_B_a_c_k *_e_B_e_g_i_n_B_a_c_k(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) │ │ │ │ │ +const = 0; │ │ │ │ │ +_3_6_0 virtual _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r_B_a_c_k *_e_E_n_d_B_a_c_k(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const │ │ │ │ │ += 0; │ │ │ │ │ +361 }; │ │ │ │ │ +362 │ │ │ │ │ +364 template │ │ │ │ │ +365 template │ │ │ │ │ +_3_6_6 struct _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t::_C_o_d_i_m │ │ │ │ │ +367 { │ │ │ │ │ +368 class SubEntityIterator; │ │ │ │ │ +369 }; │ │ │ │ │ +370 │ │ │ │ │ +371 // //////////////////////// │ │ │ │ │ +372 // │ │ │ │ │ +373 // The refinement builder │ │ │ │ │ +374 // │ │ │ │ │ +375 │ │ │ │ │ +376 template │ │ │ │ │ +377 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> & │ │ │ │ │ +378 _b_u_i_l_d_R_e_f_i_n_e_m_e_n_t(_G_e_o_m_e_t_r_y_T_y_p_e geometryType, _G_e_o_m_e_t_r_y_T_y_p_e coerceTo); │ │ │ │ │ +379 │ │ │ │ │ +380} // namespace Dune │ │ │ │ │ +381 │ │ │ │ │ +382#include "_v_i_r_t_u_a_l_r_e_f_i_n_e_m_e_n_t_._c_c" │ │ │ │ │ +383 │ │ │ │ │ +384#endif // DUNE_GEOMETRY_VIRTUALREFINEMENT_HH │ │ │ │ │ +_r_e_f_i_n_e_m_e_n_t_._h_h │ │ │ │ │ +This file simply includes all Refinement implementations so you don't have to │ │ │ │ │ +do them separately. │ │ │ │ │ +_v_i_r_t_u_a_l_r_e_f_i_n_e_m_e_n_t_._c_c │ │ │ │ │ +This file contains the virtual wrapper around refinement. │ │ │ │ │ _t_y_p_e_._h_h │ │ │ │ │ A unique label for each type of element that can occur in a grid. │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn affinegeometry.hh:21 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s │ │ │ │ │ -Class providing access to the singletons of the reference elements. │ │ │ │ │ -DDeeffiinniittiioonn referenceelements.hh:128 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ -typename Container::ReferenceElement ReferenceElement │ │ │ │ │ -The reference element type. │ │ │ │ │ -DDeeffiinniittiioonn referenceelements.hh:146 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y │ │ │ │ │ -Geometry parametrized by a LocalFunction and a LocalGeometry. │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:65 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ -std::remove_reference_t< decltype(std::declval< Map >()(std::declval< typename │ │ │ │ │ -Geo::GlobalCoordinate >()))> GlobalCoordinate │ │ │ │ │ -type of global coordinates │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:71 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_c_e_n_t_e_r │ │ │ │ │ -GlobalCoordinate center() const │ │ │ │ │ -Map the center of the wrapped geometry. │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:162 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate │ │ │ │ │ -&local) const │ │ │ │ │ -Obtain the transposed of the Jacobian's inverse. │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:310 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e │ │ │ │ │ -JacobianInverse jacobianInverse(const LocalCoordinate &local) const │ │ │ │ │ -Obtain the Jacobian's inverse. │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:296 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const │ │ │ │ │ -Obtain the transposed of the Jacobian. │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:284 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y │ │ │ │ │ -MappedGeometry(Map_ &&mapping, Geo_ &&geometry, bool affine=false) │ │ │ │ │ -Constructor from mapping to parametrize the geometry. │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:125 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed │ │ │ │ │ -type of jacobian transposed │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:89 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_m_y_d_i_m_e_n_s_i_o_n │ │ │ │ │ -static constexpr int mydimension │ │ │ │ │ -geometry dimension │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:77 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_t_y_p_e │ │ │ │ │ -GeometryType type() const │ │ │ │ │ -Obtain the geometry type from the reference element. │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:143 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ -typename Geo::LocalCoordinate LocalCoordinate │ │ │ │ │ -type of local coordinates │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:68 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_c_t_y_p_e │ │ │ │ │ -typename Geo::ctype ctype │ │ │ │ │ -coordinate type │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:74 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_l_o_c_a_l │ │ │ │ │ -LocalCoordinate local(const GlobalCoordinate &y, Impl::GaussNewtonOptions< │ │ │ │ │ -ctype > opts={}) const │ │ │ │ │ -Evaluate the inverse coordinate mapping. │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:197 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ -Geo Geometry │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:108 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_c_o_r_n_e_r │ │ │ │ │ -GlobalCoordinate corner(int i) const │ │ │ │ │ -Obtain coordinates of the i-th corner. │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:155 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_c_o_o_r_d_d_i_m_e_n_s_i_o_n │ │ │ │ │ -static constexpr int coorddimension │ │ │ │ │ -coordinate dimension │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:80 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -FieldMatrix< ctype, coorddimension, mydimension > JacobianInverseTransposed │ │ │ │ │ -type of jacobian inverse transposed │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:95 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_M_a_p_p_i_n_g │ │ │ │ │ -Map Mapping │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:105 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_g_l_o_b_a_l │ │ │ │ │ -GlobalCoordinate global(const LocalCoordinate &local) const │ │ │ │ │ -Evaluate the coordinate mapping. │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:176 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_r_e_f_E_l_e_m_e_n_t │ │ │ │ │ -ReferenceElement refElement() const │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:323 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_v_o_l_u_m_e │ │ │ │ │ -Volume volume(const QuadratureRule< ctype, mydimension > &quadRule) const │ │ │ │ │ -Obtain the volume of the mapping's image by given quadrature rules. │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:259 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_c_o_r_n_e_r_s │ │ │ │ │ -int corners() const │ │ │ │ │ -Obtain number of corners of the corresponding reference element. │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:149 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e │ │ │ │ │ -FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse │ │ │ │ │ -type of jacobian inverse │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:92 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ -friend ReferenceElement referenceElement(const MappedGeometry &geometry) │ │ │ │ │ -Obtain the reference-element related to this geometry. │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:316 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_v_o_l_u_m_e │ │ │ │ │ -Volume volume(Impl::ConvergenceOptions< ctype > opts={}) const │ │ │ │ │ -Obtain the volume of the mapping's image. │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:241 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_V_o_l_u_m_e │ │ │ │ │ -std::remove_reference_t< decltype(Dune::power(std::declval< ctype >(), │ │ │ │ │ -mydimension))> Volume │ │ │ │ │ -type of volume │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:83 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_a_f_f_i_n_e │ │ │ │ │ -bool affine() const │ │ │ │ │ -Is this mapping affine? Not in general, since we don't know anything about the │ │ │ │ │ -mapping.... │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:137 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_D_e_r_i_v_a_t_i_v_e_M_a_p_p_i_n_g │ │ │ │ │ -std::remove_reference_t< decltype(derivative(std::declval< Map >()))> │ │ │ │ │ -DerivativeMapping │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:111 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n │ │ │ │ │ -Jacobian jacobian(const LocalCoordinate &local) const │ │ │ │ │ -Obtain the Jacobian. │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:272 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_M_a_t_r_i_x_H_e_l_p_e_r │ │ │ │ │ -Impl::FieldMatrixHelper< ctype > MatrixHelper │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:102 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n │ │ │ │ │ -FieldMatrix< ctype, coorddimension, mydimension > Jacobian │ │ │ │ │ -type of jacobian │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:86 │ │ │ │ │ -_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t │ │ │ │ │ -ctype integrationElement(const LocalCoordinate &local) const │ │ │ │ │ -Obtain the integration element. │ │ │ │ │ -DDeeffiinniittiioonn mappedgeometry.hh:225 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e │ │ │ │ │ -Abstract base class for quadrature rules. │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:214 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s │ │ │ │ │ -A container for all quadrature rules of dimension dim │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:260 │ │ │ │ │ +_D_u_n_e_:_:_b_u_i_l_d_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +VirtualRefinement< dimension, CoordType > & buildRefinement(GeometryType │ │ │ │ │ +geometryType, GeometryType coerceTo) │ │ │ │ │ +return a reference to the VirtualRefinement according to the parameters │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:503 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s │ │ │ │ │ +Holds the number of refined intervals per axis needed for virtual and static │ │ │ │ │ +refinement. │ │ │ │ │ +DDeeffiinniittiioonn base.cc:94 │ │ │ │ │ _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ DDeeffiinniittiioonn type.hh:114 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:231 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +VirtualRefinement base class. │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.hh:283 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_B_a_c_k │ │ │ │ │ +SubEntityIteratorBack< dimension > VertexIteratorBack │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.hh:307 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_e_E_n_d_B_a_c_k │ │ │ │ │ +virtual ElementIteratorBack * eEndBack(Dune::RefinementIntervals tag) const =0 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_v_B_e_g_i_n │ │ │ │ │ +VertexIterator vBegin(Dune::RefinementIntervals tag) const │ │ │ │ │ +Get an VertexIterator. │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:38 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_e_B_e_g_i_n │ │ │ │ │ +ElementIterator eBegin(Dune::RefinementIntervals tag) const │ │ │ │ │ +Get an ElementIterator. │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:54 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_n_E_l_e_m_e_n_t_s │ │ │ │ │ +virtual int nElements(Dune::RefinementIntervals tag) const =0 │ │ │ │ │ +Get the number of Elements. │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_e_E_n_d │ │ │ │ │ +ElementIterator eEnd(Dune::RefinementIntervals tag) const │ │ │ │ │ +Get an ElementIterator. │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:62 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ +Codim< 0 >::SubEntityIterator ElementIterator │ │ │ │ │ +The ElementIterator of the VirtualRefinement. │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.hh:290 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_~_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +virtual ~VirtualRefinement() │ │ │ │ │ +Destructor. │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.hh:353 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_v_E_n_d │ │ │ │ │ +VertexIterator vEnd(Dune::RefinementIntervals tag) const │ │ │ │ │ +Get an VertexIterator. │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:46 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +FieldVector< CoordType, dimension > CoordVector │ │ │ │ │ +The CoordVector of the VirtualRefinement. │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.hh:297 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_n_V_e_r_t_i_c_e_s │ │ │ │ │ +virtual int nVertices(Dune::RefinementIntervals tag) const =0 │ │ │ │ │ +Get the number of Vertices. │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ +std::vector< int > IndexVector │ │ │ │ │ +The IndexVector of the VirtualRefinement. │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.hh:303 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ +Codim< dimension >::SubEntityIterator VertexIterator │ │ │ │ │ +The VertexIterator of the VirtualRefinement. │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.hh:288 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_v_E_n_d_B_a_c_k │ │ │ │ │ +virtual VertexIteratorBack * vEndBack(Dune::RefinementIntervals tag) const =0 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r_B_a_c_k │ │ │ │ │ +SubEntityIteratorBack< 0 > ElementIteratorBack │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.hh:308 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_e_B_e_g_i_n_B_a_c_k │ │ │ │ │ +virtual ElementIteratorBack * eBeginBack(Dune::RefinementIntervals tag) const │ │ │ │ │ +=0 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_v_B_e_g_i_n_B_a_c_k │ │ │ │ │ +virtual VertexIteratorBack * vBeginBack(Dune::RefinementIntervals tag) const =0 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m │ │ │ │ │ +codim database of VirtualRefinement │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.hh:367 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00188.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: topologyfactory.hh File Reference │ │ │ │ +dune-geometry: hcube.cc File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,49 +65,88 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
topologyfactory.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Macros
│ │ │ │ +
hcube.cc File Reference
│ │ │ │ │ │ │ │
│ │ │ │ + │ │ │ │ +

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

│ │ │ │
#include <cassert>
│ │ │ │ -#include <array>
│ │ │ │ -#include <map>
│ │ │ │ -#include <memory>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <vector>
│ │ │ │ -#include <dune/geometry/type.hh>
│ │ │ │ -#include <dune/geometry/typeindex.hh>
│ │ │ │ +#include <dune/common/fvector.hh>
│ │ │ │ +#include <dune/common/iteratorfacades.hh>
│ │ │ │ +#include <dune/geometry/referenceelements.hh>
│ │ │ │ +#include <dune/geometry/axisalignedcubegeometry.hh>
│ │ │ │ +#include "base.cc"
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::TopologyFactory< Traits >
 Provide a factory over the generic topologies. More...
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...
 
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::HCube::RefinementSubEntityIteratorSpecial< dimension, CoordType, dimension >
 
class  Dune::RefinementImp::HCube::RefinementSubEntityIteratorSpecial< dimension, CoordType, 0 >
 
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_REFINEMENT_HCUBE_CC
 
│ │ │ │ +

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
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,31 +1,60 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -topologyfactory.hh File Reference │ │ │ │ │ + * _r_e_f_i_n_e_m_e_n_t │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s │ │ │ │ │ +hcube.cc File Reference │ │ │ │ │ +This file contains the _R_e_f_i_n_e_m_e_n_t implementation for hypercubes │ │ │ │ │ +(quadrilaterals, hexahedrons, etc.). _M_o_r_e_._._. │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_i_n_d_e_x_._h_h> │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_a_x_i_s_a_l_i_g_n_e_d_c_u_b_e_g_e_o_m_e_t_r_y_._h_h> │ │ │ │ │ +#include "_b_a_s_e_._c_c" │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_T_o_p_o_l_o_g_y_F_a_c_t_o_r_y_<_ _T_r_a_i_t_s_ _> │ │ │ │ │ -  Provide a factory over the generic topologies. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___,_ _C_o_o_r_d_T_y_p_e_ _> │ │ │ │ │ +  _R_e_f_i_n_e_m_e_n_t implementation for hypercubes _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_T_o_p_o_l_o_g_y_S_i_n_g_l_e_t_o_n_F_a_c_t_o_r_y_<_ _F_a_c_t_o_r_y_ _> │ │ │ │ │ - A wrapper for a _T_o_p_o_l_o_g_y_F_a_c_t_o_r_y providing singleton storage. Same │ │ │ │ │ -  usage as _T_o_p_o_l_o_g_y_F_a_c_t_o_r_y but with empty release method an internal │ │ │ │ │ - storage. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___,_ _C_o_o_r_d_T_y_p_e_ _>_:_: │ │ │ │ │ + _C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ + _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ +  SubEntityIterator base class for hypercube refinement. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ + _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ + _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___,_ _C_o_o_r_d_T_y_p_e_ _>_:_: │ │ │ │ │ + _C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ +namespace   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ +  This namespace contains the implementation of _R_e_f_i_n_e_m_e_n_t. │ │ │ │ │ +  │ │ │ │ │ +namespace   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e │ │ │ │ │ +  This namespace contains the _R_e_f_i_n_e_m_e_n_t implementation for │ │ │ │ │ + hypercubes (_G_e_o_m_e_t_r_y_T_y_p_e_:_:_c_u_b_e). │ │ │ │ │ +  │ │ │ │ │ +MMaaccrrooss │ │ │ │ │ +#define  _D_U_N_E___G_E_O_M_E_T_R_Y___R_E_F_I_N_E_M_E_N_T___H_C_U_B_E___C_C │ │ │ │ │ +  │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +This file contains the _R_e_f_i_n_e_m_e_n_t implementation for hypercubes │ │ │ │ │ +(quadrilaterals, hexahedrons, etc.). │ │ │ │ │ +See _R_e_f_i_n_e_m_e_n_t_ _i_m_p_l_e_m_e_n_t_a_t_i_o_n_ _f_o_r_ _h_y_p_e_r_c_u_b_e_s. │ │ │ │ │ +********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ +********** _?◆_? DDUUNNEE__GGEEOOMMEETTRRYY__RREEFFIINNEEMMEENNTT__HHCCUUBBEE__CCCC ********** │ │ │ │ │ +#define DUNE_GEOMETRY_REFINEMENT_HCUBE_CC │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00188_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: topologyfactory.hh Source File │ │ │ │ +dune-geometry: hcube.cc Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,198 +70,478 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
topologyfactory.hh
│ │ │ │ +
hcube.cc
│ │ │ │
│ │ │ │
│ │ │ │ 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 © 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_REFINEMENT_HCUBE_CC
│ │ │ │ +
6#define DUNE_GEOMETRY_REFINEMENT_HCUBE_CC
│ │ │ │
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>
│ │ │ │ - │ │ │ │ -
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;
│ │ │ │ +
41#include <cassert>
│ │ │ │ +
42
│ │ │ │ +
43#include <dune/common/fvector.hh>
│ │ │ │ +
44#include <dune/common/iteratorfacades.hh>
│ │ │ │ +
45
│ │ │ │ + │ │ │ │ + │ │ │ │
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
│ │ │ │ -
│ │ │ │ -
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.
│ │ │ │ +
49#include "base.cc" // for RefinementTraits
│ │ │ │ +
50
│ │ │ │ +
51namespace Dune
│ │ │ │ +
52{
│ │ │ │ +
53 namespace RefinementImp
│ │ │ │ +
54 {
│ │ │ │ +
│ │ │ │ +
61 namespace HCube
│ │ │ │ +
62 {
│ │ │ │ +
72 template<int dimension_, class CoordType>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
74 {
│ │ │ │ +
75 public:
│ │ │ │ +
77 constexpr static int dimension = dimension_;
│ │ │ │ +
78 //- Know yourself
│ │ │ │ + │ │ │ │ +
80
│ │ │ │ +
81 template<int codimension>
│ │ │ │ +
82 struct Codim;
│ │ │ │ + │ │ │ │ +
84 typedef FieldVector<CoordType, dimension> CoordVector;
│ │ │ │ + │ │ │ │ +
86 typedef FieldVector<int, (1<<dimension)> IndexVector;
│ │ │ │ +
87
│ │ │ │ +
88 static unsigned nVertices(unsigned nIntervals);
│ │ │ │ +
89 static VertexIterator vBegin(unsigned nIntervals);
│ │ │ │ +
90 static VertexIterator vEnd(unsigned nIntervals);
│ │ │ │ +
91
│ │ │ │ +
92 static unsigned nElements(unsigned nIntervals);
│ │ │ │ +
93 static ElementIterator eBegin(unsigned nIntervals);
│ │ │ │ +
94 static ElementIterator eEnd(unsigned nIntervals);
│ │ │ │ +
95 };
│ │ │ │ +
│ │ │ │ +
96
│ │ │ │ +
97 template<int dimension, class CoordType>
│ │ │ │ +
98 template<int codimension>
│ │ │ │ +
│ │ │ │ +
99 struct RefinementImp<dimension, CoordType>::Codim
│ │ │ │ +
100 {
│ │ │ │ +
101 class SubEntityIterator;
│ │ │ │ + │ │ │ │ +
103 };
│ │ │ │ +
│ │ │ │ +
104
│ │ │ │ +
105 template<int dimension, class CoordType>
│ │ │ │ +
106 unsigned
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
108 nVertices(unsigned nIntervals)
│ │ │ │ +
109 {
│ │ │ │ +
110 // return (nIntervals + 1)^dim
│ │ │ │ +
111 return Dune::power(nIntervals+1u, static_cast<unsigned>(dimension));
│ │ │ │ +
112 }
│ │ │ │ +
│ │ │ │ +
113
│ │ │ │ +
114 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
117 vBegin(unsigned nIntervals)
│ │ │ │ +
118 {
│ │ │ │ +
119 return VertexIterator(0,nIntervals);
│ │ │ │ +
120 }
│ │ │ │ +
│ │ │ │ +
121
│ │ │ │ +
122 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
125 vEnd(unsigned nIntervals)
│ │ │ │ +
126 {
│ │ │ │ +
127 return VertexIterator(nVertices(nIntervals),nIntervals);
│ │ │ │ +
128 }
│ │ │ │ +
│ │ │ │ +
129
│ │ │ │ +
130 template<int dimension, class CoordType>
│ │ │ │ +
131 unsigned
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
133 nElements(unsigned nIntervals)
│ │ │ │ +
134 {
│ │ │ │ +
135 static_assert(dimension >= 0,
│ │ │ │ +
136 "Negative dimension given, what the heck is that supposed to mean?");
│ │ │ │ +
137 // return nIntervals^dim
│ │ │ │ +
138 return Dune::power(nIntervals, static_cast<unsigned>(dimension));
│ │ │ │ +
139 }
│ │ │ │ +
│ │ │ │ +
140
│ │ │ │ +
141 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
144 eBegin(unsigned nIntervals)
│ │ │ │ +
145 {
│ │ │ │ +
146 return ElementIterator(0,nIntervals);
│ │ │ │ +
147 }
│ │ │ │ +
│ │ │ │ +
148
│ │ │ │ +
149 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
152 eEnd(unsigned nIntervals)
│ │ │ │ +
153 {
│ │ │ │ +
154 return ElementIterator(nElements(nIntervals),nIntervals);
│ │ │ │ +
155 }
│ │ │ │ +
│ │ │ │ +
156
│ │ │ │ +
157 //
│ │ │ │ +
158 // The iterators
│ │ │ │ +
159 //
│ │ │ │ +
160
│ │ │ │ +
161#ifdef DOXYGEN
│ │ │ │ +
173 template<int dimension, class CoordType, int codimension>
│ │ │ │ + │ │ │ │ +
175#else
│ │ │ │ +
176 template<int dimension, class CoordType, int codimension>
│ │ │ │ + │ │ │ │ +
178#endif //DOXYGEN
│ │ │ │ +
179
│ │ │ │ +
180 // for vertices
│ │ │ │ +
181
│ │ │ │ +
182 template<int dimension, class CoordType>
│ │ │ │ +
│ │ │ │ +
183 class RefinementSubEntityIteratorSpecial<dimension, CoordType, dimension>
│ │ │ │ +
184 {
│ │ │ │ +
185 public:
│ │ │ │ + │ │ │ │ +
187 typedef typename Refinement::template Codim<dimension>::SubEntityIterator Common;
│ │ │ │ +
188 typedef typename Refinement::CoordVector CoordVector;
│ │ │ │ +
189
│ │ │ │ +
190 CoordVector coords() const;
│ │ │ │ +
191
│ │ │ │ +
192 private:
│ │ │ │ +
193 const Common & asCommon() const
│ │ │ │ +
194 {
│ │ │ │ +
195 return *static_cast<const Common*>(this);
│ │ │ │ +
196 }
│ │ │ │ +
197 };
│ │ │ │ +
│ │ │ │ +
198
│ │ │ │ +
199 template<int dimension, class CoordType>
│ │ │ │ +
200 typename RefinementSubEntityIteratorSpecial<dimension, CoordType, dimension>::CoordVector
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
202 coords() const
│ │ │ │ +
203 {
│ │ │ │ +
204 std::array<unsigned int, dimension> v(asCommon().vertexCoord());
│ │ │ │ +
205 CoordVector c;
│ │ │ │ +
206 for (int d = 0; d < dimension; d++)
│ │ │ │ +
207 {
│ │ │ │ +
208 c[d] = v[d]*1.0 / asCommon()._nIntervals;
│ │ │ │ +
209 }
│ │ │ │ +
210 return c;
│ │ │ │ +
211 }
│ │ │ │ +
│ │ │ │ +
212
│ │ │ │ +
213 // for elements
│ │ │ │ +
214
│ │ │ │ +
215 template<int dimension, class CoordType>
│ │ │ │ +
│ │ │ │ +
216 class RefinementSubEntityIteratorSpecial<dimension, CoordType, 0>
│ │ │ │ +
217 {
│ │ │ │ +
218 public:
│ │ │ │ + │ │ │ │ +
220 typedef typename Refinement::template Codim<0>::SubEntityIterator Common;
│ │ │ │ +
221 typedef typename Refinement::IndexVector IndexVector;
│ │ │ │ +
222 typedef typename Refinement::CoordVector CoordVector;
│ │ │ │ +
223
│ │ │ │ +
224 IndexVector vertexIndices() const;
│ │ │ │ +
225 CoordVector coords() const;
│ │ │ │ +
226
│ │ │ │ +
227 private:
│ │ │ │ +
228 const Common & asCommon() const
│ │ │ │ +
229 {
│ │ │ │ +
230 return *static_cast<const Common*>(this);
│ │ │ │ +
231 }
│ │ │ │ +
232 };
│ │ │ │ +
│ │ │ │ +
233
│ │ │ │ +
234 template<int dimension, class CoordType>
│ │ │ │ +
235 typename RefinementSubEntityIteratorSpecial<dimension, CoordType, 0>::IndexVector
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
237 vertexIndices() const
│ │ │ │ +
238 {
│ │ │ │ +
239 constexpr static int nIndices = 1 << dimension;
│ │ │ │ +
240
│ │ │ │ +
241 // cell index tuple
│ │ │ │ +
242 std::array<unsigned int, dimension> e(asCommon().cellCoord());
│ │ │ │ +
243
│ │ │ │ +
244 // vertices
│ │ │ │ +
245 IndexVector vec;
│ │ │ │ +
246 for(int i = 0; i < nIndices; ++i)
│ │ │ │ +
247 {
│ │ │ │ +
248 int base = 1;
│ │ │ │ +
249 std::array<unsigned int, dimension> alpha(asCommon().idx2multiidx(i));
│ │ │ │ +
250 for (int d = 0; d < dimension; d++) {
│ │ │ │ +
251 vec[i] += (alpha[d] + e[d]) * base;
│ │ │ │ +
252 base *= asCommon()._nIntervals+1;
│ │ │ │ +
253 }
│ │ │ │ +
254 }
│ │ │ │ +
255 return vec;
│ │ │ │ +
256 }
│ │ │ │ +
│ │ │ │ +
257
│ │ │ │ +
258 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
261 coords() const
│ │ │ │ +
262 {
│ │ │ │ +
263 std::array<unsigned int, dimension> v(asCommon().cellCoord());
│ │ │ │ +
264 CoordVector c;
│ │ │ │ +
265 for (int d=0; d<dimension; d++)
│ │ │ │ +
266 {
│ │ │ │ +
267 c[d] = (v[d]*1.0 + 0.5) / asCommon()._nIntervals;
│ │ │ │ +
268 }
│ │ │ │ +
269 return c;
│ │ │ │ +
270 }
│ │ │ │ +
│ │ │ │ +
271
│ │ │ │ +
272 // common
│ │ │ │ +
273 template<int dimension, class CoordType>
│ │ │ │ +
274 template<int codimension>
│ │ │ │ +
│ │ │ │ +
275 class RefinementImp<dimension, CoordType>::Codim<codimension>::SubEntityIterator
│ │ │ │ +
276 : public ForwardIteratorFacade<typename RefinementImp<dimension,
│ │ │ │ +
277 CoordType>::template Codim<codimension>::SubEntityIterator, int>,
│ │ │ │ +
278 public RefinementSubEntityIteratorSpecial<dimension, CoordType, codimension>
│ │ │ │ +
279 {
│ │ │ │ +
280 public:
│ │ │ │ + │ │ │ │ +
282 typedef typename Refinement::template Codim<codimension>::SubEntityIterator This;
│ │ │ │ +
283
│ │ │ │ +
284 SubEntityIterator(unsigned int index, unsigned int nIntervals);
│ │ │ │ +
285
│ │ │ │ +
286 bool equals(const This &other) const;
│ │ │ │ +
287 void increment();
│ │ │ │ +
288
│ │ │ │ +
289 int index() const;
│ │ │ │ +
290 Geometry geometry () const;
│ │ │ │ +
291 private:
│ │ │ │ +
292 friend class RefinementSubEntityIteratorSpecial<dimension, CoordType, codimension>;
│ │ │ │ +
293 unsigned int _index;
│ │ │ │ +
294 unsigned int _nIntervals;
│ │ │ │ +
295
│ │ │ │ +
296 std::array<unsigned int, dimension>
│ │ │ │ +
297 cellCoord(unsigned int idx) const
│ │ │ │ +
298 {
│ │ │ │ +
299 return idx2coord(idx, _nIntervals);
│ │ │ │ +
300 }
│ │ │ │ +
301
│ │ │ │ +
302 std::array<unsigned int, dimension>
│ │ │ │ +
303 vertexCoord(unsigned int idx) const
│ │ │ │ +
304 {
│ │ │ │ +
305 return idx2coord(idx, _nIntervals+1u);
│ │ │ │ +
306 }
│ │ │ │ +
307
│ │ │ │ +
308 std::array<unsigned int, dimension>
│ │ │ │ +
309 cellCoord() const
│ │ │ │ +
310 {
│ │ │ │ +
311 return cellCoord(_index);
│ │ │ │ +
312 }
│ │ │ │ +
313
│ │ │ │ +
314 std::array<unsigned int, dimension>
│ │ │ │ +
315 vertexCoord() const
│ │ │ │ +
316 {
│ │ │ │ +
317 return vertexCoord(_index);
│ │ │ │ +
318 }
│ │ │ │ +
319
│ │ │ │ +
320 std::array<unsigned int, dimension>
│ │ │ │ +
321 idx2coord(unsigned int idx, unsigned int w) const
│ │ │ │ +
322 {
│ │ │ │ +
323 std::array<unsigned int, dimension> c;
│ │ │ │ +
324 for (unsigned int d = 0; d < dimension; d++)
│ │ │ │ +
325 {
│ │ │ │ +
326 c[d] = idx%w;
│ │ │ │ +
327 idx = idx/w;
│ │ │ │ +
328 }
│ │ │ │ +
329 return c;
│ │ │ │ +
330 }
│ │ │ │ +
331
│ │ │ │ +
332 unsigned int
│ │ │ │ +
333 coord2idx(std::array<unsigned int, dimension> c, unsigned int w) const
│ │ │ │ +
334 {
│ │ │ │ +
335 unsigned int i = 0;
│ │ │ │ +
336 for (unsigned int d = dimension; d > 0; d--)
│ │ │ │ +
337 {
│ │ │ │ +
338 i *= w;
│ │ │ │ +
339 i += c[d-1];
│ │ │ │ +
340 }
│ │ │ │ +
341 return i;
│ │ │ │ +
342 }
│ │ │ │ +
343
│ │ │ │ +
344 std::array<unsigned int, dimension>
│ │ │ │ +
345 idx2multiidx(unsigned int idx) const
│ │ │ │ +
346 {
│ │ │ │ +
347 std::array<unsigned int, dimension> alpha;
│ │ │ │ +
348 for (unsigned int i = 0; i < dimension; ++i)
│ │ │ │ +
349 alpha[i] = (idx >> i) & 1u;
│ │ │ │ +
350 return alpha;
│ │ │ │ +
351 }
│ │ │ │ +
352 };
│ │ │ │ +
│ │ │ │ +
353
│ │ │ │ +
354#ifndef DOXYGEN
│ │ │ │ +
355 template<int dimension, class CoordType>
│ │ │ │ +
356 template<int codimension>
│ │ │ │ +
357 RefinementImp<dimension, CoordType>::Codim<codimension>::SubEntityIterator::
│ │ │ │ +
358 SubEntityIterator(unsigned int index, unsigned int nIntervals)
│ │ │ │ +
359 : _index(index), _nIntervals(nIntervals)
│ │ │ │ +
360 {}
│ │ │ │ +
361
│ │ │ │ +
362 template<int dimension, class CoordType>
│ │ │ │ +
363 template<int codimension>
│ │ │ │ +
364 bool
│ │ │ │ +
365 RefinementImp<dimension, CoordType>::Codim<codimension>::SubEntityIterator::
│ │ │ │ +
366 equals(const This &other) const
│ │ │ │ +
367 {
│ │ │ │ +
368 return ((_index == other._index) && (_nIntervals == other._nIntervals));
│ │ │ │ +
369 }
│ │ │ │ +
370
│ │ │ │ +
371 template<int dimension, class CoordType>
│ │ │ │ +
372 template<int codimension>
│ │ │ │ +
373 void
│ │ │ │ +
374 RefinementImp<dimension, CoordType>::Codim<codimension>::SubEntityIterator::
│ │ │ │ +
375 increment()
│ │ │ │ +
376 {
│ │ │ │ +
377 ++_index;
│ │ │ │ +
378 }
│ │ │ │ +
379
│ │ │ │ +
380 template<int dimension, class CoordType>
│ │ │ │ +
381 template<int codimension>
│ │ │ │ +
382 int
│ │ │ │ +
383 RefinementImp<dimension, CoordType>::Codim<codimension>::SubEntityIterator::
│ │ │ │ +
384 index() const
│ │ │ │ +
385 {
│ │ │ │ +
386 return _index;
│ │ │ │ +
387 }
│ │ │ │ +
388
│ │ │ │ +
389 template<int dimension, class CoordType>
│ │ │ │ +
390 template<int codimension>
│ │ │ │ +
391 typename RefinementImp<dimension, CoordType>::template Codim<codimension>::Geometry
│ │ │ │ +
392 RefinementImp<dimension, CoordType>::Codim<codimension>::SubEntityIterator::geometry () const
│ │ │ │ +
393 {
│ │ │ │ +
394 std::array<unsigned int,dimension> intCoords = idx2coord(_index,_nIntervals);
│ │ │ │ +
395
│ │ │ │ +
396 Dune::FieldVector<CoordType,dimension> lower;
│ │ │ │ +
397 Dune::FieldVector<CoordType,dimension> upper;
│ │ │ │ +
398
│ │ │ │ +
399 assert(codimension == 0 or codimension == dimension);
│ │ │ │ +
400
│ │ │ │ +
401 if constexpr (codimension == 0) {
│ │ │ │ +
402 for (size_t j = 0; j < dimension; j++)
│ │ │ │ +
403 {
│ │ │ │ +
404 lower[j] = double(intCoords[j]) / double(_nIntervals);
│ │ │ │ +
405 upper[j] = double(intCoords[j] + 1) / double(_nIntervals);
│ │ │ │ +
406 }
│ │ │ │ +
407
│ │ │ │ +
408 return typename RefinementImp<dimension,
│ │ │ │ +
409 CoordType>::template Codim<codimension>::Geometry(lower,upper);
│ │ │ │ +
410 } else {
│ │ │ │ +
411 for (size_t j = 0; j < dimension; j++)
│ │ │ │ +
412 lower[j] = upper[j] = double(intCoords[j]) / double(_nIntervals);
│ │ │ │ +
413
│ │ │ │ +
414 return typename RefinementImp<dimension,
│ │ │ │ +
415 CoordType>::template Codim<codimension>::Geometry(lower,upper,std::bitset<dimension>(0));
│ │ │ │ +
416 }
│ │ │ │ +
417 }
│ │ │ │ +
418
│ │ │ │ +
419#endif // DOXYGEN
│ │ │ │ +
420
│ │ │ │ +
421 } // namespace HCube
│ │ │ │ +
│ │ │ │ +
422
│ │ │ │ +
423 // ///////////////////////
│ │ │ │ +
424 //
│ │ │ │ +
425 // The refinement traits
│ │ │ │ +
426 //
│ │ │ │ +
427
│ │ │ │ +
428#ifndef DOXYGEN
│ │ │ │ +
429 template<unsigned topologyId, class CoordType, unsigned coerceToId,
│ │ │ │ +
430 int dim>
│ │ │ │ +
431 struct Traits<
│ │ │ │ +
432 topologyId, CoordType, coerceToId, dim,
│ │ │ │ +
433 typename std::enable_if<
│ │ │ │ +
434 (dim >= 2 &&
│ │ │ │ +
435 (GeometryTypes::cube(dim).id() >> 1) ==
│ │ │ │ +
436 (topologyId >> 1) &&
│ │ │ │ +
437 (GeometryTypes::cube(dim).id() >> 1) ==
│ │ │ │ +
438 (coerceToId >> 1)
│ │ │ │ +
439 )>::type
│ │ │ │ +
440 >
│ │ │ │ +
441 {
│ │ │ │ +
442 typedef HCube::RefinementImp<dim, CoordType> Imp;
│ │ │ │ +
443 };
│ │ │ │ +
444#endif
│ │ │ │ +
445
│ │ │ │ +
446 } // namespace RefinementImp
│ │ │ │ +
447
│ │ │ │ +
448} // namespace Dune
│ │ │ │ +
449
│ │ │ │ +
450#endif // DUNE_GEOMETRY_REFINEMENT_HCUBE_CC
│ │ │ │ +
A geometry implementation for axis-aligned hypercubes.
│ │ │ │ +
This file contains the parts independent of a particular Refinement implementation.
│ │ │ │ + │ │ │ │ +
STL namespace.
│ │ │ │
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 * >
Definition topologyfactory.hh:103
│ │ │ │ -
static Object * create(const Dune::GeometryType &gt, const Key &key)
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 * >
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:114
│ │ │ │ -
constexpr unsigned int id() const
Return the topology id of the type.
Definition type.hh:365
│ │ │ │ +
A geometry implementation for axis-aligned hypercubes.
Definition axisalignedcubegeometry.hh:50
│ │ │ │ +
Static tag representing a codimension.
Definition dimension.hh:24
│ │ │ │ +
Refinement implementation for hypercubes
Definition hcube.cc:74
│ │ │ │ +
Codim< 0 >::SubEntityIterator ElementIterator
Definition hcube.cc:85
│ │ │ │ +
static ElementIterator eEnd(unsigned nIntervals)
Definition hcube.cc:152
│ │ │ │ +
static unsigned nVertices(unsigned nIntervals)
Definition hcube.cc:108
│ │ │ │ +
static VertexIterator vEnd(unsigned nIntervals)
Definition hcube.cc:125
│ │ │ │ +
FieldVector< int,(1<< dimension)> IndexVector
Definition hcube.cc:86
│ │ │ │ +
Codim< dimension >::SubEntityIterator VertexIterator
Definition hcube.cc:83
│ │ │ │ +
FieldVector< CoordType, dimension > CoordVector
Definition hcube.cc:84
│ │ │ │ +
static unsigned nElements(unsigned nIntervals)
Definition hcube.cc:133
│ │ │ │ +
RefinementImp< dimension, CoordType > Refinement
Definition hcube.cc:79
│ │ │ │ +
static ElementIterator eBegin(unsigned nIntervals)
Definition hcube.cc:144
│ │ │ │ +
static constexpr int dimension
Know your own dimension.
Definition hcube.cc:77
│ │ │ │ +
static VertexIterator vBegin(unsigned nIntervals)
Definition hcube.cc:117
│ │ │ │ + │ │ │ │ +
Dune::AxisAlignedCubeGeometry< CoordType, dimension-codimension, dimension > Geometry
Definition hcube.cc:102
│ │ │ │ +
SubEntityIterator base class for hypercube refinement.
Definition hcube.cc:174
│ │ │ │ + │ │ │ │ +
Refinement::template Codim< dimension >::SubEntityIterator Common
Definition hcube.cc:187
│ │ │ │ + │ │ │ │ +
RefinementImp< dimension, CoordType > Refinement
Definition hcube.cc:219
│ │ │ │ +
Refinement::template Codim< 0 >::SubEntityIterator Common
Definition hcube.cc:220
│ │ │ │ + │ │ │ │ + │ │ │ │ +
SubEntityIterator(unsigned int index, unsigned int nIntervals)
│ │ │ │ + │ │ │ │ + │ │ │ │ +
RefinementImp< dimension, CoordType > Refinement
Definition hcube.cc:281
│ │ │ │ + │ │ │ │ + │ │ │ │ +
Refinement::template Codim< codimension >::SubEntityIterator This
Definition hcube.cc:282
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,220 +1,529 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -topologyfactory.hh │ │ │ │ │ + * _r_e_f_i_n_e_m_e_n_t │ │ │ │ │ +hcube.cc │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 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 © 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_REFINEMENT_HCUBE_CC │ │ │ │ │ +_6#define DUNE_GEOMETRY_REFINEMENT_HCUBE_CC │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9 │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15 │ │ │ │ │ -16#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ -17#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_i_n_d_e_x_._h_h> │ │ │ │ │ -18 │ │ │ │ │ -19namespace _D_u_n_e │ │ │ │ │ -20{ │ │ │ │ │ -21 │ │ │ │ │ -40 template │ │ │ │ │ -_4_1 struct _T_o_p_o_l_o_g_y_F_a_c_t_o_r_y │ │ │ │ │ -42 { │ │ │ │ │ -43 // extract types from Traits class │ │ │ │ │ -_4_4 static const unsigned int _d_i_m_e_n_s_i_o_n = Traits::dimension; │ │ │ │ │ -_4_5 typedef typename Traits::Key _K_e_y; │ │ │ │ │ -_4_6 typedef typename Traits::Object _O_b_j_e_c_t; │ │ │ │ │ -_4_7 typedef typename Traits::Factory _F_a_c_t_o_r_y; │ │ │ │ │ +41#include │ │ │ │ │ +42 │ │ │ │ │ +43#include │ │ │ │ │ +44#include │ │ │ │ │ +45 │ │ │ │ │ +46#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ +47#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_a_x_i_s_a_l_i_g_n_e_d_c_u_b_e_g_e_o_m_e_t_r_y_._h_h> │ │ │ │ │ 48 │ │ │ │ │ -_5_0 static _O_b_j_e_c_t *_c_r_e_a_t_e ( const _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e >, const _K_e_y &key ) │ │ │ │ │ -51 { │ │ │ │ │ -52 return Impl::toGeometryTypeIdConstant(gt, [&](auto id) { │ │ │ │ │ -53 return create(key); │ │ │ │ │ -54 }); │ │ │ │ │ -55 } │ │ │ │ │ -57 template< GeometryType::Id geometryId > │ │ │ │ │ -_5_8 static _O_b_j_e_c_t *_c_r_e_a_t_e ( const _K_e_y &key ) │ │ │ │ │ -59 { │ │ │ │ │ -60 return Factory::template createObject< geometryId >( key ); │ │ │ │ │ -61 } │ │ │ │ │ -62 │ │ │ │ │ -64 template< class Topology > │ │ │ │ │ -_6_5 static _O_b_j_e_c_t *_c_r_e_a_t_e ( const _K_e_y &key ) │ │ │ │ │ -66 { │ │ │ │ │ -67 return Factory::template createObject< Topology >( key ); │ │ │ │ │ -68 } │ │ │ │ │ -69 │ │ │ │ │ -_7_1 static void _r_e_l_e_a_s_e( _O_b_j_e_c_t *object ) { delete object; } │ │ │ │ │ -72 }; │ │ │ │ │ -73 │ │ │ │ │ -74 │ │ │ │ │ -75 │ │ │ │ │ -80 template │ │ │ │ │ -_8_1 struct _T_o_p_o_l_o_g_y_S_i_n_g_l_e_t_o_n_F_a_c_t_o_r_y │ │ │ │ │ -82 { │ │ │ │ │ -_8_3 static const unsigned int _d_i_m_e_n_s_i_o_n = Factory::dimension; │ │ │ │ │ -_8_4 typedef typename Factory::Key _K_e_y; │ │ │ │ │ -_8_5 typedef const typename Factory::Object _O_b_j_e_c_t; │ │ │ │ │ -86 │ │ │ │ │ -_8_8 static _O_b_j_e_c_t *_c_r_e_a_t_e ( const _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e >, const _K_e_y &key ) │ │ │ │ │ -89 { │ │ │ │ │ -90 assert( gt._i_d() < numTopologies ); │ │ │ │ │ -91 return instance().getObject( gt, key ); │ │ │ │ │ -92 } │ │ │ │ │ -94 template< GeometryType::Id geometryId > │ │ │ │ │ -_9_5 static auto _c_r_e_a_t_e ( const _K_e_y &key ) │ │ │ │ │ -96 -> std::enable_if_t< static_cast(geometryId).dim() == │ │ │ │ │ -_d_i_m_e_n_s_i_o_n, _O_b_j_e_c_t * > │ │ │ │ │ -97 { │ │ │ │ │ -98 return instance().template getObject< geometryId >( key ); │ │ │ │ │ -99 } │ │ │ │ │ -100 │ │ │ │ │ -102 template< class Topology > │ │ │ │ │ -_1_0_3 static auto _c_r_e_a_t_e ( const _K_e_y &key ) │ │ │ │ │ -104 -> std::enable_if_t< Topology::dimension == dimension, Object * > │ │ │ │ │ -105 { │ │ │ │ │ -106 return instance().template getObject< Topology >( key ); │ │ │ │ │ -107 } │ │ │ │ │ -108 │ │ │ │ │ -_1_1_0 static void _r_e_l_e_a_s_e ( _O_b_j_e_c_t *object ) │ │ │ │ │ -111 {} │ │ │ │ │ -112 │ │ │ │ │ -113 private: │ │ │ │ │ -114 struct ObjectDeleter │ │ │ │ │ -115 { │ │ │ │ │ -116 void operator() ( _O_b_j_e_c_t *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 << _d_i_m_e_n_s_i_o_n); │ │ │ │ │ -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 _K_e_y &key ) │ │ │ │ │ -132 { │ │ │ │ │ -133 return storage_[ key ][ topologyId ]; │ │ │ │ │ -134 } │ │ │ │ │ -135 │ │ │ │ │ -136 _O_b_j_e_c_t *getObject ( const _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e >, const _K_e_y &key ) │ │ │ │ │ -137 { │ │ │ │ │ -138 auto &object = find( gt._i_d(), key ); │ │ │ │ │ -139 if( !object ) │ │ │ │ │ -140 object.reset( Factory::create( gt, key ) ); │ │ │ │ │ -141 return object.get(); │ │ │ │ │ -142 } │ │ │ │ │ -143 │ │ │ │ │ -144 template< GeometryType::Id geometryId > │ │ │ │ │ -145 _O_b_j_e_c_t *getObject ( const _K_e_y &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 _O_b_j_e_c_t *getObject ( const _K_e_y &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 │ │ │ │ │ -_t_y_p_e_._h_h │ │ │ │ │ -A unique label for each type of element that can occur in a grid. │ │ │ │ │ -_t_y_p_e_i_n_d_e_x_._h_h │ │ │ │ │ -Helper classes to provide indices for geometrytypes for use in a vector. │ │ │ │ │ +49#include "_b_a_s_e_._c_c" // for RefinementTraits │ │ │ │ │ +50 │ │ │ │ │ +51namespace _D_u_n_e │ │ │ │ │ +52{ │ │ │ │ │ +53 namespace RefinementImp │ │ │ │ │ +54 { │ │ │ │ │ +_6_1 namespace HCube │ │ │ │ │ +62 { │ │ │ │ │ +72 template │ │ │ │ │ +_7_3 class _R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ +74 { │ │ │ │ │ +75 public: │ │ │ │ │ +_7_7 constexpr static int _d_i_m_e_n_s_i_o_n = dimension_; │ │ │ │ │ +78 //- Know yourself │ │ │ │ │ +_7_9 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +80 │ │ │ │ │ +81 template │ │ │ │ │ +82 struct _C_o_d_i_m; │ │ │ │ │ +_8_3 typedef typename _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _V_e_r_t_e_x_I_t_e_r_a_t_o_r; │ │ │ │ │ +_8_4 typedef FieldVector _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ +_8_5 typedef typename _C_o_d_i_m_<_0_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r; │ │ │ │ │ +_8_6 typedef FieldVector _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ +87 │ │ │ │ │ +88 static unsigned _n_V_e_r_t_i_c_e_s(unsigned nIntervals); │ │ │ │ │ +89 static _V_e_r_t_e_x_I_t_e_r_a_t_o_r _v_B_e_g_i_n(unsigned nIntervals); │ │ │ │ │ +90 static _V_e_r_t_e_x_I_t_e_r_a_t_o_r _v_E_n_d(unsigned nIntervals); │ │ │ │ │ +91 │ │ │ │ │ +92 static unsigned _n_E_l_e_m_e_n_t_s(unsigned nIntervals); │ │ │ │ │ +93 static _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r _e_B_e_g_i_n(unsigned nIntervals); │ │ │ │ │ +94 static _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r _e_E_n_d(unsigned nIntervals); │ │ │ │ │ +95 }; │ │ │ │ │ +96 │ │ │ │ │ +97 template │ │ │ │ │ +98 template │ │ │ │ │ +_9_9 struct _R_e_f_i_n_e_m_e_n_t_I_m_p::_C_o_d_i_m │ │ │ │ │ +100 { │ │ │ │ │ +101 class SubEntityIterator; │ │ │ │ │ +_1_0_2 typedef _D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y _G_e_o_m_e_t_r_y; │ │ │ │ │ +103 }; │ │ │ │ │ +104 │ │ │ │ │ +105 template │ │ │ │ │ +106 unsigned │ │ │ │ │ +_1_0_7 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +108_ _n_V_e_r_t_i_c_e_s(unsigned nIntervals) │ │ │ │ │ +109 { │ │ │ │ │ +110 // return (nIntervals + 1)^dim │ │ │ │ │ +111 return Dune::power(nIntervals+1u, static_cast(dimension)); │ │ │ │ │ +112 } │ │ │ │ │ +113 │ │ │ │ │ +114 template │ │ │ │ │ +115 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ +_1_1_6 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +117_ _v_B_e_g_i_n(unsigned nIntervals) │ │ │ │ │ +118 { │ │ │ │ │ +119 return _V_e_r_t_e_x_I_t_e_r_a_t_o_r(0,nIntervals); │ │ │ │ │ +120 } │ │ │ │ │ +121 │ │ │ │ │ +122 template │ │ │ │ │ +123 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ +_1_2_4 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +125_ _v_E_n_d(unsigned nIntervals) │ │ │ │ │ +126 { │ │ │ │ │ +127 return _V_e_r_t_e_x_I_t_e_r_a_t_o_r(nVertices(nIntervals),nIntervals); │ │ │ │ │ +128 } │ │ │ │ │ +129 │ │ │ │ │ +130 template │ │ │ │ │ +131 unsigned │ │ │ │ │ +_1_3_2 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +133_ _n_E_l_e_m_e_n_t_s(unsigned nIntervals) │ │ │ │ │ +134 { │ │ │ │ │ +135 static_assert(dimension >= 0, │ │ │ │ │ +136 "Negative dimension given, what the heck is that supposed to mean?"); │ │ │ │ │ +137 // return nIntervals^dim │ │ │ │ │ +138 return Dune::power(nIntervals, static_cast(dimension)); │ │ │ │ │ +139 } │ │ │ │ │ +140 │ │ │ │ │ +141 template │ │ │ │ │ +142 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ +_1_4_3 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +144_ _e_B_e_g_i_n(unsigned nIntervals) │ │ │ │ │ +145 { │ │ │ │ │ +146 return _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r(0,nIntervals); │ │ │ │ │ +147 } │ │ │ │ │ +148 │ │ │ │ │ +149 template │ │ │ │ │ +150 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ +_1_5_1 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +152_ _e_E_n_d(unsigned nIntervals) │ │ │ │ │ +153 { │ │ │ │ │ +154 return _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r(nElements(nIntervals),nIntervals); │ │ │ │ │ +155 } │ │ │ │ │ +156 │ │ │ │ │ +157 // │ │ │ │ │ +158 // The iterators │ │ │ │ │ +159 // │ │ │ │ │ +160 │ │ │ │ │ +161#ifdef DOXYGEN │ │ │ │ │ +173 template │ │ │ │ │ +_1_7_4 class _R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l {}; │ │ │ │ │ +175#else │ │ │ │ │ +176 template │ │ │ │ │ +177 class _R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l; │ │ │ │ │ +178#endif //DOXYGEN │ │ │ │ │ +179 │ │ │ │ │ +180 // for vertices │ │ │ │ │ +181 │ │ │ │ │ +182 template │ │ │ │ │ +_1_8_3 class _R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ +184 { │ │ │ │ │ +185 public: │ │ │ │ │ +_1_8_6 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +_1_8_7 typedef typename Refinement::template _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ +_C_o_m_m_o_n; │ │ │ │ │ +_1_8_8 typedef typename Refinement::CoordVector _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ +189 │ │ │ │ │ +190 _C_o_o_r_d_V_e_c_t_o_r coords() const; │ │ │ │ │ +191 │ │ │ │ │ +192 private: │ │ │ │ │ +193 const _C_o_m_m_o_n & asCommon() const │ │ │ │ │ +194 { │ │ │ │ │ +195 return *static_cast(this); │ │ │ │ │ +196 } │ │ │ │ │ +197 }; │ │ │ │ │ +198 │ │ │ │ │ +199 template │ │ │ │ │ +200 typename RefinementSubEntityIteratorSpecial::CoordVector │ │ │ │ │ +_2_0_1 _R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +202_ _c_o_o_r_d_s() const │ │ │ │ │ +203 { │ │ │ │ │ +204 std::array v(asCommon().vertexCoord()); │ │ │ │ │ +205 _C_o_o_r_d_V_e_c_t_o_r c; │ │ │ │ │ +206 for (int d = 0; d < dimension; d++) │ │ │ │ │ +207 { │ │ │ │ │ +208 c[d] = v[d]*1.0 / asCommon()._nIntervals; │ │ │ │ │ +209 } │ │ │ │ │ +210 return c; │ │ │ │ │ +211 } │ │ │ │ │ +212 │ │ │ │ │ +213 // for elements │ │ │ │ │ +214 │ │ │ │ │ +215 template │ │ │ │ │ +_2_1_6 class _R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ +217 { │ │ │ │ │ +218 public: │ │ │ │ │ +_2_1_9 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +_2_2_0 typedef typename Refinement::template _C_o_d_i_m_<_0_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _C_o_m_m_o_n; │ │ │ │ │ +_2_2_1 typedef typename Refinement::IndexVector _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ +_2_2_2 typedef typename Refinement::CoordVector _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ +223 │ │ │ │ │ +224 _I_n_d_e_x_V_e_c_t_o_r vertexIndices() const; │ │ │ │ │ +225 _C_o_o_r_d_V_e_c_t_o_r coords() const; │ │ │ │ │ +226 │ │ │ │ │ +227 private: │ │ │ │ │ +228 const _C_o_m_m_o_n & asCommon() const │ │ │ │ │ +229 { │ │ │ │ │ +230 return *static_cast(this); │ │ │ │ │ +231 } │ │ │ │ │ +232 }; │ │ │ │ │ +233 │ │ │ │ │ +234 template │ │ │ │ │ +235 typename RefinementSubEntityIteratorSpecial:: │ │ │ │ │ +IndexVector │ │ │ │ │ +_2_3_6 _R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +237_ _v_e_r_t_e_x_I_n_d_i_c_e_s() const │ │ │ │ │ +238 { │ │ │ │ │ +239 constexpr static int nIndices = 1 << dimension; │ │ │ │ │ +240 │ │ │ │ │ +241 // cell index tuple │ │ │ │ │ +242 std::array e(asCommon().cellCoord()); │ │ │ │ │ +243 │ │ │ │ │ +244 // vertices │ │ │ │ │ +245 _I_n_d_e_x_V_e_c_t_o_r vec; │ │ │ │ │ +246 for(int i = 0; i < nIndices; ++i) │ │ │ │ │ +247 { │ │ │ │ │ +248 int base = 1; │ │ │ │ │ +249 std::array alpha(asCommon().idx2multiidx(i)); │ │ │ │ │ +250 for (int d = 0; d < dimension; d++) { │ │ │ │ │ +251 vec[i] += (alpha[d] + e[d]) * base; │ │ │ │ │ +252 base *= asCommon()._nIntervals+1; │ │ │ │ │ +253 } │ │ │ │ │ +254 } │ │ │ │ │ +255 return vec; │ │ │ │ │ +256 } │ │ │ │ │ +257 │ │ │ │ │ +258 template │ │ │ │ │ +259 typename _R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +_2_6_0 _R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +261_ _c_o_o_r_d_s() const │ │ │ │ │ +262 { │ │ │ │ │ +263 std::array v(asCommon().cellCoord()); │ │ │ │ │ +264 _C_o_o_r_d_V_e_c_t_o_r c; │ │ │ │ │ +265 for (int d=0; d │ │ │ │ │ +274 template │ │ │ │ │ +_2_7_5 class _R_e_f_i_n_e_m_e_n_t_I_m_p::_C_o_d_i_m:: │ │ │ │ │ +SubEntityIterator │ │ │ │ │ +276 : public ForwardIteratorFacade::template Codim::SubEntityIterator, int>, │ │ │ │ │ +278 public _R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ +279 { │ │ │ │ │ +280 public: │ │ │ │ │ +_2_8_1 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +_2_8_2 typedef typename Refinement::template _C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ +_T_h_i_s; │ │ │ │ │ +283 │ │ │ │ │ +_2_8_4 _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r(unsigned int index, unsigned int nIntervals); │ │ │ │ │ +285 │ │ │ │ │ +_2_8_6 bool _e_q_u_a_l_s(const _T_h_i_s &other) const; │ │ │ │ │ +_2_8_7 void _i_n_c_r_e_m_e_n_t(); │ │ │ │ │ +288 │ │ │ │ │ +_2_8_9 int _i_n_d_e_x() const; │ │ │ │ │ +_2_9_0 Geometry _g_e_o_m_e_t_r_y () const; │ │ │ │ │ +291 private: │ │ │ │ │ +292 friend class _R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l<_d_i_m_e_n_s_i_o_n, CoordType, │ │ │ │ │ +codimension>; │ │ │ │ │ +293 unsigned int _index; │ │ │ │ │ +294 unsigned int _nIntervals; │ │ │ │ │ +295 │ │ │ │ │ +296 std::array │ │ │ │ │ +297 cellCoord(unsigned int idx) const │ │ │ │ │ +298 { │ │ │ │ │ +299 return idx2coord(idx, _nIntervals); │ │ │ │ │ +300 } │ │ │ │ │ +301 │ │ │ │ │ +302 std::array │ │ │ │ │ +303 vertexCoord(unsigned int idx) const │ │ │ │ │ +304 { │ │ │ │ │ +305 return idx2coord(idx, _nIntervals+1u); │ │ │ │ │ +306 } │ │ │ │ │ +307 │ │ │ │ │ +308 std::array │ │ │ │ │ +309 cellCoord() const │ │ │ │ │ +310 { │ │ │ │ │ +311 return cellCoord(_index); │ │ │ │ │ +312 } │ │ │ │ │ +313 │ │ │ │ │ +314 std::array │ │ │ │ │ +315 vertexCoord() const │ │ │ │ │ +316 { │ │ │ │ │ +317 return vertexCoord(_index); │ │ │ │ │ +318 } │ │ │ │ │ +319 │ │ │ │ │ +320 std::array │ │ │ │ │ +321 idx2coord(unsigned int idx, unsigned int w) const │ │ │ │ │ +322 { │ │ │ │ │ +323 std::array c; │ │ │ │ │ +324 for (unsigned int d = 0; d < _d_i_m_e_n_s_i_o_n; d++) │ │ │ │ │ +325 { │ │ │ │ │ +326 c[d] = idx%w; │ │ │ │ │ +327 idx = idx/w; │ │ │ │ │ +328 } │ │ │ │ │ +329 return c; │ │ │ │ │ +330 } │ │ │ │ │ +331 │ │ │ │ │ +332 unsigned int │ │ │ │ │ +333 coord2idx(std::array c, unsigned int w) const │ │ │ │ │ +334 { │ │ │ │ │ +335 unsigned int i = 0; │ │ │ │ │ +336 for (unsigned int d = _d_i_m_e_n_s_i_o_n; d > 0; d--) │ │ │ │ │ +337 { │ │ │ │ │ +338 i *= w; │ │ │ │ │ +339 i += c[d-1]; │ │ │ │ │ +340 } │ │ │ │ │ +341 return i; │ │ │ │ │ +342 } │ │ │ │ │ +343 │ │ │ │ │ +344 std::array │ │ │ │ │ +345 idx2multiidx(unsigned int idx) const │ │ │ │ │ +346 { │ │ │ │ │ +347 std::array alpha; │ │ │ │ │ +348 for (unsigned int i = 0; i < _d_i_m_e_n_s_i_o_n; ++i) │ │ │ │ │ +349 alpha[i] = (idx >> i) & 1u; │ │ │ │ │ +350 return alpha; │ │ │ │ │ +351 } │ │ │ │ │ +352 }; │ │ │ │ │ +353 │ │ │ │ │ +354#ifndef DOXYGEN │ │ │ │ │ +355 template │ │ │ │ │ +356 template │ │ │ │ │ +357 RefinementImp::Codim:: │ │ │ │ │ +SubEntityIterator:: │ │ │ │ │ +358 SubEntityIterator(unsigned int index, unsigned int nIntervals) │ │ │ │ │ +359 : _index(index), _nIntervals(nIntervals) │ │ │ │ │ +360 {} │ │ │ │ │ +361 │ │ │ │ │ +362 template │ │ │ │ │ +363 template │ │ │ │ │ +364 bool │ │ │ │ │ +365 RefinementImp::Codim:: │ │ │ │ │ +SubEntityIterator:: │ │ │ │ │ +366 equals(const This &other) const │ │ │ │ │ +367 { │ │ │ │ │ +368 return ((_index == other._index) && (_nIntervals == other._nIntervals)); │ │ │ │ │ +369 } │ │ │ │ │ +370 │ │ │ │ │ +371 template │ │ │ │ │ +372 template │ │ │ │ │ +373 void │ │ │ │ │ +374 RefinementImp::Codim:: │ │ │ │ │ +SubEntityIterator:: │ │ │ │ │ +375 increment() │ │ │ │ │ +376 { │ │ │ │ │ +377 ++_index; │ │ │ │ │ +378 } │ │ │ │ │ +379 │ │ │ │ │ +380 template │ │ │ │ │ +381 template │ │ │ │ │ +382 int │ │ │ │ │ +383 RefinementImp::Codim:: │ │ │ │ │ +SubEntityIterator:: │ │ │ │ │ +384 index() const │ │ │ │ │ +385 { │ │ │ │ │ +386 return _index; │ │ │ │ │ +387 } │ │ │ │ │ +388 │ │ │ │ │ +389 template │ │ │ │ │ +390 template │ │ │ │ │ +391 typename RefinementImp::template Codim:: │ │ │ │ │ +Geometry │ │ │ │ │ +392 RefinementImp::Codim:: │ │ │ │ │ +SubEntityIterator::geometry () const │ │ │ │ │ +393 { │ │ │ │ │ +394 std::array intCoords = idx2coord │ │ │ │ │ +(_index,_nIntervals); │ │ │ │ │ +395 │ │ │ │ │ +396 Dune::FieldVector lower; │ │ │ │ │ +397 Dune::FieldVector upper; │ │ │ │ │ +398 │ │ │ │ │ +399 assert(codimension == 0 or codimension == _d_i_m_e_n_s_i_o_n); │ │ │ │ │ +400 │ │ │ │ │ +401 if constexpr (codimension == 0) { │ │ │ │ │ +402 for (size_t j = 0; j < _d_i_m_e_n_s_i_o_n; j++) │ │ │ │ │ +403 { │ │ │ │ │ +404 lower[j] = double(intCoords[j]) / double(_nIntervals); │ │ │ │ │ +405 upper[j] = double(intCoords[j] + 1) / double(_nIntervals); │ │ │ │ │ +406 } │ │ │ │ │ +407 │ │ │ │ │ +408 return typename RefinementImp<_d_i_m_e_n_s_i_o_n, │ │ │ │ │ +409 CoordType>::template _C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_:_G_e_o_m_e_t_r_y(lower,upper); │ │ │ │ │ +410 } else { │ │ │ │ │ +411 for (size_t j = 0; j < _d_i_m_e_n_s_i_o_n; j++) │ │ │ │ │ +412 lower[j] = upper[j] = double(intCoords[j]) / double(_nIntervals); │ │ │ │ │ +413 │ │ │ │ │ +414 return typename RefinementImp<_d_i_m_e_n_s_i_o_n, │ │ │ │ │ +415 CoordType>::template _C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_:_G_e_o_m_e_t_r_y(lower,upper,std:: │ │ │ │ │ +bitset(0)); │ │ │ │ │ +416 } │ │ │ │ │ +417 } │ │ │ │ │ +418 │ │ │ │ │ +419#endif // DOXYGEN │ │ │ │ │ +420 │ │ │ │ │ +421 } // namespace HCube │ │ │ │ │ +422 │ │ │ │ │ +423 // /////////////////////// │ │ │ │ │ +424 // │ │ │ │ │ +425 // The refinement traits │ │ │ │ │ +426 // │ │ │ │ │ +427 │ │ │ │ │ +428#ifndef DOXYGEN │ │ │ │ │ +429 template │ │ │ │ │ +431 struct Traits< │ │ │ │ │ +432 topologyId, CoordType, coerceToId, dim, │ │ │ │ │ +433 typename _s_t_d::enable_if< │ │ │ │ │ +434 (dim >= 2 && │ │ │ │ │ +435 (GeometryTypes::cube(dim).id() >> 1) == │ │ │ │ │ +436 (topologyId >> 1) && │ │ │ │ │ +437 (GeometryTypes::cube(dim).id() >> 1) == │ │ │ │ │ +438 (coerceToId >> 1) │ │ │ │ │ +439 )>::type │ │ │ │ │ +440 > │ │ │ │ │ +441 { │ │ │ │ │ +442 typedef HCube::RefinementImp Imp; │ │ │ │ │ +443 }; │ │ │ │ │ +444#endif │ │ │ │ │ +445 │ │ │ │ │ +446 } // namespace RefinementImp │ │ │ │ │ +447 │ │ │ │ │ +448} // namespace Dune │ │ │ │ │ +449 │ │ │ │ │ +450#endif // DUNE_GEOMETRY_REFINEMENT_HCUBE_CC │ │ │ │ │ +_a_x_i_s_a_l_i_g_n_e_d_c_u_b_e_g_e_o_m_e_t_r_y_._h_h │ │ │ │ │ +A geometry implementation for axis-aligned hypercubes. │ │ │ │ │ +_b_a_s_e_._c_c │ │ │ │ │ +This file contains the parts independent of a particular Refinement │ │ │ │ │ +implementation. │ │ │ │ │ +_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h │ │ │ │ │ +_s_t_d │ │ │ │ │ +STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn affinegeometry.hh:21 │ │ │ │ │ -_D_u_n_e_:_:_T_o_p_o_l_o_g_y_F_a_c_t_o_r_y │ │ │ │ │ -Provide a factory over the generic topologies. │ │ │ │ │ -DDeeffiinniittiioonn topologyfactory.hh:42 │ │ │ │ │ -_D_u_n_e_:_:_T_o_p_o_l_o_g_y_F_a_c_t_o_r_y_:_:_F_a_c_t_o_r_y │ │ │ │ │ -Traits::Factory Factory │ │ │ │ │ -DDeeffiinniittiioonn topologyfactory.hh:47 │ │ │ │ │ -_D_u_n_e_:_:_T_o_p_o_l_o_g_y_F_a_c_t_o_r_y_:_:_c_r_e_a_t_e │ │ │ │ │ -static Object * create(const Dune::GeometryType >, const Key &key) │ │ │ │ │ -dynamically create objects │ │ │ │ │ -DDeeffiinniittiioonn topologyfactory.hh:50 │ │ │ │ │ -_D_u_n_e_:_:_T_o_p_o_l_o_g_y_F_a_c_t_o_r_y_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ -static const unsigned int dimension │ │ │ │ │ -DDeeffiinniittiioonn topologyfactory.hh:44 │ │ │ │ │ -_D_u_n_e_:_:_T_o_p_o_l_o_g_y_F_a_c_t_o_r_y_:_:_c_r_e_a_t_e │ │ │ │ │ -static Object * create(const Key &key) │ │ │ │ │ -statically create objects │ │ │ │ │ -DDeeffiinniittiioonn topologyfactory.hh:58 │ │ │ │ │ -_D_u_n_e_:_:_T_o_p_o_l_o_g_y_F_a_c_t_o_r_y_:_:_r_e_l_e_a_s_e │ │ │ │ │ -static void release(Object *object) │ │ │ │ │ -release the object returned by the create methods │ │ │ │ │ -DDeeffiinniittiioonn topologyfactory.hh:71 │ │ │ │ │ -_D_u_n_e_:_:_T_o_p_o_l_o_g_y_F_a_c_t_o_r_y_:_:_K_e_y │ │ │ │ │ -Traits::Key Key │ │ │ │ │ -DDeeffiinniittiioonn topologyfactory.hh:45 │ │ │ │ │ -_D_u_n_e_:_:_T_o_p_o_l_o_g_y_F_a_c_t_o_r_y_:_:_O_b_j_e_c_t │ │ │ │ │ -Traits::Object Object │ │ │ │ │ -DDeeffiinniittiioonn topologyfactory.hh:46 │ │ │ │ │ -_D_u_n_e_:_:_T_o_p_o_l_o_g_y_S_i_n_g_l_e_t_o_n_F_a_c_t_o_r_y │ │ │ │ │ -A wrapper for a TopologyFactory providing singleton storage. Same usage as │ │ │ │ │ -TopologyFactory but with e... │ │ │ │ │ -DDeeffiinniittiioonn topologyfactory.hh:82 │ │ │ │ │ -_D_u_n_e_:_:_T_o_p_o_l_o_g_y_S_i_n_g_l_e_t_o_n_F_a_c_t_o_r_y_:_:_c_r_e_a_t_e │ │ │ │ │ -static auto create(const Key &key) -> std::enable_if_t< Topology:: │ │ │ │ │ -dimension==dimension, Object * > │ │ │ │ │ -DDeeffiinniittiioonn topologyfactory.hh:103 │ │ │ │ │ -_D_u_n_e_:_:_T_o_p_o_l_o_g_y_S_i_n_g_l_e_t_o_n_F_a_c_t_o_r_y_:_:_c_r_e_a_t_e │ │ │ │ │ -static Object * create(const Dune::GeometryType >, const Key &key) │ │ │ │ │ -DDeeffiinniittiioonn topologyfactory.hh:88 │ │ │ │ │ -_D_u_n_e_:_:_T_o_p_o_l_o_g_y_S_i_n_g_l_e_t_o_n_F_a_c_t_o_r_y_:_:_r_e_l_e_a_s_e │ │ │ │ │ -static void release(Object *object) │ │ │ │ │ -release the object returned by the create methods │ │ │ │ │ -DDeeffiinniittiioonn topologyfactory.hh:110 │ │ │ │ │ -_D_u_n_e_:_:_T_o_p_o_l_o_g_y_S_i_n_g_l_e_t_o_n_F_a_c_t_o_r_y_:_:_O_b_j_e_c_t │ │ │ │ │ -const Factory::Object Object │ │ │ │ │ -DDeeffiinniittiioonn topologyfactory.hh:85 │ │ │ │ │ -_D_u_n_e_:_:_T_o_p_o_l_o_g_y_S_i_n_g_l_e_t_o_n_F_a_c_t_o_r_y_:_:_K_e_y │ │ │ │ │ -Factory::Key Key │ │ │ │ │ -DDeeffiinniittiioonn topologyfactory.hh:84 │ │ │ │ │ -_D_u_n_e_:_:_T_o_p_o_l_o_g_y_S_i_n_g_l_e_t_o_n_F_a_c_t_o_r_y_:_:_c_r_e_a_t_e │ │ │ │ │ -static auto create(const Key &key) -> std::enable_if_t< static_cast< │ │ │ │ │ -GeometryType >(geometryId).dim()==dimension, Object * > │ │ │ │ │ -DDeeffiinniittiioonn topologyfactory.hh:95 │ │ │ │ │ -_D_u_n_e_:_:_T_o_p_o_l_o_g_y_S_i_n_g_l_e_t_o_n_F_a_c_t_o_r_y_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ -static const unsigned int dimension │ │ │ │ │ -DDeeffiinniittiioonn topologyfactory.hh:83 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ -Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:114 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_d │ │ │ │ │ -constexpr unsigned int id() const │ │ │ │ │ -Return the topology id of the type. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:365 │ │ │ │ │ +_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y │ │ │ │ │ +A geometry implementation for axis-aligned hypercubes. │ │ │ │ │ +DDeeffiinniittiioonn axisalignedcubegeometry.hh:50 │ │ │ │ │ +_D_u_n_e_:_:_C_o_d_i_m │ │ │ │ │ +Static tag representing a codimension. │ │ │ │ │ +DDeeffiinniittiioonn dimension.hh:24 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ +Refinement implementation for hypercubes │ │ │ │ │ +DDeeffiinniittiioonn hcube.cc:74 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ +Codim< 0 >::SubEntityIterator ElementIterator │ │ │ │ │ +DDeeffiinniittiioonn hcube.cc:85 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_e_E_n_d │ │ │ │ │ +static ElementIterator eEnd(unsigned nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn hcube.cc:152 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_n_V_e_r_t_i_c_e_s │ │ │ │ │ +static unsigned nVertices(unsigned nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn hcube.cc:108 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_v_E_n_d │ │ │ │ │ +static VertexIterator vEnd(unsigned nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn hcube.cc:125 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ +FieldVector< int,(1<< dimension)> IndexVector │ │ │ │ │ +DDeeffiinniittiioonn hcube.cc:86 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ +Codim< dimension >::SubEntityIterator VertexIterator │ │ │ │ │ +DDeeffiinniittiioonn hcube.cc:83 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +FieldVector< CoordType, dimension > CoordVector │ │ │ │ │ +DDeeffiinniittiioonn hcube.cc:84 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_n_E_l_e_m_e_n_t_s │ │ │ │ │ +static unsigned nElements(unsigned nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn hcube.cc:133 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ +DDeeffiinniittiioonn hcube.cc:79 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_e_B_e_g_i_n │ │ │ │ │ +static ElementIterator eBegin(unsigned nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn hcube.cc:144 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ +static constexpr int dimension │ │ │ │ │ +Know your own dimension. │ │ │ │ │ +DDeeffiinniittiioonn hcube.cc:77 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_v_B_e_g_i_n │ │ │ │ │ +static VertexIterator vBegin(unsigned nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn hcube.cc:117 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m │ │ │ │ │ +DDeeffiinniittiioonn hcube.cc:100 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ +Dune::AxisAlignedCubeGeometry< CoordType, dimension-codimension, dimension > │ │ │ │ │ +Geometry │ │ │ │ │ +DDeeffiinniittiioonn hcube.cc:102 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ +SubEntityIterator base class for hypercube refinement. │ │ │ │ │ +DDeeffiinniittiioonn hcube.cc:174 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +Refinement::CoordVector CoordVector │ │ │ │ │ +DDeeffiinniittiioonn hcube.cc:188 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_C_o_m_m_o_n │ │ │ │ │ +Refinement::template Codim< dimension >::SubEntityIterator Common │ │ │ │ │ +DDeeffiinniittiioonn hcube.cc:187 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ +DDeeffiinniittiioonn hcube.cc:186 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ +DDeeffiinniittiioonn hcube.cc:219 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_C_o_m_m_o_n │ │ │ │ │ +Refinement::template Codim< 0 >::SubEntityIterator Common │ │ │ │ │ +DDeeffiinniittiioonn hcube.cc:220 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +Refinement::CoordVector CoordVector │ │ │ │ │ +DDeeffiinniittiioonn hcube.cc:222 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ +Refinement::IndexVector IndexVector │ │ │ │ │ +DDeeffiinniittiioonn hcube.cc:221 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_: │ │ │ │ │ +_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ +SubEntityIterator(unsigned int index, unsigned int nIntervals) │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_e_q_u_a_l_s │ │ │ │ │ +bool equals(const This &other) const │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_g_e_o_m_e_t_r_y │ │ │ │ │ +Geometry geometry() const │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ +DDeeffiinniittiioonn hcube.cc:281 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_i_n_d_e_x │ │ │ │ │ +int index() const │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_i_n_c_r_e_m_e_n_t │ │ │ │ │ +void increment() │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_T_h_i_s │ │ │ │ │ +Refinement::template Codim< codimension >::SubEntityIterator This │ │ │ │ │ +DDeeffiinniittiioonn hcube.cc:282 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00191.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: generalvertexorder.hh File Reference │ │ │ │ +dune-geometry: prismtriangulation.cc File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,57 +65,86 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ +Macros | │ │ │ │ Functions
│ │ │ │ -
generalvertexorder.hh File Reference
│ │ │ │ +
prismtriangulation.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>
│ │ │ │ +
#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"
│ │ │ │
│ │ │ │

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::RefinementImp::PrismTriangulation::RefinementImp< dimension_, CoordType >
 Implementation of the refinement of a prism into simplices. More...
 
class  Dune::GeneralVertexOrder< dim, Index_ >::iterator
 Iterate over the vertex indices of some sub-entity. 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<class InIterator , class OutIterator >
void Dune::reduceOrder (const InIterator &inBegin, const InIterator &inEnd, OutIterator outIt)
 Algorithm to reduce vertex order information.
 
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 {} │ │ │ │ │ @@ -1,35 +1,57 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -generalvertexorder.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "_t_y_p_e_._h_h" │ │ │ │ │ + * _r_e_f_i_n_e_m_e_n_t │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +prismtriangulation.cc File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ +#include "_b_a_s_e_._c_c" │ │ │ │ │ +#include "_s_i_m_p_l_e_x_._c_c" │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_<_ _d_i_m_,_ _I_n_d_e_x___ _> │ │ │ │ │ -  Class providing information on the ordering of vertices. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___, │ │ │ │ │ + _C_o_o_r_d_T_y_p_e_ _> │ │ │ │ │ +  Implementation of the refinement of a prism into simplices. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -class   _D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_<_ _d_i_m_,_ _I_n_d_e_x___ _>_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ -  Iterate over the vertex indices of some sub-entity. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___, │ │ │ │ │ + _C_o_o_r_d_T_y_p_e_ _>_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ + _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ + _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___, │ │ │ │ │ + _C_o_o_r_d_T_y_p_e_ _>_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ +namespace   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ +  This namespace contains the implementation of _R_e_f_i_n_e_m_e_n_t. │ │ │ │ │ +  │ │ │ │ │ +namespace   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n │ │ │ │ │ +  This namespace contains the _R_e_f_i_n_e_m_e_n_t implementation for │ │ │ │ │ + triangulating prisms (_G_e_o_m_e_t_r_y_T_y_p_e_:_:_p_r_i_s_m -> _G_e_o_m_e_t_r_y_T_y_p_e_:_:_s_i_m_p_l_e_x) │ │ │ │ │ +  │ │ │ │ │ +MMaaccrrooss │ │ │ │ │ +#define  _D_U_N_E___G_E_O_M_E_T_R_Y___R_E_F_I_N_E_M_E_N_T___P_R_I_S_M_T_R_I_A_N_G_U_L_A_T_I_O_N___C_C │ │ │ │ │ +  │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -void  _D_u_n_e_:_:_r_e_d_u_c_e_O_r_d_e_r (const InIterator &inBegin, const InIterator &inEnd, │ │ │ │ │ - OutIterator outIt) │ │ │ │ │ -  Algorithm to reduce vertex order information. │ │ │ │ │ +template │ │ │ │ │ +FieldVector< CoordType, dimension >  _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_: │ │ │ │ │ + _t_r_a_n_s_f_o_r_m_C_o_o_r_d_i_n_a_t_e (FieldVector< │ │ │ │ │ + CoordType, dimension > point) │ │ │ │ │   │ │ │ │ │ +********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ +********** _?◆_? DDUUNNEE__GGEEOOMMEETTRRYY__RREEFFIINNEEMMEENNTT__PPRRIISSMMTTRRIIAANNGGUULLAATTIIOONN__CCCC ********** │ │ │ │ │ +#define DUNE_GEOMETRY_REFINEMENT_PRISMTRIANGULATION_CC │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00191_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: generalvertexorder.hh Source File │ │ │ │ +dune-geometry: prismtriangulation.cc Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,191 +70,521 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
generalvertexorder.hh
│ │ │ │ +
prismtriangulation.cc
│ │ │ │
│ │ │ │
│ │ │ │ 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 © 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
│ │ │ │ -
9#include <algorithm>
│ │ │ │ -
10#include <cassert>
│ │ │ │ -
11#include <cstddef>
│ │ │ │ -
12#include <iterator>
│ │ │ │ -
13#include <vector>
│ │ │ │ -
14
│ │ │ │ -
15#include <dune/common/iteratorfacades.hh>
│ │ │ │ +
5#ifndef DUNE_GEOMETRY_REFINEMENT_PRISMTRIANGULATION_CC
│ │ │ │ +
6#define DUNE_GEOMETRY_REFINEMENT_PRISMTRIANGULATION_CC
│ │ │ │ +
7
│ │ │ │ +
8#include <dune/common/fvector.hh>
│ │ │ │ +
9#include <dune/common/typetraits.hh>
│ │ │ │ +
10
│ │ │ │ + │ │ │ │ +
12#include <dune/geometry/type.hh>
│ │ │ │ +
13
│ │ │ │ +
14#include "base.cc"
│ │ │ │ +
15#include "simplex.cc"
│ │ │ │
16
│ │ │ │ -
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 {
│ │ │ │ -
43 for(InIterator inIt = inBegin; inIt != inEnd; ++inIt, ++outIt)
│ │ │ │ -
44 *outIt = std::count_if(inBegin, inEnd, [&](const auto& v)
│ │ │ │ -
45 {
│ │ │ │ -
46 return v < *inIt;
│ │ │ │ -
47 });
│ │ │ │ -
48 }
│ │ │ │ -
│ │ │ │ -
49
│ │ │ │ -
51
│ │ │ │ -
66 template<std::size_t dim, class Index_ = std::size_t>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
68 typedef ReferenceElements<double, dim> RefElems;
│ │ │ │ -
69 typedef typename RefElems::ReferenceElement RefElem;
│ │ │ │ +
17namespace Dune
│ │ │ │ +
18{
│ │ │ │ +
19 namespace RefinementImp
│ │ │ │ +
20 {
│ │ │ │ +
│ │ │ │ +
26 namespace PrismTriangulation
│ │ │ │ +
27 {
│ │ │ │ +
28 // ////////////
│ │ │ │ +
29 //
│ │ │ │ +
30 // Utilities
│ │ │ │ +
31 //
│ │ │ │ +
32
│ │ │ │ + │ │ │ │ + │ │ │ │ +
35
│ │ │ │ +
36 // ////////////////////////////////////
│ │ │ │ +
37 //
│ │ │ │ +
38 // Refine a prism with simplices
│ │ │ │ +
39 //
│ │ │ │ +
40
│ │ │ │ +
41 // forward declaration of the iterator base
│ │ │ │ +
42 template<int dimension, class CoordType, int codimension>
│ │ │ │ + │ │ │ │ +
44 /*
│ │ │ │ +
45 * The permutations 0,2 and 3 of the Kuhn-decomposition of a cube into simplices form a prism.
│ │ │ │ +
46 * The resulting prism is not oriented the same as the reference prism and so the Kuhn-coordinates
│ │ │ │ +
47 * have to be transformed using the method below.
│ │ │ │ +
48 */
│ │ │ │ +
49 template<int dimension, class CoordType> FieldVector<CoordType, dimension>
│ │ │ │ +
│ │ │ │ +
50 transformCoordinate(FieldVector<CoordType, dimension> point)
│ │ │ │ +
51 {
│ │ │ │ +
52 FieldVector<CoordType, dimension> transform;
│ │ │ │ +
53 transform[0] = point[1];
│ │ │ │ +
54 transform[1] = 1 - point[0];
│ │ │ │ +
55 transform[2] = point[2];
│ │ │ │ +
56 return transform;
│ │ │ │ +
57 }
│ │ │ │ +
│ │ │ │ +
58
│ │ │ │ +
65 template<int dimension_, class CoordType>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
67 {
│ │ │ │ +
68 public:
│ │ │ │ +
69 constexpr static int dimension = dimension_;
│ │ │ │
70
│ │ │ │ -
71 RefElem refelem;
│ │ │ │ -
72 GeometryType gt;
│ │ │ │ -
73 std::vector<Index_> vertexOrder;
│ │ │ │ -
74
│ │ │ │ -
75 public:
│ │ │ │ -
77 typedef Index_ Index;
│ │ │ │ -
78
│ │ │ │ -
80 class iterator;
│ │ │ │ -
81
│ │ │ │ -
83 static const std::size_t dimension = dim;
│ │ │ │ -
85 const GeometryType &type() const { return gt; }
│ │ │ │ -
86
│ │ │ │ -
88
│ │ │ │ -
96 template<class InIterator>
│ │ │ │ -
│ │ │ │ -
97 GeneralVertexOrder(const GeometryType& gt_, const InIterator &inBegin,
│ │ │ │ -
98 const InIterator &inEnd) :
│ │ │ │ -
99 refelem(RefElems::general(gt_)), gt(gt_),
│ │ │ │ -
100 vertexOrder(refelem.size(dim))
│ │ │ │ -
101 { reduceOrder(inBegin, inEnd, vertexOrder.begin()); }
│ │ │ │ +
71 typedef CoordType ctype;
│ │ │ │ +
72
│ │ │ │ +
73 template<int codimension>
│ │ │ │ +
74 struct Codim;
│ │ │ │ + │ │ │ │ +
76 typedef FieldVector<CoordType, dimension> CoordVector;
│ │ │ │ + │ │ │ │ +
78 typedef FieldVector<int, dimension+1> IndexVector;
│ │ │ │ +
79
│ │ │ │ +
80 static int nVertices(int nIntervals);
│ │ │ │ +
81 static VertexIterator vBegin(int nIntervals);
│ │ │ │ +
82 static VertexIterator vEnd(int nIntervals);
│ │ │ │ +
83
│ │ │ │ +
84 static int nElements(int nIntervals);
│ │ │ │ +
85 static ElementIterator eBegin(int nIntervals);
│ │ │ │ +
86 static ElementIterator eEnd(int nIntervals);
│ │ │ │ +
87
│ │ │ │ +
88 private:
│ │ │ │ +
89 friend class RefinementIteratorSpecial<dimension, CoordType, 0>;
│ │ │ │ +
90 friend class RefinementIteratorSpecial<dimension, CoordType, dimension>;
│ │ │ │ +
91
│ │ │ │ + │ │ │ │ +
93 };
│ │ │ │ +
│ │ │ │ +
94
│ │ │ │ +
95 template<int dimension, class CoordType>
│ │ │ │ +
96 template<int codimension>
│ │ │ │ +
│ │ │ │ +
97 struct RefinementImp<dimension, CoordType>::Codim
│ │ │ │ +
98 {
│ │ │ │ +
99 class SubEntityIterator;
│ │ │ │ + │ │ │ │ +
101 };
│ │ │ │
│ │ │ │
102
│ │ │ │ -
104
│ │ │ │ -
│ │ │ │ -
108 iterator begin(std::size_t codim, std::size_t subEntity) const
│ │ │ │ -
109 { return iterator(*this, codim, subEntity); }
│ │ │ │ -
│ │ │ │ -
111
│ │ │ │ -
│ │ │ │ -
115 iterator end(std::size_t codim, std::size_t subEntity) const {
│ │ │ │ -
116 return iterator(*this, codim, subEntity,
│ │ │ │ -
117 refelem.size(subEntity, codim, dim));
│ │ │ │ -
118 }
│ │ │ │ -
│ │ │ │ -
119
│ │ │ │ -
121
│ │ │ │ -
│ │ │ │ -
128 void getReduced(std::size_t codim, std::size_t subEntity,
│ │ │ │ -
129 std::vector<Index>& order) const
│ │ │ │ -
130 {
│ │ │ │ -
131 order.resize(refelem.size(subEntity, codim, dim));
│ │ │ │ -
132 reduceOrder(begin(codim, subEntity), end(codim, subEntity),
│ │ │ │ -
133 order.begin());
│ │ │ │ -
134 }
│ │ │ │ -
│ │ │ │ -
135 };
│ │ │ │ -
│ │ │ │ -
136
│ │ │ │ -
138
│ │ │ │ -
141 template<std::size_t dim, class Index_>
│ │ │ │ -
│ │ │ │ -
142 class GeneralVertexOrder<dim, Index_>::iterator :
│ │ │ │ -
143 public Dune::RandomAccessIteratorFacade<iterator, const Index_>
│ │ │ │ -
144 {
│ │ │ │ -
145 const GeneralVertexOrder *order;
│ │ │ │ -
146 std::size_t codim;
│ │ │ │ -
147 std::size_t subEntity;
│ │ │ │ -
148 std::size_t vertex;
│ │ │ │ -
149
│ │ │ │ -
150 iterator(const GeneralVertexOrder &order_, std::size_t codim_,
│ │ │ │ -
151 std::size_t subEntity_, std::size_t vertex_ = 0) :
│ │ │ │ -
152 order(&order_), codim(codim_), subEntity(subEntity_), vertex(vertex_)
│ │ │ │ -
153 { }
│ │ │ │ -
154
│ │ │ │ -
155 public:
│ │ │ │ -
│ │ │ │ -
156 const Index &dereference() const {
│ │ │ │ -
157 return order->vertexOrder[order->refelem.subEntity(subEntity, codim,
│ │ │ │ -
158 vertex, dim)];
│ │ │ │ -
159 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
160 const Index &elementAt(std::ptrdiff_t n) const {
│ │ │ │ -
161 return order->vertexOrder[order->refelem.subEntity(subEntity, codim,
│ │ │ │ -
162 vertex+n, dim)];
│ │ │ │ -
163 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ -
164 bool equals(const iterator &other) const {
│ │ │ │ -
165 return order == other.order && codim == other.codim &&
│ │ │ │ -
166 subEntity == other.subEntity && vertex == other.vertex;
│ │ │ │ -
167 }
│ │ │ │ -
│ │ │ │ -
168 void increment() { ++vertex; }
│ │ │ │ -
169 void decrement() { --vertex; }
│ │ │ │ -
170 void advance(std::ptrdiff_t n) { vertex += n; }
│ │ │ │ -
│ │ │ │ -
171 std::ptrdiff_t distanceTo(const iterator &other) const {
│ │ │ │ -
172 // make sure we reference the same container
│ │ │ │ -
173 assert(order == other.order && codim == other.codim &&
│ │ │ │ -
174 subEntity == other.subEntity);
│ │ │ │ -
175 if(vertex < other.vertex) return other.vertex - vertex;
│ │ │ │ -
176 else return -static_cast<std::ptrdiff_t>(vertex - other.vertex);
│ │ │ │ -
177 }
│ │ │ │ -
│ │ │ │ -
178
│ │ │ │ -
179 friend class GeneralVertexOrder<dim, Index>;
│ │ │ │ -
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.
│ │ │ │ +
103 template<int dimension, class CoordType>
│ │ │ │ +
104 int
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
106 nVertices(int nIntervals)
│ │ │ │ +
107 {
│ │ │ │ +
108 return BackendRefinement::nVertices(nIntervals) * 3;
│ │ │ │ +
109 }
│ │ │ │ +
│ │ │ │ +
110
│ │ │ │ +
111 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
114 vBegin(int nIntervals)
│ │ │ │ +
115 {
│ │ │ │ +
116 return VertexIterator(nIntervals);
│ │ │ │ +
117 }
│ │ │ │ +
│ │ │ │ +
118
│ │ │ │ +
119 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
122 vEnd(int nIntervals)
│ │ │ │ +
123 {
│ │ │ │ +
124 return VertexIterator(nIntervals, true);
│ │ │ │ +
125 }
│ │ │ │ +
│ │ │ │ +
126
│ │ │ │ +
127 template<int dimension, class CoordType>
│ │ │ │ +
128 int
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
130 nElements(int nIntervals)
│ │ │ │ +
131 {
│ │ │ │ +
132 return BackendRefinement::nElements(nIntervals) * 3;
│ │ │ │ +
133 }
│ │ │ │ +
│ │ │ │ +
134
│ │ │ │ +
135 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
138 eBegin(int nIntervals)
│ │ │ │ +
139 {
│ │ │ │ +
140 return ElementIterator(nIntervals);
│ │ │ │ +
141 }
│ │ │ │ +
│ │ │ │ +
142
│ │ │ │ +
143 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
146 eEnd(int nIntervals)
│ │ │ │ +
147 {
│ │ │ │ +
148 return ElementIterator(nIntervals, true);
│ │ │ │ +
149 }
│ │ │ │ +
│ │ │ │ +
150
│ │ │ │ +
151 // //////////////
│ │ │ │ +
152 //
│ │ │ │ +
153 // The iterator
│ │ │ │ +
154 //
│ │ │ │ +
155
│ │ │ │ +
156 // vertices
│ │ │ │ +
157 template<int dimension, class CoordType>
│ │ │ │ +
│ │ │ │ +
158 class RefinementIteratorSpecial<dimension, CoordType, dimension>
│ │ │ │ +
159 {
│ │ │ │ +
160 public:
│ │ │ │ + │ │ │ │ +
162 typedef typename Refinement::CoordVector CoordVector;
│ │ │ │ +
163 typedef typename Refinement::template Codim<dimension>::Geometry Geometry;
│ │ │ │ +
164
│ │ │ │ +
165 RefinementIteratorSpecial(int nIntervals, bool end = false);
│ │ │ │ +
166
│ │ │ │ +
167 void increment();
│ │ │ │ +
168
│ │ │ │ +
169 CoordVector coords() const;
│ │ │ │ +
170 Geometry geometry () const;
│ │ │ │ +
171
│ │ │ │ +
172 int index() const;
│ │ │ │ +
173 protected:
│ │ │ │ +
174 typedef typename Refinement::BackendRefinement BackendRefinement;
│ │ │ │ +
175 typedef typename BackendRefinement::template Codim<dimension>::SubEntityIterator BackendIterator;
│ │ │ │ +
176 constexpr static int nKuhnSimplices = 3;
│ │ │ │ +
177
│ │ │ │ + │ │ │ │ +
179
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
183 };
│ │ │ │ +
│ │ │ │ +
184
│ │ │ │ +
185 template<int dimension, class CoordType>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
187 RefinementIteratorSpecial(int nIntervals, bool end)
│ │ │ │ +
188 : nIntervals_(nIntervals), kuhnIndex(0),
│ │ │ │ +
189 backend(BackendRefinement::vBegin(nIntervals_)),
│ │ │ │ +
190 backendEnd(BackendRefinement::vEnd(nIntervals_))
│ │ │ │ +
191 {
│ │ │ │ +
192 if (end)
│ │ │ │ +
193 kuhnIndex = nKuhnSimplices;
│ │ │ │ +
194 }
│ │ │ │ +
│ │ │ │ +
195
│ │ │ │ +
196 template<int dimension, class CoordType>
│ │ │ │ +
197 void
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
200 {
│ │ │ │ +
201 ++backend;
│ │ │ │ +
202 if (backend == backendEnd)
│ │ │ │ +
203 {
│ │ │ │ +
204 backend = BackendRefinement::vBegin(nIntervals_);
│ │ │ │ +
205 ++kuhnIndex;
│ │ │ │ +
206 }
│ │ │ │ +
207 }
│ │ │ │ +
│ │ │ │ +
208
│ │ │ │ +
209 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
212 coords() const
│ │ │ │ +
213 {
│ │ │ │ +
214 // while the kuhnIndex runs from 0,1,2 the actual permutations we need are 0,2,3
│ │ │ │ +
215 return transformCoordinate(referenceToKuhn(backend.coords(),
│ │ │ │ +
216 getPermutation<dimension>((kuhnIndex + 2) % 4)));
│ │ │ │ +
217 }
│ │ │ │ +
│ │ │ │ +
218
│ │ │ │ +
219 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
222 {
│ │ │ │ +
223 std::vector<CoordVector> corners(1);
│ │ │ │ +
224 corners[0] = transformCoordinate(referenceToKuhn(backend.coords(),
│ │ │ │ +
225 getPermutation<dimension>((kuhnIndex + 2) % 4)));
│ │ │ │ +
226 return Geometry(GeometryTypes::vertex, corners);
│ │ │ │ +
227 }
│ │ │ │ +
│ │ │ │ +
228
│ │ │ │ +
229 template<int dimension, class CoordType>
│ │ │ │ +
230 int
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
232 index() const
│ │ │ │ +
233 {
│ │ │ │ +
234 return kuhnIndex*BackendRefinement::nVertices(nIntervals_) + backend.index();
│ │ │ │ +
235 }
│ │ │ │ +
│ │ │ │ +
236
│ │ │ │ +
237 // elements
│ │ │ │ +
238 template<int dimension, class CoordType>
│ │ │ │ +
│ │ │ │ +
239 class RefinementIteratorSpecial<dimension, CoordType, 0>
│ │ │ │ +
240 {
│ │ │ │ +
241 public:
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
245 typedef typename Refinement::template Codim<0>::Geometry Geometry;
│ │ │ │ +
246
│ │ │ │ +
247 RefinementIteratorSpecial(int nIntervals, bool end = false);
│ │ │ │ +
248
│ │ │ │ +
249 void increment();
│ │ │ │ +
250
│ │ │ │ +
251 IndexVector vertexIndices() const;
│ │ │ │ +
252 int index() const;
│ │ │ │ +
253 CoordVector coords() const;
│ │ │ │ +
254
│ │ │ │ +
255 Geometry geometry () const;
│ │ │ │ +
256
│ │ │ │ +
257 private:
│ │ │ │ +
258 CoordVector global(const CoordVector &local) const;
│ │ │ │ +
259
│ │ │ │ +
260 protected:
│ │ │ │ + │ │ │ │ +
262 typedef typename BackendRefinement::template Codim<0>::SubEntityIterator BackendIterator;
│ │ │ │ +
263 constexpr static int nKuhnSimplices = 3;
│ │ │ │ +
264
│ │ │ │ + │ │ │ │ +
266
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
270 };
│ │ │ │ +
│ │ │ │ +
271
│ │ │ │ +
272 template<int dimension, class CoordType>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
274 RefinementIteratorSpecial(int nIntervals, bool end)
│ │ │ │ +
275 : nIntervals_(nIntervals), kuhnIndex(0),
│ │ │ │ +
276 backend(BackendRefinement::eBegin(nIntervals_)),
│ │ │ │ +
277 backendEnd(BackendRefinement::eEnd(nIntervals_))
│ │ │ │ +
278 {
│ │ │ │ +
279 if (end)
│ │ │ │ +
280 kuhnIndex = nKuhnSimplices;
│ │ │ │ +
281 }
│ │ │ │ +
│ │ │ │ +
282
│ │ │ │ +
283 template<int dimension, class CoordType>
│ │ │ │ +
284 void
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
287 {
│ │ │ │ +
288 ++backend;
│ │ │ │ +
289 if (backend == backendEnd)
│ │ │ │ +
290 {
│ │ │ │ +
291 backend = BackendRefinement::eBegin(nIntervals_);
│ │ │ │ +
292 ++kuhnIndex;
│ │ │ │ +
293 }
│ │ │ │ +
294 }
│ │ │ │ +
│ │ │ │ +
295
│ │ │ │ +
296 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
299 vertexIndices() const
│ │ │ │ +
300 {
│ │ │ │ +
301 IndexVector indices = backend.vertexIndices();
│ │ │ │ +
302
│ │ │ │ +
303 int base = kuhnIndex * BackendRefinement::nVertices(nIntervals_);
│ │ │ │ +
304 indices += base;
│ │ │ │ +
305
│ │ │ │ +
306 return indices;
│ │ │ │ +
307 }
│ │ │ │ +
│ │ │ │ +
308
│ │ │ │ +
309 template<int dimension, class CoordType>
│ │ │ │ +
310 int
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
312 index() const
│ │ │ │ +
313 {
│ │ │ │ +
314 return kuhnIndex*BackendRefinement::nElements(nIntervals_) + backend.index();
│ │ │ │ +
315 }
│ │ │ │ +
│ │ │ │ +
316
│ │ │ │ +
317 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
320 coords() const
│ │ │ │ +
321 {
│ │ │ │ +
322 return global(backend.coords());
│ │ │ │ +
323 }
│ │ │ │ +
│ │ │ │ +
324
│ │ │ │ +
325 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
328 {
│ │ │ │ +
329 const typename BackendIterator::Geometry &bgeo =
│ │ │ │ +
330 backend.geometry();
│ │ │ │ +
331 std::vector<CoordVector> corners(dimension+1);
│ │ │ │ +
332 for(int i = 0; i <= dimension; ++i)
│ │ │ │ +
333 corners[i] = global(bgeo.corner(i));
│ │ │ │ +
334
│ │ │ │ +
335 return Geometry(bgeo.type(), corners);
│ │ │ │ +
336 }
│ │ │ │ +
│ │ │ │ +
337
│ │ │ │ +
338 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
341 global(const CoordVector &local) const
│ │ │ │ +
342 {
│ │ │ │ +
343 // while the kuhnIndex runs from 0,1,2 the actual permutations we need are 0,2,3
│ │ │ │ +
344 return transformCoordinate(referenceToKuhn(local, getPermutation<dimension>((kuhnIndex+2)%4)));
│ │ │ │ +
345 }
│ │ │ │ +
346
│ │ │ │ +
347 // common
│ │ │ │ +
348 template<int dimension, class CoordType>
│ │ │ │ +
349 template<int codimension>
│ │ │ │ +
│ │ │ │ +
350 class RefinementImp<dimension, CoordType>::Codim<codimension>::SubEntityIterator
│ │ │ │ +
351 : public ForwardIteratorFacade<typename RefinementImp<dimension, CoordType>::template Codim<codimension>::SubEntityIterator, int>,
│ │ │ │ +
352 public RefinementIteratorSpecial<dimension, CoordType, codimension>
│ │ │ │ +
353 {
│ │ │ │ +
354 public:
│ │ │ │ + │ │ │ │ +
356 typedef SubEntityIterator This;
│ │ │ │ +
357
│ │ │ │ +
358 SubEntityIterator(int nIntervals, bool end = false);
│ │ │ │ +
359
│ │ │ │ +
360 bool equals(const This &other) const;
│ │ │ │ +
361 protected:
│ │ │ │ +
362 using RefinementIteratorSpecial<dimension, CoordType, codimension>::kuhnIndex;
│ │ │ │ +
363 using RefinementIteratorSpecial<dimension, CoordType, codimension>::backend;
│ │ │ │ +
364 };
│ │ │ │ +
│ │ │ │ +
365
│ │ │ │ +
366#ifndef DOXYGEN
│ │ │ │ +
367 template<int dimension, class CoordType>
│ │ │ │ +
368 template<int codimension>
│ │ │ │ + │ │ │ │ +
370 SubEntityIterator(int nIntervals, bool end)
│ │ │ │ +
371 : RefinementIteratorSpecial<dimension, CoordType, codimension>(nIntervals, end)
│ │ │ │ +
372 {}
│ │ │ │ +
373
│ │ │ │ +
374 template<int dimension, class CoordType>
│ │ │ │ +
375 template<int codimension>
│ │ │ │ +
376 bool
│ │ │ │ + │ │ │ │ +
378 equals(const This &other) const
│ │ │ │ +
379 {
│ │ │ │ +
380 return ((kuhnIndex == other.kuhnIndex) && (backend == other.backend));
│ │ │ │ +
381 }
│ │ │ │ +
382#endif
│ │ │ │ +
383
│ │ │ │ +
384 } // namespace PrismTriangulation
│ │ │ │ +
│ │ │ │ +
385 } // namespace RefinementImp
│ │ │ │ +
386
│ │ │ │ +
387 namespace RefinementImp
│ │ │ │ +
388 {
│ │ │ │ +
389 // ///////////////////////
│ │ │ │ +
390 //
│ │ │ │ +
391 // The refinement traits
│ │ │ │ +
392 //
│ │ │ │ +
393
│ │ │ │ +
394#ifndef DOXYGEN
│ │ │ │ +
395 template<unsigned topologyId, class CoordType, unsigned coerceToId>
│ │ │ │ +
396 struct Traits<
│ │ │ │ +
397 topologyId, CoordType, coerceToId, 3,
│ │ │ │ +
398 typename std::enable_if<
│ │ │ │ +
399 (GeometryTypes::prism.id() >> 1) ==
│ │ │ │ +
400 (topologyId >> 1) &&
│ │ │ │ +
401 (GeometryTypes::simplex(3).id() >> 1) ==
│ │ │ │ +
402 (coerceToId >> 1)
│ │ │ │ +
403 >::type>
│ │ │ │ +
404 {
│ │ │ │ +
405 typedef PrismTriangulation::RefinementImp<3, CoordType> Imp;
│ │ │ │ +
406 };
│ │ │ │ +
407#endif
│ │ │ │ +
408
│ │ │ │ +
409 } // namespace RefinementImp
│ │ │ │ +
410} // namespace Dune
│ │ │ │ +
411
│ │ │ │ +
412#endif // DUNE_GEOMETRY_REFINEMENT_PRISMTRIANGULATION_CC
│ │ │ │ +
This file contains the parts independent of a particular Refinement implementation.
│ │ │ │ +
This file contains the Refinement implementation for simplices (triangles, tetrahedrons....
│ │ │ │ +
A unique label for each type of element that can occur in a grid.
│ │ │ │ + │ │ │ │ +
STL namespace.
│ │ │ │
Definition affinegeometry.hh:21
│ │ │ │ -
void reduceOrder(const InIterator &inBegin, const InIterator &inEnd, OutIterator outIt)
Algorithm to reduce vertex order information.
Definition generalvertexorder.hh:40
│ │ │ │ -
Class providing access to the singletons of the reference elements.
Definition referenceelements.hh:128
│ │ │ │ -
typename Container::ReferenceElement ReferenceElement
The reference element type.
Definition referenceelements.hh:146
│ │ │ │ -
Class providing information on the ordering of vertices.
Definition generalvertexorder.hh:67
│ │ │ │ -
Index_ Index
Type of indices.
Definition generalvertexorder.hh:77
│ │ │ │ -
const GeometryType & type() const
get type of the entity's geometry
Definition generalvertexorder.hh:85
│ │ │ │ -
static const std::size_t dimension
export the dimension of the entity we provide information for
Definition generalvertexorder.hh:83
│ │ │ │ -
void getReduced(std::size_t codim, std::size_t subEntity, std::vector< Index > &order) const
get a vector of reduced indices for some sub-entity
Definition generalvertexorder.hh:128
│ │ │ │ -
iterator end(std::size_t codim, std::size_t subEntity) const
get end iterator for the vertex indices of some sub-entity
Definition generalvertexorder.hh:115
│ │ │ │ -
GeneralVertexOrder(const GeometryType &gt_, const InIterator &inBegin, const InIterator &inEnd)
construct a GeneralVertexOrder
Definition generalvertexorder.hh:97
│ │ │ │ -
iterator begin(std::size_t codim, std::size_t subEntity) const
get begin iterator for the vertex indices of some sub-entity
Definition generalvertexorder.hh:108
│ │ │ │ -
Iterate over the vertex indices of some sub-entity.
Definition generalvertexorder.hh:144
│ │ │ │ -
iterator()
public default constructor
Definition generalvertexorder.hh:187
│ │ │ │ -
void decrement()
Definition generalvertexorder.hh:169
│ │ │ │ -
void advance(std::ptrdiff_t n)
Definition generalvertexorder.hh:170
│ │ │ │ -
const Index & dereference() const
Definition generalvertexorder.hh:156
│ │ │ │ -
void increment()
Definition generalvertexorder.hh:168
│ │ │ │ -
bool equals(const iterator &other) const
Definition generalvertexorder.hh:164
│ │ │ │ -
std::ptrdiff_t distanceTo(const iterator &other) const
Definition generalvertexorder.hh:171
│ │ │ │ -
const Index & elementAt(std::ptrdiff_t n) const
Definition generalvertexorder.hh:160
│ │ │ │ -
Unique label for each type of entities that can occur in DUNE grids.
Definition type.hh:114
│ │ │ │ +
FieldVector< CoordType, dimension > transformCoordinate(FieldVector< CoordType, dimension > point)
Definition prismtriangulation.cc:50
│ │ │ │ +
FieldVector< int, n > getPermutation(int m)
Calculate permutation from it's index.
Definition simplex.cc:293
│ │ │ │ +
FieldVector< CoordType, dimension > referenceToKuhn(FieldVector< CoordType, dimension > point, const FieldVector< int, dimension > &kuhn)
Map from the reference simplex to some Kuhn simplex.
Definition simplex.cc:322
│ │ │ │ +
Static tag representing a codimension.
Definition dimension.hh:24
│ │ │ │ +
generic geometry implementation based on corner coordinates
Definition multilineargeometry.hh:181
│ │ │ │ + │ │ │ │ +
Implementation of the refinement of a prism into simplices.
Definition prismtriangulation.cc:67
│ │ │ │ +
static constexpr int dimension
Definition prismtriangulation.cc:69
│ │ │ │ +
CoordType ctype
Definition prismtriangulation.cc:71
│ │ │ │ +
static VertexIterator vEnd(int nIntervals)
Definition prismtriangulation.cc:122
│ │ │ │ +
FieldVector< int, dimension+1 > IndexVector
Definition prismtriangulation.cc:78
│ │ │ │ +
static ElementIterator eEnd(int nIntervals)
Definition prismtriangulation.cc:146
│ │ │ │ +
static int nVertices(int nIntervals)
Definition prismtriangulation.cc:106
│ │ │ │ +
FieldVector< CoordType, dimension > CoordVector
Definition prismtriangulation.cc:76
│ │ │ │ +
static int nElements(int nIntervals)
Definition prismtriangulation.cc:130
│ │ │ │ +
Codim< 0 >::SubEntityIterator ElementIterator
Definition prismtriangulation.cc:77
│ │ │ │ +
Codim< dimension >::SubEntityIterator VertexIterator
Definition prismtriangulation.cc:75
│ │ │ │ +
static ElementIterator eBegin(int nIntervals)
Definition prismtriangulation.cc:138
│ │ │ │ +
static VertexIterator vBegin(int nIntervals)
Definition prismtriangulation.cc:114
│ │ │ │ + │ │ │ │ +
Dune::MultiLinearGeometry< CoordType, dimension-codimension, dimension > Geometry
Definition prismtriangulation.cc:100
│ │ │ │ + │ │ │ │ +
Refinement::template Codim< dimension >::Geometry Geometry
Definition prismtriangulation.cc:163
│ │ │ │ +
Refinement::BackendRefinement BackendRefinement
Definition prismtriangulation.cc:174
│ │ │ │ +
BackendRefinement::template Codim< dimension >::SubEntityIterator BackendIterator
Definition prismtriangulation.cc:175
│ │ │ │ + │ │ │ │ + │ │ │ │ +
RefinementImp< dimension, CoordType > Refinement
Definition prismtriangulation.cc:161
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
Refinement::template Codim< 0 >::Geometry Geometry
Definition prismtriangulation.cc:245
│ │ │ │ + │ │ │ │ +
Refinement::IndexVector IndexVector
Definition prismtriangulation.cc:243
│ │ │ │ +
BackendRefinement::template Codim< 0 >::SubEntityIterator BackendIterator
Definition prismtriangulation.cc:262
│ │ │ │ + │ │ │ │ +
Refinement::CoordVector CoordVector
Definition prismtriangulation.cc:244
│ │ │ │ +
RefinementImp< dimension, CoordType > Refinement
Definition prismtriangulation.cc:242
│ │ │ │ + │ │ │ │ +
Refinement::BackendRefinement BackendRefinement
Definition prismtriangulation.cc:261
│ │ │ │ +
SubEntityIterator This
Definition prismtriangulation.cc:356
│ │ │ │ + │ │ │ │ +
RefinementImp< dimension, CoordType > Refinement
Definition prismtriangulation.cc:355
│ │ │ │ + │ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,216 +1,605 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -generalvertexorder.hh │ │ │ │ │ + * _r_e_f_i_n_e_m_e_n_t │ │ │ │ │ +prismtriangulation.cc │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 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 © 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 │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14 │ │ │ │ │ -15#include │ │ │ │ │ +5#ifndef DUNE_GEOMETRY_REFINEMENT_PRISMTRIANGULATION_CC │ │ │ │ │ +_6#define DUNE_GEOMETRY_REFINEMENT_PRISMTRIANGULATION_CC │ │ │ │ │ +7 │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10 │ │ │ │ │ +11#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ +12#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ +13 │ │ │ │ │ +14#include "_b_a_s_e_._c_c" │ │ │ │ │ +15#include "_s_i_m_p_l_e_x_._c_c" │ │ │ │ │ 16 │ │ │ │ │ -17#include "_t_y_p_e_._h_h" │ │ │ │ │ -18#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ -19 │ │ │ │ │ -20namespace _D_u_n_e { │ │ │ │ │ -21 │ │ │ │ │ -39 template │ │ │ │ │ -_4_0 void _r_e_d_u_c_e_O_r_d_e_r(const InIterator& inBegin, const InIterator& inEnd, │ │ │ │ │ -41 OutIterator outIt) │ │ │ │ │ -42 { │ │ │ │ │ -43 for(InIterator inIt = inBegin; inIt != inEnd; ++inIt, ++outIt) │ │ │ │ │ -44 *outIt = std::count_if(inBegin, inEnd, [&](const auto& v) │ │ │ │ │ -45 { │ │ │ │ │ -46 return v < *inIt; │ │ │ │ │ -47 }); │ │ │ │ │ -48 } │ │ │ │ │ -49 │ │ │ │ │ -51 │ │ │ │ │ -66 template │ │ │ │ │ -_6_7 class _G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r { │ │ │ │ │ -68 typedef _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_<_d_o_u_b_l_e_,_ _d_i_m_> RefElems; │ │ │ │ │ -69 typedef typename _R_e_f_E_l_e_m_s_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t RefElem; │ │ │ │ │ +17namespace _D_u_n_e │ │ │ │ │ +18{ │ │ │ │ │ +19 namespace RefinementImp │ │ │ │ │ +20 { │ │ │ │ │ +_2_6 namespace PrismTriangulation │ │ │ │ │ +27 { │ │ │ │ │ +28 // //////////// │ │ │ │ │ +29 // │ │ │ │ │ +30 // Utilities │ │ │ │ │ +31 // │ │ │ │ │ +32 │ │ │ │ │ +33 using _S_i_m_p_l_e_x_:_:_g_e_t_P_e_r_m_u_t_a_t_i_o_n; │ │ │ │ │ +34 using _S_i_m_p_l_e_x_:_:_r_e_f_e_r_e_n_c_e_T_o_K_u_h_n; │ │ │ │ │ +35 │ │ │ │ │ +36 // //////////////////////////////////// │ │ │ │ │ +37 // │ │ │ │ │ +38 // Refine a prism with simplices │ │ │ │ │ +39 // │ │ │ │ │ +40 │ │ │ │ │ +41 // forward declaration of the iterator base │ │ │ │ │ +42 template │ │ │ │ │ +_4_3 class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l; │ │ │ │ │ +44 /* │ │ │ │ │ +45 * The permutations 0,2 and 3 of the Kuhn-decomposition of a cube into │ │ │ │ │ +simplices form a prism. │ │ │ │ │ +46 * The resulting prism is not oriented the same as the reference prism and so │ │ │ │ │ +the Kuhn-coordinates │ │ │ │ │ +47 * have to be transformed using the method below. │ │ │ │ │ +48 */ │ │ │ │ │ +49 template FieldVector │ │ │ │ │ +_5_0 _t_r_a_n_s_f_o_r_m_C_o_o_r_d_i_n_a_t_e(FieldVector point) │ │ │ │ │ +51 { │ │ │ │ │ +52 FieldVector transform; │ │ │ │ │ +53 transform[0] = point[1]; │ │ │ │ │ +54 transform[1] = 1 - point[0]; │ │ │ │ │ +55 transform[2] = point[2]; │ │ │ │ │ +56 return transform; │ │ │ │ │ +57 } │ │ │ │ │ +58 │ │ │ │ │ +65 template │ │ │ │ │ +_6_6 class _R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ +67 { │ │ │ │ │ +68 public: │ │ │ │ │ +_6_9 constexpr static int _d_i_m_e_n_s_i_o_n = dimension_; │ │ │ │ │ 70 │ │ │ │ │ -71 RefElem refelem; │ │ │ │ │ -72 _G_e_o_m_e_t_r_y_T_y_p_e gt; │ │ │ │ │ -73 std::vector vertexOrder; │ │ │ │ │ -74 │ │ │ │ │ -75 public: │ │ │ │ │ -_7_7 typedef Index_ _I_n_d_e_x; │ │ │ │ │ -78 │ │ │ │ │ -80 class _i_t_e_r_a_t_o_r; │ │ │ │ │ -81 │ │ │ │ │ -_8_3 static const std::size_t _d_i_m_e_n_s_i_o_n = dim; │ │ │ │ │ -_8_5 const _G_e_o_m_e_t_r_y_T_y_p_e &_t_y_p_e() const { return gt; } │ │ │ │ │ -86 │ │ │ │ │ -88 │ │ │ │ │ -96 template │ │ │ │ │ -_9_7 _G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r(const _G_e_o_m_e_t_r_y_T_y_p_e& gt_, const InIterator &inBegin, │ │ │ │ │ -98 const InIterator &inEnd) : │ │ │ │ │ -99 refelem(RefElems::general(gt_)), gt(gt_), │ │ │ │ │ -100 vertexOrder(refelem.size(dim)) │ │ │ │ │ -101 { _r_e_d_u_c_e_O_r_d_e_r(inBegin, inEnd, vertexOrder.begin()); } │ │ │ │ │ +_7_1 typedef CoordType _c_t_y_p_e; │ │ │ │ │ +72 │ │ │ │ │ +73 template │ │ │ │ │ +74 struct _C_o_d_i_m; │ │ │ │ │ +_7_5 typedef typename _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _V_e_r_t_e_x_I_t_e_r_a_t_o_r; │ │ │ │ │ +_7_6 typedef FieldVector _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ +_7_7 typedef typename _C_o_d_i_m_<_0_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r; │ │ │ │ │ +_7_8 typedef FieldVector _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ +79 │ │ │ │ │ +80 static int _n_V_e_r_t_i_c_e_s(int nIntervals); │ │ │ │ │ +81 static _V_e_r_t_e_x_I_t_e_r_a_t_o_r _v_B_e_g_i_n(int nIntervals); │ │ │ │ │ +82 static _V_e_r_t_e_x_I_t_e_r_a_t_o_r _v_E_n_d(int nIntervals); │ │ │ │ │ +83 │ │ │ │ │ +84 static int _n_E_l_e_m_e_n_t_s(int nIntervals); │ │ │ │ │ +85 static _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r _e_B_e_g_i_n(int nIntervals); │ │ │ │ │ +_8_6 static _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r _e_E_n_d(int nIntervals); │ │ │ │ │ +87 │ │ │ │ │ +88 private: │ │ │ │ │ +89 friend class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l<_d_i_m_e_n_s_i_o_n, CoordType, 0>; │ │ │ │ │ +90 friend class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l<_d_i_m_e_n_s_i_o_n, CoordType, _d_i_m_e_n_s_i_o_n>; │ │ │ │ │ +91 │ │ │ │ │ +92 typedef _S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +93 }; │ │ │ │ │ +94 │ │ │ │ │ +95 template │ │ │ │ │ +96 template │ │ │ │ │ +_9_7 struct _R_e_f_i_n_e_m_e_n_t_I_m_p::_C_o_d_i_m │ │ │ │ │ +98 { │ │ │ │ │ +99 class SubEntityIterator; │ │ │ │ │ +_1_0_0 typedef _D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y _G_e_o_m_e_t_r_y; │ │ │ │ │ +101 }; │ │ │ │ │ 102 │ │ │ │ │ -104 │ │ │ │ │ -_1_0_8 _i_t_e_r_a_t_o_r _b_e_g_i_n(std::size_t codim, std::size_t subEntity) const │ │ │ │ │ -109 { return _i_t_e_r_a_t_o_r(*this, codim, subEntity); } │ │ │ │ │ -111 │ │ │ │ │ -_1_1_5 _i_t_e_r_a_t_o_r _e_n_d(std::size_t codim, std::size_t subEntity) const { │ │ │ │ │ -116 return _i_t_e_r_a_t_o_r(*this, codim, subEntity, │ │ │ │ │ -117 refelem.size(subEntity, codim, dim)); │ │ │ │ │ -118 } │ │ │ │ │ -119 │ │ │ │ │ -121 │ │ │ │ │ -_1_2_8 void _g_e_t_R_e_d_u_c_e_d(std::size_t codim, std::size_t subEntity, │ │ │ │ │ -129 std::vector& order) const │ │ │ │ │ -130 { │ │ │ │ │ -131 order.resize(refelem.size(subEntity, codim, dim)); │ │ │ │ │ -132 _r_e_d_u_c_e_O_r_d_e_r(_b_e_g_i_n(codim, subEntity), _e_n_d(codim, subEntity), │ │ │ │ │ -133 order.begin()); │ │ │ │ │ -134 } │ │ │ │ │ -135 }; │ │ │ │ │ -136 │ │ │ │ │ -138 │ │ │ │ │ -141 template │ │ │ │ │ -_1_4_2 class _G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r::_i_t_e_r_a_t_o_r : │ │ │ │ │ -143 public Dune::RandomAccessIteratorFacade │ │ │ │ │ -144 { │ │ │ │ │ -145 const _G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r *order; │ │ │ │ │ -146 std::size_t codim; │ │ │ │ │ -147 std::size_t subEntity; │ │ │ │ │ -148 std::size_t vertex; │ │ │ │ │ -149 │ │ │ │ │ -150 _i_t_e_r_a_t_o_r(const _G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r &order_, std::size_t codim_, │ │ │ │ │ -151 std::size_t subEntity_, std::size_t vertex_ = 0) : │ │ │ │ │ -152 order(&order_), codim(codim_), subEntity(subEntity_), vertex(vertex_) │ │ │ │ │ -153 { } │ │ │ │ │ -154 │ │ │ │ │ -155 public: │ │ │ │ │ -_1_5_6 const _I_n_d_e_x &_d_e_r_e_f_e_r_e_n_c_e() const { │ │ │ │ │ -157 return order->vertexOrder[order->refelem.subEntity(subEntity, codim, │ │ │ │ │ -158 vertex, dim)]; │ │ │ │ │ -159 } │ │ │ │ │ -_1_6_0 const _I_n_d_e_x &_e_l_e_m_e_n_t_A_t(std::ptrdiff_t n) const { │ │ │ │ │ -161 return order->vertexOrder[order->refelem.subEntity(subEntity, codim, │ │ │ │ │ -162 vertex+n, dim)]; │ │ │ │ │ -163 } │ │ │ │ │ -_1_6_4 bool _e_q_u_a_l_s(const _i_t_e_r_a_t_o_r &other) const { │ │ │ │ │ -165 return order == other.order && codim == other.codim && │ │ │ │ │ -166 subEntity == other.subEntity && vertex == other.vertex; │ │ │ │ │ -167 } │ │ │ │ │ -_1_6_8 void _i_n_c_r_e_m_e_n_t() { ++vertex; } │ │ │ │ │ -_1_6_9 void _d_e_c_r_e_m_e_n_t() { --vertex; } │ │ │ │ │ -_1_7_0 void _a_d_v_a_n_c_e(std::ptrdiff_t n) { vertex += n; } │ │ │ │ │ -_1_7_1 std::ptrdiff_t _d_i_s_t_a_n_c_e_T_o(const _i_t_e_r_a_t_o_r &other) const { │ │ │ │ │ -172 // make sure we reference the same container │ │ │ │ │ -173 assert(order == other.order && codim == other.codim && │ │ │ │ │ -174 subEntity == other.subEntity); │ │ │ │ │ -175 if(vertex < other.vertex) return other.vertex - vertex; │ │ │ │ │ -176 else return -static_cast(vertex - other.vertex); │ │ │ │ │ -177 } │ │ │ │ │ -178 │ │ │ │ │ -179 friend class _G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r; │ │ │ │ │ -180 │ │ │ │ │ -182 │ │ │ │ │ -_1_8_7 _i_t_e_r_a_t_o_r() { } │ │ │ │ │ -188 }; │ │ │ │ │ -189} // namespace Dune │ │ │ │ │ -190 │ │ │ │ │ -191#endif // DUNE_GEOMETRY_GENERALVERTEXORDER_HH │ │ │ │ │ -_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h │ │ │ │ │ +103 template │ │ │ │ │ +104 int │ │ │ │ │ +_1_0_5 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +106_ _n_V_e_r_t_i_c_e_s(int nIntervals) │ │ │ │ │ +107 { │ │ │ │ │ +108 return BackendRefinement::nVertices(nIntervals) * 3; │ │ │ │ │ +109 } │ │ │ │ │ +110 │ │ │ │ │ +111 template │ │ │ │ │ +112 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ +_1_1_3 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +114_ _v_B_e_g_i_n(int nIntervals) │ │ │ │ │ +115 { │ │ │ │ │ +116 return _V_e_r_t_e_x_I_t_e_r_a_t_o_r(nIntervals); │ │ │ │ │ +117 } │ │ │ │ │ +118 │ │ │ │ │ +119 template │ │ │ │ │ +120 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ +_1_2_1 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +122_ _v_E_n_d(int nIntervals) │ │ │ │ │ +123 { │ │ │ │ │ +124 return _V_e_r_t_e_x_I_t_e_r_a_t_o_r(nIntervals, true); │ │ │ │ │ +125 } │ │ │ │ │ +126 │ │ │ │ │ +127 template │ │ │ │ │ +128 int │ │ │ │ │ +_1_2_9 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +130_ _n_E_l_e_m_e_n_t_s(int nIntervals) │ │ │ │ │ +131 { │ │ │ │ │ +132 return BackendRefinement::nElements(nIntervals) * 3; │ │ │ │ │ +133 } │ │ │ │ │ +134 │ │ │ │ │ +135 template │ │ │ │ │ +136 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ +_1_3_7 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +138_ _e_B_e_g_i_n(int nIntervals) │ │ │ │ │ +139 { │ │ │ │ │ +140 return _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r(nIntervals); │ │ │ │ │ +141 } │ │ │ │ │ +142 │ │ │ │ │ +143 template │ │ │ │ │ +144 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ +_1_4_5 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +146_ _e_E_n_d(int nIntervals) │ │ │ │ │ +147 { │ │ │ │ │ +148 return _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r(nIntervals, true); │ │ │ │ │ +149 } │ │ │ │ │ +150 │ │ │ │ │ +151 // ////////////// │ │ │ │ │ +152 // │ │ │ │ │ +153 // The iterator │ │ │ │ │ +154 // │ │ │ │ │ +155 │ │ │ │ │ +156 // vertices │ │ │ │ │ +157 template │ │ │ │ │ +_1_5_8 class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ +159 { │ │ │ │ │ +160 public: │ │ │ │ │ +_1_6_1 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +_1_6_2 typedef typename Refinement::CoordVector _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ +_1_6_3 typedef typename Refinement::template _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_:_G_e_o_m_e_t_r_y _G_e_o_m_e_t_r_y; │ │ │ │ │ +164 │ │ │ │ │ +165 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end = false); │ │ │ │ │ +166 │ │ │ │ │ +167 void increment(); │ │ │ │ │ +168 │ │ │ │ │ +169 _C_o_o_r_d_V_e_c_t_o_r coords() const; │ │ │ │ │ +170 _G_e_o_m_e_t_r_y geometry () const; │ │ │ │ │ +171 │ │ │ │ │ +172 int index() const; │ │ │ │ │ +173 protected: │ │ │ │ │ +_1_7_4 typedef typename Refinement::BackendRefinement _B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +_1_7_5 typedef typename BackendRefinement::template _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r; │ │ │ │ │ +_1_7_6 constexpr static int nKuhnSimplices = 3; │ │ │ │ │ +177 │ │ │ │ │ +_1_7_8 int _n_I_n_t_e_r_v_a_l_s__; │ │ │ │ │ +179 │ │ │ │ │ +_1_8_0 int _k_u_h_n_I_n_d_e_x; │ │ │ │ │ +_1_8_1 _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r _b_a_c_k_e_n_d; │ │ │ │ │ +_1_8_2 const _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r _b_a_c_k_e_n_d_E_n_d; │ │ │ │ │ +183 }; │ │ │ │ │ +184 │ │ │ │ │ +185 template │ │ │ │ │ +_1_8_6 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +187_ _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end) │ │ │ │ │ +188 : nIntervals_(nIntervals), kuhnIndex(0), │ │ │ │ │ +189 backend(_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t::vBegin(nIntervals_)), │ │ │ │ │ +190 backendEnd(_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t::vEnd(nIntervals_)) │ │ │ │ │ +191 { │ │ │ │ │ +192 if (end) │ │ │ │ │ +193 kuhnIndex = nKuhnSimplices; │ │ │ │ │ +194 } │ │ │ │ │ +195 │ │ │ │ │ +196 template │ │ │ │ │ +197 void │ │ │ │ │ +_1_9_8 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +199_ _i_n_c_r_e_m_e_n_t() │ │ │ │ │ +200 { │ │ │ │ │ +201 ++backend; │ │ │ │ │ +202 if (backend == backendEnd) │ │ │ │ │ +203 { │ │ │ │ │ +204 backend = BackendRefinement::vBegin(nIntervals_); │ │ │ │ │ +205 ++kuhnIndex; │ │ │ │ │ +206 } │ │ │ │ │ +207 } │ │ │ │ │ +208 │ │ │ │ │ +209 template │ │ │ │ │ +210 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +_2_1_1 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +212_ _c_o_o_r_d_s() const │ │ │ │ │ +213 { │ │ │ │ │ +214 // while the kuhnIndex runs from 0,1,2 the actual permutations we need are │ │ │ │ │ +0,2,3 │ │ │ │ │ +215 return _t_r_a_n_s_f_o_r_m_C_o_o_r_d_i_n_a_t_e(referenceToKuhn(backend.coords(), │ │ │ │ │ +216 getPermutation((kuhnIndex + 2) % 4))); │ │ │ │ │ +217 } │ │ │ │ │ +218 │ │ │ │ │ +219 template │ │ │ │ │ +220 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_G_e_o_m_e_t_r_y │ │ │ │ │ +_2_2_1 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_:_g_e_o_m_e_t_r_y () │ │ │ │ │ +const │ │ │ │ │ +222 { │ │ │ │ │ +223 std::vector corners(1); │ │ │ │ │ +224 corners[0] = _t_r_a_n_s_f_o_r_m_C_o_o_r_d_i_n_a_t_e(referenceToKuhn(backend.coords(), │ │ │ │ │ +225 getPermutation((kuhnIndex + 2) % 4))); │ │ │ │ │ +226 return _G_e_o_m_e_t_r_y(GeometryTypes::vertex, corners); │ │ │ │ │ +227 } │ │ │ │ │ +228 │ │ │ │ │ +229 template │ │ │ │ │ +230 int │ │ │ │ │ +_2_3_1 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +232_ _i_n_d_e_x() const │ │ │ │ │ +233 { │ │ │ │ │ +234 return kuhnIndex*BackendRefinement::nVertices(nIntervals_) + backend.index │ │ │ │ │ +(); │ │ │ │ │ +235 } │ │ │ │ │ +236 │ │ │ │ │ +237 // elements │ │ │ │ │ +238 template │ │ │ │ │ +_2_3_9 class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ +240 { │ │ │ │ │ +241 public: │ │ │ │ │ +_2_4_2 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +_2_4_3 typedef typename _R_e_f_i_n_e_m_e_n_t_:_:_I_n_d_e_x_V_e_c_t_o_r _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ +_2_4_4 typedef typename _R_e_f_i_n_e_m_e_n_t_:_:_C_o_o_r_d_V_e_c_t_o_r _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ +_2_4_5 typedef typename Refinement::template _C_o_d_i_m_<_0_>_:_:_G_e_o_m_e_t_r_y _G_e_o_m_e_t_r_y; │ │ │ │ │ +246 │ │ │ │ │ +247 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end = false); │ │ │ │ │ +248 │ │ │ │ │ +249 void increment(); │ │ │ │ │ +250 │ │ │ │ │ +251 _I_n_d_e_x_V_e_c_t_o_r vertexIndices() const; │ │ │ │ │ +252 int index() const; │ │ │ │ │ +253 _C_o_o_r_d_V_e_c_t_o_r coords() const; │ │ │ │ │ +254 │ │ │ │ │ +255 _G_e_o_m_e_t_r_y geometry () const; │ │ │ │ │ +256 │ │ │ │ │ +257 private: │ │ │ │ │ +258 _C_o_o_r_d_V_e_c_t_o_r global(const _C_o_o_r_d_V_e_c_t_o_r &local) const; │ │ │ │ │ +259 │ │ │ │ │ +260 protected: │ │ │ │ │ +_2_6_1 typedef typename _R_e_f_i_n_e_m_e_n_t_:_:_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t _B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +_2_6_2 typedef typename BackendRefinement::template _C_o_d_i_m_<_0_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ +_B_a_c_k_e_n_d_I_t_e_r_a_t_o_r; │ │ │ │ │ +_2_6_3 constexpr static int nKuhnSimplices = 3; │ │ │ │ │ +264 │ │ │ │ │ +_2_6_5 int _n_I_n_t_e_r_v_a_l_s__; │ │ │ │ │ +266 │ │ │ │ │ +_2_6_7 int _k_u_h_n_I_n_d_e_x; │ │ │ │ │ +_2_6_8 _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r _b_a_c_k_e_n_d; │ │ │ │ │ +_2_6_9 const _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r _b_a_c_k_e_n_d_E_n_d; │ │ │ │ │ +270 }; │ │ │ │ │ +271 │ │ │ │ │ +272 template │ │ │ │ │ +_2_7_3 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +274_ _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end) │ │ │ │ │ +275 : nIntervals_(nIntervals), kuhnIndex(0), │ │ │ │ │ +276 backend(_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t::eBegin(nIntervals_)), │ │ │ │ │ +277 backendEnd(_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t::eEnd(nIntervals_)) │ │ │ │ │ +278 { │ │ │ │ │ +279 if (end) │ │ │ │ │ +280 kuhnIndex = nKuhnSimplices; │ │ │ │ │ +281 } │ │ │ │ │ +282 │ │ │ │ │ +283 template │ │ │ │ │ +284 void │ │ │ │ │ +_2_8_5 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +286_ _i_n_c_r_e_m_e_n_t() │ │ │ │ │ +287 { │ │ │ │ │ +288 ++backend; │ │ │ │ │ +289 if (backend == backendEnd) │ │ │ │ │ +290 { │ │ │ │ │ +291 backend = BackendRefinement::eBegin(nIntervals_); │ │ │ │ │ +292 ++kuhnIndex; │ │ │ │ │ +293 } │ │ │ │ │ +294 } │ │ │ │ │ +295 │ │ │ │ │ +296 template │ │ │ │ │ +297 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ +_2_9_8 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +299_ _v_e_r_t_e_x_I_n_d_i_c_e_s() const │ │ │ │ │ +300 { │ │ │ │ │ +301 _I_n_d_e_x_V_e_c_t_o_r indices = backend.vertexIndices(); │ │ │ │ │ +302 │ │ │ │ │ +303 int base = kuhnIndex * BackendRefinement::nVertices(nIntervals_); │ │ │ │ │ +304 indices += base; │ │ │ │ │ +305 │ │ │ │ │ +306 return indices; │ │ │ │ │ +307 } │ │ │ │ │ +308 │ │ │ │ │ +309 template │ │ │ │ │ +310 int │ │ │ │ │ +_3_1_1 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +312_ _i_n_d_e_x() const │ │ │ │ │ +313 { │ │ │ │ │ +314 return kuhnIndex*BackendRefinement::nElements(nIntervals_) + backend.index │ │ │ │ │ +(); │ │ │ │ │ +315 } │ │ │ │ │ +316 │ │ │ │ │ +317 template │ │ │ │ │ +318 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +_3_1_9 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +320_ _c_o_o_r_d_s() const │ │ │ │ │ +321 { │ │ │ │ │ +322 return global(backend.coords()); │ │ │ │ │ +323 } │ │ │ │ │ +324 │ │ │ │ │ +325 template │ │ │ │ │ +326 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ +_3_2_7 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_g_e_o_m_e_t_r_y () const │ │ │ │ │ +328 { │ │ │ │ │ +329 const typename BackendIterator::Geometry &bgeo = │ │ │ │ │ +330 backend.geometry(); │ │ │ │ │ +331 std::vector corners(dimension+1); │ │ │ │ │ +332 for(int i = 0; i <= dimension; ++i) │ │ │ │ │ +333 corners[i] = global(bgeo.corner(i)); │ │ │ │ │ +334 │ │ │ │ │ +335 return _G_e_o_m_e_t_r_y(bgeo.type(), corners); │ │ │ │ │ +336 } │ │ │ │ │ +337 │ │ │ │ │ +338 template │ │ │ │ │ +339 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +340 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +341_ _g_l_o_b_a_l(const CoordVector &local) const │ │ │ │ │ +342 { │ │ │ │ │ +343 // while the kuhnIndex runs from 0,1,2 the actual permutations we need are │ │ │ │ │ +0,2,3 │ │ │ │ │ +344 return _t_r_a_n_s_f_o_r_m_C_o_o_r_d_i_n_a_t_e(referenceToKuhn(local, getPermutation │ │ │ │ │ +((kuhnIndex+2)%4))); │ │ │ │ │ +345 } │ │ │ │ │ +346 │ │ │ │ │ +347 // common │ │ │ │ │ +348 template │ │ │ │ │ +349 template │ │ │ │ │ +_3_5_0 class _R_e_f_i_n_e_m_e_n_t_I_m_p::_C_o_d_i_m:: │ │ │ │ │ +SubEntityIterator │ │ │ │ │ +351 : public ForwardIteratorFacade::template Codim::SubEntityIterator, int>, │ │ │ │ │ +352 public _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ +353 { │ │ │ │ │ +354 public: │ │ │ │ │ +_3_5_5 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +_3_5_6 typedef SubEntityIterator _T_h_i_s; │ │ │ │ │ +357 │ │ │ │ │ +_3_5_8 _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r(int nIntervals, bool end = false); │ │ │ │ │ +359 │ │ │ │ │ +_3_6_0 bool _e_q_u_a_l_s(const _T_h_i_s &other) const; │ │ │ │ │ +361 protected: │ │ │ │ │ +362 using _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l<_d_i_m_e_n_s_i_o_n, CoordType, codimension>:: │ │ │ │ │ +kuhnIndex; │ │ │ │ │ +363 using _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l<_d_i_m_e_n_s_i_o_n, CoordType, codimension>:: │ │ │ │ │ +backend; │ │ │ │ │ +364 }; │ │ │ │ │ +365 │ │ │ │ │ +366#ifndef DOXYGEN │ │ │ │ │ +367 template │ │ │ │ │ +368 template │ │ │ │ │ +369 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_:_: │ │ │ │ │ +370_ _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r(int nIntervals, bool end) │ │ │ │ │ +371 : _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(nIntervals, │ │ │ │ │ +end) │ │ │ │ │ +372 {} │ │ │ │ │ +373 │ │ │ │ │ +374 template │ │ │ │ │ +375 template │ │ │ │ │ +376 bool │ │ │ │ │ +377 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_:_: │ │ │ │ │ +378_ _e_q_u_a_l_s(const This &other) const │ │ │ │ │ +379 { │ │ │ │ │ +380 return ((kuhnIndex == other.kuhnIndex) && (backend == other.backend)); │ │ │ │ │ +381 } │ │ │ │ │ +382#endif │ │ │ │ │ +383 │ │ │ │ │ +384 } // namespace PrismTriangulation │ │ │ │ │ +385 } // namespace RefinementImp │ │ │ │ │ +386 │ │ │ │ │ +387 namespace RefinementImp │ │ │ │ │ +388 { │ │ │ │ │ +389 // /////////////////////// │ │ │ │ │ +390 // │ │ │ │ │ +391 // The refinement traits │ │ │ │ │ +392 // │ │ │ │ │ +393 │ │ │ │ │ +394#ifndef DOXYGEN │ │ │ │ │ +395 template │ │ │ │ │ +396 struct Traits< │ │ │ │ │ +397 topologyId, CoordType, coerceToId, 3, │ │ │ │ │ +398 typename _s_t_d::enable_if< │ │ │ │ │ +399 (GeometryTypes::prism.id() >> 1) == │ │ │ │ │ +400 (topologyId >> 1) && │ │ │ │ │ +401 (GeometryTypes::simplex(3).id() >> 1) == │ │ │ │ │ +402 (coerceToId >> 1) │ │ │ │ │ +403 >::type> │ │ │ │ │ +404 { │ │ │ │ │ +405 typedef PrismTriangulation::RefinementImp<3, CoordType> Imp; │ │ │ │ │ +406 }; │ │ │ │ │ +407#endif │ │ │ │ │ +408 │ │ │ │ │ +409 } // namespace RefinementImp │ │ │ │ │ +410} // namespace Dune │ │ │ │ │ +411 │ │ │ │ │ +412#endif // DUNE_GEOMETRY_REFINEMENT_PRISMTRIANGULATION_CC │ │ │ │ │ +_b_a_s_e_._c_c │ │ │ │ │ +This file contains the parts independent of a particular Refinement │ │ │ │ │ +implementation. │ │ │ │ │ +_s_i_m_p_l_e_x_._c_c │ │ │ │ │ +This file contains the Refinement implementation for simplices (triangles, │ │ │ │ │ +tetrahedrons.... │ │ │ │ │ _t_y_p_e_._h_h │ │ │ │ │ A unique label for each type of element that can occur in a grid. │ │ │ │ │ +_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h │ │ │ │ │ +_s_t_d │ │ │ │ │ +STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn affinegeometry.hh:21 │ │ │ │ │ -_D_u_n_e_:_:_r_e_d_u_c_e_O_r_d_e_r │ │ │ │ │ -void reduceOrder(const InIterator &inBegin, const InIterator &inEnd, │ │ │ │ │ -OutIterator outIt) │ │ │ │ │ -Algorithm to reduce vertex order information. │ │ │ │ │ -DDeeffiinniittiioonn generalvertexorder.hh:40 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s │ │ │ │ │ -Class providing access to the singletons of the reference elements. │ │ │ │ │ -DDeeffiinniittiioonn referenceelements.hh:128 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ -typename Container::ReferenceElement ReferenceElement │ │ │ │ │ -The reference element type. │ │ │ │ │ -DDeeffiinniittiioonn referenceelements.hh:146 │ │ │ │ │ -_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r │ │ │ │ │ -Class providing information on the ordering of vertices. │ │ │ │ │ -DDeeffiinniittiioonn generalvertexorder.hh:67 │ │ │ │ │ -_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_I_n_d_e_x │ │ │ │ │ -Index_ Index │ │ │ │ │ -Type of indices. │ │ │ │ │ -DDeeffiinniittiioonn generalvertexorder.hh:77 │ │ │ │ │ -_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_t_y_p_e │ │ │ │ │ -const GeometryType & type() const │ │ │ │ │ -get type of the entity's geometry │ │ │ │ │ -DDeeffiinniittiioonn generalvertexorder.hh:85 │ │ │ │ │ -_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ -static const std::size_t dimension │ │ │ │ │ -export the dimension of the entity we provide information for │ │ │ │ │ -DDeeffiinniittiioonn generalvertexorder.hh:83 │ │ │ │ │ -_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_g_e_t_R_e_d_u_c_e_d │ │ │ │ │ -void getReduced(std::size_t codim, std::size_t subEntity, std::vector< Index > │ │ │ │ │ -&order) const │ │ │ │ │ -get a vector of reduced indices for some sub-entity │ │ │ │ │ -DDeeffiinniittiioonn generalvertexorder.hh:128 │ │ │ │ │ -_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_e_n_d │ │ │ │ │ -iterator end(std::size_t codim, std::size_t subEntity) const │ │ │ │ │ -get end iterator for the vertex indices of some sub-entity │ │ │ │ │ -DDeeffiinniittiioonn generalvertexorder.hh:115 │ │ │ │ │ -_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r │ │ │ │ │ -GeneralVertexOrder(const GeometryType >_, const InIterator &inBegin, const │ │ │ │ │ -InIterator &inEnd) │ │ │ │ │ -construct a GeneralVertexOrder │ │ │ │ │ -DDeeffiinniittiioonn generalvertexorder.hh:97 │ │ │ │ │ -_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_b_e_g_i_n │ │ │ │ │ -iterator begin(std::size_t codim, std::size_t subEntity) const │ │ │ │ │ -get begin iterator for the vertex indices of some sub-entity │ │ │ │ │ -DDeeffiinniittiioonn generalvertexorder.hh:108 │ │ │ │ │ -_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ -Iterate over the vertex indices of some sub-entity. │ │ │ │ │ -DDeeffiinniittiioonn generalvertexorder.hh:144 │ │ │ │ │ -_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_i_t_e_r_a_t_o_r_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ -iterator() │ │ │ │ │ -public default constructor │ │ │ │ │ -DDeeffiinniittiioonn generalvertexorder.hh:187 │ │ │ │ │ -_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_i_t_e_r_a_t_o_r_:_:_d_e_c_r_e_m_e_n_t │ │ │ │ │ -void decrement() │ │ │ │ │ -DDeeffiinniittiioonn generalvertexorder.hh:169 │ │ │ │ │ -_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_i_t_e_r_a_t_o_r_:_:_a_d_v_a_n_c_e │ │ │ │ │ -void advance(std::ptrdiff_t n) │ │ │ │ │ -DDeeffiinniittiioonn generalvertexorder.hh:170 │ │ │ │ │ -_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_i_t_e_r_a_t_o_r_:_:_d_e_r_e_f_e_r_e_n_c_e │ │ │ │ │ -const Index & dereference() const │ │ │ │ │ -DDeeffiinniittiioonn generalvertexorder.hh:156 │ │ │ │ │ -_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_i_t_e_r_a_t_o_r_:_:_i_n_c_r_e_m_e_n_t │ │ │ │ │ -void increment() │ │ │ │ │ -DDeeffiinniittiioonn generalvertexorder.hh:168 │ │ │ │ │ -_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_i_t_e_r_a_t_o_r_:_:_e_q_u_a_l_s │ │ │ │ │ -bool equals(const iterator &other) const │ │ │ │ │ -DDeeffiinniittiioonn generalvertexorder.hh:164 │ │ │ │ │ -_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_i_t_e_r_a_t_o_r_:_:_d_i_s_t_a_n_c_e_T_o │ │ │ │ │ -std::ptrdiff_t distanceTo(const iterator &other) const │ │ │ │ │ -DDeeffiinniittiioonn generalvertexorder.hh:171 │ │ │ │ │ -_D_u_n_e_:_:_G_e_n_e_r_a_l_V_e_r_t_e_x_O_r_d_e_r_:_:_i_t_e_r_a_t_o_r_:_:_e_l_e_m_e_n_t_A_t │ │ │ │ │ -const Index & elementAt(std::ptrdiff_t n) const │ │ │ │ │ -DDeeffiinniittiioonn generalvertexorder.hh:160 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ -Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:114 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_t_r_a_n_s_f_o_r_m_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ +FieldVector< CoordType, dimension > transformCoordinate(FieldVector< CoordType, │ │ │ │ │ +dimension > point) │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:50 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_g_e_t_P_e_r_m_u_t_a_t_i_o_n │ │ │ │ │ +FieldVector< int, n > getPermutation(int m) │ │ │ │ │ +Calculate permutation from it's index. │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:293 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_r_e_f_e_r_e_n_c_e_T_o_K_u_h_n │ │ │ │ │ +FieldVector< CoordType, dimension > referenceToKuhn(FieldVector< CoordType, │ │ │ │ │ +dimension > point, const FieldVector< int, dimension > &kuhn) │ │ │ │ │ +Map from the reference simplex to some Kuhn simplex. │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:322 │ │ │ │ │ +_D_u_n_e_:_:_C_o_d_i_m │ │ │ │ │ +Static tag representing a codimension. │ │ │ │ │ +DDeeffiinniittiioonn dimension.hh:24 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y │ │ │ │ │ +generic geometry implementation based on corner coordinates │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:181 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:43 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ +Implementation of the refinement of a prism into simplices. │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:67 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ +static constexpr int dimension │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:69 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_c_t_y_p_e │ │ │ │ │ +CoordType ctype │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:71 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_v_E_n_d │ │ │ │ │ +static VertexIterator vEnd(int nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:122 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ +FieldVector< int, dimension+1 > IndexVector │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:78 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_e_E_n_d │ │ │ │ │ +static ElementIterator eEnd(int nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:146 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_n_V_e_r_t_i_c_e_s │ │ │ │ │ +static int nVertices(int nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:106 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +FieldVector< CoordType, dimension > CoordVector │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:76 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_n_E_l_e_m_e_n_t_s │ │ │ │ │ +static int nElements(int nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:130 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ +Codim< 0 >::SubEntityIterator ElementIterator │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:77 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ +Codim< dimension >::SubEntityIterator VertexIterator │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:75 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_e_B_e_g_i_n │ │ │ │ │ +static ElementIterator eBegin(int nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:138 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_v_B_e_g_i_n │ │ │ │ │ +static VertexIterator vBegin(int nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:114 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:98 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ +Dune::MultiLinearGeometry< CoordType, dimension-codimension, dimension > │ │ │ │ │ +Geometry │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:100 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_n_I_n_t_e_r_v_a_l_s__ │ │ │ │ │ +int nIntervals_ │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:178 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ +Refinement::template Codim< dimension >::Geometry Geometry │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:163 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +Refinement::BackendRefinement BackendRefinement │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:174 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_B_a_c_k_e_n_d_I_t_e_r_a_t_o_r │ │ │ │ │ +BackendRefinement::template Codim< dimension >::SubEntityIterator │ │ │ │ │ +BackendIterator │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:175 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +Refinement::CoordVector CoordVector │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:162 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_b_a_c_k_e_n_d_E_n_d │ │ │ │ │ +const BackendIterator backendEnd │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:182 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:161 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_b_a_c_k_e_n_d │ │ │ │ │ +BackendIterator backend │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:181 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_k_u_h_n_I_n_d_e_x │ │ │ │ │ +int kuhnIndex │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:180 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_n_I_n_t_e_r_v_a_l_s__ │ │ │ │ │ +int nIntervals_ │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:265 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ +Refinement::template Codim< 0 >::Geometry Geometry │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:245 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_b_a_c_k_e_n_d │ │ │ │ │ +BackendIterator backend │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:268 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ +Refinement::IndexVector IndexVector │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:243 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_B_a_c_k_e_n_d_I_t_e_r_a_t_o_r │ │ │ │ │ +BackendRefinement::template Codim< 0 >::SubEntityIterator BackendIterator │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:262 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_k_u_h_n_I_n_d_e_x │ │ │ │ │ +int kuhnIndex │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:267 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +Refinement::CoordVector CoordVector │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:244 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:242 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_b_a_c_k_e_n_d_E_n_d │ │ │ │ │ +const BackendIterator backendEnd │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:269 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +Refinement::BackendRefinement BackendRefinement │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:261 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_: │ │ │ │ │ +_T_h_i_s │ │ │ │ │ +SubEntityIterator This │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:356 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_: │ │ │ │ │ +_e_q_u_a_l_s │ │ │ │ │ +bool equals(const This &other) const │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_: │ │ │ │ │ +_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ +DDeeffiinniittiioonn prismtriangulation.cc:355 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_: │ │ │ │ │ +_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ +SubEntityIterator(int nIntervals, bool end=false) │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:361 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00194.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: refinement.hh File Reference │ │ │ │ +dune-geometry: base.cc File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,34 +65,87 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
refinement.hh File Reference
│ │ │ │ +
│ │ │ │ +Classes | │ │ │ │ +Namespaces | │ │ │ │ +Macros | │ │ │ │ +Functions
│ │ │ │ +
base.cc File Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

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

This file contains the parts independent of a particular Refinement implementation. │ │ │ │ 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 <dune/geometry/type.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ +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...
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +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.
 
RefinementIntervals Dune::refinementLevels (int levels)
 Creates a RefinementIntervals object.
 
│ │ │ │

Detailed Description

│ │ │ │ -

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

│ │ │ │ -
│ │ │ │ +

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 {} │ │ │ │ │ @@ -1,21 +1,56 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -refinement.hh File Reference │ │ │ │ │ -This file simply includes all _R_e_f_i_n_e_m_e_n_t implementations so you don't have to │ │ │ │ │ -do them separately. _M_o_r_e_._._. │ │ │ │ │ -#include "_r_e_f_i_n_e_m_e_n_t_/_b_a_s_e_._c_c" │ │ │ │ │ -#include "_r_e_f_i_n_e_m_e_n_t_/_h_c_u_b_e_._c_c" │ │ │ │ │ -#include "_r_e_f_i_n_e_m_e_n_t_/_s_i_m_p_l_e_x_._c_c" │ │ │ │ │ -#include "_r_e_f_i_n_e_m_e_n_t_/_h_c_u_b_e_t_r_i_a_n_g_u_l_a_t_i_o_n_._c_c" │ │ │ │ │ -#include "_r_e_f_i_n_e_m_e_n_t_/_p_r_i_s_m_t_r_i_a_n_g_u_l_a_t_i_o_n_._c_c" │ │ │ │ │ -#include "_r_e_f_i_n_e_m_e_n_t_/_p_y_r_a_m_i_d_t_r_i_a_n_g_u_l_a_t_i_o_n_._c_c" │ │ │ │ │ + * _r_e_f_i_n_e_m_e_n_t │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +base.cc File Reference │ │ │ │ │ +This file contains the parts independent of a particular _R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +implementation. _M_o_r_e_._._. │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +struct   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_T_r_a_i_t_s_<_ _t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_, │ │ │ │ │ + _d_i_m_e_n_s_i_o_n_,_ _D_u_m_m_y_ _> │ │ │ │ │ +  Mapping from ggeeoommeettrryyTTyyppee, CCoooorrddTTyyppee and ccooeerrcceeTToo to a particular │ │ │ │ │ + _R_e_f_i_n_e_m_e_n_t implementation. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s │ │ │ │ │ +  Holds the number of refined intervals per axis needed for virtual and │ │ │ │ │ + static refinement. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_<_ _t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n__ │ │ │ │ │ + _> │ │ │ │ │ +  Wrap each _R_e_f_i_n_e_m_e_n_t implementation to get a consistent interface. │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_<_ _t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n__ │ │ │ │ │ + _>_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ +  The _C_o_d_i_m struct inherited from the _R_e_f_i_n_e_m_e_n_t implementation. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +NNaammeessppaacceess │ │ │ │ │ +namespace   _D_u_n_e │ │ │ │ │ +  │ │ │ │ │ +namespace   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ +  This namespace contains the implementation of _R_e_f_i_n_e_m_e_n_t. │ │ │ │ │ +  │ │ │ │ │ +MMaaccrrooss │ │ │ │ │ +#define  _D_U_N_E___G_E_O_M_E_T_R_Y___R_E_F_I_N_E_M_E_N_T___B_A_S_E___C_C │ │ │ │ │ +  │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s  _D_u_n_e_:_:_r_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s (int intervals) │ │ │ │ │ +  Creates a _R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s object. │ │ │ │ │ +  │ │ │ │ │ +_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s  _D_u_n_e_:_:_r_e_f_i_n_e_m_e_n_t_L_e_v_e_l_s (int levels) │ │ │ │ │ +  Creates a _R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s object. │ │ │ │ │ +  │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -This file simply includes all _R_e_f_i_n_e_m_e_n_t implementations so you don't have to │ │ │ │ │ -do them separately. │ │ │ │ │ +This file contains the parts independent of a particular _R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +implementation. │ │ │ │ │ +********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ +********** _?◆_? DDUUNNEE__GGEEOOMMEETTRRYY__RREEFFIINNEEMMEENNTT__BBAASSEE__CCCC ********** │ │ │ │ │ +#define DUNE_GEOMETRY_REFINEMENT_BASE_CC │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00194_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: refinement.hh Source File │ │ │ │ +dune-geometry: base.cc Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,46 +70,199 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
refinement.hh
│ │ │ │ +
base.cc
│ │ │ │
│ │ │ │
│ │ │ │ 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 © 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_REFINEMENT_BASE_CC
│ │ │ │ +
6#define DUNE_GEOMETRY_REFINEMENT_BASE_CC
│ │ │ │
7
│ │ │ │ -
239// The interface (template<...> class StaticRefinement) is not included here
│ │ │ │ -
240// since it derives from parts which I consider implementation. Look
│ │ │ │ -
241// into refinement/base.cc if the documentation is above is not enough.
│ │ │ │ -
242#include "refinement/base.cc"
│ │ │ │ -
243
│ │ │ │ -
244#include "refinement/hcube.cc"
│ │ │ │ -
245#include "refinement/simplex.cc"
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
249
│ │ │ │ -
250#endif // DUNE_GEOMETRY_REFINEMENT_HH
│ │ │ │ -
This file contains the Refinement implementation for triangulating hypercubes (quadrilateral -> trian...
│ │ │ │ -
This file contains the Refinement implementation for hypercubes (quadrilaterals, hexahedrons,...
│ │ │ │ -
This file contains the Refinement implementation for simplices (triangles, tetrahedrons....
│ │ │ │ - │ │ │ │ -
This file contains the parts independent of a particular Refinement implementation.
│ │ │ │ - │ │ │ │ +
15#include <dune/geometry/type.hh>
│ │ │ │ +
16
│ │ │ │ +
17namespace Dune
│ │ │ │ +
18{
│ │ │ │ +
│ │ │ │ +
28 namespace RefinementImp
│ │ │ │ +
29 {
│ │ │ │ +
30 // /////////////////////////////////
│ │ │ │ +
31 //
│ │ │ │ +
32 // Declaration of RefinementImp::Traits
│ │ │ │ +
33 //
│ │ │ │ +
34
│ │ │ │ +
35#ifdef DOXYGEN
│ │ │ │ +
36 // This is just for Doxygen
│ │ │ │ +
67 template<unsigned topologyId, class CoordType,
│ │ │ │ +
68 unsigned coerceToId, int dimension, class Dummy = void>
│ │ │ │ +
│ │ │ │ +
69 struct Traits
│ │ │ │ +
70 {
│ │ │ │ +
72 typedef SquaringTheCircle::Refinement Imp;
│ │ │ │ +
73 };
│ │ │ │ +
│ │ │ │ +
74
│ │ │ │ +
75#else // !DOXYGEN
│ │ │ │ +
76
│ │ │ │ +
77 // Doxygen won't see this
│ │ │ │ +
78
│ │ │ │ +
79 template<unsigned topologyId, class CoordType,
│ │ │ │ +
80 unsigned coerceToId, int dimension, class = void>
│ │ │ │ +
81 struct Traits;
│ │ │ │ +
82
│ │ │ │ +
83#endif // !DOXYGEN
│ │ │ │ +
84 } // namespace RefinementImp
│ │ │ │ +
│ │ │ │ +
85
│ │ │ │ +
86
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
95 int intervals_=1;
│ │ │ │ +
96
│ │ │ │ +
97 public:
│ │ │ │ +
98 explicit RefinementIntervals(int i) : intervals_(i) {}
│ │ │ │ +
99
│ │ │ │ +
100 int intervals() const { return intervals_; }
│ │ │ │ +
101 };
│ │ │ │ +
│ │ │ │ +
102
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
109 {
│ │ │ │ +
110 return RefinementIntervals{intervals};
│ │ │ │ +
111 }
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
118 {
│ │ │ │ +
119 return RefinementIntervals{1<<levels};
│ │ │ │ +
120 }
│ │ │ │ +
│ │ │ │ +
121
│ │ │ │ +
122 // ///////////////
│ │ │ │ +
123 //
│ │ │ │ +
124 // Static Refinement
│ │ │ │ +
125 //
│ │ │ │ +
126
│ │ │ │ +
136 template<unsigned topologyId, class CoordType,
│ │ │ │ +
137 unsigned coerceToId, int dimension_>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
139 : public RefinementImp::Traits<topologyId, CoordType,
│ │ │ │ +
140 coerceToId, dimension_ >::Imp
│ │ │ │ +
141 {
│ │ │ │ +
142 public:
│ │ │ │ +
143#ifdef DOXYGEN
│ │ │ │ +
149 template<int codimension>
│ │ │ │ +
│ │ │ │ +
150 struct Codim
│ │ │ │ +
151 {
│ │ │ │ + │ │ │ │ +
158 };
│ │ │ │ +
│ │ │ │ +
159
│ │ │ │ + │ │ │ │ + │ │ │ │ +
164
│ │ │ │ +
170 typedef CoordVector;
│ │ │ │ +
171
│ │ │ │ +
177 typedef IndexVector;
│ │ │ │ +
178#endif
│ │ │ │ +
179
│ │ │ │ +
180 typedef typename RefinementImp::Traits< topologyId, CoordType, coerceToId, dimension_>::Imp RefinementImp;
│ │ │ │ +
181
│ │ │ │ +
182 using RefinementImp::dimension;
│ │ │ │ +
183
│ │ │ │ +
184 using RefinementImp::Codim;
│ │ │ │ +
185
│ │ │ │ +
186 using typename RefinementImp::VertexIterator;
│ │ │ │ +
187 using typename RefinementImp::CoordVector;
│ │ │ │ +
188
│ │ │ │ +
189 using typename RefinementImp::ElementIterator;
│ │ │ │ +
190 using typename RefinementImp::IndexVector;
│ │ │ │ +
191
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
198 {
│ │ │ │ +
199 return RefinementImp::nVertices(tag.intervals());
│ │ │ │ +
200 }
│ │ │ │ +
│ │ │ │ +
201
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
208 {
│ │ │ │ +
209 return RefinementImp::vBegin(tag.intervals());
│ │ │ │ +
210 }
│ │ │ │ +
│ │ │ │ +
211
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
218 {
│ │ │ │ +
219 return RefinementImp::vEnd(tag.intervals());
│ │ │ │ +
220 }
│ │ │ │ +
│ │ │ │ +
221
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
228 {
│ │ │ │ +
229 return RefinementImp::nElements(tag.intervals());
│ │ │ │ +
230 }
│ │ │ │ +
│ │ │ │ +
231
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
238 {
│ │ │ │ +
239 return RefinementImp::eBegin(tag.intervals());
│ │ │ │ +
240 }
│ │ │ │ +
│ │ │ │ +
241
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
248 {
│ │ │ │ +
249 return RefinementImp::eEnd(tag.intervals());
│ │ │ │ +
250 }
│ │ │ │ +
│ │ │ │ +
251 };
│ │ │ │ +
│ │ │ │ +
252
│ │ │ │ +
254} // namespace Dune
│ │ │ │ +
255
│ │ │ │ +
256#endif // DUNE_GEOMETRY_REFINEMENT_BASE_CC
│ │ │ │ +
A unique label for each type of element that can occur in a grid.
│ │ │ │ +
RefinementIntervals refinementIntervals(int intervals)
Creates a RefinementIntervals object.
Definition base.cc:108
│ │ │ │ +
RefinementIntervals refinementLevels(int levels)
Creates a RefinementIntervals object.
Definition base.cc:117
│ │ │ │ +
Definition affinegeometry.hh:21
│ │ │ │ +
Mapping from geometryType, CoordType and coerceTo to a particular Refinement implementation.
Definition base.cc:70
│ │ │ │ +
Holds the number of refined intervals per axis needed for virtual and static refinement.
Definition base.cc:94
│ │ │ │ +
RefinementIntervals(int i)
Definition base.cc:98
│ │ │ │ +
int intervals() const
Definition base.cc:100
│ │ │ │ +
Wrap each Refinement implementation to get a consistent interface.
Definition base.cc:141
│ │ │ │ +
static ElementIterator eEnd(Dune::RefinementIntervals tag)
Get an ElementIterator.
Definition base.cc:247
│ │ │ │ +
static ElementIterator eBegin(Dune::RefinementIntervals tag)
Get an ElementIterator.
Definition base.cc:237
│ │ │ │ +
static int nElements(Dune::RefinementIntervals tag)
Get the number of Elements.
Definition base.cc:227
│ │ │ │ +
Codim< 0 >::SubEntityIterator ElementIterator
The ElementIterator of the Refinement.
Definition base.cc:163
│ │ │ │ +
static int nVertices(Dune::RefinementIntervals tag)
Get the number of Vertices.
Definition base.cc:197
│ │ │ │ +
static VertexIterator vBegin(Dune::RefinementIntervals tag)
Get a VertexIterator.
Definition base.cc:207
│ │ │ │ +
Codim< dimension >::SubEntityIterator VertexIterator
The VertexIterator of the Refinement.
Definition base.cc:161
│ │ │ │ +
typedef CoordVector
The CoordVector of the Refinement.
Definition base.cc:170
│ │ │ │ +
typedef IndexVector
The IndexVector of the Refinement.
Definition base.cc:177
│ │ │ │ +
RefinementImp::Traits< topologyId, CoordType, coerceToId, dimension_ >::Imp RefinementImp
Definition base.cc:180
│ │ │ │ +
static VertexIterator vEnd(Dune::RefinementIntervals tag)
Get a VertexIterator.
Definition base.cc:217
│ │ │ │ +
The Codim struct inherited from the Refinement implementation.
Definition base.cc:151
│ │ │ │ +
typedef SubEntityIterator
The SubEntityIterator for each codim.
Definition base.cc:157
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,44 +1,223 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -refinement.hh │ │ │ │ │ + * _r_e_f_i_n_e_m_e_n_t │ │ │ │ │ +base.cc │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 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 © 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_REFINEMENT_BASE_CC │ │ │ │ │ +_6#define DUNE_GEOMETRY_REFINEMENT_BASE_CC │ │ │ │ │ 7 │ │ │ │ │ -239// The interface (template<...> class StaticRefinement) is not included here │ │ │ │ │ -240// since it derives from parts which I consider implementation. Look │ │ │ │ │ -241// into refinement/base.cc if the documentation is above is not enough. │ │ │ │ │ -242#include "_r_e_f_i_n_e_m_e_n_t_/_b_a_s_e_._c_c" │ │ │ │ │ -243 │ │ │ │ │ -244#include "_r_e_f_i_n_e_m_e_n_t_/_h_c_u_b_e_._c_c" │ │ │ │ │ -245#include "_r_e_f_i_n_e_m_e_n_t_/_s_i_m_p_l_e_x_._c_c" │ │ │ │ │ -246#include "_r_e_f_i_n_e_m_e_n_t_/_h_c_u_b_e_t_r_i_a_n_g_u_l_a_t_i_o_n_._c_c" │ │ │ │ │ -247#include "_r_e_f_i_n_e_m_e_n_t_/_p_r_i_s_m_t_r_i_a_n_g_u_l_a_t_i_o_n_._c_c" │ │ │ │ │ -248#include "_r_e_f_i_n_e_m_e_n_t_/_p_y_r_a_m_i_d_t_r_i_a_n_g_u_l_a_t_i_o_n_._c_c" │ │ │ │ │ -249 │ │ │ │ │ -250#endif // DUNE_GEOMETRY_REFINEMENT_HH │ │ │ │ │ -_h_c_u_b_e_t_r_i_a_n_g_u_l_a_t_i_o_n_._c_c │ │ │ │ │ -This file contains the Refinement implementation for triangulating hypercubes │ │ │ │ │ -(quadrilateral -> trian... │ │ │ │ │ -_h_c_u_b_e_._c_c │ │ │ │ │ -This file contains the Refinement implementation for hypercubes │ │ │ │ │ -(quadrilaterals, hexahedrons,... │ │ │ │ │ -_s_i_m_p_l_e_x_._c_c │ │ │ │ │ -This file contains the Refinement implementation for simplices (triangles, │ │ │ │ │ -tetrahedrons.... │ │ │ │ │ -_p_y_r_a_m_i_d_t_r_i_a_n_g_u_l_a_t_i_o_n_._c_c │ │ │ │ │ -_b_a_s_e_._c_c │ │ │ │ │ -This file contains the parts independent of a particular Refinement │ │ │ │ │ +15#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ +16 │ │ │ │ │ +17namespace _D_u_n_e │ │ │ │ │ +18{ │ │ │ │ │ +_2_8 namespace RefinementImp │ │ │ │ │ +29 { │ │ │ │ │ +30 // ///////////////////////////////// │ │ │ │ │ +31 // │ │ │ │ │ +32 // Declaration of RefinementImp::Traits │ │ │ │ │ +33 // │ │ │ │ │ +34 │ │ │ │ │ +35#ifdef DOXYGEN │ │ │ │ │ +36 // This is just for Doxygen │ │ │ │ │ +67 template │ │ │ │ │ +_6_9 struct _T_r_a_i_t_s │ │ │ │ │ +70 { │ │ │ │ │ +72 typedef SquaringTheCircle::Refinement Imp; │ │ │ │ │ +73 }; │ │ │ │ │ +74 │ │ │ │ │ +75#else // !DOXYGEN │ │ │ │ │ +76 │ │ │ │ │ +77 // Doxygen won't see this │ │ │ │ │ +78 │ │ │ │ │ +79 template │ │ │ │ │ +81 struct _T_r_a_i_t_s; │ │ │ │ │ +82 │ │ │ │ │ +83#endif // !DOXYGEN │ │ │ │ │ +84 } // namespace RefinementImp │ │ │ │ │ +85 │ │ │ │ │ +86 │ │ │ │ │ +_9_4 class _R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s{ │ │ │ │ │ +95 int intervals_=1; │ │ │ │ │ +96 │ │ │ │ │ +97 public: │ │ │ │ │ +_9_8 explicit _R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s(int i) : intervals_(i) {} │ │ │ │ │ +99 │ │ │ │ │ +_1_0_0 int _i_n_t_e_r_v_a_l_s() const { return intervals_; } │ │ │ │ │ +101 }; │ │ │ │ │ +102 │ │ │ │ │ +_1_0_8 inline _R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s _r_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s(int intervals) │ │ │ │ │ +109 { │ │ │ │ │ +110 return _R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s{intervals}; │ │ │ │ │ +111 } │ │ │ │ │ +_1_1_7 inline _R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s _r_e_f_i_n_e_m_e_n_t_L_e_v_e_l_s(int levels) │ │ │ │ │ +118 { │ │ │ │ │ +119 return _R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s{1< │ │ │ │ │ +_1_3_8 class _S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +139 : public _R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_T_r_a_i_t_s::Imp │ │ │ │ │ +141 { │ │ │ │ │ +142 public: │ │ │ │ │ +143#ifdef DOXYGEN │ │ │ │ │ +149 template │ │ │ │ │ +_1_5_0 struct _C_o_d_i_m │ │ │ │ │ +151 { │ │ │ │ │ +_1_5_7 typedef _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r; │ │ │ │ │ +158 }; │ │ │ │ │ +159 │ │ │ │ │ +_1_6_1 typedef _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _V_e_r_t_e_x_I_t_e_r_a_t_o_r; │ │ │ │ │ +_1_6_3 typedef _C_o_d_i_m_<_0_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r; │ │ │ │ │ +164 │ │ │ │ │ +_1_7_0 typedef _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ +171 │ │ │ │ │ +_1_7_7 typedef _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ +178#endif │ │ │ │ │ +179 │ │ │ │ │ +_1_8_0 typedef typename RefinementImp::Traits< topologyId, CoordType, coerceToId, │ │ │ │ │ +dimension_>::Imp _R_e_f_i_n_e_m_e_n_t_I_m_p; │ │ │ │ │ +181 │ │ │ │ │ +182 using RefinementImp::dimension; │ │ │ │ │ +183 │ │ │ │ │ +184 using RefinementImp::Codim; │ │ │ │ │ +185 │ │ │ │ │ +186 using typename RefinementImp::VertexIterator; │ │ │ │ │ +187 using typename RefinementImp::CoordVector; │ │ │ │ │ +188 │ │ │ │ │ +189 using typename RefinementImp::ElementIterator; │ │ │ │ │ +190 using typename RefinementImp::IndexVector; │ │ │ │ │ +191 │ │ │ │ │ +_1_9_7 static int _n_V_e_r_t_i_c_e_s(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) │ │ │ │ │ +198 { │ │ │ │ │ +199 return RefinementImp::nVertices(tag._i_n_t_e_r_v_a_l_s()); │ │ │ │ │ +200 } │ │ │ │ │ +201 │ │ │ │ │ +_2_0_7 static _V_e_r_t_e_x_I_t_e_r_a_t_o_r _v_B_e_g_i_n(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) │ │ │ │ │ +208 { │ │ │ │ │ +209 return RefinementImp::vBegin(tag._i_n_t_e_r_v_a_l_s()); │ │ │ │ │ +210 } │ │ │ │ │ +211 │ │ │ │ │ +_2_1_7 static _V_e_r_t_e_x_I_t_e_r_a_t_o_r _v_E_n_d(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) │ │ │ │ │ +218 { │ │ │ │ │ +219 return RefinementImp::vEnd(tag._i_n_t_e_r_v_a_l_s()); │ │ │ │ │ +220 } │ │ │ │ │ +221 │ │ │ │ │ +_2_2_7 static int _n_E_l_e_m_e_n_t_s(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) │ │ │ │ │ +228 { │ │ │ │ │ +229 return RefinementImp::nElements(tag._i_n_t_e_r_v_a_l_s()); │ │ │ │ │ +230 } │ │ │ │ │ +231 │ │ │ │ │ +_2_3_7 static _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r _e_B_e_g_i_n(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) │ │ │ │ │ +238 { │ │ │ │ │ +239 return RefinementImp::eBegin(tag._i_n_t_e_r_v_a_l_s()); │ │ │ │ │ +240 } │ │ │ │ │ +241 │ │ │ │ │ +_2_4_7 static _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r _e_E_n_d(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) │ │ │ │ │ +248 { │ │ │ │ │ +249 return RefinementImp::eEnd(tag._i_n_t_e_r_v_a_l_s()); │ │ │ │ │ +250 } │ │ │ │ │ +251 }; │ │ │ │ │ +252 │ │ │ │ │ +254} // namespace Dune │ │ │ │ │ +255 │ │ │ │ │ +256#endif // DUNE_GEOMETRY_REFINEMENT_BASE_CC │ │ │ │ │ +_t_y_p_e_._h_h │ │ │ │ │ +A unique label for each type of element that can occur in a grid. │ │ │ │ │ +_D_u_n_e_:_:_r_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s │ │ │ │ │ +RefinementIntervals refinementIntervals(int intervals) │ │ │ │ │ +Creates a RefinementIntervals object. │ │ │ │ │ +DDeeffiinniittiioonn base.cc:108 │ │ │ │ │ +_D_u_n_e_:_:_r_e_f_i_n_e_m_e_n_t_L_e_v_e_l_s │ │ │ │ │ +RefinementIntervals refinementLevels(int levels) │ │ │ │ │ +Creates a RefinementIntervals object. │ │ │ │ │ +DDeeffiinniittiioonn base.cc:117 │ │ │ │ │ +_D_u_n_e │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:21 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_T_r_a_i_t_s │ │ │ │ │ +Mapping from geometryType, CoordType and coerceTo to a particular Refinement │ │ │ │ │ implementation. │ │ │ │ │ -_p_r_i_s_m_t_r_i_a_n_g_u_l_a_t_i_o_n_._c_c │ │ │ │ │ +DDeeffiinniittiioonn base.cc:70 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s │ │ │ │ │ +Holds the number of refined intervals per axis needed for virtual and static │ │ │ │ │ +refinement. │ │ │ │ │ +DDeeffiinniittiioonn base.cc:94 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s │ │ │ │ │ +RefinementIntervals(int i) │ │ │ │ │ +DDeeffiinniittiioonn base.cc:98 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s_:_:_i_n_t_e_r_v_a_l_s │ │ │ │ │ +int intervals() const │ │ │ │ │ +DDeeffiinniittiioonn base.cc:100 │ │ │ │ │ +_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +Wrap each Refinement implementation to get a consistent interface. │ │ │ │ │ +DDeeffiinniittiioonn base.cc:141 │ │ │ │ │ +_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_e_E_n_d │ │ │ │ │ +static ElementIterator eEnd(Dune::RefinementIntervals tag) │ │ │ │ │ +Get an ElementIterator. │ │ │ │ │ +DDeeffiinniittiioonn base.cc:247 │ │ │ │ │ +_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_e_B_e_g_i_n │ │ │ │ │ +static ElementIterator eBegin(Dune::RefinementIntervals tag) │ │ │ │ │ +Get an ElementIterator. │ │ │ │ │ +DDeeffiinniittiioonn base.cc:237 │ │ │ │ │ +_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_n_E_l_e_m_e_n_t_s │ │ │ │ │ +static int nElements(Dune::RefinementIntervals tag) │ │ │ │ │ +Get the number of Elements. │ │ │ │ │ +DDeeffiinniittiioonn base.cc:227 │ │ │ │ │ +_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ +Codim< 0 >::SubEntityIterator ElementIterator │ │ │ │ │ +The ElementIterator of the Refinement. │ │ │ │ │ +DDeeffiinniittiioonn base.cc:163 │ │ │ │ │ +_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_n_V_e_r_t_i_c_e_s │ │ │ │ │ +static int nVertices(Dune::RefinementIntervals tag) │ │ │ │ │ +Get the number of Vertices. │ │ │ │ │ +DDeeffiinniittiioonn base.cc:197 │ │ │ │ │ +_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_v_B_e_g_i_n │ │ │ │ │ +static VertexIterator vBegin(Dune::RefinementIntervals tag) │ │ │ │ │ +Get a VertexIterator. │ │ │ │ │ +DDeeffiinniittiioonn base.cc:207 │ │ │ │ │ +_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ +Codim< dimension >::SubEntityIterator VertexIterator │ │ │ │ │ +The VertexIterator of the Refinement. │ │ │ │ │ +DDeeffiinniittiioonn base.cc:161 │ │ │ │ │ +_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +typedef CoordVector │ │ │ │ │ +The CoordVector of the Refinement. │ │ │ │ │ +DDeeffiinniittiioonn base.cc:170 │ │ │ │ │ +_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ +typedef IndexVector │ │ │ │ │ +The IndexVector of the Refinement. │ │ │ │ │ +DDeeffiinniittiioonn base.cc:177 │ │ │ │ │ +_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ +RefinementImp::Traits< topologyId, CoordType, coerceToId, dimension_ >::Imp │ │ │ │ │ +RefinementImp │ │ │ │ │ +DDeeffiinniittiioonn base.cc:180 │ │ │ │ │ +_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_v_E_n_d │ │ │ │ │ +static VertexIterator vEnd(Dune::RefinementIntervals tag) │ │ │ │ │ +Get a VertexIterator. │ │ │ │ │ +DDeeffiinniittiioonn base.cc:217 │ │ │ │ │ +_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m │ │ │ │ │ +The Codim struct inherited from the Refinement implementation. │ │ │ │ │ +DDeeffiinniittiioonn base.cc:151 │ │ │ │ │ +_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ +typedef SubEntityIterator │ │ │ │ │ +The SubEntityIterator for each codim. │ │ │ │ │ +DDeeffiinniittiioonn base.cc:157 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00197.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: virtualrefinement.hh File Reference │ │ │ │ +dune-geometry: simplex.cc File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,59 +65,105 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ -Functions
│ │ │ │ -
virtualrefinement.hh File Reference
│ │ │ │ +Macros
│ │ │ │ +
simplex.cc File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

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

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

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

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::VirtualRefinement< dimension, CoordType >
 VirtualRefinement base class. More...
class  Dune::RefinementImp::Simplex::RefinementImp< dimension_, CoordType >
 
struct  Dune::VirtualRefinement< dimension, CoordType >::Codim< codimension >
 codim database of VirtualRefinement 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

template<int dimension, class CoordType >
VirtualRefinement< dimension, CoordType > & Dune::buildRefinement (GeometryType geometryType, GeometryType coerceTo)
 return a reference to the VirtualRefinement according to the parameters
 
Utilities
template<int dimension>
int Dune::RefinementImp::Simplex::pointIndex (const FieldVector< int, dimension > &point)
 calculate the index of a given gridpoint within a Kuhn0 simplex
 
template<int n>
FieldVector< int, n > Dune::RefinementImp::Simplex::getPermutation (int m)
 Calculate permutation from it's index.
 
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.
 
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.
 
│ │ │ │

Detailed Description

│ │ │ │ -

This file contains the virtual wrapper around refinement.

│ │ │ │ -
│ │ │ │ +

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 {} │ │ │ │ │ @@ -1,37 +1,86 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -virtualrefinement.hh File Reference │ │ │ │ │ -This file contains the virtual wrapper around refinement. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ + * _r_e_f_i_n_e_m_e_n_t │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s │ │ │ │ │ +simplex.cc File Reference │ │ │ │ │ +This file contains the _R_e_f_i_n_e_m_e_n_t implementation for simplices (triangles, │ │ │ │ │ +tetrahedrons...) _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include "_r_e_f_i_n_e_m_e_n_t_._h_h" │ │ │ │ │ -#include "_t_y_p_e_._h_h" │ │ │ │ │ -#include "_v_i_r_t_u_a_l_r_e_f_i_n_e_m_e_n_t_._c_c" │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_m_u_l_t_i_l_i_n_e_a_r_g_e_o_m_e_t_r_y_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ +#include "_b_a_s_e_._c_c" │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ - class   _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_ _> │ │ │ │ │ -  _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t base class. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___,_ _C_o_o_r_d_T_y_p_e_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_ _>_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ -  codim database of _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___,_ _C_o_o_r_d_T_y_p_e_ _>_:_: │ │ │ │ │ + _C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ + _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ + _C_o_o_r_d_T_y_p_e_,_ _0_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___,_ _C_o_o_r_d_T_y_p_e_ _>_:_: │ │ │ │ │ + _C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ +namespace   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ +  This namespace contains the implementation of _R_e_f_i_n_e_m_e_n_t. │ │ │ │ │ +  │ │ │ │ │ +namespace   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x │ │ │ │ │ +  This namespace contains the _R_e_f_i_n_e_m_e_n_t implementation for simplices │ │ │ │ │ + (triangles, tetrahedrons...) │ │ │ │ │ +  │ │ │ │ │ +MMaaccrrooss │ │ │ │ │ +#define  _D_U_N_E___G_R_I_D___C_O_M_M_O_N___R_E_F_I_N_E_M_E_N_T___S_I_M_P_L_E_X___C_C │ │ │ │ │ +  │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ +Utilities │ │ │ │ │ +template │ │ │ │ │ + int  _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_p_o_i_n_t_I_n_d_e_x │ │ │ │ │ + (const FieldVector< int, dimension > │ │ │ │ │ + &point) │ │ │ │ │ +  calculate the index of a given gridpoint │ │ │ │ │ + within a Kuhn0 simplex │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + FieldVector< int, n >  _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_: │ │ │ │ │ + _g_e_t_P_e_r_m_u_t_a_t_i_o_n (int m) │ │ │ │ │ +  Calculate permutation from it's index. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +FieldVector< CoordType, dimension >  _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_: │ │ │ │ │ + _r_e_f_e_r_e_n_c_e_T_o_K_u_h_n (FieldVector< CoordType, │ │ │ │ │ + dimension > point, const FieldVector< int, │ │ │ │ │ + dimension > &kuhn) │ │ │ │ │ +  Map from the reference simplex to some │ │ │ │ │ + Kuhn simplex. │ │ │ │ │ +  │ │ │ │ │ template │ │ │ │ │ -_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t< dimension, CoordType > _D_u_n_e_:_:_b_u_i_l_d_R_e_f_i_n_e_m_e_n_t (_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ - &  geometryType, _G_e_o_m_e_t_r_y_T_y_p_e coerceTo) │ │ │ │ │ - return a reference to the │ │ │ │ │ -  _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t according to the │ │ │ │ │ - parameters │ │ │ │ │ +FieldVector< CoordType, dimension >  _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_: │ │ │ │ │ + _k_u_h_n_T_o_R_e_f_e_r_e_n_c_e (FieldVector< CoordType, │ │ │ │ │ + dimension > point, const FieldVector< int, │ │ │ │ │ + dimension > &kuhn) │ │ │ │ │ +  Map from some Kuhn simplex to the │ │ │ │ │ + reference simplex. │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -This file contains the virtual wrapper around refinement. │ │ │ │ │ +This file contains the _R_e_f_i_n_e_m_e_n_t implementation for simplices (triangles, │ │ │ │ │ +tetrahedrons...) │ │ │ │ │ +See _R_e_f_i_n_e_m_e_n_t_ _i_m_p_l_e_m_e_n_t_a_t_i_o_n_ _f_o_r_ _s_i_m_p_l_i_c_e_s. │ │ │ │ │ +********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ +********** _?◆_? DDUUNNEE__GGRRIIDD__CCOOMMMMOONN__RREEFFIINNEEMMEENNTT__SSIIMMPPLLEEXX__CCCC ********** │ │ │ │ │ +#define DUNE_GRID_COMMON_REFINEMENT_SIMPLEX_CC │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00197_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: virtualrefinement.hh Source File │ │ │ │ +dune-geometry: simplex.cc Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,139 +70,621 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
virtualrefinement.hh
│ │ │ │ +
simplex.cc
│ │ │ │
│ │ │ │
│ │ │ │ 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 © 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_VIRTUALREFINEMENT_HH
│ │ │ │ -
6#define DUNE_GEOMETRY_VIRTUALREFINEMENT_HH
│ │ │ │ +
5#ifndef DUNE_GRID_COMMON_REFINEMENT_SIMPLEX_CC
│ │ │ │ +
6#define DUNE_GRID_COMMON_REFINEMENT_SIMPLEX_CC
│ │ │ │
7
│ │ │ │ -
257#include <vector>
│ │ │ │ -
258
│ │ │ │ -
259#include <dune/common/fvector.hh>
│ │ │ │ -
260
│ │ │ │ -
261#include "refinement.hh"
│ │ │ │ -
262#include "type.hh"
│ │ │ │ -
263
│ │ │ │ -
264namespace Dune
│ │ │ │ -
265{
│ │ │ │ -
266 // //////////////////////////////////////////
│ │ │ │ -
267 //
│ │ │ │ -
268 // The virtual base class and its iterators
│ │ │ │ -
269 //
│ │ │ │ +
8// This file is part of DUNE, a Distributed and Unified Numerics Environment
│ │ │ │ +
9// This file is copyright (C) 2005 Jorrit Fahlke <jorrit@jorrit.de>
│ │ │ │ +
10// This file is licensed under version 2 of the GNU General Public License,
│ │ │ │ +
11// with a special "runtime exception." See COPYING at the top of the source
│ │ │ │ +
12// tree for the full licence.
│ │ │ │ +
13
│ │ │ │ +
243#include <algorithm>
│ │ │ │ +
244
│ │ │ │ +
245#include <dune/common/fvector.hh>
│ │ │ │ +
246#include <dune/common/math.hh>
│ │ │ │ +
247
│ │ │ │ + │ │ │ │ + │ │ │ │ +
250#include <dune/geometry/type.hh>
│ │ │ │ +
251
│ │ │ │ +
252#include "base.cc"
│ │ │ │ +
253
│ │ │ │ +
254namespace Dune {
│ │ │ │ +
255
│ │ │ │ +
256 namespace RefinementImp {
│ │ │ │ +
257
│ │ │ │ +
│ │ │ │ +
264 namespace Simplex {
│ │ │ │ +
265
│ │ │ │ +
266 // //////////////////
│ │ │ │ +
267 //
│ │ │ │ +
269 //
│ │ │ │
270
│ │ │ │ -
271 //
│ │ │ │ -
272 // Refinement
│ │ │ │ -
273 //
│ │ │ │ -
274
│ │ │ │ -
281 template<int dimension, class CoordType>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
283 {
│ │ │ │ -
284 public:
│ │ │ │ -
285 template<int codimension>
│ │ │ │ -
286 struct Codim;
│ │ │ │ - │ │ │ │ - │ │ │ │ -
291
│ │ │ │ -
297 typedef FieldVector<CoordType, dimension> CoordVector;
│ │ │ │ -
303 typedef std::vector<int> IndexVector;
│ │ │ │ -
304
│ │ │ │ -
305 template<int codimension>
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
309
│ │ │ │ -
315 virtual int nVertices(Dune::RefinementIntervals tag) const = 0;
│ │ │ │ -
316
│ │ │ │ - │ │ │ │ -
323
│ │ │ │ - │ │ │ │ -
330
│ │ │ │ -
336 virtual int nElements(Dune::RefinementIntervals tag) const = 0;
│ │ │ │ -
337
│ │ │ │ - │ │ │ │ -
344
│ │ │ │ - │ │ │ │ +
272
│ │ │ │ +
279 template<int dimension>
│ │ │ │ +
│ │ │ │ +
280 int pointIndex(const FieldVector<int, dimension> &point)
│ │ │ │ +
281 {
│ │ │ │ +
282 int index = 0;
│ │ │ │ +
283 for(int i = 0; i < dimension; ++i)
│ │ │ │ +
284 index += Dune::binomial(dimension-i + point[i]-1, dimension-i);
│ │ │ │ +
285 return index;
│ │ │ │ +
286 }
│ │ │ │ +
│ │ │ │ +
287
│ │ │ │ +
292 template<int n>
│ │ │ │ +
│ │ │ │ +
293 FieldVector<int, n> getPermutation(int m)
│ │ │ │ +
294 {
│ │ │ │ +
295 FieldVector<int, n> perm;
│ │ │ │ +
296 for(int i = 0; i < n; ++i)
│ │ │ │ +
297 perm[i] = i;
│ │ │ │ +
298
│ │ │ │ +
299 int base = 1;
│ │ │ │ +
300 for(int i = 1; i <= n; ++i)
│ │ │ │ +
301 base *= i;
│ │ │ │ +
302
│ │ │ │ +
303 for(int i = n; i > 0; --i) {
│ │ │ │ +
304 base /= i;
│ │ │ │ +
305 int d = m / base;
│ │ │ │ +
306 m %= base;
│ │ │ │ +
307 int t = perm[i-1]; perm[i-1] = perm[i-1-d]; perm[i-1-d] = t;
│ │ │ │ +
308 }
│ │ │ │ +
309 return perm;
│ │ │ │ +
310 }
│ │ │ │ +
│ │ │ │ +
311
│ │ │ │ +
312 // map between the reference simplex and some arbitrary kuhn simplex (denoted by it's permutation)
│ │ │ │ +
320 template<int dimension, class CoordType>
│ │ │ │ +
321 FieldVector<CoordType, dimension>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
323 FieldVector<CoordType, dimension> point,
│ │ │ │ +
325 const FieldVector<int, dimension> &kuhn)
│ │ │ │ +
326 {
│ │ │ │ +
327 for(int i = dimension - 1; i > 0; --i)
│ │ │ │ +
328 point[kuhn[i-1]] += point[kuhn[i]];
│ │ │ │ +
329 return point;
│ │ │ │ +
330 }
│ │ │ │ +
│ │ │ │ +
331
│ │ │ │ +
339 template<int dimension, class CoordType>
│ │ │ │ +
340 FieldVector<CoordType, dimension>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
342 FieldVector<CoordType, dimension> point,
│ │ │ │ +
344 const FieldVector<int, dimension> &kuhn)
│ │ │ │ +
345 {
│ │ │ │ +
346 for(int i = 0; i < dimension - 1; ++i)
│ │ │ │ +
347 point[kuhn[i]] -= point[kuhn[i+1]];
│ │ │ │ +
348 return point;
│ │ │ │ +
349 }
│ │ │ │ +
│ │ │ │ +
350
│ │ │ │
351
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
354 {}
│ │ │ │ -
│ │ │ │ -
355
│ │ │ │ -
356 protected:
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
361 };
│ │ │ │ -
│ │ │ │ -
362
│ │ │ │ -
364 template<int dimension, class CoordType>
│ │ │ │ -
365 template<int codimension>
│ │ │ │ -
│ │ │ │ -
366 struct VirtualRefinement<dimension, CoordType>::Codim
│ │ │ │ -
367 {
│ │ │ │ -
368 class SubEntityIterator;
│ │ │ │ -
369 };
│ │ │ │ -
│ │ │ │ -
370
│ │ │ │ -
371 // ////////////////////////
│ │ │ │ -
372 //
│ │ │ │ -
373 // The refinement builder
│ │ │ │ -
374 //
│ │ │ │ -
375
│ │ │ │ -
376 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
378 buildRefinement(GeometryType geometryType, GeometryType coerceTo);
│ │ │ │ -
379
│ │ │ │ -
380} // namespace Dune
│ │ │ │ +
353
│ │ │ │ +
354 // /////////////////////////////////////////
│ │ │ │ +
355 //
│ │ │ │ +
356 // refinement implementation for simplices
│ │ │ │ +
357 //
│ │ │ │ +
358
│ │ │ │ +
359 template<int dimension_, class CoordType>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
361 {
│ │ │ │ +
362 public:
│ │ │ │ +
363 constexpr static int dimension = dimension_;
│ │ │ │ +
364 typedef CoordType ctype;
│ │ │ │ +
365
│ │ │ │ +
366 template<int codimension>
│ │ │ │ +
367 struct Codim;
│ │ │ │ + │ │ │ │ +
369 typedef FieldVector<CoordType, dimension> CoordVector;
│ │ │ │ + │ │ │ │ +
371 typedef FieldVector<int, dimension+1> IndexVector;
│ │ │ │ +
372
│ │ │ │ +
373 static int nVertices(int nIntervals);
│ │ │ │ +
374 static VertexIterator vBegin(int nIntervals);
│ │ │ │ +
375 static VertexIterator vEnd(int nIntervals);
│ │ │ │ +
376
│ │ │ │ +
377 static int nElements(int nIntervals);
│ │ │ │ +
378 static ElementIterator eBegin(int nIntervals);
│ │ │ │ +
379 static ElementIterator eEnd(int nIntervals);
│ │ │ │ +
380 };
│ │ │ │ +
│ │ │ │
381
│ │ │ │ -
382#include "virtualrefinement.cc"
│ │ │ │ -
383
│ │ │ │ -
384#endif // DUNE_GEOMETRY_VIRTUALREFINEMENT_HH
│ │ │ │ -
This file contains the virtual wrapper around refinement.
│ │ │ │ -
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.
│ │ │ │ +
382 template<int dimension, class CoordType>
│ │ │ │ +
383 template<int codimension>
│ │ │ │ +
│ │ │ │ +
384 struct RefinementImp<dimension, CoordType>::Codim
│ │ │ │ +
385 {
│ │ │ │ +
386 class SubEntityIterator;
│ │ │ │ +
387 // We don't need the caching, but the uncached MultiLinearGeometry has bug FS#1209
│ │ │ │ + │ │ │ │ +
389 };
│ │ │ │ +
│ │ │ │ +
390
│ │ │ │ +
391 template<int dimension, class CoordType>
│ │ │ │ +
392 int
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
394 nVertices(int nIntervals)
│ │ │ │ +
395 {
│ │ │ │ +
396 return Dune::binomial(dimension + nIntervals, (int)dimension);
│ │ │ │ +
397 }
│ │ │ │ +
│ │ │ │ +
398
│ │ │ │ +
399 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
402 vBegin(int nIntervals)
│ │ │ │ +
403 {
│ │ │ │ +
404 return VertexIterator(nIntervals);
│ │ │ │ +
405 }
│ │ │ │ +
│ │ │ │ +
406
│ │ │ │ +
407 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
410 vEnd(int nIntervals)
│ │ │ │ +
411 {
│ │ │ │ +
412 return VertexIterator(nIntervals, true);
│ │ │ │ +
413 }
│ │ │ │ +
│ │ │ │ +
414
│ │ │ │ +
415 template<int dimension, class CoordType>
│ │ │ │ +
416 int
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
418 nElements(int nIntervals)
│ │ │ │ +
419 {
│ │ │ │ +
420 return Dune::power(nIntervals, int(dimension));
│ │ │ │ +
421 }
│ │ │ │ +
│ │ │ │ +
422
│ │ │ │ +
423 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
426 eBegin(int nIntervals)
│ │ │ │ +
427 {
│ │ │ │ +
428 return ElementIterator(nIntervals);
│ │ │ │ +
429 }
│ │ │ │ +
│ │ │ │ +
430
│ │ │ │ +
431 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
434 eEnd(int nIntervals)
│ │ │ │ +
435 {
│ │ │ │ +
436 return ElementIterator(nIntervals, true);
│ │ │ │ +
437 }
│ │ │ │ +
│ │ │ │ +
438
│ │ │ │ +
439 // //////////////
│ │ │ │ +
440 //
│ │ │ │ +
441 // The iterator
│ │ │ │ +
442 //
│ │ │ │ +
443
│ │ │ │ +
444 template<int dimension, class CoordType, int codimension>
│ │ │ │ + │ │ │ │ +
446
│ │ │ │ +
447 // vertices
│ │ │ │ +
448
│ │ │ │ +
449 template<int dimension, class CoordType>
│ │ │ │ +
│ │ │ │ +
450 class RefinementIteratorSpecial<dimension, CoordType, dimension>
│ │ │ │ +
451 {
│ │ │ │ +
452 public:
│ │ │ │ + │ │ │ │ +
454 typedef typename Refinement::CoordVector CoordVector;
│ │ │ │ +
455 typedef typename Refinement::template Codim<dimension>::Geometry Geometry;
│ │ │ │ + │ │ │ │ +
457
│ │ │ │ +
458 RefinementIteratorSpecial(int nIntervals, bool end = false);
│ │ │ │ +
459
│ │ │ │ +
460 void increment();
│ │ │ │ +
461 bool equals(const This &other) const;
│ │ │ │ +
462
│ │ │ │ +
463 CoordVector coords() const;
│ │ │ │ +
464 Geometry geometry () const;
│ │ │ │ +
465
│ │ │ │ +
466 int index() const;
│ │ │ │ +
467 protected:
│ │ │ │ +
468 typedef FieldVector<int, dimension> Vertex;
│ │ │ │ +
469
│ │ │ │ +
470 int size;
│ │ │ │ + │ │ │ │ +
472 };
│ │ │ │ +
│ │ │ │ +
473
│ │ │ │ +
474 template<int dimension, class CoordType>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
476 RefinementIteratorSpecial(int nIntervals, bool end)
│ │ │ │ +
477 : size(nIntervals)
│ │ │ │ +
478 {
│ │ │ │ +
479 vertex[0] = (end) ? size + 1 : 0;
│ │ │ │ +
480 for(int i = 1; i < dimension; ++ i)
│ │ │ │ +
481 vertex[i] = 0;
│ │ │ │ +
482 }
│ │ │ │ +
│ │ │ │ +
483
│ │ │ │ +
484 template<int dimension, class CoordType>
│ │ │ │ +
485 void
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
488 {
│ │ │ │ +
489 assert(vertex[0] <= size);
│ │ │ │ +
490 for(int i = dimension - 1; i >= 0; --i) {
│ │ │ │ +
491 ++vertex[i];
│ │ │ │ +
492 if(i == 0 || vertex[i] <= vertex[i-1])
│ │ │ │ +
493 break;
│ │ │ │ +
494 else
│ │ │ │ +
495 vertex[i] = 0;
│ │ │ │ +
496 }
│ │ │ │ +
497 }
│ │ │ │ +
│ │ │ │ +
498
│ │ │ │ +
499 template<int dimension, class CoordType>
│ │ │ │ +
500 bool
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
502 equals(const This &other) const
│ │ │ │ +
503 {
│ │ │ │ +
504 return size == other.size && vertex == other.vertex;
│ │ │ │ +
505 }
│ │ │ │ +
│ │ │ │ +
506
│ │ │ │ +
507 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
510 coords() const
│ │ │ │ +
511 {
│ │ │ │ +
512 Vertex ref = kuhnToReference(vertex, getPermutation<dimension>(0));
│ │ │ │ +
513
│ │ │ │ +
514 CoordVector coords;
│ │ │ │ +
515 for(int i = 0; i < dimension; ++i)
│ │ │ │ +
516 coords[i] = CoordType(ref[i]) / size;
│ │ │ │ +
517 return coords;
│ │ │ │ +
518 }
│ │ │ │ +
│ │ │ │ +
519
│ │ │ │ +
520 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
523 {
│ │ │ │ +
524 std::vector<CoordVector> corners(1);
│ │ │ │ +
525 corners[0] = (CoordVector)vertex;
│ │ │ │ +
526 return Geometry(GeometryTypes::vertex, corners);
│ │ │ │ +
527 }
│ │ │ │ +
│ │ │ │ +
528
│ │ │ │ +
529 template<int dimension, class CoordType>
│ │ │ │ +
530 int
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
532 index() const
│ │ │ │ +
533 {
│ │ │ │ +
534 return pointIndex(vertex);
│ │ │ │ +
535 }
│ │ │ │ +
│ │ │ │ +
536
│ │ │ │ +
537 // elements
│ │ │ │ +
538
│ │ │ │ +
539 template<int dimension, class CoordType>
│ │ │ │ +
│ │ │ │ +
540 class RefinementIteratorSpecial<dimension, CoordType, 0>
│ │ │ │ +
541 {
│ │ │ │ +
542 public:
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
546 typedef typename Refinement::template Codim<0>::Geometry Geometry;
│ │ │ │ + │ │ │ │ +
548
│ │ │ │ +
549 RefinementIteratorSpecial(int nIntervals, bool end = false);
│ │ │ │ +
550
│ │ │ │ +
551 void increment();
│ │ │ │ +
552 bool equals(const This &other) const;
│ │ │ │ +
553
│ │ │ │ +
554 IndexVector vertexIndices() const;
│ │ │ │ +
555 int index() const;
│ │ │ │ +
556 CoordVector coords() const;
│ │ │ │ +
557
│ │ │ │ +
558 Geometry geometry () const;
│ │ │ │ +
559
│ │ │ │ +
560 private:
│ │ │ │ +
561 CoordVector global(const CoordVector &local) const;
│ │ │ │ +
562
│ │ │ │ +
563 protected:
│ │ │ │ +
564 typedef FieldVector<int, dimension> Vertex;
│ │ │ │ +
565 constexpr static int nKuhnIntervals = Dune::factorial(dimension);
│ │ │ │ +
566
│ │ │ │ + │ │ │ │ + │ │ │ │ +
569 int size;
│ │ │ │ + │ │ │ │ +
571 };
│ │ │ │ +
│ │ │ │ +
572
│ │ │ │ +
573 template<int dimension, class CoordType>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
575 RefinementIteratorSpecial(int nIntervals, bool end)
│ │ │ │ +
576 : kuhnIndex(0), size(nIntervals), index_(0)
│ │ │ │ +
577 {
│ │ │ │ +
578 for(int i = 0; i < dimension; ++i)
│ │ │ │ +
579 origin[i] = 0;
│ │ │ │ +
580 if(end) {
│ │ │ │ +
581 index_ = Refinement::nElements(nIntervals);
│ │ │ │ +
582 origin[0] = size;
│ │ │ │ +
583 }
│ │ │ │ +
584 }
│ │ │ │ +
│ │ │ │ +
585
│ │ │ │ +
586 template<int dimension, class CoordType>
│ │ │ │ +
587 void
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
590 {
│ │ │ │ +
591 assert(origin[0] < size);
│ │ │ │ +
592
│ │ │ │ +
593 ++index_;
│ │ │ │ +
594
│ │ │ │ +
595 while(1) {
│ │ │ │ +
596 ++kuhnIndex;
│ │ │ │ +
597 if(kuhnIndex == nKuhnIntervals) {
│ │ │ │ +
598 kuhnIndex = 0;
│ │ │ │ +
599 // increment origin
│ │ │ │ +
600 for(int i = dimension - 1; i >= 0; --i) {
│ │ │ │ +
601 ++origin[i];
│ │ │ │ +
602 if(i == 0 || origin[i] <= origin[i-1])
│ │ │ │ +
603 break;
│ │ │ │ +
604 else
│ │ │ │ +
605 origin[i] = 0;
│ │ │ │ +
606 }
│ │ │ │ +
607 }
│ │ │ │ +
608
│ │ │ │ +
609 // test whether the current simplex has any corner outside the kuhn0 simplex
│ │ │ │ +
610 FieldVector<int, dimension> perm = getPermutation<dimension>(kuhnIndex);
│ │ │ │ +
611 Vertex corner = origin;
│ │ │ │ +
612 bool outside = false;
│ │ │ │ +
613 for(int i = 0; i < dimension; ++i) {
│ │ │ │ +
614 // next corner
│ │ │ │ +
615 ++corner[perm[i]];
│ │ │ │ +
616 if(perm[i] > 0)
│ │ │ │ +
617 if(corner[perm[i]] > corner[perm[i]-1]) {
│ │ │ │ +
618 outside = true;
│ │ │ │ +
619 break;
│ │ │ │ +
620 }
│ │ │ │ +
621 }
│ │ │ │ +
622 if(!outside)
│ │ │ │ +
623 return;
│ │ │ │ +
624 }
│ │ │ │ +
625 }
│ │ │ │ +
│ │ │ │ +
626
│ │ │ │ +
627 template<int dimension, class CoordType>
│ │ │ │ +
628 bool
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
630 equals(const This &other) const
│ │ │ │ +
631 {
│ │ │ │ +
632 return size == other.size && index_ == other.index_;
│ │ │ │ +
633 }
│ │ │ │ +
│ │ │ │ +
634
│ │ │ │ +
635 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
638 vertexIndices() const
│ │ │ │ +
639 {
│ │ │ │ +
640 IndexVector indices;
│ │ │ │ +
641 FieldVector<int, dimension> perm = getPermutation<dimension>(kuhnIndex);
│ │ │ │ +
642 Vertex vertex = origin;
│ │ │ │ +
643 indices[0] = pointIndex(vertex);
│ │ │ │ +
644 for(int i = 0; i < dimension; ++i) {
│ │ │ │ +
645 ++vertex[perm[i]];
│ │ │ │ +
646 indices[i+1] = pointIndex(vertex);
│ │ │ │ +
647 }
│ │ │ │ +
648 if (kuhnIndex%2 == 1)
│ │ │ │ +
649 for(int i = 0; i < (dimension+1)/2; ++i) {
│ │ │ │ +
650 int t = indices[i];
│ │ │ │ +
651 indices[i] = indices[dimension-i];
│ │ │ │ +
652 indices[dimension-i] = t;
│ │ │ │ +
653 }
│ │ │ │ +
654 return indices;
│ │ │ │ +
655 }
│ │ │ │ +
│ │ │ │ +
656
│ │ │ │ +
657 template<int dimension, class CoordType>
│ │ │ │ +
658 int
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
660 index() const
│ │ │ │ +
661 {
│ │ │ │ +
662 return index_;
│ │ │ │ +
663 }
│ │ │ │ +
│ │ │ │ +
664
│ │ │ │ +
665 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
668 coords() const
│ │ │ │ +
669 {
│ │ │ │ + │ │ │ │ +
671 ::simplex().position(0,0));
│ │ │ │ +
672 }
│ │ │ │ +
│ │ │ │ +
673
│ │ │ │ +
674 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
677 {
│ │ │ │ +
678 std::vector<CoordVector> corners(dimension+1);
│ │ │ │ + │ │ │ │ +
680 for(int i = 0; i <= dimension; ++i)
│ │ │ │ +
681 corners[i] = global(refelem.position(i, dimension));
│ │ │ │ +
682 return Geometry(refelem.type(), corners);
│ │ │ │ +
683 }
│ │ │ │ +
│ │ │ │ +
684
│ │ │ │ +
685 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
688 global(const CoordVector &local) const {
│ │ │ │ +
689 CoordVector v =
│ │ │ │ +
690 referenceToKuhn(local, getPermutation<dimension>(kuhnIndex));
│ │ │ │ +
691 v += origin;
│ │ │ │ +
692 v /= (typename CoordVector::value_type)size;
│ │ │ │ +
693 return kuhnToReference(v, getPermutation<dimension>(0));
│ │ │ │ +
694 }
│ │ │ │ +
695
│ │ │ │ +
696 // common
│ │ │ │ +
697
│ │ │ │ +
698 template<int dimension, class CoordType>
│ │ │ │ +
699 template<int codimension>
│ │ │ │ +
│ │ │ │ +
700 class RefinementImp<dimension, CoordType>::Codim<codimension>::SubEntityIterator
│ │ │ │ +
701 : public ForwardIteratorFacade<typename RefinementImp<dimension, CoordType>::template Codim<codimension>::SubEntityIterator, int>,
│ │ │ │ +
702 public RefinementIteratorSpecial<dimension, CoordType, codimension>
│ │ │ │ +
703 {
│ │ │ │ +
704 public:
│ │ │ │ + │ │ │ │ +
706
│ │ │ │ +
707 SubEntityIterator(int nIntervals, bool end = false);
│ │ │ │ +
708 };
│ │ │ │ +
│ │ │ │ +
709
│ │ │ │ +
710#ifndef DOXYGEN
│ │ │ │ +
711
│ │ │ │ +
712 template<int dimension, class CoordType>
│ │ │ │ +
713 template<int codimension>
│ │ │ │ + │ │ │ │ +
715 SubEntityIterator(int nIntervals, bool end)
│ │ │ │ +
716 : RefinementIteratorSpecial<dimension, CoordType, codimension>(nIntervals, end)
│ │ │ │ +
717 {}
│ │ │ │ +
718
│ │ │ │ +
719#endif
│ │ │ │ +
720
│ │ │ │ +
721 } // namespace Simplex
│ │ │ │ +
│ │ │ │ +
722
│ │ │ │ +
723 } // namespace RefinementImp
│ │ │ │ +
724
│ │ │ │ +
725
│ │ │ │ +
726 namespace RefinementImp {
│ │ │ │ +
727
│ │ │ │ +
728 // ///////////////////////
│ │ │ │ +
729 //
│ │ │ │ +
730 // The refinement traits
│ │ │ │ +
731 //
│ │ │ │ +
732
│ │ │ │ +
733#ifndef DOXYGEN
│ │ │ │ +
734 template<unsigned topologyId, class CoordType, unsigned coerceToId,
│ │ │ │ +
735 int dim>
│ │ │ │ +
736 struct Traits<
│ │ │ │ +
737 topologyId, CoordType, coerceToId, dim,
│ │ │ │ +
738 typename std::enable_if<
│ │ │ │ +
739 ((GeometryTypes::simplex(dim).id() >> 1) ==
│ │ │ │ +
740 (topologyId >> 1) &&
│ │ │ │ +
741 (GeometryTypes::simplex(dim).id() >> 1) ==
│ │ │ │ +
742 (coerceToId >> 1)
│ │ │ │ +
743 )>::type
│ │ │ │ +
744 >
│ │ │ │ +
745 {
│ │ │ │ +
746 typedef Simplex::RefinementImp<dim, CoordType> Imp;
│ │ │ │ +
747 };
│ │ │ │ +
748#endif
│ │ │ │ +
749
│ │ │ │ +
750
│ │ │ │ +
751 } // namespace RefinementImp
│ │ │ │ +
752
│ │ │ │ +
753} // namespace Dune
│ │ │ │ +
754
│ │ │ │ +
755#endif //DUNE_GRID_COMMON_REFINEMENT_SIMPLEX_CC
│ │ │ │ +
This file contains the parts independent of a particular Refinement implementation.
│ │ │ │ +
A unique label for each type of element that can occur in a grid.
│ │ │ │ + │ │ │ │ + │ │ │ │ +
STL namespace.
│ │ │ │
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:114
│ │ │ │ -
Definition virtualrefinement.cc:231
│ │ │ │ -
VirtualRefinement base class.
Definition virtualrefinement.hh:283
│ │ │ │ -
SubEntityIteratorBack< dimension > VertexIteratorBack
Definition virtualrefinement.hh:307
│ │ │ │ -
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:290
│ │ │ │ -
virtual ~VirtualRefinement()
Destructor.
Definition virtualrefinement.hh:353
│ │ │ │ -
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:297
│ │ │ │ -
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:303
│ │ │ │ -
Codim< dimension >::SubEntityIterator VertexIterator
The VertexIterator of the VirtualRefinement.
Definition virtualrefinement.hh:288
│ │ │ │ -
virtual VertexIteratorBack * vEndBack(Dune::RefinementIntervals tag) const =0
│ │ │ │ -
SubEntityIteratorBack< 0 > ElementIteratorBack
Definition virtualrefinement.hh:308
│ │ │ │ -
virtual ElementIteratorBack * eBeginBack(Dune::RefinementIntervals tag) const =0
│ │ │ │ -
virtual VertexIteratorBack * vBeginBack(Dune::RefinementIntervals tag) const =0
│ │ │ │ -
codim database of VirtualRefinement
Definition virtualrefinement.hh:367
│ │ │ │ +
int pointIndex(const FieldVector< int, dimension > &point)
calculate the index of a given gridpoint within a Kuhn0 simplex
Definition simplex.cc:280
│ │ │ │ +
FieldVector< int, n > getPermutation(int m)
Calculate permutation from it's index.
Definition simplex.cc:293
│ │ │ │ +
FieldVector< CoordType, dimension > referenceToKuhn(FieldVector< CoordType, dimension > point, const FieldVector< int, dimension > &kuhn)
Map from the reference simplex to some Kuhn simplex.
Definition simplex.cc:322
│ │ │ │ +
FieldVector< CoordType, dimension > kuhnToReference(FieldVector< CoordType, dimension > point, const FieldVector< int, dimension > &kuhn)
Map from some Kuhn simplex to the reference simplex.
Definition simplex.cc:341
│ │ │ │ +
Class providing access to the singletons of the reference elements.
Definition referenceelements.hh:128
│ │ │ │ +
static const ReferenceElement & simplex()
get simplex reference elements
Definition referenceelements.hh:162
│ │ │ │ +
Static tag representing a codimension.
Definition dimension.hh:24
│ │ │ │ +
Implement a MultiLinearGeometry with additional caching.
Definition multilineargeometry.hh:526
│ │ │ │ + │ │ │ │ +
Codim< dimension >::SubEntityIterator VertexIterator
Definition simplex.cc:368
│ │ │ │ +
FieldVector< int, dimension+1 > IndexVector
Definition simplex.cc:371
│ │ │ │ +
CoordType ctype
Definition simplex.cc:364
│ │ │ │ +
static int nVertices(int nIntervals)
Definition simplex.cc:394
│ │ │ │ +
static int nElements(int nIntervals)
Definition simplex.cc:418
│ │ │ │ +
static ElementIterator eEnd(int nIntervals)
Definition simplex.cc:434
│ │ │ │ +
static VertexIterator vEnd(int nIntervals)
Definition simplex.cc:410
│ │ │ │ +
Codim< 0 >::SubEntityIterator ElementIterator
Definition simplex.cc:370
│ │ │ │ +
static VertexIterator vBegin(int nIntervals)
Definition simplex.cc:402
│ │ │ │ +
static ElementIterator eBegin(int nIntervals)
Definition simplex.cc:426
│ │ │ │ +
FieldVector< CoordType, dimension > CoordVector
Definition simplex.cc:369
│ │ │ │ +
static constexpr int dimension
Definition simplex.cc:363
│ │ │ │ + │ │ │ │ +
Dune::CachedMultiLinearGeometry< CoordType, dimension-codimension, dimension > Geometry
Definition simplex.cc:388
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
RefinementImp< dimension, CoordType > Refinement
Definition simplex.cc:453
│ │ │ │ + │ │ │ │ +
Refinement::template Codim< dimension >::Geometry Geometry
Definition simplex.cc:455
│ │ │ │ +
RefinementIteratorSpecial< dimension, CoordType, dimension > This
Definition simplex.cc:456
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
FieldVector< int, dimension > Vertex
Definition simplex.cc:564
│ │ │ │ + │ │ │ │ + │ │ │ │ +
Refinement::template Codim< 0 >::Geometry Geometry
Definition simplex.cc:546
│ │ │ │ + │ │ │ │ + │ │ │ │ +
RefinementIteratorSpecial< dimension, CoordType, 0 > This
Definition simplex.cc:547
│ │ │ │ +
RefinementImp< dimension, CoordType > Refinement
Definition simplex.cc:543
│ │ │ │ + │ │ │ │ + │ │ │ │ +
RefinementImp< dimension, CoordType > Refinement
Definition simplex.cc:705
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,186 +1,682 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -virtualrefinement.hh │ │ │ │ │ + * _r_e_f_i_n_e_m_e_n_t │ │ │ │ │ +simplex.cc │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 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 © 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_VIRTUALREFINEMENT_HH │ │ │ │ │ -6#define DUNE_GEOMETRY_VIRTUALREFINEMENT_HH │ │ │ │ │ +5#ifndef DUNE_GRID_COMMON_REFINEMENT_SIMPLEX_CC │ │ │ │ │ +_6#define DUNE_GRID_COMMON_REFINEMENT_SIMPLEX_CC │ │ │ │ │ 7 │ │ │ │ │ -257#include │ │ │ │ │ -258 │ │ │ │ │ -259#include │ │ │ │ │ -260 │ │ │ │ │ -261#include "_r_e_f_i_n_e_m_e_n_t_._h_h" │ │ │ │ │ -262#include "_t_y_p_e_._h_h" │ │ │ │ │ -263 │ │ │ │ │ -264namespace _D_u_n_e │ │ │ │ │ -265{ │ │ │ │ │ -266 // ////////////////////////////////////////// │ │ │ │ │ +8// This file is part of DUNE, a Distributed and Unified Numerics Environment │ │ │ │ │ +9// This file is copyright (C) 2005 Jorrit Fahlke │ │ │ │ │ +10// This file is licensed under version 2 of the GNU General Public License, │ │ │ │ │ +11// with a special "runtime exception." See COPYING at the top of the source │ │ │ │ │ +12// tree for the full licence. │ │ │ │ │ +13 │ │ │ │ │ +243#include │ │ │ │ │ +244 │ │ │ │ │ +245#include │ │ │ │ │ +246#include │ │ │ │ │ +247 │ │ │ │ │ +248#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_m_u_l_t_i_l_i_n_e_a_r_g_e_o_m_e_t_r_y_._h_h> │ │ │ │ │ +249#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ +250#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ +251 │ │ │ │ │ +252#include "_b_a_s_e_._c_c" │ │ │ │ │ +253 │ │ │ │ │ +254namespace _D_u_n_e { │ │ │ │ │ +255 │ │ │ │ │ +256 namespace RefinementImp { │ │ │ │ │ +257 │ │ │ │ │ +_2_6_4 namespace Simplex { │ │ │ │ │ +265 │ │ │ │ │ +266 // ////////////////// │ │ │ │ │ 267 // │ │ │ │ │ -268 // The virtual base class and its iterators │ │ │ │ │ 269 // │ │ │ │ │ 270 │ │ │ │ │ -271 // │ │ │ │ │ -272 // Refinement │ │ │ │ │ -273 // │ │ │ │ │ -274 │ │ │ │ │ -281 template │ │ │ │ │ -_2_8_2 class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -283 { │ │ │ │ │ -284 public: │ │ │ │ │ -285 template │ │ │ │ │ -286 struct _C_o_d_i_m; │ │ │ │ │ -_2_8_8 typedef typename _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _V_e_r_t_e_x_I_t_e_r_a_t_o_r; │ │ │ │ │ -_2_9_0 typedef typename _C_o_d_i_m_<_0_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r; │ │ │ │ │ -291 │ │ │ │ │ -_2_9_7 typedef FieldVector _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ -_3_0_3 typedef std::vector _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ -304 │ │ │ │ │ -305 template │ │ │ │ │ -306 class _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k; │ │ │ │ │ -_3_0_7 typedef _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_d_i_m_e_n_s_i_o_n_> _V_e_r_t_e_x_I_t_e_r_a_t_o_r_B_a_c_k; │ │ │ │ │ -_3_0_8 typedef _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_0_> _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r_B_a_c_k; │ │ │ │ │ -309 │ │ │ │ │ -_3_1_5 virtual int _n_V_e_r_t_i_c_e_s(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const = 0; │ │ │ │ │ -316 │ │ │ │ │ -322 _V_e_r_t_e_x_I_t_e_r_a_t_o_r _v_B_e_g_i_n(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const; │ │ │ │ │ -323 │ │ │ │ │ -329 _V_e_r_t_e_x_I_t_e_r_a_t_o_r _v_E_n_d(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const; │ │ │ │ │ -330 │ │ │ │ │ -_3_3_6 virtual int _n_E_l_e_m_e_n_t_s(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const = 0; │ │ │ │ │ -337 │ │ │ │ │ -343 _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r _e_B_e_g_i_n(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const; │ │ │ │ │ -344 │ │ │ │ │ -350 _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r _e_E_n_d(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const; │ │ │ │ │ +272 │ │ │ │ │ +279 template │ │ │ │ │ +_2_8_0 int _p_o_i_n_t_I_n_d_e_x(const FieldVector &point) │ │ │ │ │ +281 { │ │ │ │ │ +282 int index = 0; │ │ │ │ │ +283 for(int i = 0; i < dimension; ++i) │ │ │ │ │ +284 index += Dune::binomial(dimension-i + point[i]-1, dimension-i); │ │ │ │ │ +285 return index; │ │ │ │ │ +286 } │ │ │ │ │ +287 │ │ │ │ │ +292 template │ │ │ │ │ +_2_9_3 FieldVector _g_e_t_P_e_r_m_u_t_a_t_i_o_n(int m) │ │ │ │ │ +294 { │ │ │ │ │ +295 FieldVector perm; │ │ │ │ │ +296 for(int i = 0; i < n; ++i) │ │ │ │ │ +297 perm[i] = i; │ │ │ │ │ +298 │ │ │ │ │ +299 int base = 1; │ │ │ │ │ +300 for(int i = 1; i <= n; ++i) │ │ │ │ │ +301 base *= i; │ │ │ │ │ +302 │ │ │ │ │ +303 for(int i = n; i > 0; --i) { │ │ │ │ │ +304 base /= i; │ │ │ │ │ +305 int d = m / base; │ │ │ │ │ +306 m %= base; │ │ │ │ │ +307 int t = perm[i-1]; perm[i-1] = perm[i-1-d]; perm[i-1-d] = t; │ │ │ │ │ +308 } │ │ │ │ │ +309 return perm; │ │ │ │ │ +310 } │ │ │ │ │ +311 │ │ │ │ │ +312 // map between the reference simplex and some arbitrary kuhn simplex │ │ │ │ │ +(denoted by it's permutation) │ │ │ │ │ +320 template │ │ │ │ │ +321 FieldVector │ │ │ │ │ +_3_2_2 _r_e_f_e_r_e_n_c_e_T_o_K_u_h_n( │ │ │ │ │ +323 FieldVector point, │ │ │ │ │ +325 const FieldVector &kuhn) │ │ │ │ │ +326 { │ │ │ │ │ +327 for(int i = dimension - 1; i > 0; --i) │ │ │ │ │ +328 point[kuhn[i-1]] += point[kuhn[i]]; │ │ │ │ │ +329 return point; │ │ │ │ │ +330 } │ │ │ │ │ +331 │ │ │ │ │ +339 template │ │ │ │ │ +340 FieldVector │ │ │ │ │ +_3_4_1 _k_u_h_n_T_o_R_e_f_e_r_e_n_c_e( │ │ │ │ │ +342 FieldVector point, │ │ │ │ │ +344 const FieldVector &kuhn) │ │ │ │ │ +345 { │ │ │ │ │ +346 for(int i = 0; i < dimension - 1; ++i) │ │ │ │ │ +347 point[kuhn[i]] -= point[kuhn[i+1]]; │ │ │ │ │ +348 return point; │ │ │ │ │ +349 } │ │ │ │ │ +350 │ │ │ │ │ 351 │ │ │ │ │ -_3_5_3 virtual _~_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t() │ │ │ │ │ -354 {} │ │ │ │ │ -355 │ │ │ │ │ -356 protected: │ │ │ │ │ -_3_5_7 virtual _V_e_r_t_e_x_I_t_e_r_a_t_o_r_B_a_c_k *_v_B_e_g_i_n_B_a_c_k(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const │ │ │ │ │ -= 0; │ │ │ │ │ -_3_5_8 virtual _V_e_r_t_e_x_I_t_e_r_a_t_o_r_B_a_c_k *_v_E_n_d_B_a_c_k(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const = │ │ │ │ │ -0; │ │ │ │ │ -_3_5_9 virtual _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r_B_a_c_k *_e_B_e_g_i_n_B_a_c_k(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) │ │ │ │ │ -const = 0; │ │ │ │ │ -_3_6_0 virtual _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r_B_a_c_k *_e_E_n_d_B_a_c_k(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const │ │ │ │ │ -= 0; │ │ │ │ │ -361 }; │ │ │ │ │ -362 │ │ │ │ │ -364 template │ │ │ │ │ -365 template │ │ │ │ │ -_3_6_6 struct _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t::_C_o_d_i_m │ │ │ │ │ -367 { │ │ │ │ │ -368 class SubEntityIterator; │ │ │ │ │ -369 }; │ │ │ │ │ -370 │ │ │ │ │ -371 // //////////////////////// │ │ │ │ │ -372 // │ │ │ │ │ -373 // The refinement builder │ │ │ │ │ -374 // │ │ │ │ │ -375 │ │ │ │ │ -376 template │ │ │ │ │ -377 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> & │ │ │ │ │ -378 _b_u_i_l_d_R_e_f_i_n_e_m_e_n_t(_G_e_o_m_e_t_r_y_T_y_p_e geometryType, _G_e_o_m_e_t_r_y_T_y_p_e coerceTo); │ │ │ │ │ -379 │ │ │ │ │ -380} // namespace Dune │ │ │ │ │ +353 │ │ │ │ │ +354 // ///////////////////////////////////////// │ │ │ │ │ +355 // │ │ │ │ │ +356 // refinement implementation for simplices │ │ │ │ │ +357 // │ │ │ │ │ +358 │ │ │ │ │ +359 template │ │ │ │ │ +_3_6_0 class _R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ +361 { │ │ │ │ │ +362 public: │ │ │ │ │ +_3_6_3 constexpr static int _d_i_m_e_n_s_i_o_n = dimension_; │ │ │ │ │ +_3_6_4 typedef CoordType _c_t_y_p_e; │ │ │ │ │ +365 │ │ │ │ │ +366 template │ │ │ │ │ +367 struct _C_o_d_i_m; │ │ │ │ │ +_3_6_8 typedef typename _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _V_e_r_t_e_x_I_t_e_r_a_t_o_r; │ │ │ │ │ +_3_6_9 typedef FieldVector _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ +_3_7_0 typedef typename _C_o_d_i_m_<_0_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r; │ │ │ │ │ +_3_7_1 typedef FieldVector _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ +372 │ │ │ │ │ +373 static int _n_V_e_r_t_i_c_e_s(int nIntervals); │ │ │ │ │ +374 static _V_e_r_t_e_x_I_t_e_r_a_t_o_r _v_B_e_g_i_n(int nIntervals); │ │ │ │ │ +375 static _V_e_r_t_e_x_I_t_e_r_a_t_o_r _v_E_n_d(int nIntervals); │ │ │ │ │ +376 │ │ │ │ │ +377 static int _n_E_l_e_m_e_n_t_s(int nIntervals); │ │ │ │ │ +378 static _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r _e_B_e_g_i_n(int nIntervals); │ │ │ │ │ +379 static _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r _e_E_n_d(int nIntervals); │ │ │ │ │ +380 }; │ │ │ │ │ 381 │ │ │ │ │ -382#include "_v_i_r_t_u_a_l_r_e_f_i_n_e_m_e_n_t_._c_c" │ │ │ │ │ -383 │ │ │ │ │ -384#endif // DUNE_GEOMETRY_VIRTUALREFINEMENT_HH │ │ │ │ │ -_v_i_r_t_u_a_l_r_e_f_i_n_e_m_e_n_t_._c_c │ │ │ │ │ -This file contains the virtual wrapper around refinement. │ │ │ │ │ -_r_e_f_i_n_e_m_e_n_t_._h_h │ │ │ │ │ -This file simply includes all Refinement implementations so you don't have to │ │ │ │ │ -do them separately. │ │ │ │ │ +382 template │ │ │ │ │ +383 template │ │ │ │ │ +_3_8_4 struct _R_e_f_i_n_e_m_e_n_t_I_m_p::_C_o_d_i_m │ │ │ │ │ +385 { │ │ │ │ │ +386 class SubEntityIterator; │ │ │ │ │ +387 // We don't need the caching, but the uncached MultiLinearGeometry has bug │ │ │ │ │ +FS#1209 │ │ │ │ │ +_3_8_8 typedef _D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y _G_e_o_m_e_t_r_y; │ │ │ │ │ +389 }; │ │ │ │ │ +390 │ │ │ │ │ +391 template │ │ │ │ │ +392 int │ │ │ │ │ +_3_9_3 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +394_ _n_V_e_r_t_i_c_e_s(int nIntervals) │ │ │ │ │ +395 { │ │ │ │ │ +396 return Dune::binomial(dimension + nIntervals, (int)dimension); │ │ │ │ │ +397 } │ │ │ │ │ +398 │ │ │ │ │ +399 template │ │ │ │ │ +400 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ +_4_0_1 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +402_ _v_B_e_g_i_n(int nIntervals) │ │ │ │ │ +403 { │ │ │ │ │ +404 return _V_e_r_t_e_x_I_t_e_r_a_t_o_r(nIntervals); │ │ │ │ │ +405 } │ │ │ │ │ +406 │ │ │ │ │ +407 template │ │ │ │ │ +408 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ +_4_0_9 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +410_ _v_E_n_d(int nIntervals) │ │ │ │ │ +411 { │ │ │ │ │ +412 return _V_e_r_t_e_x_I_t_e_r_a_t_o_r(nIntervals, true); │ │ │ │ │ +413 } │ │ │ │ │ +414 │ │ │ │ │ +415 template │ │ │ │ │ +416 int │ │ │ │ │ +_4_1_7 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +418_ _n_E_l_e_m_e_n_t_s(int nIntervals) │ │ │ │ │ +419 { │ │ │ │ │ +420 return Dune::power(nIntervals, int(dimension)); │ │ │ │ │ +421 } │ │ │ │ │ +422 │ │ │ │ │ +423 template │ │ │ │ │ +424 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ +_4_2_5 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +426_ _e_B_e_g_i_n(int nIntervals) │ │ │ │ │ +427 { │ │ │ │ │ +428 return _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r(nIntervals); │ │ │ │ │ +429 } │ │ │ │ │ +430 │ │ │ │ │ +431 template │ │ │ │ │ +432 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ +_4_3_3 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +434_ _e_E_n_d(int nIntervals) │ │ │ │ │ +435 { │ │ │ │ │ +436 return _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r(nIntervals, true); │ │ │ │ │ +437 } │ │ │ │ │ +438 │ │ │ │ │ +439 // ////////////// │ │ │ │ │ +440 // │ │ │ │ │ +441 // The iterator │ │ │ │ │ +442 // │ │ │ │ │ +443 │ │ │ │ │ +444 template │ │ │ │ │ +_4_4_5 class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l; │ │ │ │ │ +446 │ │ │ │ │ +447 // vertices │ │ │ │ │ +448 │ │ │ │ │ +449 template │ │ │ │ │ +_4_5_0 class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ +451 { │ │ │ │ │ +452 public: │ │ │ │ │ +_4_5_3 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +_4_5_4 typedef typename Refinement::CoordVector _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ +_4_5_5 typedef typename Refinement::template _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_:_G_e_o_m_e_t_r_y _G_e_o_m_e_t_r_y; │ │ │ │ │ +_4_5_6 typedef _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_> _T_h_i_s; │ │ │ │ │ +457 │ │ │ │ │ +458 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end = false); │ │ │ │ │ +459 │ │ │ │ │ +460 void increment(); │ │ │ │ │ +461 bool equals(const _T_h_i_s &other) const; │ │ │ │ │ +462 │ │ │ │ │ +463 _C_o_o_r_d_V_e_c_t_o_r coords() const; │ │ │ │ │ +464 _G_e_o_m_e_t_r_y geometry () const; │ │ │ │ │ +465 │ │ │ │ │ +466 int index() const; │ │ │ │ │ +467 protected: │ │ │ │ │ +_4_6_8 typedef FieldVector _V_e_r_t_e_x; │ │ │ │ │ +469 │ │ │ │ │ +_4_7_0 int _s_i_z_e; │ │ │ │ │ +_4_7_1 _V_e_r_t_e_x _v_e_r_t_e_x; │ │ │ │ │ +472 }; │ │ │ │ │ +473 │ │ │ │ │ +474 template │ │ │ │ │ +_4_7_5 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +476_ _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end) │ │ │ │ │ +477 : size(nIntervals) │ │ │ │ │ +478 { │ │ │ │ │ +479 vertex[0] = (end) ? size + 1 : 0; │ │ │ │ │ +480 for(int i = 1; i < dimension; ++ i) │ │ │ │ │ +481 vertex[i] = 0; │ │ │ │ │ +482 } │ │ │ │ │ +483 │ │ │ │ │ +484 template │ │ │ │ │ +485 void │ │ │ │ │ +_4_8_6 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +487_ _i_n_c_r_e_m_e_n_t() │ │ │ │ │ +488 { │ │ │ │ │ +489 assert(vertex[0] <= size); │ │ │ │ │ +490 for(int i = dimension - 1; i >= 0; --i) { │ │ │ │ │ +491 ++vertex[i]; │ │ │ │ │ +492 if(i == 0 || vertex[i] <= vertex[i-1]) │ │ │ │ │ +493 break; │ │ │ │ │ +494 else │ │ │ │ │ +495 vertex[i] = 0; │ │ │ │ │ +496 } │ │ │ │ │ +497 } │ │ │ │ │ +498 │ │ │ │ │ +499 template │ │ │ │ │ +500 bool │ │ │ │ │ +_5_0_1 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +502_ _e_q_u_a_l_s(const _T_h_i_s &other) const │ │ │ │ │ +503 { │ │ │ │ │ +504 return size == other._s_i_z_e && vertex == other._v_e_r_t_e_x; │ │ │ │ │ +505 } │ │ │ │ │ +506 │ │ │ │ │ +507 template │ │ │ │ │ +508 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +_5_0_9 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +510_ _c_o_o_r_d_s() const │ │ │ │ │ +511 { │ │ │ │ │ +512 _V_e_r_t_e_x ref = _k_u_h_n_T_o_R_e_f_e_r_e_n_c_e(vertex, getPermutation(0)); │ │ │ │ │ +513 │ │ │ │ │ +514 _C_o_o_r_d_V_e_c_t_o_r coords; │ │ │ │ │ +515 for(int i = 0; i < dimension; ++i) │ │ │ │ │ +516 coords[i] = CoordType(ref[i]) / size; │ │ │ │ │ +517 return coords; │ │ │ │ │ +518 } │ │ │ │ │ +519 │ │ │ │ │ +520 template │ │ │ │ │ +521 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_G_e_o_m_e_t_r_y │ │ │ │ │ +_5_2_2 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_:_g_e_o_m_e_t_r_y () │ │ │ │ │ +const │ │ │ │ │ +523 { │ │ │ │ │ +524 std::vector corners(1); │ │ │ │ │ +525 corners[0] = (_C_o_o_r_d_V_e_c_t_o_r)vertex; │ │ │ │ │ +526 return _G_e_o_m_e_t_r_y(GeometryTypes::vertex, corners); │ │ │ │ │ +527 } │ │ │ │ │ +528 │ │ │ │ │ +529 template │ │ │ │ │ +530 int │ │ │ │ │ +_5_3_1 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +532_ _i_n_d_e_x() const │ │ │ │ │ +533 { │ │ │ │ │ +534 return _p_o_i_n_t_I_n_d_e_x(vertex); │ │ │ │ │ +535 } │ │ │ │ │ +536 │ │ │ │ │ +537 // elements │ │ │ │ │ +538 │ │ │ │ │ +539 template │ │ │ │ │ +_5_4_0 class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ +541 { │ │ │ │ │ +542 public: │ │ │ │ │ +_5_4_3 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +_5_4_4 typedef typename _R_e_f_i_n_e_m_e_n_t_:_:_I_n_d_e_x_V_e_c_t_o_r _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ +_5_4_5 typedef typename _R_e_f_i_n_e_m_e_n_t_:_:_C_o_o_r_d_V_e_c_t_o_r _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ +_5_4_6 typedef typename Refinement::template _C_o_d_i_m_<_0_>_:_:_G_e_o_m_e_t_r_y _G_e_o_m_e_t_r_y; │ │ │ │ │ +_5_4_7 typedef _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_> _T_h_i_s; │ │ │ │ │ +548 │ │ │ │ │ +549 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end = false); │ │ │ │ │ +550 │ │ │ │ │ +551 void increment(); │ │ │ │ │ +552 bool equals(const _T_h_i_s &other) const; │ │ │ │ │ +553 │ │ │ │ │ +554 _I_n_d_e_x_V_e_c_t_o_r vertexIndices() const; │ │ │ │ │ +555 int index() const; │ │ │ │ │ +556 _C_o_o_r_d_V_e_c_t_o_r coords() const; │ │ │ │ │ +557 │ │ │ │ │ +558 _G_e_o_m_e_t_r_y geometry () const; │ │ │ │ │ +559 │ │ │ │ │ +560 private: │ │ │ │ │ +561 _C_o_o_r_d_V_e_c_t_o_r global(const _C_o_o_r_d_V_e_c_t_o_r &local) const; │ │ │ │ │ +562 │ │ │ │ │ +563 protected: │ │ │ │ │ +_5_6_4 typedef FieldVector _V_e_r_t_e_x; │ │ │ │ │ +_5_6_5 constexpr static int nKuhnIntervals = Dune::factorial(dimension); │ │ │ │ │ +566 │ │ │ │ │ +_5_6_7 _V_e_r_t_e_x _o_r_i_g_i_n; │ │ │ │ │ +_5_6_8 int _k_u_h_n_I_n_d_e_x; │ │ │ │ │ +_5_6_9 int _s_i_z_e; │ │ │ │ │ +_5_7_0 int _i_n_d_e_x__; │ │ │ │ │ +571 }; │ │ │ │ │ +572 │ │ │ │ │ +573 template │ │ │ │ │ +_5_7_4 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +575_ _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end) │ │ │ │ │ +576 : kuhnIndex(0), size(nIntervals), index_(0) │ │ │ │ │ +577 { │ │ │ │ │ +578 for(int i = 0; i < dimension; ++i) │ │ │ │ │ +579 origin[i] = 0; │ │ │ │ │ +580 if(end) { │ │ │ │ │ +581 index_ = Refinement::nElements(nIntervals); │ │ │ │ │ +582 origin[0] = size; │ │ │ │ │ +583 } │ │ │ │ │ +584 } │ │ │ │ │ +585 │ │ │ │ │ +586 template │ │ │ │ │ +587 void │ │ │ │ │ +_5_8_8 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +589_ _i_n_c_r_e_m_e_n_t() │ │ │ │ │ +590 { │ │ │ │ │ +591 assert(origin[0] < size); │ │ │ │ │ +592 │ │ │ │ │ +593 ++index_; │ │ │ │ │ +594 │ │ │ │ │ +595 while(1) { │ │ │ │ │ +596 ++kuhnIndex; │ │ │ │ │ +597 if(kuhnIndex == nKuhnIntervals) { │ │ │ │ │ +598 kuhnIndex = 0; │ │ │ │ │ +599 // increment origin │ │ │ │ │ +600 for(int i = dimension - 1; i >= 0; --i) { │ │ │ │ │ +601 ++origin[i]; │ │ │ │ │ +602 if(i == 0 || origin[i] <= origin[i-1]) │ │ │ │ │ +603 break; │ │ │ │ │ +604 else │ │ │ │ │ +605 origin[i] = 0; │ │ │ │ │ +606 } │ │ │ │ │ +607 } │ │ │ │ │ +608 │ │ │ │ │ +609 // test whether the current simplex has any corner outside the kuhn0 │ │ │ │ │ +simplex │ │ │ │ │ +610 FieldVector perm = getPermutation(kuhnIndex); │ │ │ │ │ +611 _V_e_r_t_e_x corner = origin; │ │ │ │ │ +612 bool outside = false; │ │ │ │ │ +613 for(int i = 0; i < dimension; ++i) { │ │ │ │ │ +614 // next corner │ │ │ │ │ +615 ++corner[perm[i]]; │ │ │ │ │ +616 if(perm[i] > 0) │ │ │ │ │ +617 if(corner[perm[i]] > corner[perm[i]-1]) { │ │ │ │ │ +618 outside = true; │ │ │ │ │ +619 break; │ │ │ │ │ +620 } │ │ │ │ │ +621 } │ │ │ │ │ +622 if(!outside) │ │ │ │ │ +623 return; │ │ │ │ │ +624 } │ │ │ │ │ +625 } │ │ │ │ │ +626 │ │ │ │ │ +627 template │ │ │ │ │ +628 bool │ │ │ │ │ +_6_2_9 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +630_ _e_q_u_a_l_s(const _T_h_i_s &other) const │ │ │ │ │ +631 { │ │ │ │ │ +632 return size == other._s_i_z_e && index_ == other._i_n_d_e_x__; │ │ │ │ │ +633 } │ │ │ │ │ +634 │ │ │ │ │ +635 template │ │ │ │ │ +636 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ +_6_3_7 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +638_ _v_e_r_t_e_x_I_n_d_i_c_e_s() const │ │ │ │ │ +639 { │ │ │ │ │ +640 _I_n_d_e_x_V_e_c_t_o_r indices; │ │ │ │ │ +641 FieldVector perm = getPermutation(kuhnIndex); │ │ │ │ │ +642 _V_e_r_t_e_x vertex = origin; │ │ │ │ │ +643 indices[0] = _p_o_i_n_t_I_n_d_e_x(vertex); │ │ │ │ │ +644 for(int i = 0; i < dimension; ++i) { │ │ │ │ │ +645 ++vertex[perm[i]]; │ │ │ │ │ +646 indices[i+1] = _p_o_i_n_t_I_n_d_e_x(vertex); │ │ │ │ │ +647 } │ │ │ │ │ +648 if (kuhnIndex%2 == 1) │ │ │ │ │ +649 for(int i = 0; i < (dimension+1)/2; ++i) { │ │ │ │ │ +650 int t = indices[i]; │ │ │ │ │ +651 indices[i] = indices[dimension-i]; │ │ │ │ │ +652 indices[dimension-i] = t; │ │ │ │ │ +653 } │ │ │ │ │ +654 return indices; │ │ │ │ │ +655 } │ │ │ │ │ +656 │ │ │ │ │ +657 template │ │ │ │ │ +658 int │ │ │ │ │ +_6_5_9 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +660_ _i_n_d_e_x() const │ │ │ │ │ +661 { │ │ │ │ │ +662 return index_; │ │ │ │ │ +663 } │ │ │ │ │ +664 │ │ │ │ │ +665 template │ │ │ │ │ +666 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +_6_6_7 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +668_ _c_o_o_r_d_s() const │ │ │ │ │ +669 { │ │ │ │ │ +670 return global(_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_<_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_> │ │ │ │ │ +671 ::simplex().position(0,0)); │ │ │ │ │ +672 } │ │ │ │ │ +673 │ │ │ │ │ +674 template │ │ │ │ │ +675 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ +_6_7_6 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_g_e_o_m_e_t_r_y () const │ │ │ │ │ +677 { │ │ │ │ │ +678 std::vector corners(dimension+1); │ │ │ │ │ +679 auto refelem = _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_<_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_:_s_i_m_p_l_e_x(); │ │ │ │ │ +680 for(int i = 0; i <= dimension; ++i) │ │ │ │ │ +681 corners[i] = global(refelem.position(i, dimension)); │ │ │ │ │ +682 return _G_e_o_m_e_t_r_y(refelem.type(), corners); │ │ │ │ │ +683 } │ │ │ │ │ +684 │ │ │ │ │ +685 template │ │ │ │ │ +686 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +687 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +688_ _g_l_o_b_a_l(const CoordVector &local) const { │ │ │ │ │ +689 CoordVector v = │ │ │ │ │ +690 _r_e_f_e_r_e_n_c_e_T_o_K_u_h_n(local, getPermutation(kuhnIndex)); │ │ │ │ │ +691 v += origin; │ │ │ │ │ +692 v /= (typename CoordVector::value_type)size; │ │ │ │ │ +693 return _k_u_h_n_T_o_R_e_f_e_r_e_n_c_e(v, getPermutation(0)); │ │ │ │ │ +694 } │ │ │ │ │ +695 │ │ │ │ │ +696 // common │ │ │ │ │ +697 │ │ │ │ │ +698 template │ │ │ │ │ +699 template │ │ │ │ │ +_7_0_0 class _R_e_f_i_n_e_m_e_n_t_I_m_p::_C_o_d_i_m:: │ │ │ │ │ +SubEntityIterator │ │ │ │ │ +701 : public ForwardIteratorFacade::template Codim::SubEntityIterator, int>, │ │ │ │ │ +702 public _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ +703 { │ │ │ │ │ +704 public: │ │ │ │ │ +_7_0_5 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +706 │ │ │ │ │ +_7_0_7 _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r(int nIntervals, bool end = false); │ │ │ │ │ +708 }; │ │ │ │ │ +709 │ │ │ │ │ +710#ifndef DOXYGEN │ │ │ │ │ +711 │ │ │ │ │ +712 template │ │ │ │ │ +713 template │ │ │ │ │ +714 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_:_: │ │ │ │ │ +715_ _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r(int nIntervals, bool end) │ │ │ │ │ +716 : _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(nIntervals, │ │ │ │ │ +end) │ │ │ │ │ +717 {} │ │ │ │ │ +718 │ │ │ │ │ +719#endif │ │ │ │ │ +720 │ │ │ │ │ +721 } // namespace Simplex │ │ │ │ │ +722 │ │ │ │ │ +723 } // namespace RefinementImp │ │ │ │ │ +724 │ │ │ │ │ +725 │ │ │ │ │ +726 namespace RefinementImp { │ │ │ │ │ +727 │ │ │ │ │ +728 // /////////////////////// │ │ │ │ │ +729 // │ │ │ │ │ +730 // The refinement traits │ │ │ │ │ +731 // │ │ │ │ │ +732 │ │ │ │ │ +733#ifndef DOXYGEN │ │ │ │ │ +734 template │ │ │ │ │ +736 struct Traits< │ │ │ │ │ +737 topologyId, CoordType, coerceToId, dim, │ │ │ │ │ +738 typename _s_t_d::enable_if< │ │ │ │ │ +739 ((GeometryTypes::simplex(dim).id() >> 1) == │ │ │ │ │ +740 (topologyId >> 1) && │ │ │ │ │ +741 (GeometryTypes::simplex(dim).id() >> 1) == │ │ │ │ │ +742 (coerceToId >> 1) │ │ │ │ │ +743 )>::type │ │ │ │ │ +744 > │ │ │ │ │ +745 { │ │ │ │ │ +746 typedef Simplex::RefinementImp Imp; │ │ │ │ │ +747 }; │ │ │ │ │ +748#endif │ │ │ │ │ +749 │ │ │ │ │ +750 │ │ │ │ │ +751 } // namespace RefinementImp │ │ │ │ │ +752 │ │ │ │ │ +753} // namespace Dune │ │ │ │ │ +754 │ │ │ │ │ +755#endif //DUNE_GRID_COMMON_REFINEMENT_SIMPLEX_CC │ │ │ │ │ +_b_a_s_e_._c_c │ │ │ │ │ +This file contains the parts independent of a particular Refinement │ │ │ │ │ +implementation. │ │ │ │ │ _t_y_p_e_._h_h │ │ │ │ │ A unique label for each type of element that can occur in a grid. │ │ │ │ │ +_m_u_l_t_i_l_i_n_e_a_r_g_e_o_m_e_t_r_y_._h_h │ │ │ │ │ +_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h │ │ │ │ │ +_s_t_d │ │ │ │ │ +STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn affinegeometry.hh:21 │ │ │ │ │ -_D_u_n_e_:_:_b_u_i_l_d_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -VirtualRefinement< dimension, CoordType > & buildRefinement(GeometryType │ │ │ │ │ -geometryType, GeometryType coerceTo) │ │ │ │ │ -return a reference to the VirtualRefinement according to the parameters │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:503 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s │ │ │ │ │ -Holds the number of refined intervals per axis needed for virtual and static │ │ │ │ │ -refinement. │ │ │ │ │ -DDeeffiinniittiioonn base.cc:94 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ -Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:114 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:231 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -VirtualRefinement base class. │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.hh:283 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_B_a_c_k │ │ │ │ │ -SubEntityIteratorBack< dimension > VertexIteratorBack │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.hh:307 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_e_E_n_d_B_a_c_k │ │ │ │ │ -virtual ElementIteratorBack * eEndBack(Dune::RefinementIntervals tag) const =0 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_v_B_e_g_i_n │ │ │ │ │ -VertexIterator vBegin(Dune::RefinementIntervals tag) const │ │ │ │ │ -Get an VertexIterator. │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:38 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_e_B_e_g_i_n │ │ │ │ │ -ElementIterator eBegin(Dune::RefinementIntervals tag) const │ │ │ │ │ -Get an ElementIterator. │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:54 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_n_E_l_e_m_e_n_t_s │ │ │ │ │ -virtual int nElements(Dune::RefinementIntervals tag) const =0 │ │ │ │ │ -Get the number of Elements. │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_e_E_n_d │ │ │ │ │ -ElementIterator eEnd(Dune::RefinementIntervals tag) const │ │ │ │ │ -Get an ElementIterator. │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:62 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_p_o_i_n_t_I_n_d_e_x │ │ │ │ │ +int pointIndex(const FieldVector< int, dimension > &point) │ │ │ │ │ +calculate the index of a given gridpoint within a Kuhn0 simplex │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:280 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_g_e_t_P_e_r_m_u_t_a_t_i_o_n │ │ │ │ │ +FieldVector< int, n > getPermutation(int m) │ │ │ │ │ +Calculate permutation from it's index. │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:293 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_r_e_f_e_r_e_n_c_e_T_o_K_u_h_n │ │ │ │ │ +FieldVector< CoordType, dimension > referenceToKuhn(FieldVector< CoordType, │ │ │ │ │ +dimension > point, const FieldVector< int, dimension > &kuhn) │ │ │ │ │ +Map from the reference simplex to some Kuhn simplex. │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:322 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_k_u_h_n_T_o_R_e_f_e_r_e_n_c_e │ │ │ │ │ +FieldVector< CoordType, dimension > kuhnToReference(FieldVector< CoordType, │ │ │ │ │ +dimension > point, const FieldVector< int, dimension > &kuhn) │ │ │ │ │ +Map from some Kuhn simplex to the reference simplex. │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:341 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s │ │ │ │ │ +Class providing access to the singletons of the reference elements. │ │ │ │ │ +DDeeffiinniittiioonn referenceelements.hh:128 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_s_i_m_p_l_e_x │ │ │ │ │ +static const ReferenceElement & simplex() │ │ │ │ │ +get simplex reference elements │ │ │ │ │ +DDeeffiinniittiioonn referenceelements.hh:162 │ │ │ │ │ +_D_u_n_e_:_:_C_o_d_i_m │ │ │ │ │ +Static tag representing a codimension. │ │ │ │ │ +DDeeffiinniittiioonn dimension.hh:24 │ │ │ │ │ +_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y │ │ │ │ │ +Implement a MultiLinearGeometry with additional caching. │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:526 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:361 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ +Codim< dimension >::SubEntityIterator VertexIterator │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:368 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ +FieldVector< int, dimension+1 > IndexVector │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:371 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_c_t_y_p_e │ │ │ │ │ +CoordType ctype │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:364 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_n_V_e_r_t_i_c_e_s │ │ │ │ │ +static int nVertices(int nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:394 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_n_E_l_e_m_e_n_t_s │ │ │ │ │ +static int nElements(int nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:418 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_e_E_n_d │ │ │ │ │ +static ElementIterator eEnd(int nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:434 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_v_E_n_d │ │ │ │ │ +static VertexIterator vEnd(int nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:410 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ Codim< 0 >::SubEntityIterator ElementIterator │ │ │ │ │ -The ElementIterator of the VirtualRefinement. │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.hh:290 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_~_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -virtual ~VirtualRefinement() │ │ │ │ │ -Destructor. │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.hh:353 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_v_E_n_d │ │ │ │ │ -VertexIterator vEnd(Dune::RefinementIntervals tag) const │ │ │ │ │ -Get an VertexIterator. │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.cc:46 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:370 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_v_B_e_g_i_n │ │ │ │ │ +static VertexIterator vBegin(int nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:402 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_e_B_e_g_i_n │ │ │ │ │ +static ElementIterator eBegin(int nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:426 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ FieldVector< CoordType, dimension > CoordVector │ │ │ │ │ -The CoordVector of the VirtualRefinement. │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.hh:297 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_n_V_e_r_t_i_c_e_s │ │ │ │ │ -virtual int nVertices(Dune::RefinementIntervals tag) const =0 │ │ │ │ │ -Get the number of Vertices. │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ -std::vector< int > IndexVector │ │ │ │ │ -The IndexVector of the VirtualRefinement. │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.hh:303 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ -Codim< dimension >::SubEntityIterator VertexIterator │ │ │ │ │ -The VertexIterator of the VirtualRefinement. │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.hh:288 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_v_E_n_d_B_a_c_k │ │ │ │ │ -virtual VertexIteratorBack * vEndBack(Dune::RefinementIntervals tag) const =0 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r_B_a_c_k │ │ │ │ │ -SubEntityIteratorBack< 0 > ElementIteratorBack │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.hh:308 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_e_B_e_g_i_n_B_a_c_k │ │ │ │ │ -virtual ElementIteratorBack * eBeginBack(Dune::RefinementIntervals tag) const │ │ │ │ │ -=0 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_v_B_e_g_i_n_B_a_c_k │ │ │ │ │ -virtual VertexIteratorBack * vBeginBack(Dune::RefinementIntervals tag) const =0 │ │ │ │ │ -_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m │ │ │ │ │ -codim database of VirtualRefinement │ │ │ │ │ -DDeeffiinniittiioonn virtualrefinement.hh:367 │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:369 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ +static constexpr int dimension │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:363 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:385 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ +Dune::CachedMultiLinearGeometry< CoordType, dimension-codimension, dimension > │ │ │ │ │ +Geometry │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:388 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:445 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:451 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_ _>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +Refinement::CoordVector CoordVector │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:454 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_ _>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:453 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_ _>_:_:_v_e_r_t_e_x │ │ │ │ │ +Vertex vertex │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:471 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_ _>_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ +Refinement::template Codim< dimension >::Geometry Geometry │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:455 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_ _>_:_:_T_h_i_s │ │ │ │ │ +RefinementIteratorSpecial< dimension, CoordType, dimension > This │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:456 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_ _>_:_:_V_e_r_t_e_x │ │ │ │ │ +FieldVector< int, dimension > Vertex │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:468 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_ _>_:_:_s_i_z_e │ │ │ │ │ +int size │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:470 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ +_0_ _> │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:541 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ +_0_ _>_:_:_k_u_h_n_I_n_d_e_x │ │ │ │ │ +int kuhnIndex │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:568 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ +_0_ _>_:_:_V_e_r_t_e_x │ │ │ │ │ +FieldVector< int, dimension > Vertex │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:564 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ +_0_ _>_:_:_o_r_i_g_i_n │ │ │ │ │ +Vertex origin │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:567 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ +_0_ _>_:_:_i_n_d_e_x__ │ │ │ │ │ +int index_ │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:570 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ +_0_ _>_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ +Refinement::template Codim< 0 >::Geometry Geometry │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:546 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ +_0_ _>_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ +Refinement::IndexVector IndexVector │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:544 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ +_0_ _>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +Refinement::CoordVector CoordVector │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:545 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ +_0_ _>_:_:_T_h_i_s │ │ │ │ │ +RefinementIteratorSpecial< dimension, CoordType, 0 > This │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:547 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ +_0_ _>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:543 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ +_0_ _>_:_:_s_i_z_e │ │ │ │ │ +int size │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:569 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_: │ │ │ │ │ +_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ +SubEntityIterator(int nIntervals, bool end=false) │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:705 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00200.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: referenceelements.hh File Reference │ │ │ │ +dune-geometry: hcubetriangulation.cc File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,79 +65,82 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ -Typedefs | │ │ │ │ -Functions
│ │ │ │ -
referenceelements.hh File Reference
│ │ │ │ +Macros
│ │ │ │ +
hcubetriangulation.cc File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#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>
│ │ │ │ + │ │ │ │ +

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"
│ │ │ │
│ │ │ │

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::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::Transitional
namespace  Dune::RefinementImp::HCubeTriangulation
 This namespace contains the Refinement implementation for triangulating hypercubes (GeometryType::cube -> GeometryType::simplex)
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Typedefs

template<typename... T>
using Dune::ReferenceElement = decltype(referenceElement(std::declval< T >()...))
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Functions

template<typename... T>
unspecified value type Dune::referenceElement (T &&... t)
 Returns a reference element for the objects t....
 
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.
 
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.
 

│ │ │ │ +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 {} │ │ │ │ │ @@ -1,60 +1,55 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -referenceelements.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_d_i_m_e_n_s_i_o_n_._h_h> │ │ │ │ │ + * _r_e_f_i_n_e_m_e_n_t │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s │ │ │ │ │ +hcubetriangulation.cc File Reference │ │ │ │ │ +This file contains the _R_e_f_i_n_e_m_e_n_t implementation for triangulating hypercubes │ │ │ │ │ +(quadrilateral -> triangle, hexahedron -> tetrahedron) _M_o_r_e_._._. │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_i_m_p_l_e_m_e_n_t_a_t_i_o_n_._h_h> │ │ │ │ │ +#include "_b_a_s_e_._c_c" │ │ │ │ │ +#include "_s_i_m_p_l_e_x_._c_c" │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_<_ _c_t_y_p_e___,_ _d_i_m_ _> │ │ │ │ │ -  Class providing access to the singletons of the reference elements. │ │ │ │ │ - _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___, │ │ │ │ │ + _C_o_o_r_d_T_y_p_e_ _> │ │ │ │ │   │ │ │ │ │ -NNaammeessppaacceess │ │ │ │ │ -namespace   _D_u_n_e │ │ │ │ │ +struct   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___, │ │ │ │ │ + _C_o_o_r_d_T_y_p_e_ _>_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ + _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_G_e_o │ │ │ │ │ + class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ + _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _> │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_T_r_a_n_s_i_t_i_o_n_a_l │ │ │ │ │ + class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___, │ │ │ │ │ + _C_o_o_r_d_T_y_p_e_ _>_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ +  │ │ │ │ │ +NNaammeessppaacceess │ │ │ │ │ +namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -TTyyppeeddeeffss │ │ │ │ │ -template │ │ │ │ │ -using  _D_u_n_e_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t = decltype(_r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t(std::declval< T > │ │ │ │ │ - ()...)) │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -unspecified value type  _D_u_n_e_:_:_r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t (T &&... t) │ │ │ │ │ -  Returns a reference element for the objects t.... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - auto  _D_u_n_e_:_:_r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t (const _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e >, │ │ │ │ │ - _D_u_n_e_:_:_D_i_m< dim >={}) │ │ │ │ │ -  Returns a reference element of dimension dim for the │ │ │ │ │ - given geometry type and coordinate field type. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ ->::value, int > = 0> │ │ │ │ │ - auto  _D_u_n_e_:_:_r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t (const T &, const _D_u_n_e_:_: │ │ │ │ │ - _G_e_o_m_e_t_r_y_T_y_p_e >, _D_u_n_e_:_:_D_i_m< dim >) │ │ │ │ │ -  Returns a reference element of dimension dim for the │ │ │ │ │ - given geometry type and coordinate field type. │ │ │ │ │ +namespace   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ +  This namespace contains the implementation of _R_e_f_i_n_e_m_e_n_t. │ │ │ │ │   │ │ │ │ │ +namespace   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n │ │ │ │ │ + This namespace contains the _R_e_f_i_n_e_m_e_n_t implementation for │ │ │ │ │ +  triangulating hypercubes (_G_e_o_m_e_t_r_y_T_y_p_e_:_:_c_u_b_e -> _G_e_o_m_e_t_r_y_T_y_p_e_:_: │ │ │ │ │ + _s_i_m_p_l_e_x) │ │ │ │ │ +  │ │ │ │ │ +MMaaccrrooss │ │ │ │ │ +#define  _D_U_N_E___G_E_O_M_E_T_R_Y___R_E_F_I_N_E_M_E_N_T___H_C_U_B_E_T_R_I_A_N_G_U_L_A_T_I_O_N___C_C │ │ │ │ │ +  │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +This file contains the _R_e_f_i_n_e_m_e_n_t implementation for triangulating hypercubes │ │ │ │ │ +(quadrilateral -> triangle, hexahedron -> tetrahedron) │ │ │ │ │ +See _R_e_f_i_n_e_m_e_n_t_ _i_m_p_l_e_m_e_n_t_a_t_i_o_n_ _f_o_r_ _t_r_i_a_n_g_u_l_a_t_i_n_g_ _h_y_p_e_r_c_u_b_e_s. │ │ │ │ │ +********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ +********** _?◆_? DDUUNNEE__GGEEOOMMEETTRRYY__RREEFFIINNEEMMEENNTT__HHCCUUBBEETTRRIIAANNGGUULLAATTIIOONN__CCCC ********** │ │ │ │ │ +#define DUNE_GEOMETRY_REFINEMENT_HCUBETRIANGULATION_CC │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00200_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: referenceelements.hh Source File │ │ │ │ +dune-geometry: hcubetriangulation.cc Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,321 +70,509 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
referenceelements.hh
│ │ │ │ +
hcubetriangulation.cc
│ │ │ │
│ │ │ │
│ │ │ │ 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 © 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
│ │ │ │ +
5#ifndef DUNE_GEOMETRY_REFINEMENT_HCUBETRIANGULATION_CC
│ │ │ │ +
6#define DUNE_GEOMETRY_REFINEMENT_HCUBETRIANGULATION_CC
│ │ │ │
7
│ │ │ │ -
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 {
│ │ │ │ + │ │ │ │ +
30#include <dune/geometry/type.hh>
│ │ │ │
31
│ │ │ │ -
32#ifndef DOXYGEN
│ │ │ │ -
33
│ │ │ │ +
32#include "base.cc"
│ │ │ │ +
33#include "simplex.cc"
│ │ │ │
34
│ │ │ │ -
35 namespace Impl
│ │ │ │ -
36 {
│ │ │ │ -
37
│ │ │ │ -
38 // ReferenceElementContainer
│ │ │ │ -
39 // -------------------------
│ │ │ │ -
40
│ │ │ │ -
41 template< class ctype, int dim >
│ │ │ │ -
42 class ReferenceElementContainer
│ │ │ │ -
43 {
│ │ │ │ -
44 static const unsigned int numTopologies = dim >= 0 ? (1u << dim) : 0;
│ │ │ │ -
45
│ │ │ │ -
46 using Implementation = ReferenceElementImplementation< ctype, dim >;
│ │ │ │ +
35namespace Dune
│ │ │ │ +
36{
│ │ │ │ +
37 namespace RefinementImp
│ │ │ │ +
38 {
│ │ │ │ +
│ │ │ │ +
46 namespace HCubeTriangulation {
│ │ │ │
47
│ │ │ │ -
48 public:
│ │ │ │ -
49
│ │ │ │ -
50 using ReferenceElement = Dune::Geo::ReferenceElement< Implementation >;
│ │ │ │ -
51 using value_type = ReferenceElement;
│ │ │ │ -
52 using const_iterator = const value_type*;
│ │ │ │ -
53
│ │ │ │ -
54 ReferenceElementContainer ()
│ │ │ │ -
55 {
│ │ │ │ -
56 for( unsigned int topologyId = 0; topologyId < numTopologies; ++topologyId )
│ │ │ │ -
57 {
│ │ │ │ -
58 implementations_[ topologyId ].initialize( topologyId );
│ │ │ │ -
59 reference_elements_[ topologyId ].setImplementation( implementations_[ topologyId ] );
│ │ │ │ -
60 }
│ │ │ │ -
61 }
│ │ │ │ -
62
│ │ │ │ -
63 const ReferenceElement& operator() ( const GeometryType &type ) const
│ │ │ │ -
64 {
│ │ │ │ -
65 assert( type.dim() == dim );
│ │ │ │ -
66 return reference_elements_[ type.id() ];
│ │ │ │ -
67 }
│ │ │ │ -
68
│ │ │ │ -
69 const ReferenceElement& simplex () const
│ │ │ │ -
70 {
│ │ │ │ -
71 return reference_elements_[ Dune::GeometryTypes::simplex(dim).id() ];
│ │ │ │ -
72 }
│ │ │ │ -
73
│ │ │ │ -
74 const ReferenceElement& cube () const
│ │ │ │ -
75 {
│ │ │ │ -
76 return reference_elements_[ Dune::GeometryTypes::cube(dim).id() ];
│ │ │ │ -
77 }
│ │ │ │ -
78
│ │ │ │ -
79 const ReferenceElement& pyramid () const
│ │ │ │ -
80 {
│ │ │ │ -
81 return reference_elements_[ Dune::GeometryTypes::pyramid.id() ];
│ │ │ │ -
82 }
│ │ │ │ +
48 // ////////////
│ │ │ │ +
49 //
│ │ │ │ +
50 // Utilities
│ │ │ │ +
51 //
│ │ │ │ +
52
│ │ │ │ + │ │ │ │ + │ │ │ │ +
55
│ │ │ │ +
56 // ////////////////////////////////////
│ │ │ │ +
57 //
│ │ │ │ +
58 // Refine a hypercube with simplices
│ │ │ │ +
59 //
│ │ │ │ +
60
│ │ │ │ +
61 // forward declaration of the iterator base
│ │ │ │ +
62 template<int dimension, class CoordType, int codimension>
│ │ │ │ + │ │ │ │ +
64
│ │ │ │ +
65 template<int dimension_, class CoordType>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
67 {
│ │ │ │ +
68 public:
│ │ │ │ +
69 constexpr static int dimension = dimension_;
│ │ │ │ +
70
│ │ │ │ +
71 typedef CoordType ctype;
│ │ │ │ +
72
│ │ │ │ +
73 template<int codimension>
│ │ │ │ +
74 struct Codim;
│ │ │ │ + │ │ │ │ +
76 typedef FieldVector<CoordType, dimension> CoordVector;
│ │ │ │ + │ │ │ │ +
78 typedef FieldVector<int, dimension+1> IndexVector;
│ │ │ │ +
79
│ │ │ │ +
80 static int nVertices(int nIntervals);
│ │ │ │ +
81 static VertexIterator vBegin(int nIntervals);
│ │ │ │ +
82 static VertexIterator vEnd(int nIntervals);
│ │ │ │
83
│ │ │ │ -
84 const ReferenceElement& prism () const
│ │ │ │ -
85 {
│ │ │ │ -
86 return reference_elements_[ Dune::GeometryTypes::prism.id() ];
│ │ │ │ -
87 }
│ │ │ │ -
88
│ │ │ │ -
89 const_iterator begin () const
│ │ │ │ -
90 {
│ │ │ │ -
91 return reference_elements_.data();
│ │ │ │ -
92 }
│ │ │ │ +
84 static int nElements(int nIntervals);
│ │ │ │ +
85 static ElementIterator eBegin(int nIntervals);
│ │ │ │ +
86 static ElementIterator eEnd(int nIntervals);
│ │ │ │ +
87 private:
│ │ │ │ +
88 friend class RefinementIteratorSpecial<dimension, CoordType, 0>;
│ │ │ │ +
89 friend class RefinementIteratorSpecial<dimension, CoordType, dimension>;
│ │ │ │ +
90
│ │ │ │ + │ │ │ │ +
92 };
│ │ │ │ +
│ │ │ │
93
│ │ │ │ -
94 const_iterator end () const
│ │ │ │ -
95 {
│ │ │ │ -
96 return reference_elements_.data() + numTopologies;
│ │ │ │ -
97 }
│ │ │ │ -
98
│ │ │ │ -
99 private:
│ │ │ │ -
100
│ │ │ │ -
101 std::array<Implementation,numTopologies> implementations_;
│ │ │ │ -
102 std::array<ReferenceElement,numTopologies> reference_elements_;
│ │ │ │ -
103
│ │ │ │ -
104 };
│ │ │ │ -
105
│ │ │ │ -
106
│ │ │ │ -
107 } // namespace Impl
│ │ │ │ -
108
│ │ │ │ -
109
│ │ │ │ -
110#endif // DOXYGEN
│ │ │ │ -
111
│ │ │ │ -
112
│ │ │ │ -
113 // ReferenceElements
│ │ │ │ -
114 // ------------------------
│ │ │ │ -
115
│ │ │ │ -
126 template< class ctype_, int dim >
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
128 {
│ │ │ │ -
129
│ │ │ │ -
131 using ctype = ctype_;
│ │ │ │ -
132
│ │ │ │ - │ │ │ │ -
135
│ │ │ │ -
137 static constexpr int dimension = dim;
│ │ │ │ -
138
│ │ │ │ -
139 private:
│ │ │ │ -
140
│ │ │ │ -
141 using Container = Impl::ReferenceElementContainer< ctype, dim >;
│ │ │ │ -
142
│ │ │ │ -
143 public:
│ │ │ │ -
144
│ │ │ │ -
146 using ReferenceElement = typename Container::ReferenceElement;
│ │ │ │ -
147
│ │ │ │ -
149 using Iterator = typename Container::const_iterator;
│ │ │ │ -
150
│ │ │ │ - │ │ │ │ -
153
│ │ │ │ -
155 static const ReferenceElement&
│ │ │ │ -
│ │ │ │ -
156 general ( const GeometryType& type )
│ │ │ │ -
157 {
│ │ │ │ -
158 return container() ( type );
│ │ │ │ -
159 }
│ │ │ │ -
│ │ │ │ -
160
│ │ │ │ -
│ │ │ │ -
162 static const ReferenceElement& simplex ()
│ │ │ │ -
163 {
│ │ │ │ -
164 return container().simplex();
│ │ │ │ -
165 }
│ │ │ │ -
│ │ │ │ -
166
│ │ │ │ -
│ │ │ │ -
168 static const ReferenceElement& cube ()
│ │ │ │ -
169 {
│ │ │ │ -
170 return container().cube();
│ │ │ │ -
171 }
│ │ │ │ -
│ │ │ │ -
172
│ │ │ │ -
│ │ │ │ -
173 static Iterator begin ()
│ │ │ │ -
174 {
│ │ │ │ -
175 return container().begin();
│ │ │ │ -
176 }
│ │ │ │ +
94 template<int dimension, class CoordType>
│ │ │ │ +
95 template<int codimension>
│ │ │ │ +
│ │ │ │ +
96 struct RefinementImp<dimension, CoordType>::Codim
│ │ │ │ +
97 {
│ │ │ │ +
98 class SubEntityIterator;
│ │ │ │ +
99 typedef Dune::MultiLinearGeometry<CoordType,dimension-codimension,dimension> Geometry;
│ │ │ │ +
100 };
│ │ │ │ +
│ │ │ │ +
101
│ │ │ │ +
102 template<int dimension, class CoordType>
│ │ │ │ +
103 int
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
105 nVertices(int nIntervals)
│ │ │ │ +
106 {
│ │ │ │ +
107 return BackendRefinement::nVertices(nIntervals) * factorial(int(dimension));
│ │ │ │ +
108 }
│ │ │ │
│ │ │ │ +
109
│ │ │ │ +
110 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
113 vBegin(int nIntervals)
│ │ │ │ +
114 {
│ │ │ │ +
115 return VertexIterator(nIntervals);
│ │ │ │ +
116 }
│ │ │ │ +
│ │ │ │ +
117
│ │ │ │ +
118 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
121 vEnd(int nIntervals)
│ │ │ │ +
122 {
│ │ │ │ +
123 return VertexIterator(nIntervals, true);
│ │ │ │ +
124 }
│ │ │ │ +
│ │ │ │ +
125
│ │ │ │ +
126 template<int dimension, class CoordType>
│ │ │ │ +
127 int
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
129 nElements(int nIntervals)
│ │ │ │ +
130 {
│ │ │ │ +
131 return BackendRefinement::nElements(nIntervals) * factorial(int(dimension));
│ │ │ │ +
132 }
│ │ │ │ +
│ │ │ │ +
133
│ │ │ │ +
134 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
137 eBegin(int nIntervals)
│ │ │ │ +
138 {
│ │ │ │ +
139 return ElementIterator(nIntervals);
│ │ │ │ +
140 }
│ │ │ │ +
│ │ │ │ +
141
│ │ │ │ +
142 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
145 eEnd(int nIntervals)
│ │ │ │ +
146 {
│ │ │ │ +
147 return ElementIterator(nIntervals, true);
│ │ │ │ +
148 }
│ │ │ │ +
│ │ │ │ +
149
│ │ │ │ +
150 // //////////////
│ │ │ │ +
151 //
│ │ │ │ +
152 // The iterator
│ │ │ │ +
153 //
│ │ │ │ +
154
│ │ │ │ +
155 // vertices
│ │ │ │ +
156 template<int dimension, class CoordType>
│ │ │ │ +
│ │ │ │ +
157 class RefinementIteratorSpecial<dimension, CoordType, dimension>
│ │ │ │ +
158 {
│ │ │ │ +
159 public:
│ │ │ │ + │ │ │ │ +
161 typedef typename Refinement::CoordVector CoordVector;
│ │ │ │ +
162 typedef typename Refinement::template Codim<dimension>::Geometry Geometry;
│ │ │ │ +
163
│ │ │ │ +
164 RefinementIteratorSpecial(int nIntervals, bool end = false);
│ │ │ │ +
165
│ │ │ │ +
166 void increment();
│ │ │ │ +
167
│ │ │ │ +
168 CoordVector coords() const;
│ │ │ │ +
169
│ │ │ │ +
170 Geometry geometry() const;
│ │ │ │ +
171
│ │ │ │ +
172 int index() const;
│ │ │ │ +
173 protected:
│ │ │ │ +
174 typedef typename Refinement::BackendRefinement BackendRefinement;
│ │ │ │ +
175 typedef typename BackendRefinement::template Codim<dimension>::SubEntityIterator BackendIterator;
│ │ │ │ +
176 constexpr static int nKuhnSimplices = factorial(int(dimension));
│ │ │ │
177
│ │ │ │ -
│ │ │ │ -
178 static Iterator end ()
│ │ │ │ -
179 {
│ │ │ │ -
180 return container().end();
│ │ │ │ -
181 }
│ │ │ │ + │ │ │ │ +
179
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
183 };
│ │ │ │
│ │ │ │ -
182
│ │ │ │ -
183 private:
│ │ │ │
184
│ │ │ │ -
185 DUNE_EXPORT static const Container& container ()
│ │ │ │ -
186 {
│ │ │ │ -
187 static Container container;
│ │ │ │ -
188 return container;
│ │ │ │ -
189 }
│ │ │ │ -
190 };
│ │ │ │ -
│ │ │ │ -
191
│ │ │ │ -
192 } // namespace Geo
│ │ │ │ -
193
│ │ │ │ -
195 using Geo::ReferenceElements;
│ │ │ │ -
196
│ │ │ │ -
197
│ │ │ │ -
198#ifdef DOXYGEN
│ │ │ │ -
199
│ │ │ │ -
201
│ │ │ │ -
244 template<typename... T>
│ │ │ │ -
245 unspecified-value-type referenceElement(T&&... t);
│ │ │ │ +
185 template<int dimension, class CoordType>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
187 RefinementIteratorSpecial(int nIntervals, bool end)
│ │ │ │ +
188 : nIntervals_(nIntervals), kuhnIndex(0),
│ │ │ │ +
189 backend(BackendRefinement::vBegin(nIntervals_)),
│ │ │ │ +
190 backendEnd(BackendRefinement::vEnd(nIntervals_))
│ │ │ │ +
191 {
│ │ │ │ +
192 if (end)
│ │ │ │ +
193 kuhnIndex = nKuhnSimplices;
│ │ │ │ +
194 }
│ │ │ │ +
│ │ │ │ +
195
│ │ │ │ +
196 template<int dimension, class CoordType>
│ │ │ │ +
197 void
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
200 {
│ │ │ │ +
201 ++backend;
│ │ │ │ +
202 if (backend == backendEnd)
│ │ │ │ +
203 {
│ │ │ │ +
204 backend = BackendRefinement::vBegin(nIntervals_);
│ │ │ │ +
205 ++kuhnIndex;
│ │ │ │ +
206 }
│ │ │ │ +
207 }
│ │ │ │ +
│ │ │ │ +
208
│ │ │ │ +
209 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
212 coords() const
│ │ │ │ +
213 {
│ │ │ │ +
214 return referenceToKuhn(backend.coords(), getPermutation<dimension>(kuhnIndex));
│ │ │ │ +
215 }
│ │ │ │ +
│ │ │ │ +
216
│ │ │ │ +
217 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
220 {
│ │ │ │ +
221 std::vector<CoordVector> corners(1);
│ │ │ │ +
222 corners[0] = referenceToKuhn(backend.coords(), getPermutation<dimension>(kuhnIndex));
│ │ │ │ +
223 return Geometry(GeometryTypes::vertex, corners);
│ │ │ │ +
224 }
│ │ │ │ +
│ │ │ │ +
225
│ │ │ │ +
226 template<int dimension, class CoordType>
│ │ │ │ +
227 int
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
229 index() const
│ │ │ │ +
230 {
│ │ │ │ +
231 return kuhnIndex*BackendRefinement::nVertices(nIntervals_) + backend.index();
│ │ │ │ +
232 }
│ │ │ │ +
│ │ │ │ +
233
│ │ │ │ +
234 // elements
│ │ │ │ +
235 template<int dimension, class CoordType>
│ │ │ │ +
│ │ │ │ +
236 class RefinementIteratorSpecial<dimension, CoordType, 0>
│ │ │ │ +
237 {
│ │ │ │ +
238 public:
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
242 typedef typename Refinement::template Codim<0>::Geometry Geometry;
│ │ │ │ +
243
│ │ │ │ +
244 RefinementIteratorSpecial(int nIntervals_, bool end = false);
│ │ │ │ + │ │ │ │
246
│ │ │ │ -
247#endif
│ │ │ │ +
247 void increment();
│ │ │ │
248
│ │ │ │ -
249
│ │ │ │ -
251
│ │ │ │ -
264 template<typename T, int dim>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
266 {
│ │ │ │ - │ │ │ │ -
268 }
│ │ │ │ +
249 IndexVector vertexIndices() const;
│ │ │ │ +
250 int index() const;
│ │ │ │ +
251 CoordVector coords() const;
│ │ │ │ +
252
│ │ │ │ +
253 Geometry geometry() const;
│ │ │ │ +
254
│ │ │ │ +
255 private:
│ │ │ │ +
256 CoordVector global(const CoordVector &local) const;
│ │ │ │ +
257
│ │ │ │ +
258 protected:
│ │ │ │ + │ │ │ │ +
260 typedef typename BackendRefinement::template Codim<0>::SubEntityIterator BackendIterator;
│ │ │ │ +
261 constexpr static int nKuhnSimplices = factorial(dimension);
│ │ │ │ +
262
│ │ │ │ + │ │ │ │ +
264
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
268 };
│ │ │ │
│ │ │ │
269
│ │ │ │ -
270
│ │ │ │ -
272
│ │ │ │ -
284 template<typename T, int dim, std::enable_if_t<IsNumber<std::decay_t<T>>::value, int> = 0>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
286 {
│ │ │ │ - │ │ │ │ -
288 }
│ │ │ │ -
│ │ │ │ -
289
│ │ │ │ -
290
│ │ │ │ -
291#ifndef DOXYGEN
│ │ │ │ -
292
│ │ │ │ -
293 // helpers for the ReferenceElement<> meta function
│ │ │ │ -
294 // the complete Impl block can be removed together with deprecated Transitional::ReferenceElement
│ │ │ │ -
295
│ │ │ │ -
296 namespace Impl {
│ │ │ │ -
297
│ │ │ │ -
298 // Evaluates to the correct reference element iff <T...> matches the pattern <number_type,Dim<int>>
│ │ │ │ -
299 // otherwise, it's ill-formed. Should be used with detected_or and friends.
│ │ │ │ +
270 template<int dimension, class CoordType>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
272 RefinementIteratorSpecial(int nIntervals, bool end)
│ │ │ │ +
273 : nIntervals_(nIntervals), kuhnIndex(0),
│ │ │ │ +
274 backend(BackendRefinement::eBegin(nIntervals_)),
│ │ │ │ +
275 backendEnd(BackendRefinement::eEnd(nIntervals_))
│ │ │ │ +
276 {
│ │ │ │ +
277 if (end)
│ │ │ │ +
278 kuhnIndex = nKuhnSimplices;
│ │ │ │ +
279 }
│ │ │ │ +
│ │ │ │ +
280 template<int dimension, class CoordType>
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
283 : nIntervals_(other.nIntervals_), kuhnIndex(other.kuhnIndex),
│ │ │ │ +
284 backend(other.backend),
│ │ │ │ +
285 backendEnd(other.backendEnd)
│ │ │ │ +
286 {}
│ │ │ │ +
│ │ │ │ +
287
│ │ │ │ +
288 template<int dimension, class CoordType>
│ │ │ │ +
289 void
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
292 {
│ │ │ │ +
293 ++backend;
│ │ │ │ +
294 if (backend == backendEnd)
│ │ │ │ +
295 {
│ │ │ │ +
296 backend = BackendRefinement::eBegin(nIntervals_);
│ │ │ │ +
297 ++kuhnIndex;
│ │ │ │ +
298 }
│ │ │ │ +
299 }
│ │ │ │ +
│ │ │ │
300
│ │ │ │ -
301 template<typename... T>
│ │ │ │ -
302 struct DefaultReferenceElementExtractor;
│ │ │ │ -
303
│ │ │ │ -
304 template<typename T, typename std::enable_if<IsNumber<T>::value,int>::type dim>
│ │ │ │ -
305 struct DefaultReferenceElementExtractor<T,Dim<dim>>
│ │ │ │ -
306 {
│ │ │ │ - │ │ │ │ -
308 };
│ │ │ │ -
309
│ │ │ │ -
310 template<typename... T>
│ │ │ │ -
311 using DefaultReferenceElement = typename DefaultReferenceElementExtractor<T...>::type;
│ │ │ │ -
312
│ │ │ │ -
313 }
│ │ │ │ -
314
│ │ │ │ -
315 // looks up the type of a reference element by trying to instantiate the correct overload
│ │ │ │ -
316 // of referenceElement() for the given arguments. This will fail if there is no valid
│ │ │ │ -
317 // overload and should be used with detected_or or some other utility that places the
│ │ │ │ -
318 // instantiation in SFINAE context.
│ │ │ │ -
319 //
│ │ │ │ -
320 // this is placed directly in namespace Dune to avoid any weird surprises
│ │ │ │ +
301 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
304 vertexIndices() const
│ │ │ │ +
305 {
│ │ │ │ +
306 IndexVector indices = backend.vertexIndices();
│ │ │ │ +
307
│ │ │ │ +
308 int base = kuhnIndex * BackendRefinement::nVertices(nIntervals_);
│ │ │ │ +
309 indices += base;
│ │ │ │ +
310
│ │ │ │ +
311 return indices;
│ │ │ │ +
312 }
│ │ │ │ +
│ │ │ │ +
313
│ │ │ │ +
314 template<int dimension, class CoordType>
│ │ │ │ +
315 int
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
317 index() const
│ │ │ │ +
318 {
│ │ │ │ +
319 return kuhnIndex*BackendRefinement::nElements(nIntervals_) + backend.index();
│ │ │ │ +
320 }
│ │ │ │ +
│ │ │ │
321
│ │ │ │ -
322 template<typename... T>
│ │ │ │ -
323 using LookupReferenceElement = decltype(referenceElement(std::declval<T>()...));
│ │ │ │ -
324
│ │ │ │ -
325#endif // DOXYGEN
│ │ │ │ -
326
│ │ │ │ -
│ │ │ │ -
327 namespace [[deprecated]] Transitional {
│ │ │ │ -
328
│ │ │ │ -
329 // this abomination checks whether the template signature matches the special case
│ │ │ │ -
330 // ReferenceElement<number_type,Dune::Dim<int>> and otherwise defers the type lookup
│ │ │ │ -
331 // to a decltype on a call to referenceElement(std::declval<T>())
│ │ │ │ -
332
│ │ │ │ -
337 template<typename... T>
│ │ │ │ -
338 using ReferenceElement = detected_or_fallback_t<
│ │ │ │ -
339 Impl::DefaultReferenceElement,
│ │ │ │ -
340 LookupReferenceElement,
│ │ │ │ -
341 T...
│ │ │ │ -
342 >;
│ │ │ │ -
343
│ │ │ │ -
344 }
│ │ │ │ -
│ │ │ │ -
345
│ │ │ │ -
346 template<typename... T>
│ │ │ │ -
347 using ReferenceElement = decltype(referenceElement(std::declval<T>()...));
│ │ │ │ -
348
│ │ │ │ -
349} // namespace Dune
│ │ │ │ +
322 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
325 coords() const
│ │ │ │ +
326 {
│ │ │ │ +
327 return global(backend.coords());
│ │ │ │ +
328 }
│ │ │ │ +
│ │ │ │ +
329
│ │ │ │ +
330 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
333 {
│ │ │ │ +
334 const typename BackendIterator::Geometry &bgeo =
│ │ │ │ +
335 backend.geometry();
│ │ │ │ +
336 std::vector<CoordVector> corners(dimension+1);
│ │ │ │ +
337 for(int i = 0; i <= dimension; ++i)
│ │ │ │ +
338 corners[i] = global(bgeo.corner(i));
│ │ │ │ +
339
│ │ │ │ +
340 return Geometry(bgeo.type(), corners);
│ │ │ │ +
341 }
│ │ │ │ +
│ │ │ │ +
342
│ │ │ │ +
343 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
346 global(const CoordVector &local) const
│ │ │ │ +
347 {
│ │ │ │ +
348 return referenceToKuhn(local, getPermutation<dimension>(kuhnIndex));
│ │ │ │ +
349 }
│ │ │ │
350
│ │ │ │ -
351#endif // #ifndef DUNE_GEOMETRY_REFERENCEELEMENTS_HH
│ │ │ │ -
A unique label for each type of element that can occur in a grid.
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
unspecified value type referenceElement(T &&... t)
Returns a reference element for the objects t....
│ │ │ │ +
351 // common
│ │ │ │ +
352 template<int dimension, class CoordType>
│ │ │ │ +
353 template<int codimension>
│ │ │ │ +
│ │ │ │ +
354 class RefinementImp<dimension, CoordType>::Codim<codimension>::SubEntityIterator
│ │ │ │ +
355 : public ForwardIteratorFacade<typename RefinementImp<dimension, CoordType>::template Codim<codimension>::SubEntityIterator, int>,
│ │ │ │ +
356 public RefinementIteratorSpecial<dimension, CoordType, codimension>
│ │ │ │ +
357 {
│ │ │ │ +
358 public:
│ │ │ │ + │ │ │ │ +
360 typedef SubEntityIterator This;
│ │ │ │ +
361
│ │ │ │ +
362 SubEntityIterator(int nIntervals, bool end = false);
│ │ │ │ +
363
│ │ │ │ +
364 bool equals(const This &other) const;
│ │ │ │ +
365 protected:
│ │ │ │ +
366 using RefinementIteratorSpecial<dimension, CoordType, codimension>::kuhnIndex;
│ │ │ │ +
367 using RefinementIteratorSpecial<dimension, CoordType, codimension>::backend;
│ │ │ │ +
368 };
│ │ │ │ +
│ │ │ │ +
369
│ │ │ │ +
370#ifndef DOXYGEN
│ │ │ │ +
371 template<int dimension, class CoordType>
│ │ │ │ +
372 template<int codimension>
│ │ │ │ + │ │ │ │ +
374 SubEntityIterator(int nIntervals, bool end)
│ │ │ │ +
375 : RefinementIteratorSpecial<dimension, CoordType, codimension>(nIntervals, end)
│ │ │ │ +
376 {}
│ │ │ │ +
377
│ │ │ │ +
378 template<int dimension, class CoordType>
│ │ │ │ +
379 template<int codimension>
│ │ │ │ +
380 bool
│ │ │ │ + │ │ │ │ +
382 equals(const This &other) const
│ │ │ │ +
383 { return kuhnIndex == other.kuhnIndex && backend == other.backend; }
│ │ │ │ +
384
│ │ │ │ +
385#endif // DOXYGEN
│ │ │ │ +
386
│ │ │ │ +
387 } // namespace HCubeTriangulation
│ │ │ │ +
│ │ │ │ +
388 } // namespace RefinementImp
│ │ │ │ +
389
│ │ │ │ +
390 namespace RefinementImp
│ │ │ │ +
391 {
│ │ │ │ +
392 // ///////////////////////
│ │ │ │ +
393 //
│ │ │ │ +
394 // The refinement traits
│ │ │ │ +
395 //
│ │ │ │ +
396
│ │ │ │ +
397#ifndef DOXYGEN
│ │ │ │ +
398 template<unsigned topologyId, class CoordType, unsigned coerceToId,
│ │ │ │ +
399 int dim>
│ │ │ │ +
400 struct Traits<
│ │ │ │ +
401 topologyId, CoordType, coerceToId, dim,
│ │ │ │ +
402 typename std::enable_if<
│ │ │ │ +
403 (dim >= 2 &&
│ │ │ │ +
404 (GeometryTypes::cube(dim).id() >> 1) ==
│ │ │ │ +
405 (topologyId >> 1) &&
│ │ │ │ +
406 (GeometryTypes::simplex(dim).id() >> 1) ==
│ │ │ │ +
407 (coerceToId >> 1)
│ │ │ │ +
408 )>::type
│ │ │ │ +
409 >
│ │ │ │ +
410 {
│ │ │ │ +
411 typedef HCubeTriangulation::RefinementImp<dim, CoordType> Imp;
│ │ │ │ +
412 };
│ │ │ │ +
413#endif
│ │ │ │ +
414
│ │ │ │ +
415 } // namespace RefinementImp
│ │ │ │ +
416} // namespace Dune
│ │ │ │ +
417
│ │ │ │ +
418#endif // DUNE_GEOMETRY_REFINEMENT_HCUBETRIANGULATION_CC
│ │ │ │ +
This file contains the parts independent of a particular Refinement implementation.
│ │ │ │ +
This file contains the Refinement implementation for simplices (triangles, tetrahedrons....
│ │ │ │ +
A unique label for each type of element that can occur in a grid.
│ │ │ │ + │ │ │ │ +
STL namespace.
│ │ │ │
Definition affinegeometry.hh:21
│ │ │ │ -
decltype(referenceElement(std::declval< T >()...)) ReferenceElement
Definition referenceelements.hh:347
│ │ │ │ -
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:128
│ │ │ │ -
static Iterator begin()
Definition referenceelements.hh:173
│ │ │ │ -
Iterator iterator
Iterator over available reference elements.
Definition referenceelements.hh:152
│ │ │ │ -
typename Container::ReferenceElement ReferenceElement
The reference element type.
Definition referenceelements.hh:146
│ │ │ │ -
static const ReferenceElement & cube()
get hypercube reference elements
Definition referenceelements.hh:168
│ │ │ │ -
static Iterator end()
Definition referenceelements.hh:178
│ │ │ │ -
ctype_ ctype
The coordinate field type of the contained reference elements.
Definition referenceelements.hh:131
│ │ │ │ -
static const ReferenceElement & general(const GeometryType &type)
get general reference elements
Definition referenceelements.hh:156
│ │ │ │ -
static const ReferenceElement & simplex()
get simplex reference elements
Definition referenceelements.hh:162
│ │ │ │ -
typename Container::const_iterator Iterator
Iterator over available reference elements.
Definition referenceelements.hh:149
│ │ │ │ -
static constexpr int dimension
The dimension of the contained reference elements.
Definition referenceelements.hh:137
│ │ │ │ -
ctype CoordinateField
The coordinate field type of the contained reference elements.
Definition referenceelements.hh:134
│ │ │ │ -
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:114
│ │ │ │ -
constexpr unsigned int id() const
Return the topology id of the type.
Definition type.hh:365
│ │ │ │ +
FieldVector< int, n > getPermutation(int m)
Calculate permutation from it's index.
Definition simplex.cc:293
│ │ │ │ +
FieldVector< CoordType, dimension > referenceToKuhn(FieldVector< CoordType, dimension > point, const FieldVector< int, dimension > &kuhn)
Map from the reference simplex to some Kuhn simplex.
Definition simplex.cc:322
│ │ │ │ +
Static tag representing a codimension.
Definition dimension.hh:24
│ │ │ │ +
generic geometry implementation based on corner coordinates
Definition multilineargeometry.hh:181
│ │ │ │ + │ │ │ │ + │ │ │ │ +
static VertexIterator vEnd(int nIntervals)
Definition hcubetriangulation.cc:121
│ │ │ │ +
static VertexIterator vBegin(int nIntervals)
Definition hcubetriangulation.cc:113
│ │ │ │ +
static int nElements(int nIntervals)
Definition hcubetriangulation.cc:129
│ │ │ │ +
FieldVector< CoordType, dimension > CoordVector
Definition hcubetriangulation.cc:76
│ │ │ │ +
CoordType ctype
Definition hcubetriangulation.cc:71
│ │ │ │ +
Codim< 0 >::SubEntityIterator ElementIterator
Definition hcubetriangulation.cc:77
│ │ │ │ +
FieldVector< int, dimension+1 > IndexVector
Definition hcubetriangulation.cc:78
│ │ │ │ +
static ElementIterator eBegin(int nIntervals)
Definition hcubetriangulation.cc:137
│ │ │ │ +
static ElementIterator eEnd(int nIntervals)
Definition hcubetriangulation.cc:145
│ │ │ │ +
static constexpr int dimension
Definition hcubetriangulation.cc:69
│ │ │ │ +
Codim< dimension >::SubEntityIterator VertexIterator
Definition hcubetriangulation.cc:75
│ │ │ │ +
static int nVertices(int nIntervals)
Definition hcubetriangulation.cc:105
│ │ │ │ + │ │ │ │ +
Dune::MultiLinearGeometry< CoordType, dimension-codimension, dimension > Geometry
Definition hcubetriangulation.cc:99
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
Refinement::template Codim< dimension >::Geometry Geometry
Definition hcubetriangulation.cc:162
│ │ │ │ +
BackendRefinement::template Codim< dimension >::SubEntityIterator BackendIterator
Definition hcubetriangulation.cc:175
│ │ │ │ +
Refinement::BackendRefinement BackendRefinement
Definition hcubetriangulation.cc:174
│ │ │ │ + │ │ │ │ +
RefinementImp< dimension, CoordType > Refinement
Definition hcubetriangulation.cc:160
│ │ │ │ + │ │ │ │ +
BackendRefinement::template Codim< 0 >::SubEntityIterator BackendIterator
Definition hcubetriangulation.cc:260
│ │ │ │ + │ │ │ │ +
Refinement::CoordVector CoordVector
Definition hcubetriangulation.cc:241
│ │ │ │ + │ │ │ │ + │ │ │ │ +
Refinement::BackendRefinement BackendRefinement
Definition hcubetriangulation.cc:259
│ │ │ │ + │ │ │ │ +
Refinement::IndexVector IndexVector
Definition hcubetriangulation.cc:240
│ │ │ │ +
RefinementImp< dimension, CoordType > Refinement
Definition hcubetriangulation.cc:239
│ │ │ │ +
Refinement::template Codim< 0 >::Geometry Geometry
Definition hcubetriangulation.cc:242
│ │ │ │ + │ │ │ │ + │ │ │ │ +
RefinementImp< dimension, CoordType > Refinement
Definition hcubetriangulation.cc:359
│ │ │ │ +
SubEntityIterator This
Definition hcubetriangulation.cc:360
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,356 +1,590 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -referenceelements.hh │ │ │ │ │ + * _r_e_f_i_n_e_m_e_n_t │ │ │ │ │ +hcubetriangulation.cc │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 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 © 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 │ │ │ │ │ +5#ifndef DUNE_GEOMETRY_REFINEMENT_HCUBETRIANGULATION_CC │ │ │ │ │ +_6#define DUNE_GEOMETRY_REFINEMENT_HCUBETRIANGULATION_CC │ │ │ │ │ 7 │ │ │ │ │ -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 <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_d_i_m_e_n_s_i_o_n_._h_h> │ │ │ │ │ -22#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ -23#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_._h_h> │ │ │ │ │ -24#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_i_m_p_l_e_m_e_n_t_a_t_i_o_n_._h_h> │ │ │ │ │ -25 │ │ │ │ │ -26namespace _D_u_n_e │ │ │ │ │ -27{ │ │ │ │ │ -28 │ │ │ │ │ -29 namespace Geo │ │ │ │ │ -30 { │ │ │ │ │ +29#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ +30#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ 31 │ │ │ │ │ -32#ifndef DOXYGEN │ │ │ │ │ -33 │ │ │ │ │ +32#include "_b_a_s_e_._c_c" │ │ │ │ │ +33#include "_s_i_m_p_l_e_x_._c_c" │ │ │ │ │ 34 │ │ │ │ │ -35 namespace Impl │ │ │ │ │ -36 { │ │ │ │ │ -37 │ │ │ │ │ -38 // ReferenceElementContainer │ │ │ │ │ -39 // ------------------------- │ │ │ │ │ -40 │ │ │ │ │ -41 template< class ctype, int dim > │ │ │ │ │ -42 class ReferenceElementContainer │ │ │ │ │ -43 { │ │ │ │ │ -44 static const unsigned int numTopologies = dim >= 0 ? (1u << dim) : 0; │ │ │ │ │ -45 │ │ │ │ │ -46 using Implementation = ReferenceElementImplementation< ctype, dim >; │ │ │ │ │ +35namespace _D_u_n_e │ │ │ │ │ +36{ │ │ │ │ │ +37 namespace RefinementImp │ │ │ │ │ +38 { │ │ │ │ │ +_4_6 namespace HCubeTriangulation { │ │ │ │ │ 47 │ │ │ │ │ -48 public: │ │ │ │ │ -49 │ │ │ │ │ -50 using ReferenceElement = _D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_<_ _I_m_p_l_e_m_e_n_t_a_t_i_o_n_ _>; │ │ │ │ │ -51 using value_type = ReferenceElement; │ │ │ │ │ -52 using const_iterator = const value_type*; │ │ │ │ │ -53 │ │ │ │ │ -54 ReferenceElementContainer () │ │ │ │ │ -55 { │ │ │ │ │ -56 for( unsigned int topologyId = 0; topologyId < numTopologies; ++topologyId ) │ │ │ │ │ -57 { │ │ │ │ │ -58 implementations_[ topologyId ].initialize( topologyId ); │ │ │ │ │ -59 reference_elements_[ topologyId ].setImplementation( implementations_ │ │ │ │ │ -[ topologyId ] ); │ │ │ │ │ -60 } │ │ │ │ │ -61 } │ │ │ │ │ -62 │ │ │ │ │ -63 const ReferenceElement& operator() ( const GeometryType &type ) const │ │ │ │ │ -64 { │ │ │ │ │ -65 assert( type.dim() == dim ); │ │ │ │ │ -66 return reference_elements_[ type.id() ]; │ │ │ │ │ -67 } │ │ │ │ │ -68 │ │ │ │ │ -69 const ReferenceElement& simplex () const │ │ │ │ │ -70 { │ │ │ │ │ -71 return reference_elements_[ Dune::GeometryTypes::simplex(dim)._i_d() ]; │ │ │ │ │ -72 } │ │ │ │ │ -73 │ │ │ │ │ -74 const ReferenceElement& cube () const │ │ │ │ │ -75 { │ │ │ │ │ -76 return reference_elements_[ Dune::GeometryTypes::cube(dim)._i_d() ]; │ │ │ │ │ -77 } │ │ │ │ │ -78 │ │ │ │ │ -79 const ReferenceElement& pyramid () const │ │ │ │ │ -80 { │ │ │ │ │ -81 return reference_elements_[ Dune::GeometryTypes::pyramid._i_d() ]; │ │ │ │ │ -82 } │ │ │ │ │ +48 // //////////// │ │ │ │ │ +49 // │ │ │ │ │ +50 // Utilities │ │ │ │ │ +51 // │ │ │ │ │ +52 │ │ │ │ │ +53 using _S_i_m_p_l_e_x_:_:_g_e_t_P_e_r_m_u_t_a_t_i_o_n; │ │ │ │ │ +54 using _S_i_m_p_l_e_x_:_:_r_e_f_e_r_e_n_c_e_T_o_K_u_h_n; │ │ │ │ │ +55 │ │ │ │ │ +56 // //////////////////////////////////// │ │ │ │ │ +57 // │ │ │ │ │ +58 // Refine a hypercube with simplices │ │ │ │ │ +59 // │ │ │ │ │ +60 │ │ │ │ │ +61 // forward declaration of the iterator base │ │ │ │ │ +62 template │ │ │ │ │ +_6_3 class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l; │ │ │ │ │ +64 │ │ │ │ │ +65 template │ │ │ │ │ +_6_6 class _R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ +67 { │ │ │ │ │ +68 public: │ │ │ │ │ +_6_9 constexpr static int _d_i_m_e_n_s_i_o_n = dimension_; │ │ │ │ │ +70 │ │ │ │ │ +_7_1 typedef CoordType _c_t_y_p_e; │ │ │ │ │ +72 │ │ │ │ │ +73 template │ │ │ │ │ +74 struct _C_o_d_i_m; │ │ │ │ │ +_7_5 typedef typename _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _V_e_r_t_e_x_I_t_e_r_a_t_o_r; │ │ │ │ │ +_7_6 typedef FieldVector _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ +_7_7 typedef typename _C_o_d_i_m_<_0_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r; │ │ │ │ │ +_7_8 typedef FieldVector _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ +79 │ │ │ │ │ +80 static int _n_V_e_r_t_i_c_e_s(int nIntervals); │ │ │ │ │ +81 static _V_e_r_t_e_x_I_t_e_r_a_t_o_r _v_B_e_g_i_n(int nIntervals); │ │ │ │ │ +82 static _V_e_r_t_e_x_I_t_e_r_a_t_o_r _v_E_n_d(int nIntervals); │ │ │ │ │ 83 │ │ │ │ │ -84 const ReferenceElement& prism () const │ │ │ │ │ -85 { │ │ │ │ │ -86 return reference_elements_[ Dune::GeometryTypes::prism._i_d() ]; │ │ │ │ │ -87 } │ │ │ │ │ -88 │ │ │ │ │ -89 const_iterator begin () const │ │ │ │ │ -90 { │ │ │ │ │ -91 return reference_elements_.data(); │ │ │ │ │ -92 } │ │ │ │ │ +84 static int _n_E_l_e_m_e_n_t_s(int nIntervals); │ │ │ │ │ +85 static _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r _e_B_e_g_i_n(int nIntervals); │ │ │ │ │ +_8_6 static _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r _e_E_n_d(int nIntervals); │ │ │ │ │ +87 private: │ │ │ │ │ +88 friend class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l<_d_i_m_e_n_s_i_o_n, CoordType, 0>; │ │ │ │ │ +89 friend class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l<_d_i_m_e_n_s_i_o_n, CoordType, _d_i_m_e_n_s_i_o_n>; │ │ │ │ │ +90 │ │ │ │ │ +91 typedef _S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +92 }; │ │ │ │ │ 93 │ │ │ │ │ -94 const_iterator end () const │ │ │ │ │ -95 { │ │ │ │ │ -96 return reference_elements_.data() + numTopologies; │ │ │ │ │ -97 } │ │ │ │ │ -98 │ │ │ │ │ -99 private: │ │ │ │ │ -100 │ │ │ │ │ -101 std::array implementations_; │ │ │ │ │ -102 std::array reference_elements_; │ │ │ │ │ -103 │ │ │ │ │ -104 }; │ │ │ │ │ -105 │ │ │ │ │ -106 │ │ │ │ │ -107 } // namespace Impl │ │ │ │ │ -108 │ │ │ │ │ +94 template │ │ │ │ │ +95 template │ │ │ │ │ +_9_6 struct _R_e_f_i_n_e_m_e_n_t_I_m_p::_C_o_d_i_m │ │ │ │ │ +97 { │ │ │ │ │ +98 class SubEntityIterator; │ │ │ │ │ +_9_9 typedef _D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y │ │ │ │ │ +_G_e_o_m_e_t_r_y; │ │ │ │ │ +100 }; │ │ │ │ │ +101 │ │ │ │ │ +102 template │ │ │ │ │ +103 int │ │ │ │ │ +_1_0_4 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +105_ _n_V_e_r_t_i_c_e_s(int nIntervals) │ │ │ │ │ +106 { │ │ │ │ │ +107 return BackendRefinement::nVertices(nIntervals) * factorial(int │ │ │ │ │ +(dimension)); │ │ │ │ │ +108 } │ │ │ │ │ 109 │ │ │ │ │ -110#endif // DOXYGEN │ │ │ │ │ -111 │ │ │ │ │ -112 │ │ │ │ │ -113 // ReferenceElements │ │ │ │ │ -114 // ------------------------ │ │ │ │ │ -115 │ │ │ │ │ -126 template< class ctype_, int dim > │ │ │ │ │ -_1_2_7 struct _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s │ │ │ │ │ -128 { │ │ │ │ │ -129 │ │ │ │ │ -_1_3_1 using _c_t_y_p_e = ctype_; │ │ │ │ │ -132 │ │ │ │ │ -_1_3_4 using _C_o_o_r_d_i_n_a_t_e_F_i_e_l_d = _c_t_y_p_e; │ │ │ │ │ -135 │ │ │ │ │ -_1_3_7 static constexpr int _d_i_m_e_n_s_i_o_n = dim; │ │ │ │ │ -138 │ │ │ │ │ -139 private: │ │ │ │ │ -140 │ │ │ │ │ -141 using Container = Impl::ReferenceElementContainer< ctype, dim >; │ │ │ │ │ -142 │ │ │ │ │ -143 public: │ │ │ │ │ -144 │ │ │ │ │ -_1_4_6 using _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t = typename Container::ReferenceElement; │ │ │ │ │ -147 │ │ │ │ │ -_1_4_9 using _I_t_e_r_a_t_o_r = typename Container::const_iterator; │ │ │ │ │ -150 │ │ │ │ │ -_1_5_2 using _i_t_e_r_a_t_o_r = _I_t_e_r_a_t_o_r; │ │ │ │ │ -153 │ │ │ │ │ -155 static const _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t& │ │ │ │ │ -_1_5_6 _g_e_n_e_r_a_l ( const _G_e_o_m_e_t_r_y_T_y_p_e& type ) │ │ │ │ │ -157 { │ │ │ │ │ -158 return container() ( type ); │ │ │ │ │ -159 } │ │ │ │ │ -160 │ │ │ │ │ -_1_6_2 static const _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t& _s_i_m_p_l_e_x () │ │ │ │ │ -163 { │ │ │ │ │ -164 return container().simplex(); │ │ │ │ │ -165 } │ │ │ │ │ -166 │ │ │ │ │ -_1_6_8 static const _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t& _c_u_b_e () │ │ │ │ │ -169 { │ │ │ │ │ -170 return container().cube(); │ │ │ │ │ -171 } │ │ │ │ │ -172 │ │ │ │ │ -_1_7_3 static _I_t_e_r_a_t_o_r _b_e_g_i_n () │ │ │ │ │ -174 { │ │ │ │ │ -175 return container().begin(); │ │ │ │ │ -176 } │ │ │ │ │ +110 template │ │ │ │ │ +111 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ +_1_1_2 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +113_ _v_B_e_g_i_n(int nIntervals) │ │ │ │ │ +114 { │ │ │ │ │ +115 return _V_e_r_t_e_x_I_t_e_r_a_t_o_r(nIntervals); │ │ │ │ │ +116 } │ │ │ │ │ +117 │ │ │ │ │ +118 template │ │ │ │ │ +119 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ +_1_2_0 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +121_ _v_E_n_d(int nIntervals) │ │ │ │ │ +122 { │ │ │ │ │ +123 return _V_e_r_t_e_x_I_t_e_r_a_t_o_r(nIntervals, true); │ │ │ │ │ +124 } │ │ │ │ │ +125 │ │ │ │ │ +126 template │ │ │ │ │ +127 int │ │ │ │ │ +_1_2_8 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +129_ _n_E_l_e_m_e_n_t_s(int nIntervals) │ │ │ │ │ +130 { │ │ │ │ │ +131 return BackendRefinement::nElements(nIntervals) * factorial(int │ │ │ │ │ +(dimension)); │ │ │ │ │ +132 } │ │ │ │ │ +133 │ │ │ │ │ +134 template │ │ │ │ │ +135 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ +_1_3_6 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +137_ _e_B_e_g_i_n(int nIntervals) │ │ │ │ │ +138 { │ │ │ │ │ +139 return _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r(nIntervals); │ │ │ │ │ +140 } │ │ │ │ │ +141 │ │ │ │ │ +142 template │ │ │ │ │ +143 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ +_1_4_4 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +145_ _e_E_n_d(int nIntervals) │ │ │ │ │ +146 { │ │ │ │ │ +147 return _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r(nIntervals, true); │ │ │ │ │ +148 } │ │ │ │ │ +149 │ │ │ │ │ +150 // ////////////// │ │ │ │ │ +151 // │ │ │ │ │ +152 // The iterator │ │ │ │ │ +153 // │ │ │ │ │ +154 │ │ │ │ │ +155 // vertices │ │ │ │ │ +156 template │ │ │ │ │ +_1_5_7 class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ +158 { │ │ │ │ │ +159 public: │ │ │ │ │ +_1_6_0 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +_1_6_1 typedef typename Refinement::CoordVector _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ +_1_6_2 typedef typename Refinement::template _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_:_G_e_o_m_e_t_r_y _G_e_o_m_e_t_r_y; │ │ │ │ │ +163 │ │ │ │ │ +164 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end = false); │ │ │ │ │ +165 │ │ │ │ │ +166 void increment(); │ │ │ │ │ +167 │ │ │ │ │ +168 _C_o_o_r_d_V_e_c_t_o_r coords() const; │ │ │ │ │ +169 │ │ │ │ │ +170 _G_e_o_m_e_t_r_y geometry() const; │ │ │ │ │ +171 │ │ │ │ │ +172 int index() const; │ │ │ │ │ +173 protected: │ │ │ │ │ +_1_7_4 typedef typename Refinement::BackendRefinement _B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +_1_7_5 typedef typename BackendRefinement::template _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r; │ │ │ │ │ +_1_7_6 constexpr static int nKuhnSimplices = factorial(int(dimension)); │ │ │ │ │ 177 │ │ │ │ │ -_1_7_8 static _I_t_e_r_a_t_o_r _e_n_d () │ │ │ │ │ -179 { │ │ │ │ │ -180 return container().end(); │ │ │ │ │ -181 } │ │ │ │ │ -182 │ │ │ │ │ -183 private: │ │ │ │ │ +_1_7_8 int _n_I_n_t_e_r_v_a_l_s__; │ │ │ │ │ +179 │ │ │ │ │ +_1_8_0 int _k_u_h_n_I_n_d_e_x; │ │ │ │ │ +_1_8_1 _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r _b_a_c_k_e_n_d; │ │ │ │ │ +_1_8_2 const _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r _b_a_c_k_e_n_d_E_n_d; │ │ │ │ │ +183 }; │ │ │ │ │ 184 │ │ │ │ │ -185 DUNE_EXPORT static const Container& container () │ │ │ │ │ -186 { │ │ │ │ │ -187 static Container container; │ │ │ │ │ -188 return container; │ │ │ │ │ -189 } │ │ │ │ │ -190 }; │ │ │ │ │ -191 │ │ │ │ │ -192 } // namespace Geo │ │ │ │ │ -193 │ │ │ │ │ -195 using Geo::ReferenceElements; │ │ │ │ │ -196 │ │ │ │ │ -197 │ │ │ │ │ -198#ifdef DOXYGEN │ │ │ │ │ -199 │ │ │ │ │ -201 │ │ │ │ │ -244 template │ │ │ │ │ -_2_4_5 unspecified-value-type _r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t(T&&... t); │ │ │ │ │ +185 template │ │ │ │ │ +_1_8_6 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +187_ _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end) │ │ │ │ │ +188 : nIntervals_(nIntervals), kuhnIndex(0), │ │ │ │ │ +189 backend(_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t::vBegin(nIntervals_)), │ │ │ │ │ +190 backendEnd(_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t::vEnd(nIntervals_)) │ │ │ │ │ +191 { │ │ │ │ │ +192 if (end) │ │ │ │ │ +193 kuhnIndex = nKuhnSimplices; │ │ │ │ │ +194 } │ │ │ │ │ +195 │ │ │ │ │ +196 template │ │ │ │ │ +197 void │ │ │ │ │ +_1_9_8 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +199_ _i_n_c_r_e_m_e_n_t() │ │ │ │ │ +200 { │ │ │ │ │ +201 ++backend; │ │ │ │ │ +202 if (backend == backendEnd) │ │ │ │ │ +203 { │ │ │ │ │ +204 backend = BackendRefinement::vBegin(nIntervals_); │ │ │ │ │ +205 ++kuhnIndex; │ │ │ │ │ +206 } │ │ │ │ │ +207 } │ │ │ │ │ +208 │ │ │ │ │ +209 template │ │ │ │ │ +210 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +_2_1_1 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +212_ _c_o_o_r_d_s() const │ │ │ │ │ +213 { │ │ │ │ │ +214 return referenceToKuhn(backend.coords(), getPermutation │ │ │ │ │ +(kuhnIndex)); │ │ │ │ │ +215 } │ │ │ │ │ +216 │ │ │ │ │ +217 template │ │ │ │ │ +218 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_G_e_o_m_e_t_r_y │ │ │ │ │ +_2_1_9 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_:_g_e_o_m_e_t_r_y () │ │ │ │ │ +const │ │ │ │ │ +220 { │ │ │ │ │ +221 std::vector corners(1); │ │ │ │ │ +222 corners[0] = referenceToKuhn(backend.coords(), getPermutation │ │ │ │ │ +(kuhnIndex)); │ │ │ │ │ +223 return _G_e_o_m_e_t_r_y(GeometryTypes::vertex, corners); │ │ │ │ │ +224 } │ │ │ │ │ +225 │ │ │ │ │ +226 template │ │ │ │ │ +227 int │ │ │ │ │ +_2_2_8 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +229_ _i_n_d_e_x() const │ │ │ │ │ +230 { │ │ │ │ │ +231 return kuhnIndex*BackendRefinement::nVertices(nIntervals_) + backend.index │ │ │ │ │ +(); │ │ │ │ │ +232 } │ │ │ │ │ +233 │ │ │ │ │ +234 // elements │ │ │ │ │ +235 template │ │ │ │ │ +_2_3_6 class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ +237 { │ │ │ │ │ +238 public: │ │ │ │ │ +_2_3_9 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +_2_4_0 typedef typename _R_e_f_i_n_e_m_e_n_t_:_:_I_n_d_e_x_V_e_c_t_o_r _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ +_2_4_1 typedef typename _R_e_f_i_n_e_m_e_n_t_:_:_C_o_o_r_d_V_e_c_t_o_r _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ +_2_4_2 typedef typename Refinement::template _C_o_d_i_m_<_0_>_:_:_G_e_o_m_e_t_r_y _G_e_o_m_e_t_r_y; │ │ │ │ │ +243 │ │ │ │ │ +244 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals_, bool end = false); │ │ │ │ │ +245 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(const _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _0_> &other); │ │ │ │ │ 246 │ │ │ │ │ -247#endif │ │ │ │ │ +247 void increment(); │ │ │ │ │ 248 │ │ │ │ │ -249 │ │ │ │ │ -251 │ │ │ │ │ -264 template │ │ │ │ │ -_2_6_5 auto _r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t(const _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e& gt, _D_u_n_e_:_:_D_i_m_<_d_i_m_> = {}) │ │ │ │ │ -266 { │ │ │ │ │ -267 return _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_<_T_,_d_i_m_>_:_:_g_e_n_e_r_a_l(gt); │ │ │ │ │ -268 } │ │ │ │ │ +249 _I_n_d_e_x_V_e_c_t_o_r vertexIndices() const; │ │ │ │ │ +250 int index() const; │ │ │ │ │ +251 _C_o_o_r_d_V_e_c_t_o_r coords() const; │ │ │ │ │ +252 │ │ │ │ │ +253 _G_e_o_m_e_t_r_y geometry() const; │ │ │ │ │ +254 │ │ │ │ │ +255 private: │ │ │ │ │ +256 _C_o_o_r_d_V_e_c_t_o_r global(const _C_o_o_r_d_V_e_c_t_o_r &local) const; │ │ │ │ │ +257 │ │ │ │ │ +258 protected: │ │ │ │ │ +_2_5_9 typedef typename _R_e_f_i_n_e_m_e_n_t_:_:_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t _B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +_2_6_0 typedef typename BackendRefinement::template _C_o_d_i_m_<_0_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ +_B_a_c_k_e_n_d_I_t_e_r_a_t_o_r; │ │ │ │ │ +_2_6_1 constexpr static int nKuhnSimplices = factorial(dimension); │ │ │ │ │ +262 │ │ │ │ │ +_2_6_3 int _n_I_n_t_e_r_v_a_l_s__; │ │ │ │ │ +264 │ │ │ │ │ +_2_6_5 int _k_u_h_n_I_n_d_e_x; │ │ │ │ │ +_2_6_6 _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r _b_a_c_k_e_n_d; │ │ │ │ │ +_2_6_7 const _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r _b_a_c_k_e_n_d_E_n_d; │ │ │ │ │ +268 }; │ │ │ │ │ 269 │ │ │ │ │ -270 │ │ │ │ │ -272 │ │ │ │ │ -284 template>:: │ │ │ │ │ -value, int> = 0> │ │ │ │ │ -_2_8_5 auto _r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t(const T&, const _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e& gt, _D_u_n_e_:_: │ │ │ │ │ -_D_i_m_<_d_i_m_>) │ │ │ │ │ -286 { │ │ │ │ │ -287 return _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_<_T_,_d_i_m_>_:_:_g_e_n_e_r_a_l(gt); │ │ │ │ │ -288 } │ │ │ │ │ -289 │ │ │ │ │ -290 │ │ │ │ │ -291#ifndef DOXYGEN │ │ │ │ │ -292 │ │ │ │ │ -293 // helpers for the ReferenceElement<> meta function │ │ │ │ │ -294 // the complete Impl block can be removed together with deprecated │ │ │ │ │ -Transitional::ReferenceElement │ │ │ │ │ -295 │ │ │ │ │ -296 namespace Impl { │ │ │ │ │ -297 │ │ │ │ │ -298 // Evaluates to the correct reference element iff matches the │ │ │ │ │ -pattern > │ │ │ │ │ -299 // otherwise, it's ill-formed. Should be used with detected_or and friends. │ │ │ │ │ +270 template │ │ │ │ │ +_2_7_1 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +272_ _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end) │ │ │ │ │ +273 : nIntervals_(nIntervals), kuhnIndex(0), │ │ │ │ │ +274 backend(_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t::eBegin(nIntervals_)), │ │ │ │ │ +275 backendEnd(_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t::eEnd(nIntervals_)) │ │ │ │ │ +276 { │ │ │ │ │ +277 if (end) │ │ │ │ │ +278 kuhnIndex = nKuhnSimplices; │ │ │ │ │ +279 } │ │ │ │ │ +280 template │ │ │ │ │ +_2_8_1 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +282_ _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(const _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _0_> &other) │ │ │ │ │ +283 : nIntervals_(other.nIntervals_), kuhnIndex(other.kuhnIndex), │ │ │ │ │ +284 backend(other.backend), │ │ │ │ │ +285 backendEnd(other.backendEnd) │ │ │ │ │ +286 {} │ │ │ │ │ +287 │ │ │ │ │ +288 template │ │ │ │ │ +289 void │ │ │ │ │ +_2_9_0 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +291_ _i_n_c_r_e_m_e_n_t() │ │ │ │ │ +292 { │ │ │ │ │ +293 ++backend; │ │ │ │ │ +294 if (backend == backendEnd) │ │ │ │ │ +295 { │ │ │ │ │ +296 backend = BackendRefinement::eBegin(nIntervals_); │ │ │ │ │ +297 ++kuhnIndex; │ │ │ │ │ +298 } │ │ │ │ │ +299 } │ │ │ │ │ 300 │ │ │ │ │ -301 template │ │ │ │ │ -302 struct DefaultReferenceElementExtractor; │ │ │ │ │ -303 │ │ │ │ │ -304 template::value,int>::type │ │ │ │ │ -dim> │ │ │ │ │ -305 struct DefaultReferenceElementExtractor> │ │ │ │ │ -306 { │ │ │ │ │ -307 using type = typename _D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_<_T_,_d_i_m_>_:_: │ │ │ │ │ -_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t; │ │ │ │ │ -308 }; │ │ │ │ │ -309 │ │ │ │ │ -310 template │ │ │ │ │ -311 using DefaultReferenceElement = typename │ │ │ │ │ -DefaultReferenceElementExtractor::type; │ │ │ │ │ -312 │ │ │ │ │ -313 } │ │ │ │ │ -314 │ │ │ │ │ -315 // looks up the type of a reference element by trying to instantiate the │ │ │ │ │ -correct overload │ │ │ │ │ -316 // of referenceElement() for the given arguments. This will fail if there │ │ │ │ │ -is no valid │ │ │ │ │ -317 // overload and should be used with detected_or or some other utility that │ │ │ │ │ -places the │ │ │ │ │ -318 // instantiation in SFINAE context. │ │ │ │ │ -319 // │ │ │ │ │ -320 // this is placed directly in namespace Dune to avoid any weird surprises │ │ │ │ │ +301 template │ │ │ │ │ +302 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ +_3_0_3 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +304_ _v_e_r_t_e_x_I_n_d_i_c_e_s() const │ │ │ │ │ +305 { │ │ │ │ │ +306 _I_n_d_e_x_V_e_c_t_o_r indices = backend.vertexIndices(); │ │ │ │ │ +307 │ │ │ │ │ +308 int base = kuhnIndex * BackendRefinement::nVertices(nIntervals_); │ │ │ │ │ +309 indices += base; │ │ │ │ │ +310 │ │ │ │ │ +311 return indices; │ │ │ │ │ +312 } │ │ │ │ │ +313 │ │ │ │ │ +314 template │ │ │ │ │ +315 int │ │ │ │ │ +_3_1_6 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +317_ _i_n_d_e_x() const │ │ │ │ │ +318 { │ │ │ │ │ +319 return kuhnIndex*BackendRefinement::nElements(nIntervals_) + backend.index │ │ │ │ │ +(); │ │ │ │ │ +320 } │ │ │ │ │ 321 │ │ │ │ │ -322 template │ │ │ │ │ -323 using LookupReferenceElement = decltype(_r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t(std::declval │ │ │ │ │ -()...)); │ │ │ │ │ -324 │ │ │ │ │ -325#endif // DOXYGEN │ │ │ │ │ -326 │ │ │ │ │ -_3_2_7 namespace [[deprecated]] Transitional { │ │ │ │ │ -328 │ │ │ │ │ -329 // this abomination checks whether the template signature matches the │ │ │ │ │ -special case │ │ │ │ │ -330 // ReferenceElement> and otherwise defers the │ │ │ │ │ -type lookup │ │ │ │ │ -331 // to a decltype on a call to referenceElement(std::declval()) │ │ │ │ │ -332 │ │ │ │ │ -337 template │ │ │ │ │ -338 using ReferenceElement = detected_or_fallback_t< │ │ │ │ │ -339 Impl::DefaultReferenceElement, │ │ │ │ │ -340 LookupReferenceElement, │ │ │ │ │ -341 T... │ │ │ │ │ -342 >; │ │ │ │ │ -343 │ │ │ │ │ -344 } │ │ │ │ │ -345 │ │ │ │ │ -346 template │ │ │ │ │ -_3_4_7 using _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t = decltype(_r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t(std::declval()...)); │ │ │ │ │ -348 │ │ │ │ │ -349} // namespace Dune │ │ │ │ │ +322 template │ │ │ │ │ +323 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +_3_2_4 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +325_ _c_o_o_r_d_s() const │ │ │ │ │ +326 { │ │ │ │ │ +327 return global(backend.coords()); │ │ │ │ │ +328 } │ │ │ │ │ +329 │ │ │ │ │ +330 template │ │ │ │ │ +331 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ +_3_3_2 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_g_e_o_m_e_t_r_y () const │ │ │ │ │ +333 { │ │ │ │ │ +334 const typename BackendIterator::Geometry &bgeo = │ │ │ │ │ +335 backend.geometry(); │ │ │ │ │ +336 std::vector corners(dimension+1); │ │ │ │ │ +337 for(int i = 0; i <= dimension; ++i) │ │ │ │ │ +338 corners[i] = global(bgeo.corner(i)); │ │ │ │ │ +339 │ │ │ │ │ +340 return _G_e_o_m_e_t_r_y(bgeo.type(), corners); │ │ │ │ │ +341 } │ │ │ │ │ +342 │ │ │ │ │ +343 template │ │ │ │ │ +344 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +345 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +346_ _g_l_o_b_a_l(const CoordVector &local) const │ │ │ │ │ +347 { │ │ │ │ │ +348 return referenceToKuhn(local, getPermutation(kuhnIndex)); │ │ │ │ │ +349 } │ │ │ │ │ 350 │ │ │ │ │ -351#endif // #ifndef DUNE_GEOMETRY_REFERENCEELEMENTS_HH │ │ │ │ │ +351 // common │ │ │ │ │ +352 template │ │ │ │ │ +353 template │ │ │ │ │ +_3_5_4 class _R_e_f_i_n_e_m_e_n_t_I_m_p::_C_o_d_i_m:: │ │ │ │ │ +SubEntityIterator │ │ │ │ │ +355 : public ForwardIteratorFacade::template Codim::SubEntityIterator, int>, │ │ │ │ │ +356 public _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ +357 { │ │ │ │ │ +358 public: │ │ │ │ │ +_3_5_9 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +_3_6_0 typedef SubEntityIterator _T_h_i_s; │ │ │ │ │ +361 │ │ │ │ │ +_3_6_2 _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r(int nIntervals, bool end = false); │ │ │ │ │ +363 │ │ │ │ │ +_3_6_4 bool _e_q_u_a_l_s(const _T_h_i_s &other) const; │ │ │ │ │ +365 protected: │ │ │ │ │ +366 using _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l<_d_i_m_e_n_s_i_o_n, CoordType, codimension>:: │ │ │ │ │ +kuhnIndex; │ │ │ │ │ +367 using _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l<_d_i_m_e_n_s_i_o_n, CoordType, codimension>:: │ │ │ │ │ +backend; │ │ │ │ │ +368 }; │ │ │ │ │ +369 │ │ │ │ │ +370#ifndef DOXYGEN │ │ │ │ │ +371 template │ │ │ │ │ +372 template │ │ │ │ │ +373 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_:_: │ │ │ │ │ +374_ _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r(int nIntervals, bool end) │ │ │ │ │ +375 : _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(nIntervals, │ │ │ │ │ +end) │ │ │ │ │ +376 {} │ │ │ │ │ +377 │ │ │ │ │ +378 template │ │ │ │ │ +379 template │ │ │ │ │ +380 bool │ │ │ │ │ +381 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_:_: │ │ │ │ │ +382_ _e_q_u_a_l_s(const This &other) const │ │ │ │ │ +383 { return kuhnIndex == other.kuhnIndex && backend == other.backend; } │ │ │ │ │ +384 │ │ │ │ │ +385#endif // DOXYGEN │ │ │ │ │ +386 │ │ │ │ │ +387 } // namespace HCubeTriangulation │ │ │ │ │ +388 } // namespace RefinementImp │ │ │ │ │ +389 │ │ │ │ │ +390 namespace RefinementImp │ │ │ │ │ +391 { │ │ │ │ │ +392 // /////////////////////// │ │ │ │ │ +393 // │ │ │ │ │ +394 // The refinement traits │ │ │ │ │ +395 // │ │ │ │ │ +396 │ │ │ │ │ +397#ifndef DOXYGEN │ │ │ │ │ +398 template │ │ │ │ │ +400 struct Traits< │ │ │ │ │ +401 topologyId, CoordType, coerceToId, dim, │ │ │ │ │ +402 typename _s_t_d::enable_if< │ │ │ │ │ +403 (dim >= 2 && │ │ │ │ │ +404 (GeometryTypes::cube(dim).id() >> 1) == │ │ │ │ │ +405 (topologyId >> 1) && │ │ │ │ │ +406 (GeometryTypes::simplex(dim).id() >> 1) == │ │ │ │ │ +407 (coerceToId >> 1) │ │ │ │ │ +408 )>::type │ │ │ │ │ +409 > │ │ │ │ │ +410 { │ │ │ │ │ +411 typedef HCubeTriangulation::RefinementImp Imp; │ │ │ │ │ +412 }; │ │ │ │ │ +413#endif │ │ │ │ │ +414 │ │ │ │ │ +415 } // namespace RefinementImp │ │ │ │ │ +416} // namespace Dune │ │ │ │ │ +417 │ │ │ │ │ +418#endif // DUNE_GEOMETRY_REFINEMENT_HCUBETRIANGULATION_CC │ │ │ │ │ +_b_a_s_e_._c_c │ │ │ │ │ +This file contains the parts independent of a particular Refinement │ │ │ │ │ +implementation. │ │ │ │ │ +_s_i_m_p_l_e_x_._c_c │ │ │ │ │ +This file contains the Refinement implementation for simplices (triangles, │ │ │ │ │ +tetrahedrons.... │ │ │ │ │ _t_y_p_e_._h_h │ │ │ │ │ A unique label for each type of element that can occur in a grid. │ │ │ │ │ -_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_i_m_p_l_e_m_e_n_t_a_t_i_o_n_._h_h │ │ │ │ │ -_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_._h_h │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_._h_h │ │ │ │ │ -_D_u_n_e_:_:_r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ -unspecified value type referenceElement(T &&... t) │ │ │ │ │ -Returns a reference element for the objects t.... │ │ │ │ │ +_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h │ │ │ │ │ +_s_t_d │ │ │ │ │ +STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn affinegeometry.hh:21 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ -decltype(referenceElement(std::declval< T >()...)) ReferenceElement │ │ │ │ │ -DDeeffiinniittiioonn referenceelements.hh:347 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ -This class provides access to geometric and topological properties of a │ │ │ │ │ -reference element. │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s │ │ │ │ │ -Class providing access to the singletons of the reference elements. │ │ │ │ │ -DDeeffiinniittiioonn referenceelements.hh:128 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_b_e_g_i_n │ │ │ │ │ -static Iterator begin() │ │ │ │ │ -DDeeffiinniittiioonn referenceelements.hh:173 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ -Iterator iterator │ │ │ │ │ -Iterator over available reference elements. │ │ │ │ │ -DDeeffiinniittiioonn referenceelements.hh:152 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ -typename Container::ReferenceElement ReferenceElement │ │ │ │ │ -The reference element type. │ │ │ │ │ -DDeeffiinniittiioonn referenceelements.hh:146 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_c_u_b_e │ │ │ │ │ -static const ReferenceElement & cube() │ │ │ │ │ -get hypercube reference elements │ │ │ │ │ -DDeeffiinniittiioonn referenceelements.hh:168 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_e_n_d │ │ │ │ │ -static Iterator end() │ │ │ │ │ -DDeeffiinniittiioonn referenceelements.hh:178 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_c_t_y_p_e │ │ │ │ │ -ctype_ ctype │ │ │ │ │ -The coordinate field type of the contained reference elements. │ │ │ │ │ -DDeeffiinniittiioonn referenceelements.hh:131 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_g_e_n_e_r_a_l │ │ │ │ │ -static const ReferenceElement & general(const GeometryType &type) │ │ │ │ │ -get general reference elements │ │ │ │ │ -DDeeffiinniittiioonn referenceelements.hh:156 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_s_i_m_p_l_e_x │ │ │ │ │ -static const ReferenceElement & simplex() │ │ │ │ │ -get simplex reference elements │ │ │ │ │ -DDeeffiinniittiioonn referenceelements.hh:162 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ -typename Container::const_iterator Iterator │ │ │ │ │ -Iterator over available reference elements. │ │ │ │ │ -DDeeffiinniittiioonn referenceelements.hh:149 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_g_e_t_P_e_r_m_u_t_a_t_i_o_n │ │ │ │ │ +FieldVector< int, n > getPermutation(int m) │ │ │ │ │ +Calculate permutation from it's index. │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:293 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_r_e_f_e_r_e_n_c_e_T_o_K_u_h_n │ │ │ │ │ +FieldVector< CoordType, dimension > referenceToKuhn(FieldVector< CoordType, │ │ │ │ │ +dimension > point, const FieldVector< int, dimension > &kuhn) │ │ │ │ │ +Map from the reference simplex to some Kuhn simplex. │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:322 │ │ │ │ │ +_D_u_n_e_:_:_C_o_d_i_m │ │ │ │ │ +Static tag representing a codimension. │ │ │ │ │ +DDeeffiinniittiioonn dimension.hh:24 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y │ │ │ │ │ +generic geometry implementation based on corner coordinates │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:181 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:63 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:67 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_v_E_n_d │ │ │ │ │ +static VertexIterator vEnd(int nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:121 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_v_B_e_g_i_n │ │ │ │ │ +static VertexIterator vBegin(int nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:113 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_n_E_l_e_m_e_n_t_s │ │ │ │ │ +static int nElements(int nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:129 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +FieldVector< CoordType, dimension > CoordVector │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:76 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_c_t_y_p_e │ │ │ │ │ +CoordType ctype │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:71 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ +Codim< 0 >::SubEntityIterator ElementIterator │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:77 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ +FieldVector< int, dimension+1 > IndexVector │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:78 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_e_B_e_g_i_n │ │ │ │ │ +static ElementIterator eBegin(int nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:137 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_e_E_n_d │ │ │ │ │ +static ElementIterator eEnd(int nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:145 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ static constexpr int dimension │ │ │ │ │ -The dimension of the contained reference elements. │ │ │ │ │ -DDeeffiinniittiioonn referenceelements.hh:137 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_C_o_o_r_d_i_n_a_t_e_F_i_e_l_d │ │ │ │ │ -ctype CoordinateField │ │ │ │ │ -The coordinate field type of the contained reference elements. │ │ │ │ │ -DDeeffiinniittiioonn referenceelements.hh:134 │ │ │ │ │ -_D_u_n_e_:_:_D_i_m │ │ │ │ │ -Static tag representing a dimension. │ │ │ │ │ -DDeeffiinniittiioonn dimension.hh:16 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ -Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:114 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_d │ │ │ │ │ -constexpr unsigned int id() const │ │ │ │ │ -Return the topology id of the type. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:365 │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:69 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ +Codim< dimension >::SubEntityIterator VertexIterator │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:75 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_n_V_e_r_t_i_c_e_s │ │ │ │ │ +static int nVertices(int nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:105 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:97 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ +Dune::MultiLinearGeometry< CoordType, dimension-codimension, dimension > │ │ │ │ │ +Geometry │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:99 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_n_I_n_t_e_r_v_a_l_s__ │ │ │ │ │ +int nIntervals_ │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:178 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_k_u_h_n_I_n_d_e_x │ │ │ │ │ +int kuhnIndex │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:180 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +Refinement::CoordVector CoordVector │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:161 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ +Refinement::template Codim< dimension >::Geometry Geometry │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:162 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_B_a_c_k_e_n_d_I_t_e_r_a_t_o_r │ │ │ │ │ +BackendRefinement::template Codim< dimension >::SubEntityIterator │ │ │ │ │ +BackendIterator │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:175 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +Refinement::BackendRefinement BackendRefinement │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:174 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_b_a_c_k_e_n_d │ │ │ │ │ +BackendIterator backend │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:181 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:160 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_b_a_c_k_e_n_d_E_n_d │ │ │ │ │ +const BackendIterator backendEnd │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:182 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_B_a_c_k_e_n_d_I_t_e_r_a_t_o_r │ │ │ │ │ +BackendRefinement::template Codim< 0 >::SubEntityIterator BackendIterator │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:260 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_b_a_c_k_e_n_d │ │ │ │ │ +BackendIterator backend │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:266 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +Refinement::CoordVector CoordVector │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:241 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_b_a_c_k_e_n_d_E_n_d │ │ │ │ │ +const BackendIterator backendEnd │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:267 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_k_u_h_n_I_n_d_e_x │ │ │ │ │ +int kuhnIndex │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:265 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +Refinement::BackendRefinement BackendRefinement │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:259 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_n_I_n_t_e_r_v_a_l_s__ │ │ │ │ │ +int nIntervals_ │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:263 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ +Refinement::IndexVector IndexVector │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:240 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:239 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ +Refinement::template Codim< 0 >::Geometry Geometry │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:242 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_: │ │ │ │ │ +_e_q_u_a_l_s │ │ │ │ │ +bool equals(const This &other) const │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_: │ │ │ │ │ +_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ +SubEntityIterator(int nIntervals, bool end=false) │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_: │ │ │ │ │ +_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:359 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_: │ │ │ │ │ +_T_h_i_s │ │ │ │ │ +SubEntityIterator This │ │ │ │ │ +DDeeffiinniittiioonn hcubetriangulation.cc:360 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:361 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00203.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: multilineargeometry.hh File Reference │ │ │ │ +dune-geometry: pyramidtriangulation.cc File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,63 +65,86 @@ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
multilineargeometry.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Macros | │ │ │ │ +Functions
│ │ │ │ +
pyramidtriangulation.cc File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <cassert>
│ │ │ │ -#include <functional>
│ │ │ │ -#include <iterator>
│ │ │ │ -#include <limits>
│ │ │ │ -#include <vector>
│ │ │ │ -#include <dune/common/fmatrix.hh>
│ │ │ │ -#include <dune/common/fvector.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>
│ │ │ │ +#include <dune/geometry/referenceelements.hh>
│ │ │ │ +#include <dune/geometry/type.hh>
│ │ │ │ +#include "base.cc"
│ │ │ │ +#include "simplex.cc"
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::MultiLinearGeometryTraits< ct >
 default traits class for MultiLinearGeometry More...
class  Dune::RefinementImp::PyramidTriangulation::RefinementImp< dimension_, CoordType >
 Implementation of the refinement of a pyramid into simplices. More...
 
struct  Dune::MultiLinearGeometryTraits< ct >::CornerStorage< mydim, cdim >
 template specifying the storage for the corners More...
struct  Dune::RefinementImp::PyramidTriangulation::RefinementImp< dimension_, CoordType >::Codim< codimension >
 
struct  Dune::MultiLinearGeometryTraits< ct >::hasSingleGeometryType< dim >
 will there be only one geometry type for a dimension? More...
class  Dune::RefinementImp::PyramidTriangulation::RefinementIteratorSpecial< dimension, CoordType, dimension >
 
class  Dune::MultiLinearGeometry< ct, mydim, cdim, Traits >
 generic geometry implementation based on corner coordinates More...
class  Dune::RefinementImp::PyramidTriangulation::RefinementIteratorSpecial< dimension, CoordType, 0 >
 
class  Dune::MultiLinearGeometry< ct, mydim, cdim, Traits >::JacobianInverseTransposed
 
class  Dune::CachedMultiLinearGeometry< ct, mydim, cdim, Traits >
 Implement a MultiLinearGeometry with additional caching. More...
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
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,44 +1,59 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -multilineargeometry.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * _r_e_f_i_n_e_m_e_n_t │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +pyramidtriangulation.cc File Reference │ │ │ │ │ #include │ │ │ │ │ #include │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_a_f_f_i_n_e_g_e_o_m_e_t_r_y_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ +#include "_b_a_s_e_._c_c" │ │ │ │ │ +#include "_s_i_m_p_l_e_x_._c_c" │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_T_r_a_i_t_s_<_ _c_t_ _> │ │ │ │ │ -  default traits class for _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___, │ │ │ │ │ + _C_o_o_r_d_T_y_p_e_ _> │ │ │ │ │ +  Implementation of the refinement of a pyramid into simplices. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_T_r_a_i_t_s_<_ _c_t_ _>_:_:_C_o_r_n_e_r_S_t_o_r_a_g_e_<_ _m_y_d_i_m_,_ _c_d_i_m_ _> │ │ │ │ │ -  template specifying the storage for the corners _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___, │ │ │ │ │ + _C_o_o_r_d_T_y_p_e_ _>_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_T_r_a_i_t_s_<_ _c_t_ _>_:_:_h_a_s_S_i_n_g_l_e_G_e_o_m_e_t_r_y_T_y_p_e_<_ _d_i_m_ _> │ │ │ │ │ -  will there be only one geometry type for a dimension? _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ + _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_<_ _c_t_,_ _m_y_d_i_m_,_ _c_d_i_m_,_ _T_r_a_i_t_s_ _> │ │ │ │ │ -  generic geometry implementation based on corner coordinates _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ + _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _> │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_<_ _c_t_,_ _m_y_d_i_m_,_ _c_d_i_m_,_ _T_r_a_i_t_s_ _>_:_: │ │ │ │ │ - _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_<_ _c_t_,_ _m_y_d_i_m_,_ _c_d_i_m_,_ _T_r_a_i_t_s_ _> │ │ │ │ │ -  Implement a _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y with additional caching. _M_o_r_e_._._. │ │ │ │ │ + class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___, │ │ │ │ │ + _C_o_o_r_d_T_y_p_e_ _>_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ +namespace   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ +  This namespace contains the implementation of _R_e_f_i_n_e_m_e_n_t. │ │ │ │ │ +  │ │ │ │ │ +namespace   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n │ │ │ │ │ + This namespace contains the _R_e_f_i_n_e_m_e_n_t implementation for │ │ │ │ │ +  triangulating pyramids (_G_e_o_m_e_t_r_y_T_y_p_e_:_:_p_y_r_a_m_i_d -> _G_e_o_m_e_t_r_y_T_y_p_e_:_: │ │ │ │ │ + _s_i_m_p_l_e_x) │ │ │ │ │ +  │ │ │ │ │ +MMaaccrrooss │ │ │ │ │ +#define  _D_U_N_E___G_E_O_M_E_T_R_Y___R_E_F_I_N_E_M_E_N_T___P_Y_R_A_M_I_D_T_R_I_A_N_G_U_L_A_T_I_O_N___C_C │ │ │ │ │ +  │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +FieldVector< CoordType, dimension >  _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_: │ │ │ │ │ + _P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_t_r_a_n_s_f_o_r_m_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ + (FieldVector< CoordType, dimension > │ │ │ │ │ + point) │ │ │ │ │ +  │ │ │ │ │ +********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ +********** _?◆_? DDUUNNEE__GGEEOOMMEETTRRYY__RREEFFIINNEEMMEENNTT__PPYYRRAAMMIIDDTTRRIIAANNGGUULLAATTIIOONN__CCCC ********** │ │ │ │ │ +#define DUNE_GEOMETRY_REFINEMENT_PYRAMIDTRIANGULATION_CC │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00203_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: multilineargeometry.hh Source File │ │ │ │ +dune-geometry: pyramidtriangulation.cc Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,844 +70,524 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
multilineargeometry.hh
│ │ │ │ +
pyramidtriangulation.cc
│ │ │ │
│ │ │ │
│ │ │ │ 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 © 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_REFINEMENT_PYRAMIDTRIANGULATION_CC
│ │ │ │ +
6#define DUNE_GEOMETRY_REFINEMENT_PYRAMIDTRIANGULATION_CC
│ │ │ │
7
│ │ │ │ -
8#include <cassert>
│ │ │ │ -
9#include <functional>
│ │ │ │ -
10#include <iterator>
│ │ │ │ -
11#include <limits>
│ │ │ │ -
12#include <vector>
│ │ │ │ +
8#include <dune/common/fvector.hh>
│ │ │ │ +
9#include <dune/common/typetraits.hh>
│ │ │ │ +
10
│ │ │ │ + │ │ │ │ +
12#include <dune/geometry/type.hh>
│ │ │ │
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 };
│ │ │ │ +
14#include "base.cc"
│ │ │ │ +
15#include "simplex.cc"
│ │ │ │ +
16
│ │ │ │ +
17namespace Dune
│ │ │ │ +
18{
│ │ │ │ +
19 namespace RefinementImp
│ │ │ │ +
20 {
│ │ │ │ +
│ │ │ │ +
26 namespace PyramidTriangulation
│ │ │ │ +
27 {
│ │ │ │ +
28 // ////////////
│ │ │ │ +
29 //
│ │ │ │ +
30 // Utilities
│ │ │ │ +
31 //
│ │ │ │ +
32
│ │ │ │ + │ │ │ │ + │ │ │ │ +
35
│ │ │ │ +
36 // ////////////////////////////////////
│ │ │ │ +
37 //
│ │ │ │ +
38 // Refine a pyramid with simplices
│ │ │ │ +
39 //
│ │ │ │ +
40
│ │ │ │ +
41 // forward declaration of the iterator base
│ │ │ │ +
42 template<int dimension, class CoordType, int codimension>
│ │ │ │ + │ │ │ │ +
44
│ │ │ │ +
45 /*
│ │ │ │ +
46 * The permutations 0 and 1 of the Kuhn-decomposition of a cube into simplices form a pyramid.
│ │ │ │ +
47 * The resulting pyramid is not oriented the same as the reference pyramid and so the Kuhn-coordinates
│ │ │ │ +
48 * have to be transformed using the method below.
│ │ │ │ +
49 */
│ │ │ │ +
50 template<int dimension, class CoordType> FieldVector<CoordType, dimension>
│ │ │ │ +
│ │ │ │ +
51 transformCoordinate( FieldVector<CoordType, dimension> point)
│ │ │ │ +
52 {
│ │ │ │ +
53 FieldVector<CoordType, dimension> transform;
│ │ │ │ +
54 transform[0]=1-point[0];
│ │ │ │ +
55 transform[1]=1-point[1];
│ │ │ │ +
56 transform[2]=point[2];
│ │ │ │ +
57 return transform;
│ │ │ │ +
58 }
│ │ │ │
│ │ │ │ -
152 };
│ │ │ │ +
59
│ │ │ │ +
66 template<int dimension_, class CoordType>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
68 {
│ │ │ │ +
69 public:
│ │ │ │ +
70 constexpr static int dimension = dimension_;
│ │ │ │ +
71
│ │ │ │ +
72 typedef CoordType ctype;
│ │ │ │ +
73
│ │ │ │ +
74 template<int codimension>
│ │ │ │ +
75 struct Codim;
│ │ │ │ + │ │ │ │ +
77 typedef FieldVector<CoordType, dimension> CoordVector;
│ │ │ │ + │ │ │ │ +
79 typedef FieldVector<int, dimension+1> IndexVector;
│ │ │ │ +
80
│ │ │ │ +
81 static int nVertices(int nIntervals);
│ │ │ │ +
82 static VertexIterator vBegin(int nIntervals);
│ │ │ │ +
83 static VertexIterator vEnd(int nIntervals);
│ │ │ │ +
84
│ │ │ │ +
85 static int nElements(int nIntervals);
│ │ │ │ +
86 static ElementIterator eBegin(int nIntervals);
│ │ │ │ +
87 static ElementIterator eEnd(int nIntervals);
│ │ │ │ +
88
│ │ │ │ +
89 private:
│ │ │ │ +
90 friend class RefinementIteratorSpecial<dimension, CoordType, 0>;
│ │ │ │ +
91 friend class RefinementIteratorSpecial<dimension, CoordType, dimension>;
│ │ │ │ +
92
│ │ │ │ + │ │ │ │ +
94
│ │ │ │ +
95 constexpr static int nKuhnSimplices = 2;
│ │ │ │ +
96 };
│ │ │ │ +
│ │ │ │ +
97
│ │ │ │ +
98 template<int dimension, class CoordType>
│ │ │ │ +
99 template<int codimension>
│ │ │ │ +
│ │ │ │ +
100 struct RefinementImp<dimension, CoordType>::Codim
│ │ │ │ +
101 {
│ │ │ │ +
102 class SubEntityIterator;
│ │ │ │ + │ │ │ │ +
104 };
│ │ │ │ +
│ │ │ │ +
105
│ │ │ │ +
106 template<int dimension, class CoordType>
│ │ │ │ +
107 int
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
109 nVertices(int nIntervals)
│ │ │ │ +
110 {
│ │ │ │ +
111 return BackendRefinement::nVertices(nIntervals) * nKuhnSimplices;
│ │ │ │ +
112 }
│ │ │ │ +
│ │ │ │ +
113
│ │ │ │ +
114 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
117 vBegin(int nIntervals)
│ │ │ │ +
118 {
│ │ │ │ +
119 return VertexIterator(nIntervals);
│ │ │ │ +
120 }
│ │ │ │ +
│ │ │ │ +
121
│ │ │ │ +
122 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
125 vEnd(int nIntervals)
│ │ │ │ +
126 {
│ │ │ │ +
127 return VertexIterator(nIntervals, true);
│ │ │ │ +
128 }
│ │ │ │ +
│ │ │ │ +
129
│ │ │ │ +
130 template<int dimension, class CoordType>
│ │ │ │ +
131 int
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
133 nElements(int nIntervals)
│ │ │ │ +
134 {
│ │ │ │ +
135 return BackendRefinement::nElements(nIntervals) * nKuhnSimplices;
│ │ │ │ +
136 }
│ │ │ │ +
│ │ │ │ +
137
│ │ │ │ +
138 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
141 eBegin(int nIntervals)
│ │ │ │ +
142 {
│ │ │ │ +
143 return ElementIterator(nIntervals);
│ │ │ │ +
144 }
│ │ │ │ +
│ │ │ │ +
145
│ │ │ │ +
146 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
149 eEnd(int nIntervals)
│ │ │ │ +
150 {
│ │ │ │ +
151 return ElementIterator(nIntervals, true);
│ │ │ │ +
152 }
│ │ │ │
│ │ │ │
153
│ │ │ │ -
154
│ │ │ │ -
155
│ │ │ │ -
156 // MultiLinearGeometry
│ │ │ │ -
157 // -------------------
│ │ │ │ +
154 // //////////////
│ │ │ │ +
155 //
│ │ │ │ +
156 // The iterator
│ │ │ │ +
157 //
│ │ │ │
158
│ │ │ │ -
179 template< class ct, int mydim, int cdim, class Traits = MultiLinearGeometryTraits< ct > >
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
181 {
│ │ │ │ - │ │ │ │ +
159 // vertices
│ │ │ │ +
160 template<int dimension, class CoordType>
│ │ │ │ +
│ │ │ │ +
161 class RefinementIteratorSpecial<dimension, CoordType, dimension>
│ │ │ │ +
162 {
│ │ │ │ +
163 public:
│ │ │ │ + │ │ │ │ +
165 typedef typename Refinement::CoordVector CoordVector;
│ │ │ │ +
166 typedef typename Refinement::template Codim<dimension>::Geometry Geometry;
│ │ │ │ +
167
│ │ │ │ +
168 RefinementIteratorSpecial(int nIntervals, bool end = false);
│ │ │ │ +
169
│ │ │ │ +
170 void increment();
│ │ │ │ +
171
│ │ │ │ +
172 CoordVector coords() const;
│ │ │ │ +
173
│ │ │ │ +
174 Geometry geometry() const;
│ │ │ │ +
175
│ │ │ │ +
176 int index() const;
│ │ │ │ +
177 protected:
│ │ │ │ +
178 typedef typename Refinement::BackendRefinement BackendRefinement;
│ │ │ │ +
179 typedef typename BackendRefinement::template Codim<dimension>::SubEntityIterator BackendIterator;
│ │ │ │ +
180 constexpr static int nKuhnSimplices = 2;
│ │ │ │ +
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;
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
187 };
│ │ │ │ +
│ │ │ │ +
188
│ │ │ │ +
189 template<int dimension, class CoordType>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
191 RefinementIteratorSpecial(int nIntervals, bool end)
│ │ │ │ +
192 : nIntervals_(nIntervals), kuhnIndex(0),
│ │ │ │ +
193 backend(BackendRefinement::vBegin(nIntervals_)),
│ │ │ │ +
194 backendEnd(BackendRefinement::vEnd(nIntervals_))
│ │ │ │ +
195 {
│ │ │ │ +
196 if (end)
│ │ │ │ +
197 kuhnIndex = nKuhnSimplices;
│ │ │ │ +
198 }
│ │ │ │ +
│ │ │ │
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 ); }
│ │ │ │ +
200 template<int dimension, class CoordType>
│ │ │ │ +
201 void
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
204 {
│ │ │ │ +
205 ++backend;
│ │ │ │ +
206 if(backend == backendEnd)
│ │ │ │ +
207 {
│ │ │ │ +
208 backend = BackendRefinement::vBegin(nIntervals_);
│ │ │ │ +
209 ++kuhnIndex;
│ │ │ │ +
210 }
│ │ │ │ +
211 }
│ │ │ │ +
│ │ │ │ +
212
│ │ │ │ +
213 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
216 coords() const
│ │ │ │ +
217 {
│ │ │ │ +
218 return transformCoordinate(referenceToKuhn(backend.coords(),
│ │ │ │ +
219 getPermutation<dimension>(kuhnIndex)));
│ │ │ │ +
220 }
│ │ │ │ +
│ │ │ │ +
221
│ │ │ │ +
222 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
225 {
│ │ │ │ +
226 std::vector<CoordVector> corners(1);
│ │ │ │ +
227 corners[0] = referenceToKuhn(backend.coords(), getPermutation<dimension>(kuhnIndex));
│ │ │ │ +
228 return Geometry(GeometryTypes::vertex, corners);
│ │ │ │ +
229 }
│ │ │ │ +
│ │ │ │ +
230
│ │ │ │ +
231 template<int dimension, class CoordType>
│ │ │ │ +
232 int
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
234 index() const
│ │ │ │ +
235 {
│ │ │ │ +
236 return kuhnIndex*BackendRefinement::nVertices(nIntervals_) + backend.index();
│ │ │ │ +
237 }
│ │ │ │ +
│ │ │ │ +
238
│ │ │ │ +
239 // elements
│ │ │ │ +
240 template<int dimension, class CoordType>
│ │ │ │ +
│ │ │ │ +
241 class RefinementIteratorSpecial<dimension, CoordType, 0>
│ │ │ │ +
242 {
│ │ │ │ +
243 public:
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
247 typedef typename Refinement::template Codim<0>::Geometry Geometry;
│ │ │ │ +
248
│ │ │ │ +
249 RefinementIteratorSpecial(int nIntervals, bool end = false);
│ │ │ │ +
250
│ │ │ │ +
251 void increment();
│ │ │ │ +
252
│ │ │ │ +
253 IndexVector vertexIndices() const;
│ │ │ │ +
254 int index() const;
│ │ │ │ +
255 CoordVector coords() const;
│ │ │ │ +
256
│ │ │ │ +
257 Geometry geometry() const;
│ │ │ │ +
258
│ │ │ │ +
259 private:
│ │ │ │ +
260 CoordVector global(const CoordVector &local) const;
│ │ │ │ +
261
│ │ │ │ +
262 protected:
│ │ │ │ + │ │ │ │ +
264 typedef typename BackendRefinement::template Codim<0>::SubEntityIterator BackendIterator;
│ │ │ │ +
265 constexpr static int nKuhnSimplices = 2;
│ │ │ │ +
266
│ │ │ │ + │ │ │ │ +
268
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
272 };
│ │ │ │ +
│ │ │ │
273
│ │ │ │ +
274 template<int dimension, class CoordType>
│ │ │ │
│ │ │ │ -
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
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
408 {
│ │ │ │ -
409 return jacobianTransposed(local).transposed();
│ │ │ │ -
410 }
│ │ │ │ + │ │ │ │ +
276 RefinementIteratorSpecial(int nIntervals, bool end)
│ │ │ │ +
277 : nIntervals_(nIntervals), kuhnIndex(0),
│ │ │ │ +
278 backend(BackendRefinement::eBegin(nIntervals_)),
│ │ │ │ +
279 backendEnd(BackendRefinement::eEnd(nIntervals_))
│ │ │ │ +
280 {
│ │ │ │ +
281 if (end)
│ │ │ │ +
282 kuhnIndex = nKuhnSimplices;
│ │ │ │ +
283 }
│ │ │ │ +
│ │ │ │ +
284
│ │ │ │ +
285 template<int dimension, class CoordType>
│ │ │ │ +
286 void
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
289 {
│ │ │ │ +
290 ++backend;
│ │ │ │ +
291 if (backend == backendEnd)
│ │ │ │ +
292 {
│ │ │ │ +
293 backend = BackendRefinement::eBegin(nIntervals_);
│ │ │ │ +
294 ++kuhnIndex;
│ │ │ │ +
295 }
│ │ │ │ +
296 }
│ │ │ │ +
│ │ │ │ +
297
│ │ │ │ +
298 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
301 vertexIndices() const
│ │ │ │ +
302 {
│ │ │ │ +
303 IndexVector indices = backend.vertexIndices();
│ │ │ │ +
304
│ │ │ │ +
305 int base = kuhnIndex * BackendRefinement::nVertices(nIntervals_);
│ │ │ │ +
306 indices += base;
│ │ │ │ +
307
│ │ │ │ +
308 return indices;
│ │ │ │ +
309 }
│ │ │ │ +
│ │ │ │ +
310
│ │ │ │ +
311 template<int dimension, class CoordType>
│ │ │ │ +
312 int
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
314 index() const
│ │ │ │ +
315 {
│ │ │ │ +
316 return kuhnIndex*BackendRefinement::nElements(nIntervals_) + backend.index();
│ │ │ │ +
317 }
│ │ │ │ +
│ │ │ │ +
318
│ │ │ │ +
319 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
322 coords() const
│ │ │ │ +
323 {
│ │ │ │ +
324 return global(backend.coords());
│ │ │ │ +
325 }
│ │ │ │
│ │ │ │ +
326
│ │ │ │ +
327 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
330 geometry() const
│ │ │ │ +
331 {
│ │ │ │ +
332 const typename BackendIterator::Geometry &
│ │ │ │ +
333 bgeo = backend.geometry();
│ │ │ │ +
334 std::vector<CoordVector> corners(dimension+1);
│ │ │ │ +
335 for(int i = 0; i <= dimension; ++i)
│ │ │ │ +
336 corners[i] = global(bgeo.corner(i));
│ │ │ │ +
337
│ │ │ │ +
338 return Geometry(bgeo.type(), corners);
│ │ │ │ +
339 }
│ │ │ │ +
│ │ │ │ +
340
│ │ │ │ +
341 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
343 CoordVector
│ │ │ │ + │ │ │ │ +
345 global(const CoordVector &local) const
│ │ │ │ +
346 {
│ │ │ │ +
347 return transformCoordinate(referenceToKuhn(local,
│ │ │ │ +
348 getPermutation<dimension>(kuhnIndex)));
│ │ │ │ +
349 }
│ │ │ │ +
350
│ │ │ │ +
351 // common
│ │ │ │ +
352 template<int dimension, class CoordType>
│ │ │ │ +
353 template<int codimension>
│ │ │ │ +
│ │ │ │ +
354 class RefinementImp<dimension, CoordType>::Codim<codimension>::SubEntityIterator
│ │ │ │ +
355 : public ForwardIteratorFacade<typename RefinementImp<dimension, CoordType>::template Codim<codimension>::SubEntityIterator, int>,
│ │ │ │ +
356 public RefinementIteratorSpecial<dimension, CoordType, codimension>
│ │ │ │ +
357 {
│ │ │ │ +
358 public:
│ │ │ │ + │ │ │ │ +
360 typedef SubEntityIterator This;
│ │ │ │ +
361
│ │ │ │ +
362 SubEntityIterator(int nIntervals, bool end = false);
│ │ │ │ +
363
│ │ │ │ +
364 bool equals(const This &other) const;
│ │ │ │ +
365 protected:
│ │ │ │ +
366 using RefinementIteratorSpecial<dimension, CoordType, codimension>::kuhnIndex;
│ │ │ │ +
367 using RefinementIteratorSpecial<dimension, CoordType, codimension>::backend;
│ │ │ │ +
368 };
│ │ │ │ +
│ │ │ │ +
369
│ │ │ │ +
370#ifndef DOXYGEN
│ │ │ │ +
371 template<int dimension, class CoordType>
│ │ │ │ +
372 template<int codimension>
│ │ │ │ + │ │ │ │ +
374 SubEntityIterator(int nIntervals, bool end)
│ │ │ │ +
375 : RefinementIteratorSpecial<dimension, CoordType, codimension>(nIntervals, end)
│ │ │ │ +
376 {}
│ │ │ │ +
377
│ │ │ │ +
378 template<int dimension, class CoordType>
│ │ │ │ +
379 template<int codimension>
│ │ │ │ +
380 bool
│ │ │ │ + │ │ │ │ +
382 equals(const This &other) const
│ │ │ │ +
383 {
│ │ │ │ +
384 return kuhnIndex == other.kuhnIndex && backend == other.backend;
│ │ │ │ +
385 }
│ │ │ │ +
386#endif
│ │ │ │ +
387
│ │ │ │ +
388 } // namespace PyramidTriangulation
│ │ │ │ +
│ │ │ │ +
389 } // namespace RefinementImp
│ │ │ │ +
390
│ │ │ │ +
391 namespace RefinementImp
│ │ │ │ +
392 {
│ │ │ │ +
393 // ///////////////////////
│ │ │ │ +
394 //
│ │ │ │ +
395 // The refinement traits
│ │ │ │ +
396 //
│ │ │ │ +
397#ifndef DOXYGEN
│ │ │ │ +
398 template<unsigned topologyId, class CoordType, unsigned coerceToId>
│ │ │ │ +
399 struct Traits<
│ │ │ │ +
400 topologyId, CoordType, coerceToId, 3,
│ │ │ │ +
401 typename std::enable_if<
│ │ │ │ +
402 (GeometryTypes::pyramid.id() >> 1) ==
│ │ │ │ +
403 (topologyId >> 1) &&
│ │ │ │ +
404 (GeometryTypes::simplex(3).id() >> 1) ==
│ │ │ │ +
405 (coerceToId >> 1)
│ │ │ │ +
406 >::type>
│ │ │ │ +
407 {
│ │ │ │ +
408 typedef PyramidTriangulation::RefinementImp<3, CoordType> Imp;
│ │ │ │ +
409 };
│ │ │ │ +
410#endif
│ │ │ │
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 {
│ │ │ │ - │ │ │ │ -
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
│ │ │ │ - │ │ │ │ -
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
│ │ │ │ - │ │ │ │ -
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
│ │ │ │ - │ │ │ │ -
694 }
│ │ │ │ -
│ │ │ │ -
695
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
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.
│ │ │ │ +
412 } // namespace RefinementImp
│ │ │ │ +
413} // namespace Dune
│ │ │ │ +
414
│ │ │ │ +
415#endif // DUNE_GEOMETRY_REFINEMENT_PYRAMIDTRIANGULATION_CC
│ │ │ │ +
This file contains the parts independent of a particular Refinement implementation.
│ │ │ │ +
This file contains the Refinement implementation for simplices (triangles, tetrahedrons....
│ │ │ │ +
A unique label for each type of element that can occur in a grid.
│ │ │ │ + │ │ │ │ +
STL namespace.
│ │ │ │
Definition affinegeometry.hh:21
│ │ │ │ -
Class providing access to the singletons of the reference elements.
Definition referenceelements.hh:128
│ │ │ │ -
typename Container::ReferenceElement ReferenceElement
The reference element type.
Definition referenceelements.hh:146
│ │ │ │ -
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
│ │ │ │ +
FieldVector< CoordType, dimension > transformCoordinate(FieldVector< CoordType, dimension > point)
Definition pyramidtriangulation.cc:51
│ │ │ │ +
FieldVector< int, n > getPermutation(int m)
Calculate permutation from it's index.
Definition simplex.cc:293
│ │ │ │ +
FieldVector< CoordType, dimension > referenceToKuhn(FieldVector< CoordType, dimension > point, const FieldVector< int, dimension > &kuhn)
Map from the reference simplex to some Kuhn simplex.
Definition simplex.cc:322
│ │ │ │ +
Static tag representing a codimension.
Definition dimension.hh:24
│ │ │ │
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
│ │ │ │ -
LocalCoordinate local(const GlobalCoordinate &globalCoord) const
evaluate the inverse mapping
Definition multilineargeometry.hh:312
│ │ │ │ -
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
│ │ │ │ -
LocalCoordinate local(const GlobalCoordinate &global) const
evaluate the inverse mapping
Definition multilineargeometry.hh:604
│ │ │ │ -
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:114
│ │ │ │ + │ │ │ │ +
Implementation of the refinement of a pyramid into simplices.
Definition pyramidtriangulation.cc:68
│ │ │ │ +
FieldVector< CoordType, dimension > CoordVector
Definition pyramidtriangulation.cc:77
│ │ │ │ +
static int nVertices(int nIntervals)
Definition pyramidtriangulation.cc:109
│ │ │ │ +
static int nElements(int nIntervals)
Definition pyramidtriangulation.cc:133
│ │ │ │ +
CoordType ctype
Definition pyramidtriangulation.cc:72
│ │ │ │ +
Codim< dimension >::SubEntityIterator VertexIterator
Definition pyramidtriangulation.cc:76
│ │ │ │ +
Codim< 0 >::SubEntityIterator ElementIterator
Definition pyramidtriangulation.cc:78
│ │ │ │ +
static constexpr int dimension
Definition pyramidtriangulation.cc:70
│ │ │ │ +
static ElementIterator eBegin(int nIntervals)
Definition pyramidtriangulation.cc:141
│ │ │ │ +
static ElementIterator eEnd(int nIntervals)
Definition pyramidtriangulation.cc:149
│ │ │ │ +
FieldVector< int, dimension+1 > IndexVector
Definition pyramidtriangulation.cc:79
│ │ │ │ +
static VertexIterator vBegin(int nIntervals)
Definition pyramidtriangulation.cc:117
│ │ │ │ +
static VertexIterator vEnd(int nIntervals)
Definition pyramidtriangulation.cc:125
│ │ │ │ + │ │ │ │ +
Dune::MultiLinearGeometry< CoordType, dimension-codimension, dimension > Geometry
Definition pyramidtriangulation.cc:103
│ │ │ │ +
RefinementImp< dimension, CoordType > Refinement
Definition pyramidtriangulation.cc:164
│ │ │ │ +
Refinement::template Codim< dimension >::Geometry Geometry
Definition pyramidtriangulation.cc:166
│ │ │ │ +
Refinement::BackendRefinement BackendRefinement
Definition pyramidtriangulation.cc:178
│ │ │ │ + │ │ │ │ +
BackendRefinement::template Codim< dimension >::SubEntityIterator BackendIterator
Definition pyramidtriangulation.cc:179
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
Refinement::CoordVector CoordVector
Definition pyramidtriangulation.cc:246
│ │ │ │ + │ │ │ │ +
Refinement::template Codim< 0 >::Geometry Geometry
Definition pyramidtriangulation.cc:247
│ │ │ │ +
Refinement::IndexVector IndexVector
Definition pyramidtriangulation.cc:245
│ │ │ │ +
BackendRefinement::template Codim< 0 >::SubEntityIterator BackendIterator
Definition pyramidtriangulation.cc:264
│ │ │ │ + │ │ │ │ + │ │ │ │ +
RefinementImp< dimension, CoordType > Refinement
Definition pyramidtriangulation.cc:244
│ │ │ │ +
Refinement::BackendRefinement BackendRefinement
Definition pyramidtriangulation.cc:263
│ │ │ │ + │ │ │ │ +
SubEntityIterator This
Definition pyramidtriangulation.cc:360
│ │ │ │ + │ │ │ │ +
RefinementImp< dimension, CoordType > Refinement
Definition pyramidtriangulation.cc:359
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,1022 +1,606 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -multilineargeometry.hh │ │ │ │ │ + * _r_e_f_i_n_e_m_e_n_t │ │ │ │ │ +pyramidtriangulation.cc │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 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 © 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_REFINEMENT_PYRAMIDTRIANGULATION_CC │ │ │ │ │ +_6#define DUNE_GEOMETRY_REFINEMENT_PYRAMIDTRIANGULATION_CC │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10#include │ │ │ │ │ -11#include │ │ │ │ │ -12#include │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10 │ │ │ │ │ +11#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ +12#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ 13 │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ -17 │ │ │ │ │ -18#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_a_f_f_i_n_e_g_e_o_m_e_t_r_y_._h_h> │ │ │ │ │ -19#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ -20#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ -21 │ │ │ │ │ -22namespace _D_u_n_e │ │ │ │ │ -23{ │ │ │ │ │ -24 │ │ │ │ │ -25 // MultiLinearGeometryTraits │ │ │ │ │ -26 // ------------------------- │ │ │ │ │ -27 │ │ │ │ │ -37 template< class ct > │ │ │ │ │ -_3_8 struct _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_T_r_a_i_t_s │ │ │ │ │ -39 { │ │ │ │ │ -_5_8 typedef Impl::FieldMatrixHelper< ct > _M_a_t_r_i_x_H_e_l_p_e_r; │ │ │ │ │ +14#include "_b_a_s_e_._c_c" │ │ │ │ │ +15#include "_s_i_m_p_l_e_x_._c_c" │ │ │ │ │ +16 │ │ │ │ │ +17namespace _D_u_n_e │ │ │ │ │ +18{ │ │ │ │ │ +19 namespace RefinementImp │ │ │ │ │ +20 { │ │ │ │ │ +_2_6 namespace PyramidTriangulation │ │ │ │ │ +27 { │ │ │ │ │ +28 // //////////// │ │ │ │ │ +29 // │ │ │ │ │ +30 // Utilities │ │ │ │ │ +31 // │ │ │ │ │ +32 │ │ │ │ │ +33 using _S_i_m_p_l_e_x_:_:_g_e_t_P_e_r_m_u_t_a_t_i_o_n; │ │ │ │ │ +34 using _S_i_m_p_l_e_x_:_:_r_e_f_e_r_e_n_c_e_T_o_K_u_h_n; │ │ │ │ │ +35 │ │ │ │ │ +36 // //////////////////////////////////// │ │ │ │ │ +37 // │ │ │ │ │ +38 // Refine a pyramid with simplices │ │ │ │ │ +39 // │ │ │ │ │ +40 │ │ │ │ │ +41 // forward declaration of the iterator base │ │ │ │ │ +42 template │ │ │ │ │ +_4_3 class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l; │ │ │ │ │ +44 │ │ │ │ │ +45 /* │ │ │ │ │ +46 * The permutations 0 and 1 of the Kuhn-decomposition of a cube into │ │ │ │ │ +simplices form a pyramid. │ │ │ │ │ +47 * The resulting pyramid is not oriented the same as the reference pyramid │ │ │ │ │ +and so the Kuhn-coordinates │ │ │ │ │ +48 * have to be transformed using the method below. │ │ │ │ │ +49 */ │ │ │ │ │ +50 template FieldVector │ │ │ │ │ +_5_1 _t_r_a_n_s_f_o_r_m_C_o_o_r_d_i_n_a_t_e( FieldVector point) │ │ │ │ │ +52 { │ │ │ │ │ +53 FieldVector transform; │ │ │ │ │ +54 transform[0]=1-point[0]; │ │ │ │ │ +55 transform[1]=1-point[1]; │ │ │ │ │ +56 transform[2]=point[2]; │ │ │ │ │ +57 return transform; │ │ │ │ │ +58 } │ │ │ │ │ 59 │ │ │ │ │ -_6_1 static ct _t_o_l_e_r_a_n_c_e () { return ct( 16 ) * std::numeric_limits< ct >:: │ │ │ │ │ -epsilon(); } │ │ │ │ │ -62 │ │ │ │ │ -127 template< int mydim, int cdim > │ │ │ │ │ -_1_2_8 struct _C_o_r_n_e_r_S_t_o_r_a_g_e │ │ │ │ │ -129 { │ │ │ │ │ -_1_3_0 typedef std::vector< FieldVector< ct, cdim > > _T_y_p_e; │ │ │ │ │ -131 }; │ │ │ │ │ -132 │ │ │ │ │ -146 template< int dim > │ │ │ │ │ -_1_4_7 struct _h_a_s_S_i_n_g_l_e_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ -148 { │ │ │ │ │ -_1_4_9 static const bool _v = false; │ │ │ │ │ -_1_5_0 static const unsigned int _t_o_p_o_l_o_g_y_I_d = ~0u; │ │ │ │ │ -151 }; │ │ │ │ │ -152 }; │ │ │ │ │ +66 template │ │ │ │ │ +_6_7 class _R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ +68 { │ │ │ │ │ +69 public: │ │ │ │ │ +_7_0 constexpr static int _d_i_m_e_n_s_i_o_n = dimension_; │ │ │ │ │ +71 │ │ │ │ │ +_7_2 typedef CoordType _c_t_y_p_e; │ │ │ │ │ +73 │ │ │ │ │ +74 template │ │ │ │ │ +75 struct _C_o_d_i_m; │ │ │ │ │ +_7_6 typedef typename _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _V_e_r_t_e_x_I_t_e_r_a_t_o_r; │ │ │ │ │ +_7_7 typedef FieldVector _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ +_7_8 typedef typename _C_o_d_i_m_<_0_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r; │ │ │ │ │ +_7_9 typedef FieldVector _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ +80 │ │ │ │ │ +81 static int _n_V_e_r_t_i_c_e_s(int nIntervals); │ │ │ │ │ +82 static _V_e_r_t_e_x_I_t_e_r_a_t_o_r _v_B_e_g_i_n(int nIntervals); │ │ │ │ │ +83 static _V_e_r_t_e_x_I_t_e_r_a_t_o_r _v_E_n_d(int nIntervals); │ │ │ │ │ +84 │ │ │ │ │ +85 static int _n_E_l_e_m_e_n_t_s(int nIntervals); │ │ │ │ │ +86 static _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r _e_B_e_g_i_n(int nIntervals); │ │ │ │ │ +_8_7 static _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r _e_E_n_d(int nIntervals); │ │ │ │ │ +88 │ │ │ │ │ +89 private: │ │ │ │ │ +90 friend class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l<_d_i_m_e_n_s_i_o_n, CoordType, 0>; │ │ │ │ │ +91 friend class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l<_d_i_m_e_n_s_i_o_n, CoordType, _d_i_m_e_n_s_i_o_n>; │ │ │ │ │ +92 │ │ │ │ │ +93 typedef _S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +94 │ │ │ │ │ +95 constexpr static int nKuhnSimplices = 2; │ │ │ │ │ +96 }; │ │ │ │ │ +97 │ │ │ │ │ +98 template │ │ │ │ │ +99 template │ │ │ │ │ +_1_0_0 struct _R_e_f_i_n_e_m_e_n_t_I_m_p::_C_o_d_i_m │ │ │ │ │ +101 { │ │ │ │ │ +102 class SubEntityIterator; │ │ │ │ │ +_1_0_3 typedef _D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y _G_e_o_m_e_t_r_y; │ │ │ │ │ +104 }; │ │ │ │ │ +105 │ │ │ │ │ +106 template │ │ │ │ │ +107 int │ │ │ │ │ +_1_0_8 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +109_ _n_V_e_r_t_i_c_e_s(int nIntervals) │ │ │ │ │ +110 { │ │ │ │ │ +111 return BackendRefinement::nVertices(nIntervals) * nKuhnSimplices; │ │ │ │ │ +112 } │ │ │ │ │ +113 │ │ │ │ │ +114 template │ │ │ │ │ +115 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ +_1_1_6 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +117_ _v_B_e_g_i_n(int nIntervals) │ │ │ │ │ +118 { │ │ │ │ │ +119 return _V_e_r_t_e_x_I_t_e_r_a_t_o_r(nIntervals); │ │ │ │ │ +120 } │ │ │ │ │ +121 │ │ │ │ │ +122 template │ │ │ │ │ +123 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ +_1_2_4 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +125_ _v_E_n_d(int nIntervals) │ │ │ │ │ +126 { │ │ │ │ │ +127 return _V_e_r_t_e_x_I_t_e_r_a_t_o_r(nIntervals, true); │ │ │ │ │ +128 } │ │ │ │ │ +129 │ │ │ │ │ +130 template │ │ │ │ │ +131 int │ │ │ │ │ +_1_3_2 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +133_ _n_E_l_e_m_e_n_t_s(int nIntervals) │ │ │ │ │ +134 { │ │ │ │ │ +135 return BackendRefinement::nElements(nIntervals) * nKuhnSimplices; │ │ │ │ │ +136 } │ │ │ │ │ +137 │ │ │ │ │ +138 template │ │ │ │ │ +139 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ +_1_4_0 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +141_ _e_B_e_g_i_n(int nIntervals) │ │ │ │ │ +142 { │ │ │ │ │ +143 return _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r(nIntervals); │ │ │ │ │ +144 } │ │ │ │ │ +145 │ │ │ │ │ +146 template │ │ │ │ │ +147 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ +_1_4_8 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +149_ _e_E_n_d(int nIntervals) │ │ │ │ │ +150 { │ │ │ │ │ +151 return _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r(nIntervals, true); │ │ │ │ │ +152 } │ │ │ │ │ 153 │ │ │ │ │ -154 │ │ │ │ │ -155 │ │ │ │ │ -156 // MultiLinearGeometry │ │ │ │ │ -157 // ------------------- │ │ │ │ │ +154 // ////////////// │ │ │ │ │ +155 // │ │ │ │ │ +156 // The iterator │ │ │ │ │ +157 // │ │ │ │ │ 158 │ │ │ │ │ -179 template< class ct, int mydim, int cdim, class Traits = │ │ │ │ │ -MultiLinearGeometryTraits< ct > > │ │ │ │ │ -_1_8_0 class _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y │ │ │ │ │ -181 { │ │ │ │ │ -182 typedef _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_<_ _c_t_,_ _m_y_d_i_m_,_ _c_d_i_m_,_ _T_r_a_i_t_s_ _> This; │ │ │ │ │ +159 // vertices │ │ │ │ │ +160 template │ │ │ │ │ +_1_6_1 class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ +162 { │ │ │ │ │ +163 public: │ │ │ │ │ +_1_6_4 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +_1_6_5 typedef typename Refinement::CoordVector _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ +_1_6_6 typedef typename Refinement::template _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_:_G_e_o_m_e_t_r_y _G_e_o_m_e_t_r_y; │ │ │ │ │ +167 │ │ │ │ │ +168 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end = false); │ │ │ │ │ +169 │ │ │ │ │ +170 void increment(); │ │ │ │ │ +171 │ │ │ │ │ +172 _C_o_o_r_d_V_e_c_t_o_r coords() const; │ │ │ │ │ +173 │ │ │ │ │ +174 _G_e_o_m_e_t_r_y geometry() const; │ │ │ │ │ +175 │ │ │ │ │ +176 int index() const; │ │ │ │ │ +177 protected: │ │ │ │ │ +_1_7_8 typedef typename Refinement::BackendRefinement _B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +_1_7_9 typedef typename BackendRefinement::template _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r; │ │ │ │ │ +_1_8_0 constexpr static int nKuhnSimplices = 2; │ │ │ │ │ +181 │ │ │ │ │ +_1_8_2 int _n_I_n_t_e_r_v_a_l_s__; │ │ │ │ │ 183 │ │ │ │ │ -184 public: │ │ │ │ │ -_1_8_6 typedef ct _c_t_y_p_e; │ │ │ │ │ -187 │ │ │ │ │ -_1_8_9 static const int _m_y_d_i_m_e_n_s_i_o_n= mydim; │ │ │ │ │ -_1_9_1 static const int _c_o_o_r_d_d_i_m_e_n_s_i_o_n = cdim; │ │ │ │ │ -192 │ │ │ │ │ -_1_9_4 typedef FieldVector< ctype, mydimension > _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ -_1_9_6 typedef FieldVector< ctype, coorddimension > _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ -_1_9_8 typedef _c_t_y_p_e _V_o_l_u_m_e; │ │ │ │ │ +_1_8_4 int _k_u_h_n_I_n_d_e_x; │ │ │ │ │ +_1_8_5 _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r _b_a_c_k_e_n_d; │ │ │ │ │ +_1_8_6 const _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r _b_a_c_k_e_n_d_E_n_d; │ │ │ │ │ +187 }; │ │ │ │ │ +188 │ │ │ │ │ +189 template │ │ │ │ │ +_1_9_0 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +191_ _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end) │ │ │ │ │ +192 : nIntervals_(nIntervals), kuhnIndex(0), │ │ │ │ │ +193 backend(_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t::vBegin(nIntervals_)), │ │ │ │ │ +194 backendEnd(_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t::vEnd(nIntervals_)) │ │ │ │ │ +195 { │ │ │ │ │ +196 if (end) │ │ │ │ │ +197 kuhnIndex = nKuhnSimplices; │ │ │ │ │ +198 } │ │ │ │ │ 199 │ │ │ │ │ -_2_0_1 typedef FieldMatrix< ctype, mydimension, coorddimension > │ │ │ │ │ -_J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d; │ │ │ │ │ -202 │ │ │ │ │ -204 class _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d; │ │ │ │ │ -205 │ │ │ │ │ -_2_0_7 typedef FieldMatrix< ctype, coorddimension, mydimension > _J_a_c_o_b_i_a_n; │ │ │ │ │ -208 │ │ │ │ │ -_2_1_0 typedef FieldMatrix< ctype, mydimension, coorddimension > _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e; │ │ │ │ │ -211 │ │ │ │ │ -212 protected: │ │ │ │ │ -213 │ │ │ │ │ -_2_1_4 typedef _D_u_n_e_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_<_ _c_t_y_p_e_,_ _m_y_d_i_m_e_n_s_i_o_n_ _> _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s; │ │ │ │ │ -215 │ │ │ │ │ -216 public: │ │ │ │ │ -217 │ │ │ │ │ -_2_1_9 typedef typename _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t; │ │ │ │ │ -220 │ │ │ │ │ -221 private: │ │ │ │ │ -222 static const bool hasSingleGeometryType = Traits::template │ │ │ │ │ -hasSingleGeometryType< mydimension >::v; │ │ │ │ │ -223 │ │ │ │ │ -224 protected: │ │ │ │ │ -_2_2_5 typedef typename Traits::MatrixHelper _M_a_t_r_i_x_H_e_l_p_e_r; │ │ │ │ │ -_2_2_6 typedef typename std::conditional< hasSingleGeometryType, std:: │ │ │ │ │ -integral_constant< unsigned int, Traits::template hasSingleGeometryType< │ │ │ │ │ -mydimension >::topologyId >, unsigned int >_:_:_t_y_p_e _T_o_p_o_l_o_g_y_I_d; │ │ │ │ │ -227 │ │ │ │ │ -228 public: │ │ │ │ │ -238 template< class Corners > │ │ │ │ │ -_2_3_9 _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y ( const _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t &_r_e_f_E_l_e_m_e_n_t, │ │ │ │ │ -240 const Corners &_c_o_r_n_e_r_s ) │ │ │ │ │ -241 : refElement_( _r_e_f_E_l_e_m_e_n_t ), │ │ │ │ │ -242 corners_( _c_o_r_n_e_r_s ) │ │ │ │ │ -243 {} │ │ │ │ │ -244 │ │ │ │ │ -254 template< class Corners > │ │ │ │ │ -_2_5_5 _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y ( _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e gt, │ │ │ │ │ -256 const Corners &_c_o_r_n_e_r_s ) │ │ │ │ │ -257 : refElement_( _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s::general( gt ) ), │ │ │ │ │ -258 corners_( _c_o_r_n_e_r_s ) │ │ │ │ │ -259 {} │ │ │ │ │ -260 │ │ │ │ │ -_2_6_2 bool _a_f_f_i_n_e () const │ │ │ │ │ -263 { │ │ │ │ │ -264 _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d jt; │ │ │ │ │ -265 return _a_f_f_i_n_e( jt ); │ │ │ │ │ -266 } │ │ │ │ │ -267 │ │ │ │ │ -_2_6_9 _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e _t_y_p_e () const { return _G_e_o_m_e_t_r_y_T_y_p_e( toUnsignedInt │ │ │ │ │ -(_t_o_p_o_l_o_g_y_I_d()), _m_y_d_i_m_e_n_s_i_o_n ); } │ │ │ │ │ -270 │ │ │ │ │ -_2_7_2 int _c_o_r_n_e_r_s () const { return _r_e_f_E_l_e_m_e_n_t().size( _m_y_d_i_m_e_n_s_i_o_n ); } │ │ │ │ │ +200 template │ │ │ │ │ +201 void │ │ │ │ │ +_2_0_2 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +203_ _i_n_c_r_e_m_e_n_t() │ │ │ │ │ +204 { │ │ │ │ │ +205 ++backend; │ │ │ │ │ +206 if(backend == backendEnd) │ │ │ │ │ +207 { │ │ │ │ │ +208 backend = BackendRefinement::vBegin(nIntervals_); │ │ │ │ │ +209 ++kuhnIndex; │ │ │ │ │ +210 } │ │ │ │ │ +211 } │ │ │ │ │ +212 │ │ │ │ │ +213 template │ │ │ │ │ +214 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +_2_1_5 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +216_ _c_o_o_r_d_s() const │ │ │ │ │ +217 { │ │ │ │ │ +218 return _t_r_a_n_s_f_o_r_m_C_o_o_r_d_i_n_a_t_e(referenceToKuhn(backend.coords(), │ │ │ │ │ +219 getPermutation(kuhnIndex))); │ │ │ │ │ +220 } │ │ │ │ │ +221 │ │ │ │ │ +222 template │ │ │ │ │ +223 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_G_e_o_m_e_t_r_y │ │ │ │ │ +_2_2_4 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_:_g_e_o_m_e_t_r_y () │ │ │ │ │ +const │ │ │ │ │ +225 { │ │ │ │ │ +226 std::vector corners(1); │ │ │ │ │ +227 corners[0] = referenceToKuhn(backend.coords(), getPermutation │ │ │ │ │ +(kuhnIndex)); │ │ │ │ │ +228 return _G_e_o_m_e_t_r_y(GeometryTypes::vertex, corners); │ │ │ │ │ +229 } │ │ │ │ │ +230 │ │ │ │ │ +231 template │ │ │ │ │ +232 int │ │ │ │ │ +_2_3_3 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +234_ _i_n_d_e_x() const │ │ │ │ │ +235 { │ │ │ │ │ +236 return kuhnIndex*BackendRefinement::nVertices(nIntervals_) + backend.index │ │ │ │ │ +(); │ │ │ │ │ +237 } │ │ │ │ │ +238 │ │ │ │ │ +239 // elements │ │ │ │ │ +240 template │ │ │ │ │ +_2_4_1 class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ +242 { │ │ │ │ │ +243 public: │ │ │ │ │ +_2_4_4 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +_2_4_5 typedef typename _R_e_f_i_n_e_m_e_n_t_:_:_I_n_d_e_x_V_e_c_t_o_r _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ +_2_4_6 typedef typename _R_e_f_i_n_e_m_e_n_t_:_:_C_o_o_r_d_V_e_c_t_o_r _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ +_2_4_7 typedef typename Refinement::template _C_o_d_i_m_<_0_>_:_:_G_e_o_m_e_t_r_y _G_e_o_m_e_t_r_y; │ │ │ │ │ +248 │ │ │ │ │ +249 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end = false); │ │ │ │ │ +250 │ │ │ │ │ +251 void increment(); │ │ │ │ │ +252 │ │ │ │ │ +253 _I_n_d_e_x_V_e_c_t_o_r vertexIndices() const; │ │ │ │ │ +254 int index() const; │ │ │ │ │ +255 _C_o_o_r_d_V_e_c_t_o_r coords() const; │ │ │ │ │ +256 │ │ │ │ │ +257 _G_e_o_m_e_t_r_y geometry() const; │ │ │ │ │ +258 │ │ │ │ │ +259 private: │ │ │ │ │ +260 _C_o_o_r_d_V_e_c_t_o_r global(const _C_o_o_r_d_V_e_c_t_o_r &local) const; │ │ │ │ │ +261 │ │ │ │ │ +262 protected: │ │ │ │ │ +_2_6_3 typedef typename _R_e_f_i_n_e_m_e_n_t_:_:_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t _B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +_2_6_4 typedef typename BackendRefinement::template _C_o_d_i_m_<_0_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ +_B_a_c_k_e_n_d_I_t_e_r_a_t_o_r; │ │ │ │ │ +_2_6_5 constexpr static int nKuhnSimplices = 2; │ │ │ │ │ +266 │ │ │ │ │ +_2_6_7 int _n_I_n_t_e_r_v_a_l_s__; │ │ │ │ │ +268 │ │ │ │ │ +_2_6_9 int _k_u_h_n_I_n_d_e_x; │ │ │ │ │ +_2_7_0 _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r _b_a_c_k_e_n_d; │ │ │ │ │ +_2_7_1 const _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r _b_a_c_k_e_n_d_E_n_d; │ │ │ │ │ +272 }; │ │ │ │ │ 273 │ │ │ │ │ -_2_7_5 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _c_o_r_n_e_r ( int i ) const │ │ │ │ │ -276 { │ │ │ │ │ -277 assert( (i >= 0) && (i < _c_o_r_n_e_r_s()) ); │ │ │ │ │ -278 return std::cref(corners_).get()[ i ]; │ │ │ │ │ -279 } │ │ │ │ │ -280 │ │ │ │ │ -_2_8_2 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _c_e_n_t_e_r () const { return _g_l_o_b_a_l( _r_e_f_E_l_e_m_e_n_t().position( 0, │ │ │ │ │ -0 ) ); } │ │ │ │ │ -283 │ │ │ │ │ -_2_9_0 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _g_l_o_b_a_l ( const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l ) const │ │ │ │ │ -291 { │ │ │ │ │ -292 using std::begin; │ │ │ │ │ -293 │ │ │ │ │ -294 auto cit = begin(std::cref(corners_).get()); │ │ │ │ │ -295 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e y; │ │ │ │ │ -296 global< false >( _t_o_p_o_l_o_g_y_I_d(), std::integral_constant< int, mydimension > │ │ │ │ │ -(), cit, _c_t_y_p_e( 1 ), _l_o_c_a_l, _c_t_y_p_e( 1 ), y ); │ │ │ │ │ -297 return y; │ │ │ │ │ -298 } │ │ │ │ │ -299 │ │ │ │ │ -_3_1_2 _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e _l_o_c_a_l ( const _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e &globalCoord ) const │ │ │ │ │ -313 { │ │ │ │ │ -314 const _c_t_y_p_e tolerance = Traits::tolerance(); │ │ │ │ │ -315 _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e x = _r_e_f_E_l_e_m_e_n_t().position( 0, 0 ); │ │ │ │ │ -316 _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e dx; │ │ │ │ │ -317 const bool affineMapping = this->_a_f_f_i_n_e(); │ │ │ │ │ -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 > │ │ │ │ │ -( _j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d( x ), dglobal, dx ); │ │ │ │ │ -324 if( ! invertible ) │ │ │ │ │ -325 return _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e( std::numeric_limits< ctype > :: max() ); │ │ │ │ │ +274 template │ │ │ │ │ +_2_7_5 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +276_ _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end) │ │ │ │ │ +277 : nIntervals_(nIntervals), kuhnIndex(0), │ │ │ │ │ +278 backend(_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t::eBegin(nIntervals_)), │ │ │ │ │ +279 backendEnd(_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t::eEnd(nIntervals_)) │ │ │ │ │ +280 { │ │ │ │ │ +281 if (end) │ │ │ │ │ +282 kuhnIndex = nKuhnSimplices; │ │ │ │ │ +283 } │ │ │ │ │ +284 │ │ │ │ │ +285 template │ │ │ │ │ +286 void │ │ │ │ │ +_2_8_7 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +288_ _i_n_c_r_e_m_e_n_t() │ │ │ │ │ +289 { │ │ │ │ │ +290 ++backend; │ │ │ │ │ +291 if (backend == backendEnd) │ │ │ │ │ +292 { │ │ │ │ │ +293 backend = BackendRefinement::eBegin(nIntervals_); │ │ │ │ │ +294 ++kuhnIndex; │ │ │ │ │ +295 } │ │ │ │ │ +296 } │ │ │ │ │ +297 │ │ │ │ │ +298 template │ │ │ │ │ +299 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ +_3_0_0 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +301_ _v_e_r_t_e_x_I_n_d_i_c_e_s() const │ │ │ │ │ +302 { │ │ │ │ │ +303 _I_n_d_e_x_V_e_c_t_o_r indices = backend.vertexIndices(); │ │ │ │ │ +304 │ │ │ │ │ +305 int base = kuhnIndex * BackendRefinement::nVertices(nIntervals_); │ │ │ │ │ +306 indices += base; │ │ │ │ │ +307 │ │ │ │ │ +308 return indices; │ │ │ │ │ +309 } │ │ │ │ │ +310 │ │ │ │ │ +311 template │ │ │ │ │ +312 int │ │ │ │ │ +_3_1_3 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +314_ _i_n_d_e_x() const │ │ │ │ │ +315 { │ │ │ │ │ +316 return kuhnIndex*BackendRefinement::nElements(nIntervals_) + backend.index │ │ │ │ │ +(); │ │ │ │ │ +317 } │ │ │ │ │ +318 │ │ │ │ │ +319 template │ │ │ │ │ +320 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +_3_2_1 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +322_ _c_o_o_r_d_s() const │ │ │ │ │ +323 { │ │ │ │ │ +324 return global(backend.coords()); │ │ │ │ │ +325 } │ │ │ │ │ 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 │ │ │ │ │ -_3_5_0 _V_o_l_u_m_e _i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t ( const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l ) const │ │ │ │ │ -351 { │ │ │ │ │ -352 return MatrixHelper::template sqrtDetAAT< mydimension, coorddimension > │ │ │ │ │ -( _j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d( _l_o_c_a_l ) ); │ │ │ │ │ -353 } │ │ │ │ │ -354 │ │ │ │ │ -_3_6_3 _V_o_l_u_m_e _v_o_l_u_m_e () const │ │ │ │ │ -364 { │ │ │ │ │ -365 return _i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t( _r_e_f_E_l_e_m_e_n_t().position( 0, 0 ) ) * _r_e_f_E_l_e_m_e_n_t │ │ │ │ │ -().volume(); │ │ │ │ │ -366 } │ │ │ │ │ -367 │ │ │ │ │ -_3_7_7 _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d _j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d ( const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l ) │ │ │ │ │ -const │ │ │ │ │ -378 { │ │ │ │ │ -379 using std::begin; │ │ │ │ │ -380 │ │ │ │ │ -381 _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d jt; │ │ │ │ │ -382 auto cit = begin(std::cref(corners_).get()); │ │ │ │ │ -383 jacobianTransposed< false >( _t_o_p_o_l_o_g_y_I_d(), std::integral_constant< int, │ │ │ │ │ -mydimension >(), cit, _c_t_y_p_e( 1 ), _l_o_c_a_l, _c_t_y_p_e( 1 ), jt ); │ │ │ │ │ -384 return jt; │ │ │ │ │ +327 template │ │ │ │ │ +328 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ +_3_2_9 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +330_ _g_e_o_m_e_t_r_y() const │ │ │ │ │ +331 { │ │ │ │ │ +332 const typename BackendIterator::Geometry & │ │ │ │ │ +333 bgeo = backend.geometry(); │ │ │ │ │ +334 std::vector corners(dimension+1); │ │ │ │ │ +335 for(int i = 0; i <= dimension; ++i) │ │ │ │ │ +336 corners[i] = global(bgeo.corner(i)); │ │ │ │ │ +337 │ │ │ │ │ +338 return _G_e_o_m_e_t_r_y(bgeo.type(), corners); │ │ │ │ │ +339 } │ │ │ │ │ +340 │ │ │ │ │ +341 template │ │ │ │ │ +342 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>:: │ │ │ │ │ +343 CoordVector │ │ │ │ │ +344 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +345_ _g_l_o_b_a_l(const CoordVector &local) const │ │ │ │ │ +346 { │ │ │ │ │ +347 return _t_r_a_n_s_f_o_r_m_C_o_o_r_d_i_n_a_t_e(referenceToKuhn(local, │ │ │ │ │ +348 getPermutation(kuhnIndex))); │ │ │ │ │ +349 } │ │ │ │ │ +350 │ │ │ │ │ +351 // common │ │ │ │ │ +352 template │ │ │ │ │ +353 template │ │ │ │ │ +_3_5_4 class _R_e_f_i_n_e_m_e_n_t_I_m_p::_C_o_d_i_m:: │ │ │ │ │ +SubEntityIterator │ │ │ │ │ +355 : public ForwardIteratorFacade::template Codim::SubEntityIterator, int>, │ │ │ │ │ +356 public _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ +357 { │ │ │ │ │ +358 public: │ │ │ │ │ +_3_5_9 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +_3_6_0 typedef SubEntityIterator _T_h_i_s; │ │ │ │ │ +361 │ │ │ │ │ +_3_6_2 _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r(int nIntervals, bool end = false); │ │ │ │ │ +363 │ │ │ │ │ +_3_6_4 bool _e_q_u_a_l_s(const _T_h_i_s &other) const; │ │ │ │ │ +365 protected: │ │ │ │ │ +366 using _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l<_d_i_m_e_n_s_i_o_n, CoordType, codimension>:: │ │ │ │ │ +kuhnIndex; │ │ │ │ │ +367 using _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l<_d_i_m_e_n_s_i_o_n, CoordType, codimension>:: │ │ │ │ │ +backend; │ │ │ │ │ +368 }; │ │ │ │ │ +369 │ │ │ │ │ +370#ifndef DOXYGEN │ │ │ │ │ +371 template │ │ │ │ │ +372 template │ │ │ │ │ +373 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_:_: │ │ │ │ │ +374_ _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r(int nIntervals, bool end) │ │ │ │ │ +375 : _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(nIntervals, │ │ │ │ │ +end) │ │ │ │ │ +376 {} │ │ │ │ │ +377 │ │ │ │ │ +378 template │ │ │ │ │ +379 template │ │ │ │ │ +380 bool │ │ │ │ │ +381 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_:_: │ │ │ │ │ +382_ _e_q_u_a_l_s(const This &other) const │ │ │ │ │ +383 { │ │ │ │ │ +384 return kuhnIndex == other.kuhnIndex && backend == other.backend; │ │ │ │ │ 385 } │ │ │ │ │ -386 │ │ │ │ │ -_3_9_3 JacobianInverseTransposed _j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d ( const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ -&_l_o_c_a_l ) const; │ │ │ │ │ -394 │ │ │ │ │ -_3_9_5 friend _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t _r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t ( const _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y │ │ │ │ │ -&geometry ) │ │ │ │ │ -396 { │ │ │ │ │ -397 return geometry._r_e_f_E_l_e_m_e_n_t(); │ │ │ │ │ -398 } │ │ │ │ │ -399 │ │ │ │ │ -400 │ │ │ │ │ -_4_0_7 _J_a_c_o_b_i_a_n _j_a_c_o_b_i_a_n (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l) const │ │ │ │ │ -408 { │ │ │ │ │ -409 return _j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d(_l_o_c_a_l).transposed(); │ │ │ │ │ -410 } │ │ │ │ │ +386#endif │ │ │ │ │ +387 │ │ │ │ │ +388 } // namespace PyramidTriangulation │ │ │ │ │ +389 } // namespace RefinementImp │ │ │ │ │ +390 │ │ │ │ │ +391 namespace RefinementImp │ │ │ │ │ +392 { │ │ │ │ │ +393 // /////////////////////// │ │ │ │ │ +394 // │ │ │ │ │ +395 // The refinement traits │ │ │ │ │ +396 // │ │ │ │ │ +397#ifndef DOXYGEN │ │ │ │ │ +398 template │ │ │ │ │ +399 struct Traits< │ │ │ │ │ +400 topologyId, CoordType, coerceToId, 3, │ │ │ │ │ +401 typename _s_t_d::enable_if< │ │ │ │ │ +402 (GeometryTypes::pyramid.id() >> 1) == │ │ │ │ │ +403 (topologyId >> 1) && │ │ │ │ │ +404 (GeometryTypes::simplex(3).id() >> 1) == │ │ │ │ │ +405 (coerceToId >> 1) │ │ │ │ │ +406 >::type> │ │ │ │ │ +407 { │ │ │ │ │ +408 typedef PyramidTriangulation::RefinementImp<3, CoordType> Imp; │ │ │ │ │ +409 }; │ │ │ │ │ +410#endif │ │ │ │ │ 411 │ │ │ │ │ -_4_1_8 _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e _j_a_c_o_b_i_a_n_I_n_v_e_r_s_e (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l) const │ │ │ │ │ -419 { │ │ │ │ │ -420 return _j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d(_l_o_c_a_l).transposed(); │ │ │ │ │ -421 } │ │ │ │ │ -422 │ │ │ │ │ -423 protected: │ │ │ │ │ -424 │ │ │ │ │ -_4_2_5 _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t _r_e_f_E_l_e_m_e_n_t () const │ │ │ │ │ -426 { │ │ │ │ │ -427 return refElement_; │ │ │ │ │ -428 } │ │ │ │ │ -429 │ │ │ │ │ -_4_3_0 _T_o_p_o_l_o_g_y_I_d _t_o_p_o_l_o_g_y_I_d () const │ │ │ │ │ -431 { │ │ │ │ │ -432 return _t_o_p_o_l_o_g_y_I_d( std::integral_constant< bool, hasSingleGeometryType >() │ │ │ │ │ -); │ │ │ │ │ -433 } │ │ │ │ │ -434 │ │ │ │ │ -435 template< bool add, int dim, class CornerIterator > │ │ │ │ │ -_4_3_6 static void _g_l_o_b_a_l ( _T_o_p_o_l_o_g_y_I_d _t_o_p_o_l_o_g_y_I_d, std::integral_constant< int, │ │ │ │ │ -dim >, │ │ │ │ │ -437 CornerIterator &cit, const _c_t_y_p_e &df, const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &x, │ │ │ │ │ -438 const _c_t_y_p_e &rf, _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e &y ); │ │ │ │ │ -439 template< bool add, class CornerIterator > │ │ │ │ │ -_4_4_0 static void _g_l_o_b_a_l ( _T_o_p_o_l_o_g_y_I_d _t_o_p_o_l_o_g_y_I_d, std::integral_constant< int, 0 │ │ │ │ │ ->, │ │ │ │ │ -441 CornerIterator &cit, const _c_t_y_p_e &df, const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &x, │ │ │ │ │ -442 const _c_t_y_p_e &rf, _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e &y ); │ │ │ │ │ -443 │ │ │ │ │ -444 template< bool add, int rows, int dim, class CornerIterator > │ │ │ │ │ -_4_4_5 static void _j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d ( _T_o_p_o_l_o_g_y_I_d _t_o_p_o_l_o_g_y_I_d, std:: │ │ │ │ │ -integral_constant< int, dim >, │ │ │ │ │ -446 CornerIterator &cit, const _c_t_y_p_e &df, const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &x, │ │ │ │ │ -447 const _c_t_y_p_e &rf, FieldMatrix< ctype, rows, cdim > &jt ); │ │ │ │ │ -448 template< bool add, int rows, class CornerIterator > │ │ │ │ │ -_4_4_9 static void _j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d ( _T_o_p_o_l_o_g_y_I_d _t_o_p_o_l_o_g_y_I_d, std:: │ │ │ │ │ -integral_constant< int, 0 >, │ │ │ │ │ -450 CornerIterator &cit, const _c_t_y_p_e &df, const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &x, │ │ │ │ │ -451 const _c_t_y_p_e &rf, FieldMatrix< ctype, rows, cdim > &jt ); │ │ │ │ │ -452 │ │ │ │ │ -453 template< int dim, class CornerIterator > │ │ │ │ │ -_4_5_4 static bool _a_f_f_i_n_e ( _T_o_p_o_l_o_g_y_I_d _t_o_p_o_l_o_g_y_I_d, std::integral_constant< int, │ │ │ │ │ -dim >, CornerIterator &cit, _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d &jt ); │ │ │ │ │ -455 template< class CornerIterator > │ │ │ │ │ -_4_5_6 static bool _a_f_f_i_n_e ( _T_o_p_o_l_o_g_y_I_d _t_o_p_o_l_o_g_y_I_d, std::integral_constant< int, 0 │ │ │ │ │ ->, CornerIterator &cit, _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d &jt ); │ │ │ │ │ -457 │ │ │ │ │ -_4_5_8 bool _a_f_f_i_n_e ( _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d &jacobianT ) const │ │ │ │ │ -459 { │ │ │ │ │ -460 using std::begin; │ │ │ │ │ -461 │ │ │ │ │ -462 auto cit = begin(std::cref(corners_).get()); │ │ │ │ │ -463 return _a_f_f_i_n_e( _t_o_p_o_l_o_g_y_I_d(), 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 _T_o_p_o_l_o_g_y_I_d _t_o_p_o_l_o_g_y_I_d ( std::integral_constant< bool, true > ) const │ │ │ │ │ -{ return _T_o_p_o_l_o_g_y_I_d(); } │ │ │ │ │ -474 unsigned int _t_o_p_o_l_o_g_y_I_d ( std::integral_constant< bool, false > ) const │ │ │ │ │ -{ return _r_e_f_E_l_e_m_e_n_t().type().id(); } │ │ │ │ │ -475 │ │ │ │ │ -476 _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t 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 > │ │ │ │ │ -_4_8_6 class _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y< ct, mydim, cdim, Traits >:: │ │ │ │ │ -_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -487 : public FieldMatrix< ctype, coorddimension, mydimension > │ │ │ │ │ -488 { │ │ │ │ │ -489 typedef FieldMatrix< ctype, coorddimension, mydimension > Base; │ │ │ │ │ -490 │ │ │ │ │ -491 public: │ │ │ │ │ -_4_9_2 void _s_e_t_u_p ( const _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d &jt ) │ │ │ │ │ -493 { │ │ │ │ │ -494 detInv_ = MatrixHelper::template rightInvA< mydimension, coorddimension > │ │ │ │ │ -( jt, static_cast< Base & >( *this ) ); │ │ │ │ │ -495 } │ │ │ │ │ -496 │ │ │ │ │ -_4_9_7 void _s_e_t_u_p_D_e_t_e_r_m_i_n_a_n_t ( const _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d &jt ) │ │ │ │ │ -498 { │ │ │ │ │ -499 detInv_ = MatrixHelper::template sqrtDetAAT< mydimension, coorddimension > │ │ │ │ │ -( jt ); │ │ │ │ │ -500 } │ │ │ │ │ -501 │ │ │ │ │ -_5_0_2 _c_t_y_p_e _d_e_t () const { return _c_t_y_p_e( 1 ) / detInv_; } │ │ │ │ │ -_5_0_3 _c_t_y_p_e _d_e_t_I_n_v () const { return detInv_; } │ │ │ │ │ -504 │ │ │ │ │ -505 private: │ │ │ │ │ -506 _c_t_y_p_e detInv_; │ │ │ │ │ -507 }; │ │ │ │ │ -508 │ │ │ │ │ -509 │ │ │ │ │ -510 │ │ │ │ │ -523 template< class ct, int mydim, int cdim, class Traits = │ │ │ │ │ -MultiLinearGeometryTraits< ct > > │ │ │ │ │ -_5_2_4 class _C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y │ │ │ │ │ -525 : public _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y< ct, mydim, cdim, Traits > │ │ │ │ │ -526 { │ │ │ │ │ -527 typedef _C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_<_ _c_t_,_ _m_y_d_i_m_,_ _c_d_i_m_,_ _T_r_a_i_t_s_ _> This; │ │ │ │ │ -528 typedef _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_<_ _c_t_,_ _m_y_d_i_m_,_ _c_d_i_m_,_ _T_r_a_i_t_s_ _> _B_a_s_e; │ │ │ │ │ -529 │ │ │ │ │ -530 protected: │ │ │ │ │ -_5_3_1 typedef typename _B_a_s_e_:_:_M_a_t_r_i_x_H_e_l_p_e_r _M_a_t_r_i_x_H_e_l_p_e_r; │ │ │ │ │ -532 │ │ │ │ │ -533 public: │ │ │ │ │ -_5_3_4 typedef typename _B_a_s_e_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t; │ │ │ │ │ -535 │ │ │ │ │ -_5_3_6 typedef typename _B_a_s_e_:_:_c_t_y_p_e _c_t_y_p_e; │ │ │ │ │ -537 │ │ │ │ │ -538 using _B_a_s_e_:_:_m_y_d_i_m_e_n_s_i_o_n; │ │ │ │ │ -539 using _B_a_s_e_:_:_c_o_o_r_d_d_i_m_e_n_s_i_o_n; │ │ │ │ │ -540 │ │ │ │ │ -_5_4_1 typedef typename _B_a_s_e_:_:_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ -_5_4_2 typedef typename _B_a_s_e_:_:_G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ -_5_4_3 typedef typename _B_a_s_e_:_:_V_o_l_u_m_e _V_o_l_u_m_e; │ │ │ │ │ -544 │ │ │ │ │ -_5_4_5 typedef typename _B_a_s_e_:_:_J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d; │ │ │ │ │ -_5_4_6 typedef typename _B_a_s_e_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d; │ │ │ │ │ -_5_4_7 typedef typename _B_a_s_e_:_:_J_a_c_o_b_i_a_n _J_a_c_o_b_i_a_n; │ │ │ │ │ -_5_4_8 typedef typename _B_a_s_e_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e; │ │ │ │ │ -549 │ │ │ │ │ -550 template< class CornerStorage > │ │ │ │ │ -_5_5_1 _C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y ( const _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t &_r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t, const │ │ │ │ │ -CornerStorage &cornerStorage ) │ │ │ │ │ -552 : _B_a_s_e( _r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t, cornerStorage ), │ │ │ │ │ -553 affine_( _B_a_s_e::_a_f_f_i_n_e( jacobianTransposed_ ) ), │ │ │ │ │ -554 jacobianInverseTransposedComputed_( false ), │ │ │ │ │ -555 integrationElementComputed_( false ) │ │ │ │ │ -556 {} │ │ │ │ │ -557 │ │ │ │ │ -558 template< class CornerStorage > │ │ │ │ │ -_5_5_9 _C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y ( _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e gt, const CornerStorage │ │ │ │ │ -&cornerStorage ) │ │ │ │ │ -560 : _B_a_s_e( gt, cornerStorage ), │ │ │ │ │ -561 affine_( _B_a_s_e::_a_f_f_i_n_e( jacobianTransposed_ ) ), │ │ │ │ │ -562 jacobianInverseTransposedComputed_( false ), │ │ │ │ │ -563 integrationElementComputed_( false ) │ │ │ │ │ -564 {} │ │ │ │ │ -565 │ │ │ │ │ -_5_6_7 bool _a_f_f_i_n_e () const { return affine_; } │ │ │ │ │ -568 │ │ │ │ │ -569 using _B_a_s_e_:_:_c_o_r_n_e_r; │ │ │ │ │ -570 │ │ │ │ │ -_5_7_2 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _c_e_n_t_e_r () const { return _g_l_o_b_a_l( _r_e_f_E_l_e_m_e_n_t().position( 0, │ │ │ │ │ -0 ) ); } │ │ │ │ │ -573 │ │ │ │ │ -_5_8_0 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _g_l_o_b_a_l ( const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l ) const │ │ │ │ │ -581 { │ │ │ │ │ -582 if( _a_f_f_i_n_e() ) │ │ │ │ │ -583 { │ │ │ │ │ -584 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _g_l_o_b_a_l( _c_o_r_n_e_r( 0 ) ); │ │ │ │ │ -585 jacobianTransposed_.umtv( _l_o_c_a_l, _g_l_o_b_a_l ); │ │ │ │ │ -586 return _g_l_o_b_a_l; │ │ │ │ │ -587 } │ │ │ │ │ -588 else │ │ │ │ │ -589 return _B_a_s_e_:_:_g_l_o_b_a_l( _l_o_c_a_l ); │ │ │ │ │ -590 } │ │ │ │ │ -591 │ │ │ │ │ -_6_0_4 _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e _l_o_c_a_l ( const _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e &_g_l_o_b_a_l ) const │ │ │ │ │ -605 { │ │ │ │ │ -606 if( _a_f_f_i_n_e() ) │ │ │ │ │ -607 { │ │ │ │ │ -608 _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e _l_o_c_a_l; │ │ │ │ │ -609 if( jacobianInverseTransposedComputed_ ) │ │ │ │ │ -610 jacobianInverseTransposed_.mtv( _g_l_o_b_a_l - _c_o_r_n_e_r( 0 ), _l_o_c_a_l ); │ │ │ │ │ -611 else │ │ │ │ │ -612 MatrixHelper::template xTRightInvA< mydimension, coorddimension > │ │ │ │ │ -( jacobianTransposed_, _g_l_o_b_a_l - _c_o_r_n_e_r( 0 ), _l_o_c_a_l ); │ │ │ │ │ -613 return _l_o_c_a_l; │ │ │ │ │ -614 } │ │ │ │ │ -615 else │ │ │ │ │ -616 return _B_a_s_e_:_:_l_o_c_a_l( _g_l_o_b_a_l ); │ │ │ │ │ -617 } │ │ │ │ │ -618 │ │ │ │ │ -_6_3_3 _c_t_y_p_e _i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t ( const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l ) const │ │ │ │ │ -634 { │ │ │ │ │ -635 if( _a_f_f_i_n_e() ) │ │ │ │ │ -636 { │ │ │ │ │ -637 if( !integrationElementComputed_ ) │ │ │ │ │ -638 { │ │ │ │ │ -639 jacobianInverseTransposed_._s_e_t_u_p_D_e_t_e_r_m_i_n_a_n_t( jacobianTransposed_ ); │ │ │ │ │ -640 integrationElementComputed_ = true; │ │ │ │ │ -641 } │ │ │ │ │ -642 return jacobianInverseTransposed_._d_e_t_I_n_v(); │ │ │ │ │ -643 } │ │ │ │ │ -644 else │ │ │ │ │ -645 return _B_a_s_e_:_:_i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t( _l_o_c_a_l ); │ │ │ │ │ -646 } │ │ │ │ │ -647 │ │ │ │ │ -_6_4_9 _V_o_l_u_m_e _v_o_l_u_m_e () const │ │ │ │ │ -650 { │ │ │ │ │ -651 if( _a_f_f_i_n_e() ) │ │ │ │ │ -652 return _i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t( _r_e_f_E_l_e_m_e_n_t().position( 0, 0 ) ) * _r_e_f_E_l_e_m_e_n_t │ │ │ │ │ -().volume(); │ │ │ │ │ -653 else │ │ │ │ │ -654 return _B_a_s_e_:_:_v_o_l_u_m_e(); │ │ │ │ │ -655 } │ │ │ │ │ -656 │ │ │ │ │ -_6_6_6 _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d _j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d ( const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l ) │ │ │ │ │ -const │ │ │ │ │ -667 { │ │ │ │ │ -668 if( _a_f_f_i_n_e() ) │ │ │ │ │ -669 return jacobianTransposed_; │ │ │ │ │ -670 else │ │ │ │ │ -671 return _B_a_s_e_:_:_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d( _l_o_c_a_l ); │ │ │ │ │ -672 } │ │ │ │ │ -673 │ │ │ │ │ -_6_8_0 _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d _j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d ( const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ -&_l_o_c_a_l ) const │ │ │ │ │ -681 { │ │ │ │ │ -682 if( _a_f_f_i_n_e() ) │ │ │ │ │ -683 { │ │ │ │ │ -684 if( !jacobianInverseTransposedComputed_ ) │ │ │ │ │ -685 { │ │ │ │ │ -686 jacobianInverseTransposed_._s_e_t_u_p( jacobianTransposed_ ); │ │ │ │ │ -687 jacobianInverseTransposedComputed_ = true; │ │ │ │ │ -688 integrationElementComputed_ = true; │ │ │ │ │ -689 } │ │ │ │ │ -690 return jacobianInverseTransposed_; │ │ │ │ │ -691 } │ │ │ │ │ -692 else │ │ │ │ │ -693 return _B_a_s_e_:_:_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d( _l_o_c_a_l ); │ │ │ │ │ -694 } │ │ │ │ │ -695 │ │ │ │ │ -_7_0_2 _J_a_c_o_b_i_a_n _j_a_c_o_b_i_a_n (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l) const │ │ │ │ │ -703 { │ │ │ │ │ -704 return _j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d(_l_o_c_a_l).transposed(); │ │ │ │ │ -705 } │ │ │ │ │ -706 │ │ │ │ │ -_7_1_3 _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e _j_a_c_o_b_i_a_n_I_n_v_e_r_s_e (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l) const │ │ │ │ │ -714 { │ │ │ │ │ -715 return _j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d(_l_o_c_a_l).transposed(); │ │ │ │ │ -716 } │ │ │ │ │ -717 │ │ │ │ │ -718 protected: │ │ │ │ │ -719 using _B_a_s_e_:_:_r_e_f_E_l_e_m_e_n_t; │ │ │ │ │ -720 │ │ │ │ │ -721 private: │ │ │ │ │ -722 mutable _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d jacobianTransposed_; │ │ │ │ │ -723 mutable _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d 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 │ │ │ │ │ -_7_3_8 _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_<_ _c_t_,_ _m_y_d_i_m_,_ _c_d_i_m_,_ _T_r_a_i_t_s_ _>_:_:_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -( const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &local ) const │ │ │ │ │ -739 { │ │ │ │ │ -740 _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d jit; │ │ │ │ │ -741 jit._s_e_t_u_p( 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 _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_<_ _c_t_,_ _m_y_d_i_m_,_ _c_d_i_m_,_ _T_r_a_i_t_s_ _> │ │ │ │ │ -_7_4_9_ _:_:_g_l_o_b_a_l ( _T_o_p_o_l_o_g_y_I_d topologyId, std::integral_constant< int, dim >, │ │ │ │ │ -750 CornerIterator &cit, const _c_t_y_p_e &df, const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &x, │ │ │ │ │ -751 const _c_t_y_p_e &rf, _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e &y ) │ │ │ │ │ -752 { │ │ │ │ │ -753 const _c_t_y_p_e xn = df*x[ dim-1 ]; │ │ │ │ │ -754 const _c_t_y_p_e cxn = _c_t_y_p_e( 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, _c_t_y_p_e( 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 _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_<_ _c_t_,_ _m_y_d_i_m_,_ _c_d_i_m_,_ _T_r_a_i_t_s_ _> │ │ │ │ │ -_7_8_0_ _:_:_g_l_o_b_a_l ( _T_o_p_o_l_o_g_y_I_d, std::integral_constant< int, 0 >, │ │ │ │ │ -781 CornerIterator &cit, const _c_t_y_p_e &, const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &, │ │ │ │ │ -782 const _c_t_y_p_e &rf, _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e &y ) │ │ │ │ │ -783 { │ │ │ │ │ -784 const _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e &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 _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_<_ _c_t_,_ _m_y_d_i_m_,_ _c_d_i_m_,_ _T_r_a_i_t_s_ _> │ │ │ │ │ -_7_9_4_ _:_:_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d ( _T_o_p_o_l_o_g_y_I_d topologyId, std::integral_constant< int, │ │ │ │ │ -dim >, │ │ │ │ │ -795 CornerIterator &cit, const _c_t_y_p_e &df, const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &x, │ │ │ │ │ -796 const _c_t_y_p_e &rf, FieldMatrix< ctype, rows, cdim > &jt ) │ │ │ │ │ -797 { │ │ │ │ │ -798 assert( rows >= dim ); │ │ │ │ │ -799 │ │ │ │ │ -800 const _c_t_y_p_e xn = df*x[ dim-1 ]; │ │ │ │ │ -801 const _c_t_y_p_e cxn = _c_t_y_p_e( 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 _c_t_y_p_e dfcxn = (cxn > Traits::tolerance() || cxn < -Traits::tolerance()) ? │ │ │ │ │ -_c_t_y_p_e(df / cxn) : _c_t_y_p_e(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< _c_t_y_p_e, 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 _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_<_ _c_t_,_ _m_y_d_i_m_,_ _c_d_i_m_,_ _T_r_a_i_t_s_ _> │ │ │ │ │ -_8_9_6_ _:_:_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d ( _T_o_p_o_l_o_g_y_I_d, std::integral_constant< int, 0 >, │ │ │ │ │ -897 CornerIterator &cit, const _c_t_y_p_e &, const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &, │ │ │ │ │ -898 const _c_t_y_p_e &, 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 _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_<_ _c_t_,_ _m_y_d_i_m_,_ _c_d_i_m_,_ _T_r_a_i_t_s_ _> │ │ │ │ │ -_9_0_8_ _:_:_a_f_f_i_n_e ( _T_o_p_o_l_o_g_y_I_d topologyId, std::integral_constant< int, dim >, │ │ │ │ │ -CornerIterator &cit, _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d &jt ) │ │ │ │ │ -909 { │ │ │ │ │ -910 const _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e &orgBottom = *cit; │ │ │ │ │ -911 if( !affine( topologyId, std::integral_constant< int, dim-1 >(), cit, jt ) │ │ │ │ │ -) │ │ │ │ │ -912 return false; │ │ │ │ │ -913 const _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e &orgTop = *cit; │ │ │ │ │ -914 │ │ │ │ │ -915 if( Impl::isPrism( toUnsignedInt(topologyId), mydimension, mydimension-dim │ │ │ │ │ -) ) │ │ │ │ │ -916 { │ │ │ │ │ -917 _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d 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 _c_t_y_p_e 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 _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_<_ _c_t_,_ _m_y_d_i_m_,_ _c_d_i_m_,_ _T_r_a_i_t_s_ _> │ │ │ │ │ -_9_3_7_ _:_:_a_f_f_i_n_e ( _T_o_p_o_l_o_g_y_I_d, std::integral_constant< int, 0 >, CornerIterator │ │ │ │ │ -&cit, _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d & ) │ │ │ │ │ -938 { │ │ │ │ │ -939 ++cit; │ │ │ │ │ -940 return true; │ │ │ │ │ -941 } │ │ │ │ │ -942 │ │ │ │ │ -943} // namespace Dune │ │ │ │ │ -944 │ │ │ │ │ -945#endif // #ifndef DUNE_GEOMETRY_MULTILINEARGEOMETRY_HH │ │ │ │ │ -_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h │ │ │ │ │ -_a_f_f_i_n_e_g_e_o_m_e_t_r_y_._h_h │ │ │ │ │ -An implementation of the Geometry interface for affine geometries. │ │ │ │ │ +412 } // namespace RefinementImp │ │ │ │ │ +413} // namespace Dune │ │ │ │ │ +414 │ │ │ │ │ +415#endif // DUNE_GEOMETRY_REFINEMENT_PYRAMIDTRIANGULATION_CC │ │ │ │ │ +_b_a_s_e_._c_c │ │ │ │ │ +This file contains the parts independent of a particular Refinement │ │ │ │ │ +implementation. │ │ │ │ │ +_s_i_m_p_l_e_x_._c_c │ │ │ │ │ +This file contains the Refinement implementation for simplices (triangles, │ │ │ │ │ +tetrahedrons.... │ │ │ │ │ _t_y_p_e_._h_h │ │ │ │ │ A unique label for each type of element that can occur in a grid. │ │ │ │ │ +_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h │ │ │ │ │ +_s_t_d │ │ │ │ │ +STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn affinegeometry.hh:21 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s │ │ │ │ │ -Class providing access to the singletons of the reference elements. │ │ │ │ │ -DDeeffiinniittiioonn referenceelements.hh:128 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ -typename Container::ReferenceElement ReferenceElement │ │ │ │ │ -The reference element type. │ │ │ │ │ -DDeeffiinniittiioonn referenceelements.hh:146 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_T_r_a_i_t_s │ │ │ │ │ -default traits class for MultiLinearGeometry │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:39 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_T_r_a_i_t_s_:_:_M_a_t_r_i_x_H_e_l_p_e_r │ │ │ │ │ -Impl::FieldMatrixHelper< ct > MatrixHelper │ │ │ │ │ -helper structure containing some matrix routines │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:58 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_T_r_a_i_t_s_:_:_t_o_l_e_r_a_n_c_e │ │ │ │ │ -static ct tolerance() │ │ │ │ │ -tolerance to numerical algorithms │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_T_r_a_i_t_s_:_:_C_o_r_n_e_r_S_t_o_r_a_g_e │ │ │ │ │ -template specifying the storage for the corners │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:129 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_T_r_a_i_t_s_:_:_C_o_r_n_e_r_S_t_o_r_a_g_e_:_:_T_y_p_e │ │ │ │ │ -std::vector< FieldVector< ct, cdim > > Type │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:130 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_T_r_a_i_t_s_:_:_h_a_s_S_i_n_g_l_e_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ -will there be only one geometry type for a dimension? │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:148 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_T_r_a_i_t_s_:_:_h_a_s_S_i_n_g_l_e_G_e_o_m_e_t_r_y_T_y_p_e_:_:_t_o_p_o_l_o_g_y_I_d │ │ │ │ │ -static const unsigned int topologyId │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:150 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_T_r_a_i_t_s_:_:_h_a_s_S_i_n_g_l_e_G_e_o_m_e_t_r_y_T_y_p_e_:_:_v │ │ │ │ │ -static const bool v │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:149 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_t_r_a_n_s_f_o_r_m_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ +FieldVector< CoordType, dimension > transformCoordinate(FieldVector< CoordType, │ │ │ │ │ +dimension > point) │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:51 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_g_e_t_P_e_r_m_u_t_a_t_i_o_n │ │ │ │ │ +FieldVector< int, n > getPermutation(int m) │ │ │ │ │ +Calculate permutation from it's index. │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:293 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_r_e_f_e_r_e_n_c_e_T_o_K_u_h_n │ │ │ │ │ +FieldVector< CoordType, dimension > referenceToKuhn(FieldVector< CoordType, │ │ │ │ │ +dimension > point, const FieldVector< int, dimension > &kuhn) │ │ │ │ │ +Map from the reference simplex to some Kuhn simplex. │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:322 │ │ │ │ │ +_D_u_n_e_:_:_C_o_d_i_m │ │ │ │ │ +Static tag representing a codimension. │ │ │ │ │ +DDeeffiinniittiioonn dimension.hh:24 │ │ │ │ │ _D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y │ │ │ │ │ generic geometry implementation based on corner coordinates │ │ │ │ │ DDeeffiinniittiioonn multilineargeometry.hh:181 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_g_l_o_b_a_l │ │ │ │ │ -static void global(TopologyId topologyId, std::integral_constant< int, dim >, │ │ │ │ │ -CornerIterator &cit, const ctype &df, const LocalCoordinate &x, const ctype │ │ │ │ │ -&rf, GlobalCoordinate &y) │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:749 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_m_y_d_i_m_e_n_s_i_o_n │ │ │ │ │ -static const int mydimension │ │ │ │ │ -geometry dimension │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:189 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_t_y_p_e │ │ │ │ │ -Dune::GeometryType type() const │ │ │ │ │ -obtain the name of the reference element │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:269 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_M_a_t_r_i_x_H_e_l_p_e_r │ │ │ │ │ -Traits::MatrixHelper MatrixHelper │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:225 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ -FieldVector< ctype, coorddimension > GlobalCoordinate │ │ │ │ │ -type of global coordinates │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:196 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -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) │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:896 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const │ │ │ │ │ -obtain the transposed of the Jacobian │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:377 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_r_e_f_E_l_e_m_e_n_t │ │ │ │ │ -ReferenceElement refElement() const │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:425 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_g_l_o_b_a_l │ │ │ │ │ -GlobalCoordinate global(const LocalCoordinate &local) const │ │ │ │ │ -evaluate the mapping │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:290 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_c_e_n_t_e_r │ │ │ │ │ -GlobalCoordinate center() const │ │ │ │ │ -obtain the centroid of the mapping's image │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:282 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_c_o_r_n_e_r │ │ │ │ │ -GlobalCoordinate corner(int i) const │ │ │ │ │ -obtain coordinates of the i-th corner │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:275 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s │ │ │ │ │ -Dune::ReferenceElements< ctype, mydimension > ReferenceElements │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:214 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_c_t_y_p_e │ │ │ │ │ -ct ctype │ │ │ │ │ -coordinate type │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:186 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -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) │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:794 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_c_o_o_r_d_d_i_m_e_n_s_i_o_n │ │ │ │ │ -static const int coorddimension │ │ │ │ │ -coordinate dimension │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:191 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_c_o_r_n_e_r_s │ │ │ │ │ -int corners() const │ │ │ │ │ -obtain number of corners of the corresponding reference element │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:272 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_t_o_p_o_l_o_g_y_I_d │ │ │ │ │ -TopologyId topologyId() const │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:430 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ -friend ReferenceElement referenceElement(const MultiLinearGeometry &geometry) │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:395 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_l_o_c_a_l │ │ │ │ │ -LocalCoordinate local(const GlobalCoordinate &globalCoord) const │ │ │ │ │ -evaluate the inverse mapping │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:312 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_g_l_o_b_a_l │ │ │ │ │ -static void global(TopologyId topologyId, std::integral_constant< int, 0 >, │ │ │ │ │ -CornerIterator &cit, const ctype &df, const LocalCoordinate &x, const ctype │ │ │ │ │ -&rf, GlobalCoordinate &y) │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:780 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_v_o_l_u_m_e │ │ │ │ │ -Volume volume() const │ │ │ │ │ -obtain the volume of the mapping's image │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:363 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ -FieldVector< ctype, mydimension > LocalCoordinate │ │ │ │ │ -type of local coordinates │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:194 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y │ │ │ │ │ -MultiLinearGeometry(const ReferenceElement &refElement, const Corners &corners) │ │ │ │ │ -constructor │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:239 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_a_f_f_i_n_e │ │ │ │ │ -static bool affine(TopologyId topologyId, std::integral_constant< int, 0 >, │ │ │ │ │ -CornerIterator &cit, JacobianTransposed &jt) │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:937 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_T_o_p_o_l_o_g_y_I_d │ │ │ │ │ -std::conditional< hasSingleGeometryType, std::integral_constant< unsignedint, │ │ │ │ │ -Traits::templatehasSingleGeometryType< mydimension >::topologyId >, unsignedint │ │ │ │ │ ->::type TopologyId │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:226 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_V_o_l_u_m_e │ │ │ │ │ -ctype Volume │ │ │ │ │ -type of volume │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:198 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_a_f_f_i_n_e │ │ │ │ │ -static bool affine(TopologyId topologyId, std::integral_constant< int, dim >, │ │ │ │ │ -CornerIterator &cit, JacobianTransposed &jt) │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:908 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e │ │ │ │ │ -JacobianInverse jacobianInverse(const LocalCoordinate &local) const │ │ │ │ │ -Obtain the Jacobian's inverse. │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:418 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y │ │ │ │ │ -MultiLinearGeometry(Dune::GeometryType gt, const Corners &corners) │ │ │ │ │ -constructor │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:255 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed │ │ │ │ │ -type of jacobian transposed │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:201 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ -ReferenceElements::ReferenceElement ReferenceElement │ │ │ │ │ -type of reference element │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:219 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate │ │ │ │ │ -&local) const │ │ │ │ │ -obtain the transposed of the Jacobian's inverse │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:738 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n │ │ │ │ │ -FieldMatrix< ctype, coorddimension, mydimension > Jacobian │ │ │ │ │ -Type for the Jacobian matrix. │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:207 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_a_f_f_i_n_e │ │ │ │ │ -bool affine() const │ │ │ │ │ -is this mapping affine? │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:262 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e │ │ │ │ │ -FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse │ │ │ │ │ -Type for the inverse Jacobian matrix. │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:210 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_a_f_f_i_n_e │ │ │ │ │ -bool affine(JacobianTransposed &jacobianT) const │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:458 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t │ │ │ │ │ -Volume integrationElement(const LocalCoordinate &local) const │ │ │ │ │ -obtain the integration element │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:350 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n │ │ │ │ │ -Jacobian jacobian(const LocalCoordinate &local) const │ │ │ │ │ -Obtain the Jacobian. │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:407 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:488 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d_:_:_s_e_t_u_p │ │ │ │ │ -void setup(const JacobianTransposed &jt) │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:492 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d_:_:_d_e_t │ │ │ │ │ -ctype det() const │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:502 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d_:_:_d_e_t_I_n_v │ │ │ │ │ -ctype detInv() const │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:503 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d_:_:_s_e_t_u_p_D_e_t_e_r_m_i_n_a_n_t │ │ │ │ │ -void setupDeterminant(const JacobianTransposed &jt) │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:497 │ │ │ │ │ -_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y │ │ │ │ │ -Implement a MultiLinearGeometry with additional caching. │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:526 │ │ │ │ │ -_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_g_l_o_b_a_l │ │ │ │ │ -GlobalCoordinate global(const LocalCoordinate &local) const │ │ │ │ │ -evaluate the mapping │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:580 │ │ │ │ │ -_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ -Base::ReferenceElement ReferenceElement │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:534 │ │ │ │ │ -_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_a_f_f_i_n_e │ │ │ │ │ -bool affine() const │ │ │ │ │ -is this mapping affine? │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:567 │ │ │ │ │ -_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y │ │ │ │ │ -CachedMultiLinearGeometry(const ReferenceElement &referenceElement, const │ │ │ │ │ -CornerStorage &cornerStorage) │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:551 │ │ │ │ │ -_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_r_e_f_E_l_e_m_e_n_t │ │ │ │ │ -ReferenceElement refElement() const │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:425 │ │ │ │ │ -_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_l_o_c_a_l │ │ │ │ │ -LocalCoordinate local(const GlobalCoordinate &global) const │ │ │ │ │ -evaluate the inverse mapping │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:604 │ │ │ │ │ -_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_M_a_t_r_i_x_H_e_l_p_e_r │ │ │ │ │ -Base::MatrixHelper MatrixHelper │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:531 │ │ │ │ │ -_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ -Base::LocalCoordinate LocalCoordinate │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:541 │ │ │ │ │ -_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e │ │ │ │ │ -JacobianInverse jacobianInverse(const LocalCoordinate &local) const │ │ │ │ │ -Obtain the Jacobian's inverse. │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:713 │ │ │ │ │ -_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const │ │ │ │ │ -obtain the transposed of the Jacobian │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:666 │ │ │ │ │ -_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_c_o_r_n_e_r │ │ │ │ │ -GlobalCoordinate corner(int i) const │ │ │ │ │ -obtain coordinates of the i-th corner │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:275 │ │ │ │ │ -_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_v_o_l_u_m_e │ │ │ │ │ -Volume volume() const │ │ │ │ │ -obtain the volume of the mapping's image │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:649 │ │ │ │ │ -_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y │ │ │ │ │ -CachedMultiLinearGeometry(Dune::GeometryType gt, const CornerStorage │ │ │ │ │ -&cornerStorage) │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:559 │ │ │ │ │ -_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t │ │ │ │ │ -ctype integrationElement(const LocalCoordinate &local) const │ │ │ │ │ -obtain the integration element │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:633 │ │ │ │ │ -_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_c_t_y_p_e │ │ │ │ │ -Base::ctype ctype │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:536 │ │ │ │ │ -_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n │ │ │ │ │ -Jacobian jacobian(const LocalCoordinate &local) const │ │ │ │ │ -Obtain the Jacobian. │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:702 │ │ │ │ │ -_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -Base::JacobianInverseTransposed JacobianInverseTransposed │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:546 │ │ │ │ │ -_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -Base::JacobianTransposed JacobianTransposed │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:545 │ │ │ │ │ -_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e │ │ │ │ │ -Base::JacobianInverse JacobianInverse │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:548 │ │ │ │ │ -_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n │ │ │ │ │ -Base::Jacobian Jacobian │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:547 │ │ │ │ │ -_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_V_o_l_u_m_e │ │ │ │ │ -Base::Volume Volume │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:543 │ │ │ │ │ -_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ -Base::GlobalCoordinate GlobalCoordinate │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:542 │ │ │ │ │ -_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_c_e_n_t_e_r │ │ │ │ │ -GlobalCoordinate center() const │ │ │ │ │ -obtain the centroid of the mapping's image │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:572 │ │ │ │ │ -_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate │ │ │ │ │ -&local) const │ │ │ │ │ -obtain the transposed of the Jacobian's inverse │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:680 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ -Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:114 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:43 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ +Implementation of the refinement of a pyramid into simplices. │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:68 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +FieldVector< CoordType, dimension > CoordVector │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:77 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_n_V_e_r_t_i_c_e_s │ │ │ │ │ +static int nVertices(int nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:109 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_n_E_l_e_m_e_n_t_s │ │ │ │ │ +static int nElements(int nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:133 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_c_t_y_p_e │ │ │ │ │ +CoordType ctype │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:72 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ +Codim< dimension >::SubEntityIterator VertexIterator │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:76 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ +Codim< 0 >::SubEntityIterator ElementIterator │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:78 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ +static constexpr int dimension │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:70 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_e_B_e_g_i_n │ │ │ │ │ +static ElementIterator eBegin(int nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:141 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_e_E_n_d │ │ │ │ │ +static ElementIterator eEnd(int nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:149 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ +FieldVector< int, dimension+1 > IndexVector │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:79 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_v_B_e_g_i_n │ │ │ │ │ +static VertexIterator vBegin(int nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:117 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_v_E_n_d │ │ │ │ │ +static VertexIterator vEnd(int nIntervals) │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:125 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:101 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ +Dune::MultiLinearGeometry< CoordType, dimension-codimension, dimension > │ │ │ │ │ +Geometry │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:103 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:164 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ +Refinement::template Codim< dimension >::Geometry Geometry │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:166 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +Refinement::BackendRefinement BackendRefinement │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:178 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_b_a_c_k_e_n_d │ │ │ │ │ +BackendIterator backend │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:185 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_B_a_c_k_e_n_d_I_t_e_r_a_t_o_r │ │ │ │ │ +BackendRefinement::template Codim< dimension >::SubEntityIterator │ │ │ │ │ +BackendIterator │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:179 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_k_u_h_n_I_n_d_e_x │ │ │ │ │ +int kuhnIndex │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:184 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +Refinement::CoordVector CoordVector │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:165 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_b_a_c_k_e_n_d_E_n_d │ │ │ │ │ +const BackendIterator backendEnd │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:186 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_n_I_n_t_e_r_v_a_l_s__ │ │ │ │ │ +int nIntervals_ │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:182 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_b_a_c_k_e_n_d_E_n_d │ │ │ │ │ +const BackendIterator backendEnd │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:271 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +Refinement::CoordVector CoordVector │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:246 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_n_I_n_t_e_r_v_a_l_s__ │ │ │ │ │ +int nIntervals_ │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:267 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ +Refinement::template Codim< 0 >::Geometry Geometry │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:247 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ +Refinement::IndexVector IndexVector │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:245 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_B_a_c_k_e_n_d_I_t_e_r_a_t_o_r │ │ │ │ │ +BackendRefinement::template Codim< 0 >::SubEntityIterator BackendIterator │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:264 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_k_u_h_n_I_n_d_e_x │ │ │ │ │ +int kuhnIndex │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:269 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_b_a_c_k_e_n_d │ │ │ │ │ +BackendIterator backend │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:270 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:244 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +Refinement::BackendRefinement BackendRefinement │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:263 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n │ │ │ │ │ +_>_:_:_e_q_u_a_l_s │ │ │ │ │ +bool equals(const This &other) const │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n │ │ │ │ │ +_>_:_:_T_h_i_s │ │ │ │ │ +SubEntityIterator This │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:360 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n │ │ │ │ │ +_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ +SubEntityIterator(int nIntervals, bool end=false) │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n │ │ │ │ │ +_>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ +DDeeffiinniittiioonn pyramidtriangulation.cc:359 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ +DDeeffiinniittiioonn simplex.cc:361 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00206.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: hcubetriangulation.cc File Reference │ │ │ │ +dune-geometry: referenceelement.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,82 +65,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::RefinementImp::HCubeTriangulation::RefinementIteratorSpecial< dimension, CoordType, dimension >
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, 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 {} │ │ │ │ │ @@ -1,55 +1,25 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ - * _r_e_f_i_n_e_m_e_n_t │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s │ │ │ │ │ -hcubetriangulation.cc File Reference │ │ │ │ │ -This file contains the _R_e_f_i_n_e_m_e_n_t implementation for triangulating hypercubes │ │ │ │ │ -(quadrilateral -> triangle, hexahedron -> tetrahedron) _M_o_r_e_._._. │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +referenceelement.hh File Reference │ │ │ │ │ #include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ -#include "_b_a_s_e_._c_c" │ │ │ │ │ -#include "_s_i_m_p_l_e_x_._c_c" │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ - class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___, │ │ │ │ │ - _C_o_o_r_d_T_y_p_e_ _> │ │ │ │ │ + class   _D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_<_ _I_m_p_l_e_m_e_n_t_a_t_i_o_n_ _> │ │ │ │ │ +  This class provides access to geometric and topological properties of │ │ │ │ │ + a reference element. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___, │ │ │ │ │ - _C_o_o_r_d_T_y_p_e_ _>_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ - _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ - _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___, │ │ │ │ │ - _C_o_o_r_d_T_y_p_e_ _>_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_<_ _I_m_p_l_e_m_e_n_t_a_t_i_o_n_ _>_:_:_C_o_d_i_m_<_ _c_o_d_i_m_ _> │ │ │ │ │ +  Collection of types depending on the codimension. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ -  This namespace contains the implementation of _R_e_f_i_n_e_m_e_n_t. │ │ │ │ │ -  │ │ │ │ │ -namespace   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n │ │ │ │ │ - This namespace contains the _R_e_f_i_n_e_m_e_n_t implementation for │ │ │ │ │ -  triangulating hypercubes (_G_e_o_m_e_t_r_y_T_y_p_e_:_:_c_u_b_e -> _G_e_o_m_e_t_r_y_T_y_p_e_:_: │ │ │ │ │ - _s_i_m_p_l_e_x) │ │ │ │ │ -  │ │ │ │ │ -MMaaccrrooss │ │ │ │ │ -#define  _D_U_N_E___G_E_O_M_E_T_R_Y___R_E_F_I_N_E_M_E_N_T___H_C_U_B_E_T_R_I_A_N_G_U_L_A_T_I_O_N___C_C │ │ │ │ │ +namespace   _D_u_n_e_:_:_G_e_o │ │ │ │ │   │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -This file contains the _R_e_f_i_n_e_m_e_n_t implementation for triangulating hypercubes │ │ │ │ │ -(quadrilateral -> triangle, hexahedron -> tetrahedron) │ │ │ │ │ -See _R_e_f_i_n_e_m_e_n_t_ _i_m_p_l_e_m_e_n_t_a_t_i_o_n_ _f_o_r_ _t_r_i_a_n_g_u_l_a_t_i_n_g_ _h_y_p_e_r_c_u_b_e_s. │ │ │ │ │ -********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ -********** _?◆_? DDUUNNEE__GGEEOOMMEETTRRYY__RREEFFIINNEEMMEENNTT__HHCCUUBBEETTRRIIAANNGGUULLAATTIIOONN__CCCC ********** │ │ │ │ │ -#define DUNE_GEOMETRY_REFINEMENT_HCUBETRIANGULATION_CC │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00206_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: hcubetriangulation.cc Source File │ │ │ │ +dune-geometry: referenceelement.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,509 +70,265 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
hcubetriangulation.cc
│ │ │ │ +
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 © 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_HCUBETRIANGULATION_CC
│ │ │ │ -
6#define DUNE_GEOMETRY_REFINEMENT_HCUBETRIANGULATION_CC
│ │ │ │ +
5#ifndef DUNE_GEOMETRY_REFERENCEELEMENT_HH
│ │ │ │ +
6#define DUNE_GEOMETRY_REFERENCEELEMENT_HH
│ │ │ │
7
│ │ │ │ - │ │ │ │ -
30#include <dune/geometry/type.hh>
│ │ │ │ + │ │ │ │ +
9
│ │ │ │ +
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
│ │ │ │ +
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
│ │ │ │ -
32#include "base.cc"
│ │ │ │ -
33#include "simplex.cc"
│ │ │ │ -
34
│ │ │ │ -
35namespace Dune
│ │ │ │ -
36{
│ │ │ │ -
37 namespace RefinementImp
│ │ │ │ -
38 {
│ │ │ │ -
│ │ │ │ -
46 namespace HCubeTriangulation {
│ │ │ │ -
47
│ │ │ │ -
48 // ////////////
│ │ │ │ -
49 //
│ │ │ │ -
50 // Utilities
│ │ │ │ -
51 //
│ │ │ │ -
52
│ │ │ │ - │ │ │ │ - │ │ │ │ +
50 template<typename Implementation>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
52 {
│ │ │ │ +
53
│ │ │ │ +
54 public:
│ │ │ │
55
│ │ │ │ -
56 // ////////////////////////////////////
│ │ │ │ -
57 //
│ │ │ │ -
58 // Refine a hypercube with simplices
│ │ │ │ -
59 //
│ │ │ │ -
60
│ │ │ │ -
61 // forward declaration of the iterator base
│ │ │ │ -
62 template<int dimension, class CoordType, int codimension>
│ │ │ │ - │ │ │ │ -
64
│ │ │ │ -
65 template<int dimension_, class CoordType>
│ │ │ │ +
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 {
│ │ │ │ -
68 public:
│ │ │ │ -
69 constexpr static int dimension = dimension_;
│ │ │ │ -
70
│ │ │ │ -
71 typedef CoordType ctype;
│ │ │ │ -
72
│ │ │ │ -
73 template<int codimension>
│ │ │ │ -
74 struct Codim;
│ │ │ │ - │ │ │ │ -
76 typedef FieldVector<CoordType, dimension> CoordVector;
│ │ │ │ - │ │ │ │ -
78 typedef FieldVector<int, dimension+1> IndexVector;
│ │ │ │ +
69 using Geometry = implementation-defined;
│ │ │ │ +
70 };
│ │ │ │ +
│ │ │ │ +
71
│ │ │ │ +
72#endif // DOXYGEN
│ │ │ │ +
73
│ │ │ │ +
75 using ctype = typename Implementation::ctype;
│ │ │ │ +
76
│ │ │ │ + │ │ │ │
79
│ │ │ │ -
80 static int nVertices(int nIntervals);
│ │ │ │ -
81 static VertexIterator vBegin(int nIntervals);
│ │ │ │ -
82 static VertexIterator vEnd(int nIntervals);
│ │ │ │ -
83
│ │ │ │ -
84 static int nElements(int nIntervals);
│ │ │ │ -
85 static ElementIterator eBegin(int nIntervals);
│ │ │ │ -
86 static ElementIterator eEnd(int nIntervals);
│ │ │ │ -
87 private:
│ │ │ │ -
88 friend class RefinementIteratorSpecial<dimension, CoordType, 0>;
│ │ │ │ -
89 friend class RefinementIteratorSpecial<dimension, CoordType, dimension>;
│ │ │ │ -
90
│ │ │ │ - │ │ │ │ -
92 };
│ │ │ │ -
│ │ │ │ -
93
│ │ │ │ -
94 template<int dimension, class CoordType>
│ │ │ │ -
95 template<int codimension>
│ │ │ │ -
│ │ │ │ -
96 struct RefinementImp<dimension, CoordType>::Codim
│ │ │ │ -
97 {
│ │ │ │ -
98 class SubEntityIterator;
│ │ │ │ -
99 typedef Dune::MultiLinearGeometry<CoordType,dimension-codimension,dimension> Geometry;
│ │ │ │ -
100 };
│ │ │ │ -
│ │ │ │ -
101
│ │ │ │ -
102 template<int dimension, class CoordType>
│ │ │ │ -
103 int
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
105 nVertices(int nIntervals)
│ │ │ │ -
106 {
│ │ │ │ -
107 return BackendRefinement::nVertices(nIntervals) * factorial(int(dimension));
│ │ │ │ -
108 }
│ │ │ │ -
│ │ │ │ -
109
│ │ │ │ -
110 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
113 vBegin(int nIntervals)
│ │ │ │ -
114 {
│ │ │ │ -
115 return VertexIterator(nIntervals);
│ │ │ │ -
116 }
│ │ │ │ -
│ │ │ │ -
117
│ │ │ │ -
118 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
121 vEnd(int nIntervals)
│ │ │ │ -
122 {
│ │ │ │ -
123 return VertexIterator(nIntervals, true);
│ │ │ │ -
124 }
│ │ │ │ -
│ │ │ │ -
125
│ │ │ │ -
126 template<int dimension, class CoordType>
│ │ │ │ -
127 int
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
129 nElements(int nIntervals)
│ │ │ │ -
130 {
│ │ │ │ -
131 return BackendRefinement::nElements(nIntervals) * factorial(int(dimension));
│ │ │ │ -
132 }
│ │ │ │ -
│ │ │ │ -
133
│ │ │ │ -
134 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
137 eBegin(int nIntervals)
│ │ │ │ -
138 {
│ │ │ │ -
139 return ElementIterator(nIntervals);
│ │ │ │ -
140 }
│ │ │ │ -
│ │ │ │ -
141
│ │ │ │ -
142 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
145 eEnd(int nIntervals)
│ │ │ │ -
146 {
│ │ │ │ -
147 return ElementIterator(nIntervals, true);
│ │ │ │ -
148 }
│ │ │ │ -
│ │ │ │ -
149
│ │ │ │ -
150 // //////////////
│ │ │ │ -
151 //
│ │ │ │ -
152 // The iterator
│ │ │ │ -
153 //
│ │ │ │ -
154
│ │ │ │ -
155 // vertices
│ │ │ │ -
156 template<int dimension, class CoordType>
│ │ │ │ -
│ │ │ │ -
157 class RefinementIteratorSpecial<dimension, CoordType, dimension>
│ │ │ │ -
158 {
│ │ │ │ -
159 public:
│ │ │ │ - │ │ │ │ -
161 typedef typename Refinement::CoordVector CoordVector;
│ │ │ │ -
162 typedef typename Refinement::template Codim<dimension>::Geometry Geometry;
│ │ │ │ -
163
│ │ │ │ -
164 RefinementIteratorSpecial(int nIntervals, bool end = false);
│ │ │ │ -
165
│ │ │ │ -
166 void increment();
│ │ │ │ -
167
│ │ │ │ -
168 CoordVector coords() const;
│ │ │ │ -
169
│ │ │ │ -
170 Geometry geometry() const;
│ │ │ │ +
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
│ │ │ │ +
│ │ │ │ +
167 GeometryType type(int i, int c) const
│ │ │ │ +
168 {
│ │ │ │ +
169 return _impl->type(i,c);
│ │ │ │ +
170 }
│ │ │ │ +
│ │ │ │
171
│ │ │ │ -
172 int index() const;
│ │ │ │ -
173 protected:
│ │ │ │ -
174 typedef typename Refinement::BackendRefinement BackendRefinement;
│ │ │ │ -
175 typedef typename BackendRefinement::template Codim<dimension>::SubEntityIterator BackendIterator;
│ │ │ │ -
176 constexpr static int nKuhnSimplices = factorial(int(dimension));
│ │ │ │ -
177
│ │ │ │ - │ │ │ │ +
172
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
176 {
│ │ │ │ +
177 return _impl->type();
│ │ │ │ +
178 }
│ │ │ │ +
│ │ │ │
179
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
183 };
│ │ │ │ -
│ │ │ │ -
184
│ │ │ │ -
185 template<int dimension, class CoordType>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
187 RefinementIteratorSpecial(int nIntervals, bool end)
│ │ │ │ -
188 : nIntervals_(nIntervals), kuhnIndex(0),
│ │ │ │ -
189 backend(BackendRefinement::vBegin(nIntervals_)),
│ │ │ │ -
190 backendEnd(BackendRefinement::vEnd(nIntervals_))
│ │ │ │ -
191 {
│ │ │ │ -
192 if (end)
│ │ │ │ -
193 kuhnIndex = nKuhnSimplices;
│ │ │ │ -
194 }
│ │ │ │ +
180
│ │ │ │ +
│ │ │ │ +
190 Coordinate position(int i, int c) const
│ │ │ │ +
191 {
│ │ │ │ +
192 return _impl->position(i,c);
│ │ │ │ +
193 }
│ │ │ │
│ │ │ │ +
194
│ │ │ │
195
│ │ │ │ -
196 template<int dimension, class CoordType>
│ │ │ │ -
197 void
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
200 {
│ │ │ │ -
201 ++backend;
│ │ │ │ -
202 if (backend == backendEnd)
│ │ │ │ -
203 {
│ │ │ │ -
204 backend = BackendRefinement::vBegin(nIntervals_);
│ │ │ │ -
205 ++kuhnIndex;
│ │ │ │ -
206 }
│ │ │ │ -
207 }
│ │ │ │ +
│ │ │ │ +
203 bool checkInside(const Coordinate& local) const
│ │ │ │ +
204 {
│ │ │ │ +
205 return _impl->checkInside(local);
│ │ │ │ +
206 }
│ │ │ │
│ │ │ │ +
207
│ │ │ │
208
│ │ │ │ -
209 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
212 coords() const
│ │ │ │ -
213 {
│ │ │ │ -
214 return referenceToKuhn(backend.coords(), getPermutation<dimension>(kuhnIndex));
│ │ │ │ -
215 }
│ │ │ │ -
│ │ │ │ -
216
│ │ │ │ -
217 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
220 {
│ │ │ │ -
221 std::vector<CoordVector> corners(1);
│ │ │ │ -
222 corners[0] = referenceToKuhn(backend.coords(), getPermutation<dimension>(kuhnIndex));
│ │ │ │ -
223 return Geometry(GeometryTypes::vertex, corners);
│ │ │ │ +
220 template<int codim>
│ │ │ │ +
│ │ │ │ +
221 typename Codim<codim>::Geometry geometry(int i) const
│ │ │ │ +
222 {
│ │ │ │ +
223 return _impl->template geometry<codim>(i);
│ │ │ │
224 }
│ │ │ │
│ │ │ │
225
│ │ │ │ -
226 template<int dimension, class CoordType>
│ │ │ │ -
227 int
│ │ │ │ +
226
│ │ │ │
│ │ │ │ - │ │ │ │ -
229 index() const
│ │ │ │ -
230 {
│ │ │ │ -
231 return kuhnIndex*BackendRefinement::nVertices(nIntervals_) + backend.index();
│ │ │ │ -
232 }
│ │ │ │ + │ │ │ │ +
229 {
│ │ │ │ +
230 return _impl->volume();
│ │ │ │ +
231 }
│ │ │ │
│ │ │ │ +
232
│ │ │ │
233
│ │ │ │ -
234 // elements
│ │ │ │ -
235 template<int dimension, class CoordType>
│ │ │ │ -
│ │ │ │ -
236 class RefinementIteratorSpecial<dimension, CoordType, 0>
│ │ │ │ -
237 {
│ │ │ │ -
238 public:
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
242 typedef typename Refinement::template Codim<0>::Geometry Geometry;
│ │ │ │ -
243
│ │ │ │ -
244 RefinementIteratorSpecial(int nIntervals_, bool end = false);
│ │ │ │ - │ │ │ │ +
│ │ │ │ + │ │ │ │ +
242 {
│ │ │ │ +
243 return _impl->integrationOuterNormal(face);
│ │ │ │ +
244 }
│ │ │ │ +
│ │ │ │ +
245
│ │ │ │
246
│ │ │ │ -
247 void increment();
│ │ │ │ -
248
│ │ │ │ -
249 IndexVector vertexIndices() const;
│ │ │ │ -
250 int index() const;
│ │ │ │ -
251 CoordVector coords() const;
│ │ │ │ -
252
│ │ │ │ -
253 Geometry geometry() const;
│ │ │ │ -
254
│ │ │ │ -
255 private:
│ │ │ │ -
256 CoordVector global(const CoordVector &local) const;
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
255 : _impl(nullptr)
│ │ │ │ +
256 {}
│ │ │ │ +
│ │ │ │
257
│ │ │ │ -
258 protected:
│ │ │ │ - │ │ │ │ -
260 typedef typename BackendRefinement::template Codim<0>::SubEntityIterator BackendIterator;
│ │ │ │ -
261 constexpr static int nKuhnSimplices = factorial(dimension);
│ │ │ │ -
262
│ │ │ │ - │ │ │ │ -
264
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
268 };
│ │ │ │ -
│ │ │ │ -
269
│ │ │ │ -
270 template<int dimension, class CoordType>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
272 RefinementIteratorSpecial(int nIntervals, bool end)
│ │ │ │ -
273 : nIntervals_(nIntervals), kuhnIndex(0),
│ │ │ │ -
274 backend(BackendRefinement::eBegin(nIntervals_)),
│ │ │ │ -
275 backendEnd(BackendRefinement::eEnd(nIntervals_))
│ │ │ │ -
276 {
│ │ │ │ -
277 if (end)
│ │ │ │ -
278 kuhnIndex = nKuhnSimplices;
│ │ │ │ -
279 }
│ │ │ │ -
│ │ │ │ -
280 template<int dimension, class CoordType>
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
283 : nIntervals_(other.nIntervals_), kuhnIndex(other.kuhnIndex),
│ │ │ │ -
284 backend(other.backend),
│ │ │ │ -
285 backendEnd(other.backendEnd)
│ │ │ │ -
286 {}
│ │ │ │ +
│ │ │ │ +
263 const Implementation& impl() const
│ │ │ │ +
264 {
│ │ │ │ +
265 return *_impl;
│ │ │ │ +
266 }
│ │ │ │ +
│ │ │ │ +
267
│ │ │ │ +
│ │ │ │ +
269 bool operator==(const ReferenceElement& r) const
│ │ │ │ +
270 {
│ │ │ │ +
271 return _impl == r._impl;
│ │ │ │ +
272 }
│ │ │ │ +
│ │ │ │ +
273
│ │ │ │ +
│ │ │ │ +
275 bool operator!=(const ReferenceElement& r) const
│ │ │ │ +
276 {
│ │ │ │ +
277 return not (*this == r);
│ │ │ │ +
278 }
│ │ │ │ +
│ │ │ │ +
279
│ │ │ │ +
│ │ │ │ +
281 friend std::size_t hash_value(const ReferenceElement& r)
│ │ │ │ +
282 {
│ │ │ │ +
283 return reinterpret_cast<std::size_t>(r._impl);
│ │ │ │ +
284 }
│ │ │ │
│ │ │ │ +
285
│ │ │ │ +
286 private:
│ │ │ │
287
│ │ │ │ -
288 template<int dimension, class CoordType>
│ │ │ │ -
289 void
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
292 {
│ │ │ │ -
293 ++backend;
│ │ │ │ -
294 if (backend == backendEnd)
│ │ │ │ -
295 {
│ │ │ │ -
296 backend = BackendRefinement::eBegin(nIntervals_);
│ │ │ │ -
297 ++kuhnIndex;
│ │ │ │ -
298 }
│ │ │ │ -
299 }
│ │ │ │ -
│ │ │ │ -
300
│ │ │ │ -
301 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
304 vertexIndices() const
│ │ │ │ -
305 {
│ │ │ │ -
306 IndexVector indices = backend.vertexIndices();
│ │ │ │ +
288 // The implementation must be a friend to construct a wrapper around itself.
│ │ │ │ +
289 friend Implementation;
│ │ │ │ +
290
│ │ │ │ +
291 // The reference container is a friend to be able to call setImplementation.
│ │ │ │ +
292 friend class Impl::ReferenceElementContainer<ctype,dimension>;
│ │ │ │ +
293
│ │ │ │ +
294 // Constructor for wrapping an implementation reference (required internally by the default implementation)
│ │ │ │ +
295 ReferenceElement(const Implementation& impl)
│ │ │ │ +
296 : _impl(&impl)
│ │ │ │ +
297 {}
│ │ │ │ +
298
│ │ │ │ +
299 void setImplementation(const Implementation& impl)
│ │ │ │ +
300 {
│ │ │ │ +
301 _impl = &impl;
│ │ │ │ +
302 }
│ │ │ │ +
303
│ │ │ │ +
304 const Implementation* _impl;
│ │ │ │ +
305
│ │ │ │ +
306 };
│ │ │ │ +
│ │ │ │
307
│ │ │ │ -
308 int base = kuhnIndex * BackendRefinement::nVertices(nIntervals_);
│ │ │ │ -
309 indices += base;
│ │ │ │ -
310
│ │ │ │ -
311 return indices;
│ │ │ │ -
312 }
│ │ │ │ -
│ │ │ │ -
313
│ │ │ │ -
314 template<int dimension, class CoordType>
│ │ │ │ -
315 int
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
317 index() const
│ │ │ │ -
318 {
│ │ │ │ -
319 return kuhnIndex*BackendRefinement::nElements(nIntervals_) + backend.index();
│ │ │ │ -
320 }
│ │ │ │ -
│ │ │ │ -
321
│ │ │ │ -
322 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
325 coords() const
│ │ │ │ -
326 {
│ │ │ │ -
327 return global(backend.coords());
│ │ │ │ -
328 }
│ │ │ │ -
│ │ │ │ -
329
│ │ │ │ -
330 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
333 {
│ │ │ │ -
334 const typename BackendIterator::Geometry &bgeo =
│ │ │ │ -
335 backend.geometry();
│ │ │ │ -
336 std::vector<CoordVector> corners(dimension+1);
│ │ │ │ -
337 for(int i = 0; i <= dimension; ++i)
│ │ │ │ -
338 corners[i] = global(bgeo.corner(i));
│ │ │ │ -
339
│ │ │ │ -
340 return Geometry(bgeo.type(), corners);
│ │ │ │ -
341 }
│ │ │ │ -
│ │ │ │ -
342
│ │ │ │ -
343 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ - │ │ │ │ -
346 global(const CoordVector &local) const
│ │ │ │ -
347 {
│ │ │ │ -
348 return referenceToKuhn(local, getPermutation<dimension>(kuhnIndex));
│ │ │ │ -
349 }
│ │ │ │ -
350
│ │ │ │ -
351 // common
│ │ │ │ -
352 template<int dimension, class CoordType>
│ │ │ │ -
353 template<int codimension>
│ │ │ │ -
│ │ │ │ -
354 class RefinementImp<dimension, CoordType>::Codim<codimension>::SubEntityIterator
│ │ │ │ -
355 : public ForwardIteratorFacade<typename RefinementImp<dimension, CoordType>::template Codim<codimension>::SubEntityIterator, int>,
│ │ │ │ -
356 public RefinementIteratorSpecial<dimension, CoordType, codimension>
│ │ │ │ -
357 {
│ │ │ │ -
358 public:
│ │ │ │ - │ │ │ │ -
360 typedef SubEntityIterator This;
│ │ │ │ -
361
│ │ │ │ -
362 SubEntityIterator(int nIntervals, bool end = false);
│ │ │ │ -
363
│ │ │ │ -
364 bool equals(const This &other) const;
│ │ │ │ -
365 protected:
│ │ │ │ -
366 using RefinementIteratorSpecial<dimension, CoordType, codimension>::kuhnIndex;
│ │ │ │ -
367 using RefinementIteratorSpecial<dimension, CoordType, codimension>::backend;
│ │ │ │ -
368 };
│ │ │ │ -
│ │ │ │ -
369
│ │ │ │ -
370#ifndef DOXYGEN
│ │ │ │ -
371 template<int dimension, class CoordType>
│ │ │ │ -
372 template<int codimension>
│ │ │ │ - │ │ │ │ -
374 SubEntityIterator(int nIntervals, bool end)
│ │ │ │ -
375 : RefinementIteratorSpecial<dimension, CoordType, codimension>(nIntervals, end)
│ │ │ │ -
376 {}
│ │ │ │ -
377
│ │ │ │ -
378 template<int dimension, class CoordType>
│ │ │ │ -
379 template<int codimension>
│ │ │ │ -
380 bool
│ │ │ │ - │ │ │ │ -
382 equals(const This &other) const
│ │ │ │ -
383 { return kuhnIndex == other.kuhnIndex && backend == other.backend; }
│ │ │ │ -
384
│ │ │ │ -
385#endif // DOXYGEN
│ │ │ │ -
386
│ │ │ │ -
387 } // namespace HCubeTriangulation
│ │ │ │ -
│ │ │ │ -
388 } // namespace RefinementImp
│ │ │ │ -
389
│ │ │ │ -
390 namespace RefinementImp
│ │ │ │ -
391 {
│ │ │ │ -
392 // ///////////////////////
│ │ │ │ -
393 //
│ │ │ │ -
394 // The refinement traits
│ │ │ │ -
395 //
│ │ │ │ -
396
│ │ │ │ -
397#ifndef DOXYGEN
│ │ │ │ -
398 template<unsigned topologyId, class CoordType, unsigned coerceToId,
│ │ │ │ -
399 int dim>
│ │ │ │ -
400 struct Traits<
│ │ │ │ -
401 topologyId, CoordType, coerceToId, dim,
│ │ │ │ -
402 typename std::enable_if<
│ │ │ │ -
403 (dim >= 2 &&
│ │ │ │ -
404 (GeometryTypes::cube(dim).id() >> 1) ==
│ │ │ │ -
405 (topologyId >> 1) &&
│ │ │ │ -
406 (GeometryTypes::simplex(dim).id() >> 1) ==
│ │ │ │ -
407 (coerceToId >> 1)
│ │ │ │ -
408 )>::type
│ │ │ │ -
409 >
│ │ │ │ -
410 {
│ │ │ │ -
411 typedef HCubeTriangulation::RefinementImp<dim, CoordType> Imp;
│ │ │ │ -
412 };
│ │ │ │ -
413#endif
│ │ │ │ -
414
│ │ │ │ -
415 } // namespace RefinementImp
│ │ │ │ -
416} // namespace Dune
│ │ │ │ -
417
│ │ │ │ -
418#endif // DUNE_GEOMETRY_REFINEMENT_HCUBETRIANGULATION_CC
│ │ │ │ - │ │ │ │ -
This file contains the Refinement implementation for simplices (triangles, tetrahedrons....
│ │ │ │ -
This file contains the parts independent of a particular Refinement implementation.
│ │ │ │ -
A unique label for each type of element that can occur in a grid.
│ │ │ │ -
STL namespace.
│ │ │ │ +
308 }
│ │ │ │ +
309
│ │ │ │ +
310}
│ │ │ │ +
311
│ │ │ │ +
312
│ │ │ │ +
313#endif // DUNE_GEOMETRY_REFERENCEELEMENT_HH
│ │ │ │ +
A unique label for each type of element that can occur in a grid.
│ │ │ │
Definition affinegeometry.hh:21
│ │ │ │ -
FieldVector< int, n > getPermutation(int m)
Calculate permutation from it's index.
Definition simplex.cc:293
│ │ │ │ -
FieldVector< CoordType, dimension > referenceToKuhn(FieldVector< CoordType, dimension > point, const FieldVector< int, dimension > &kuhn)
Map from the reference simplex to some Kuhn simplex.
Definition simplex.cc:322
│ │ │ │ -
Static tag representing a codimension.
Definition dimension.hh:24
│ │ │ │ -
generic geometry implementation based on corner coordinates
Definition multilineargeometry.hh:181
│ │ │ │ - │ │ │ │ - │ │ │ │ -
static VertexIterator vEnd(int nIntervals)
Definition hcubetriangulation.cc:121
│ │ │ │ -
static VertexIterator vBegin(int nIntervals)
Definition hcubetriangulation.cc:113
│ │ │ │ -
static int nElements(int nIntervals)
Definition hcubetriangulation.cc:129
│ │ │ │ -
FieldVector< CoordType, dimension > CoordVector
Definition hcubetriangulation.cc:76
│ │ │ │ -
CoordType ctype
Definition hcubetriangulation.cc:71
│ │ │ │ -
Codim< 0 >::SubEntityIterator ElementIterator
Definition hcubetriangulation.cc:77
│ │ │ │ -
FieldVector< int, dimension+1 > IndexVector
Definition hcubetriangulation.cc:78
│ │ │ │ -
static ElementIterator eBegin(int nIntervals)
Definition hcubetriangulation.cc:137
│ │ │ │ -
static ElementIterator eEnd(int nIntervals)
Definition hcubetriangulation.cc:145
│ │ │ │ -
static constexpr int dimension
Definition hcubetriangulation.cc:69
│ │ │ │ -
Codim< dimension >::SubEntityIterator VertexIterator
Definition hcubetriangulation.cc:75
│ │ │ │ -
static int nVertices(int nIntervals)
Definition hcubetriangulation.cc:105
│ │ │ │ - │ │ │ │ -
Dune::MultiLinearGeometry< CoordType, dimension-codimension, dimension > Geometry
Definition hcubetriangulation.cc:99
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
Refinement::template Codim< dimension >::Geometry Geometry
Definition hcubetriangulation.cc:162
│ │ │ │ -
BackendRefinement::template Codim< dimension >::SubEntityIterator BackendIterator
Definition hcubetriangulation.cc:175
│ │ │ │ -
Refinement::BackendRefinement BackendRefinement
Definition hcubetriangulation.cc:174
│ │ │ │ - │ │ │ │ -
RefinementImp< dimension, CoordType > Refinement
Definition hcubetriangulation.cc:160
│ │ │ │ - │ │ │ │ -
BackendRefinement::template Codim< 0 >::SubEntityIterator BackendIterator
Definition hcubetriangulation.cc:260
│ │ │ │ - │ │ │ │ -
Refinement::CoordVector CoordVector
Definition hcubetriangulation.cc:241
│ │ │ │ - │ │ │ │ - │ │ │ │ -
Refinement::BackendRefinement BackendRefinement
Definition hcubetriangulation.cc:259
│ │ │ │ - │ │ │ │ -
Refinement::IndexVector IndexVector
Definition hcubetriangulation.cc:240
│ │ │ │ -
RefinementImp< dimension, CoordType > Refinement
Definition hcubetriangulation.cc:239
│ │ │ │ -
Refinement::template Codim< 0 >::Geometry Geometry
Definition hcubetriangulation.cc:242
│ │ │ │ - │ │ │ │ - │ │ │ │ -
RefinementImp< dimension, CoordType > Refinement
Definition hcubetriangulation.cc:359
│ │ │ │ -
SubEntityIterator This
Definition hcubetriangulation.cc:360
│ │ │ │ - │ │ │ │ +
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:228
│ │ │ │ +
GeometryType type(int i, int c) const
obtain the type of subentity (i,c)
Definition referenceelement.hh:167
│ │ │ │ +
ReferenceElement()
Constructs an empty reference element.
Definition referenceelement.hh:254
│ │ │ │ +
bool operator!=(const ReferenceElement &r) const
Compares for inequality with another reference element.
Definition referenceelement.hh:275
│ │ │ │ +
Coordinate position(int i, int c) const
position of the barycenter of entity (i,c)
Definition referenceelement.hh:190
│ │ │ │ +
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:221
│ │ │ │ +
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
│ │ │ │ +
GeometryType type() const
obtain the type of this reference element
Definition referenceelement.hh:175
│ │ │ │ +
const Implementation & impl() const
Returns a reference to the internal implementation object.
Definition referenceelement.hh:263
│ │ │ │ +
bool checkInside(const Coordinate &local) const
check if a coordinate is in the reference element
Definition referenceelement.hh:203
│ │ │ │ +
Coordinate integrationOuterNormal(int face) const
obtain the integration outer normal of the reference element
Definition referenceelement.hh:241
│ │ │ │ +
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:269
│ │ │ │ +
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:281
│ │ │ │ +
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
│ │ │ │ +
Unique label for each type of entities that can occur in DUNE grids.
Definition type.hh:114
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,590 +1,297 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ - * _r_e_f_i_n_e_m_e_n_t │ │ │ │ │ -hcubetriangulation.cc │ │ │ │ │ +referenceelement.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 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 © 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_HCUBETRIANGULATION_CC │ │ │ │ │ -_6#define DUNE_GEOMETRY_REFINEMENT_HCUBETRIANGULATION_CC │ │ │ │ │ +5#ifndef DUNE_GEOMETRY_REFERENCEELEMENT_HH │ │ │ │ │ +6#define DUNE_GEOMETRY_REFERENCEELEMENT_HH │ │ │ │ │ 7 │ │ │ │ │ -29#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ -30#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ +8#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ +9 │ │ │ │ │ +10namespace _D_u_n_e { │ │ │ │ │ +11 namespace Geo { │ │ │ │ │ +12 │ │ │ │ │ +13 namespace Impl { │ │ │ │ │ +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; │ │ │ │ │ +28 │ │ │ │ │ +29 // ReferenceElement │ │ │ │ │ +30 // ---------------- │ │ │ │ │ 31 │ │ │ │ │ -32#include "_b_a_s_e_._c_c" │ │ │ │ │ -33#include "_s_i_m_p_l_e_x_._c_c" │ │ │ │ │ -34 │ │ │ │ │ -35namespace _D_u_n_e │ │ │ │ │ -36{ │ │ │ │ │ -37 namespace RefinementImp │ │ │ │ │ -38 { │ │ │ │ │ -_4_6 namespace HCubeTriangulation { │ │ │ │ │ -47 │ │ │ │ │ -48 // //////////// │ │ │ │ │ -49 // │ │ │ │ │ -50 // Utilities │ │ │ │ │ -51 // │ │ │ │ │ -52 │ │ │ │ │ -53 using _S_i_m_p_l_e_x_:_:_g_e_t_P_e_r_m_u_t_a_t_i_o_n; │ │ │ │ │ -54 using _S_i_m_p_l_e_x_:_:_r_e_f_e_r_e_n_c_e_T_o_K_u_h_n; │ │ │ │ │ +50 template │ │ │ │ │ +_5_1 class _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ +52 { │ │ │ │ │ +53 │ │ │ │ │ +54 public: │ │ │ │ │ 55 │ │ │ │ │ -56 // //////////////////////////////////// │ │ │ │ │ -57 // │ │ │ │ │ -58 // Refine a hypercube with simplices │ │ │ │ │ -59 // │ │ │ │ │ -60 │ │ │ │ │ -61 // forward declaration of the iterator base │ │ │ │ │ -62 template │ │ │ │ │ -_6_3 class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l; │ │ │ │ │ -64 │ │ │ │ │ -65 template │ │ │ │ │ -_6_6 class _R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ +56#ifndef DOXYGEN │ │ │ │ │ +57 │ │ │ │ │ +59 template │ │ │ │ │ +60 using _C_o_d_i_m = typename Implementation::template _C_o_d_i_m_<_c_o_d_i_m_>; │ │ │ │ │ +61 │ │ │ │ │ +62#else │ │ │ │ │ +63 │ │ │ │ │ +65 template< int codim > │ │ │ │ │ +_6_6 struct _C_o_d_i_m │ │ │ │ │ 67 { │ │ │ │ │ -68 public: │ │ │ │ │ -_6_9 constexpr static int _d_i_m_e_n_s_i_o_n = dimension_; │ │ │ │ │ -70 │ │ │ │ │ -_7_1 typedef CoordType _c_t_y_p_e; │ │ │ │ │ -72 │ │ │ │ │ -73 template │ │ │ │ │ -74 struct _C_o_d_i_m; │ │ │ │ │ -_7_5 typedef typename _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _V_e_r_t_e_x_I_t_e_r_a_t_o_r; │ │ │ │ │ -_7_6 typedef FieldVector _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ -_7_7 typedef typename _C_o_d_i_m_<_0_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r; │ │ │ │ │ -_7_8 typedef FieldVector _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ +_6_9 using _G_e_o_m_e_t_r_y = implementation-defined; │ │ │ │ │ +70 }; │ │ │ │ │ +71 │ │ │ │ │ +72#endif // DOXYGEN │ │ │ │ │ +73 │ │ │ │ │ +_7_5 using _c_t_y_p_e = typename Implementation::ctype; │ │ │ │ │ +76 │ │ │ │ │ +_7_8 using _C_o_o_r_d_i_n_a_t_e_F_i_e_l_d = _c_t_y_p_e; │ │ │ │ │ 79 │ │ │ │ │ -80 static int _n_V_e_r_t_i_c_e_s(int nIntervals); │ │ │ │ │ -81 static _V_e_r_t_e_x_I_t_e_r_a_t_o_r _v_B_e_g_i_n(int nIntervals); │ │ │ │ │ -82 static _V_e_r_t_e_x_I_t_e_r_a_t_o_r _v_E_n_d(int nIntervals); │ │ │ │ │ -83 │ │ │ │ │ -84 static int _n_E_l_e_m_e_n_t_s(int nIntervals); │ │ │ │ │ -85 static _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r _e_B_e_g_i_n(int nIntervals); │ │ │ │ │ -_8_6 static _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r _e_E_n_d(int nIntervals); │ │ │ │ │ -87 private: │ │ │ │ │ -88 friend class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l<_d_i_m_e_n_s_i_o_n, CoordType, 0>; │ │ │ │ │ -89 friend class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l<_d_i_m_e_n_s_i_o_n, CoordType, _d_i_m_e_n_s_i_o_n>; │ │ │ │ │ -90 │ │ │ │ │ -91 typedef _S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -92 }; │ │ │ │ │ -93 │ │ │ │ │ -94 template │ │ │ │ │ -95 template │ │ │ │ │ -_9_6 struct _R_e_f_i_n_e_m_e_n_t_I_m_p::_C_o_d_i_m │ │ │ │ │ -97 { │ │ │ │ │ -98 class SubEntityIterator; │ │ │ │ │ -_9_9 typedef _D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y │ │ │ │ │ -_G_e_o_m_e_t_r_y; │ │ │ │ │ -100 }; │ │ │ │ │ -101 │ │ │ │ │ -102 template │ │ │ │ │ -103 int │ │ │ │ │ -_1_0_4 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -105_ _n_V_e_r_t_i_c_e_s(int nIntervals) │ │ │ │ │ -106 { │ │ │ │ │ -107 return BackendRefinement::nVertices(nIntervals) * factorial(int │ │ │ │ │ -(dimension)); │ │ │ │ │ -108 } │ │ │ │ │ -109 │ │ │ │ │ -110 template │ │ │ │ │ -111 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ -_1_1_2 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -113_ _v_B_e_g_i_n(int nIntervals) │ │ │ │ │ -114 { │ │ │ │ │ -115 return _V_e_r_t_e_x_I_t_e_r_a_t_o_r(nIntervals); │ │ │ │ │ -116 } │ │ │ │ │ -117 │ │ │ │ │ -118 template │ │ │ │ │ -119 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ -_1_2_0 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -121_ _v_E_n_d(int nIntervals) │ │ │ │ │ -122 { │ │ │ │ │ -123 return _V_e_r_t_e_x_I_t_e_r_a_t_o_r(nIntervals, true); │ │ │ │ │ -124 } │ │ │ │ │ -125 │ │ │ │ │ -126 template │ │ │ │ │ -127 int │ │ │ │ │ -_1_2_8 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -129_ _n_E_l_e_m_e_n_t_s(int nIntervals) │ │ │ │ │ -130 { │ │ │ │ │ -131 return BackendRefinement::nElements(nIntervals) * factorial(int │ │ │ │ │ -(dimension)); │ │ │ │ │ -132 } │ │ │ │ │ -133 │ │ │ │ │ -134 template │ │ │ │ │ -135 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ -_1_3_6 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -137_ _e_B_e_g_i_n(int nIntervals) │ │ │ │ │ -138 { │ │ │ │ │ -139 return _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r(nIntervals); │ │ │ │ │ -140 } │ │ │ │ │ -141 │ │ │ │ │ -142 template │ │ │ │ │ -143 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ -_1_4_4 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -145_ _e_E_n_d(int nIntervals) │ │ │ │ │ -146 { │ │ │ │ │ -147 return _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r(nIntervals, true); │ │ │ │ │ -148 } │ │ │ │ │ -149 │ │ │ │ │ -150 // ////////////// │ │ │ │ │ -151 // │ │ │ │ │ -152 // The iterator │ │ │ │ │ -153 // │ │ │ │ │ -154 │ │ │ │ │ -155 // vertices │ │ │ │ │ -156 template │ │ │ │ │ -_1_5_7 class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ -158 { │ │ │ │ │ -159 public: │ │ │ │ │ -_1_6_0 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -_1_6_1 typedef typename Refinement::CoordVector _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ -_1_6_2 typedef typename Refinement::template _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_:_G_e_o_m_e_t_r_y _G_e_o_m_e_t_r_y; │ │ │ │ │ -163 │ │ │ │ │ -164 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end = false); │ │ │ │ │ -165 │ │ │ │ │ -166 void increment(); │ │ │ │ │ -167 │ │ │ │ │ -168 _C_o_o_r_d_V_e_c_t_o_r coords() const; │ │ │ │ │ -169 │ │ │ │ │ -170 _G_e_o_m_e_t_r_y geometry() const; │ │ │ │ │ +_8_1 using _C_o_o_r_d_i_n_a_t_e = typename Implementation::Coordinate; │ │ │ │ │ +82 │ │ │ │ │ +_8_4 typedef _c_t_y_p_e _V_o_l_u_m_e; │ │ │ │ │ +85 │ │ │ │ │ +_8_7 static constexpr int _d_i_m_e_n_s_i_o_n = Implementation::dimension; │ │ │ │ │ +88 │ │ │ │ │ +89 │ │ │ │ │ +_9_4 int _s_i_z_e(int c) const │ │ │ │ │ +95 { │ │ │ │ │ +96 return _impl->size(c); │ │ │ │ │ +97 } │ │ │ │ │ +98 │ │ │ │ │ +99 │ │ │ │ │ +_1_1_1 int _s_i_z_e(int i, int c, int cc) const │ │ │ │ │ +112 { │ │ │ │ │ +113 return _impl->size(i,c,cc); │ │ │ │ │ +114 } │ │ │ │ │ +115 │ │ │ │ │ +116 │ │ │ │ │ +_1_3_0 int _s_u_b_E_n_t_i_t_y(int i, int c, int ii, int cc) const │ │ │ │ │ +131 { │ │ │ │ │ +132 return _impl->subEntity(i,c,ii,cc); │ │ │ │ │ +133 } │ │ │ │ │ +134 │ │ │ │ │ +_1_5_3 auto _s_u_b_E_n_t_i_t_i_e_s ( int i, int c, int cc ) const │ │ │ │ │ +154 { │ │ │ │ │ +155 return _impl->subEntities(i,c,cc); │ │ │ │ │ +156 } │ │ │ │ │ +157 │ │ │ │ │ +158 │ │ │ │ │ +_1_6_7 _G_e_o_m_e_t_r_y_T_y_p_e _t_y_p_e(int i, int c) const │ │ │ │ │ +168 { │ │ │ │ │ +169 return _impl->type(i,c); │ │ │ │ │ +170 } │ │ │ │ │ 171 │ │ │ │ │ -172 int index() const; │ │ │ │ │ -173 protected: │ │ │ │ │ -_1_7_4 typedef typename Refinement::BackendRefinement _B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -_1_7_5 typedef typename BackendRefinement::template _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r; │ │ │ │ │ -_1_7_6 constexpr static int nKuhnSimplices = factorial(int(dimension)); │ │ │ │ │ -177 │ │ │ │ │ -_1_7_8 int _n_I_n_t_e_r_v_a_l_s__; │ │ │ │ │ +172 │ │ │ │ │ +_1_7_5 _G_e_o_m_e_t_r_y_T_y_p_e _t_y_p_e() const │ │ │ │ │ +176 { │ │ │ │ │ +177 return _impl->type(); │ │ │ │ │ +178 } │ │ │ │ │ 179 │ │ │ │ │ -_1_8_0 int _k_u_h_n_I_n_d_e_x; │ │ │ │ │ -_1_8_1 _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r _b_a_c_k_e_n_d; │ │ │ │ │ -_1_8_2 const _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r _b_a_c_k_e_n_d_E_n_d; │ │ │ │ │ -183 }; │ │ │ │ │ -184 │ │ │ │ │ -185 template │ │ │ │ │ -_1_8_6 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -187_ _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end) │ │ │ │ │ -188 : nIntervals_(nIntervals), kuhnIndex(0), │ │ │ │ │ -189 backend(_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t::vBegin(nIntervals_)), │ │ │ │ │ -190 backendEnd(_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t::vEnd(nIntervals_)) │ │ │ │ │ +180 │ │ │ │ │ +_1_9_0 _C_o_o_r_d_i_n_a_t_e _p_o_s_i_t_i_o_n(int i, int c) const │ │ │ │ │ 191 { │ │ │ │ │ -192 if (end) │ │ │ │ │ -193 kuhnIndex = nKuhnSimplices; │ │ │ │ │ -194 } │ │ │ │ │ +192 return _impl->position(i,c); │ │ │ │ │ +193 } │ │ │ │ │ +194 │ │ │ │ │ 195 │ │ │ │ │ -196 template │ │ │ │ │ -197 void │ │ │ │ │ -_1_9_8 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -199_ _i_n_c_r_e_m_e_n_t() │ │ │ │ │ -200 { │ │ │ │ │ -201 ++backend; │ │ │ │ │ -202 if (backend == backendEnd) │ │ │ │ │ -203 { │ │ │ │ │ -204 backend = BackendRefinement::vBegin(nIntervals_); │ │ │ │ │ -205 ++kuhnIndex; │ │ │ │ │ +_2_0_3 bool _c_h_e_c_k_I_n_s_i_d_e(const _C_o_o_r_d_i_n_a_t_e& local) const │ │ │ │ │ +204 { │ │ │ │ │ +205 return _impl->checkInside(local); │ │ │ │ │ 206 } │ │ │ │ │ -207 } │ │ │ │ │ +207 │ │ │ │ │ 208 │ │ │ │ │ -209 template │ │ │ │ │ -210 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -_2_1_1 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -212_ _c_o_o_r_d_s() const │ │ │ │ │ -213 { │ │ │ │ │ -214 return referenceToKuhn(backend.coords(), getPermutation │ │ │ │ │ -(kuhnIndex)); │ │ │ │ │ -215 } │ │ │ │ │ -216 │ │ │ │ │ -217 template │ │ │ │ │ -218 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_G_e_o_m_e_t_r_y │ │ │ │ │ -_2_1_9 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_:_g_e_o_m_e_t_r_y () │ │ │ │ │ -const │ │ │ │ │ -220 { │ │ │ │ │ -221 std::vector corners(1); │ │ │ │ │ -222 corners[0] = referenceToKuhn(backend.coords(), getPermutation │ │ │ │ │ -(kuhnIndex)); │ │ │ │ │ -223 return _G_e_o_m_e_t_r_y(GeometryTypes::vertex, corners); │ │ │ │ │ +220 template │ │ │ │ │ +_2_2_1 typename _C_o_d_i_m_<_c_o_d_i_m_>_:_:_G_e_o_m_e_t_r_y _g_e_o_m_e_t_r_y(int i) const │ │ │ │ │ +222 { │ │ │ │ │ +223 return _impl->template geometry(i); │ │ │ │ │ 224 } │ │ │ │ │ 225 │ │ │ │ │ -226 template │ │ │ │ │ -227 int │ │ │ │ │ -_2_2_8 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -229_ _i_n_d_e_x() const │ │ │ │ │ -230 { │ │ │ │ │ -231 return kuhnIndex*BackendRefinement::nVertices(nIntervals_) + backend.index │ │ │ │ │ -(); │ │ │ │ │ -232 } │ │ │ │ │ +226 │ │ │ │ │ +_2_2_8 _C_o_o_r_d_i_n_a_t_e_F_i_e_l_d _v_o_l_u_m_e() const │ │ │ │ │ +229 { │ │ │ │ │ +230 return _impl->volume(); │ │ │ │ │ +231 } │ │ │ │ │ +232 │ │ │ │ │ 233 │ │ │ │ │ -234 // elements │ │ │ │ │ -235 template │ │ │ │ │ -_2_3_6 class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ -237 { │ │ │ │ │ -238 public: │ │ │ │ │ -_2_3_9 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -_2_4_0 typedef typename _R_e_f_i_n_e_m_e_n_t_:_:_I_n_d_e_x_V_e_c_t_o_r _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ -_2_4_1 typedef typename _R_e_f_i_n_e_m_e_n_t_:_:_C_o_o_r_d_V_e_c_t_o_r _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ -_2_4_2 typedef typename Refinement::template _C_o_d_i_m_<_0_>_:_:_G_e_o_m_e_t_r_y _G_e_o_m_e_t_r_y; │ │ │ │ │ -243 │ │ │ │ │ -244 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals_, bool end = false); │ │ │ │ │ -245 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(const _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _0_> &other); │ │ │ │ │ +_2_4_1 _C_o_o_r_d_i_n_a_t_e _i_n_t_e_g_r_a_t_i_o_n_O_u_t_e_r_N_o_r_m_a_l(int face) const │ │ │ │ │ +242 { │ │ │ │ │ +243 return _impl->integrationOuterNormal(face); │ │ │ │ │ +244 } │ │ │ │ │ +245 │ │ │ │ │ 246 │ │ │ │ │ -247 void increment(); │ │ │ │ │ -248 │ │ │ │ │ -249 _I_n_d_e_x_V_e_c_t_o_r vertexIndices() const; │ │ │ │ │ -250 int index() const; │ │ │ │ │ -251 _C_o_o_r_d_V_e_c_t_o_r coords() const; │ │ │ │ │ -252 │ │ │ │ │ -253 _G_e_o_m_e_t_r_y geometry() const; │ │ │ │ │ -254 │ │ │ │ │ -255 private: │ │ │ │ │ -256 _C_o_o_r_d_V_e_c_t_o_r global(const _C_o_o_r_d_V_e_c_t_o_r &local) const; │ │ │ │ │ +_2_5_4 _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t() │ │ │ │ │ +255 : _impl(nullptr) │ │ │ │ │ +256 {} │ │ │ │ │ 257 │ │ │ │ │ -258 protected: │ │ │ │ │ -_2_5_9 typedef typename _R_e_f_i_n_e_m_e_n_t_:_:_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t _B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -_2_6_0 typedef typename BackendRefinement::template _C_o_d_i_m_<_0_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ -_B_a_c_k_e_n_d_I_t_e_r_a_t_o_r; │ │ │ │ │ -_2_6_1 constexpr static int nKuhnSimplices = factorial(dimension); │ │ │ │ │ -262 │ │ │ │ │ -_2_6_3 int _n_I_n_t_e_r_v_a_l_s__; │ │ │ │ │ -264 │ │ │ │ │ -_2_6_5 int _k_u_h_n_I_n_d_e_x; │ │ │ │ │ -_2_6_6 _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r _b_a_c_k_e_n_d; │ │ │ │ │ -_2_6_7 const _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r _b_a_c_k_e_n_d_E_n_d; │ │ │ │ │ -268 }; │ │ │ │ │ -269 │ │ │ │ │ -270 template │ │ │ │ │ -_2_7_1 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -272_ _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end) │ │ │ │ │ -273 : nIntervals_(nIntervals), kuhnIndex(0), │ │ │ │ │ -274 backend(_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t::eBegin(nIntervals_)), │ │ │ │ │ -275 backendEnd(_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t::eEnd(nIntervals_)) │ │ │ │ │ +_2_6_3 const Implementation& _i_m_p_l() const │ │ │ │ │ +264 { │ │ │ │ │ +265 return *_impl; │ │ │ │ │ +266 } │ │ │ │ │ +267 │ │ │ │ │ +_2_6_9 bool _o_p_e_r_a_t_o_r_=_=(const _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t& r) const │ │ │ │ │ +270 { │ │ │ │ │ +271 return _impl == r._impl; │ │ │ │ │ +272 } │ │ │ │ │ +273 │ │ │ │ │ +_2_7_5 bool _o_p_e_r_a_t_o_r_!_=(const _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t& r) const │ │ │ │ │ 276 { │ │ │ │ │ -277 if (end) │ │ │ │ │ -278 kuhnIndex = nKuhnSimplices; │ │ │ │ │ -279 } │ │ │ │ │ -280 template │ │ │ │ │ -_2_8_1 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -282_ _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(const _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _0_> &other) │ │ │ │ │ -283 : nIntervals_(other.nIntervals_), kuhnIndex(other.kuhnIndex), │ │ │ │ │ -284 backend(other.backend), │ │ │ │ │ -285 backendEnd(other.backendEnd) │ │ │ │ │ -286 {} │ │ │ │ │ +277 return not (*this == r); │ │ │ │ │ +278 } │ │ │ │ │ +279 │ │ │ │ │ +_2_8_1 friend std::size_t _h_a_s_h___v_a_l_u_e(const _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t& r) │ │ │ │ │ +282 { │ │ │ │ │ +283 return reinterpret_cast(r._impl); │ │ │ │ │ +284 } │ │ │ │ │ +285 │ │ │ │ │ +286 private: │ │ │ │ │ 287 │ │ │ │ │ -288 template │ │ │ │ │ -289 void │ │ │ │ │ -_2_9_0 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -291_ _i_n_c_r_e_m_e_n_t() │ │ │ │ │ -292 { │ │ │ │ │ -293 ++backend; │ │ │ │ │ -294 if (backend == backendEnd) │ │ │ │ │ -295 { │ │ │ │ │ -296 backend = BackendRefinement::eBegin(nIntervals_); │ │ │ │ │ -297 ++kuhnIndex; │ │ │ │ │ -298 } │ │ │ │ │ -299 } │ │ │ │ │ -300 │ │ │ │ │ -301 template │ │ │ │ │ -302 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ -_3_0_3 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -304_ _v_e_r_t_e_x_I_n_d_i_c_e_s() const │ │ │ │ │ -305 { │ │ │ │ │ -306 _I_n_d_e_x_V_e_c_t_o_r indices = backend.vertexIndices(); │ │ │ │ │ +288 // The implementation must be a friend to construct a wrapper around │ │ │ │ │ +itself. │ │ │ │ │ +289 friend Implementation; │ │ │ │ │ +290 │ │ │ │ │ +291 // The reference container is a friend to be able to call │ │ │ │ │ +setImplementation. │ │ │ │ │ +292 friend class Impl::ReferenceElementContainer<_c_t_y_p_e,_d_i_m_e_n_s_i_o_n>; │ │ │ │ │ +293 │ │ │ │ │ +294 // Constructor for wrapping an implementation reference (required │ │ │ │ │ +internally by the default implementation) │ │ │ │ │ +295 _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t(const Implementation& _i_m_p_l) │ │ │ │ │ +296 : _impl(&_i_m_p_l) │ │ │ │ │ +297 {} │ │ │ │ │ +298 │ │ │ │ │ +299 void setImplementation(const Implementation& _i_m_p_l) │ │ │ │ │ +300 { │ │ │ │ │ +301 _impl = &_i_m_p_l; │ │ │ │ │ +302 } │ │ │ │ │ +303 │ │ │ │ │ +304 const Implementation* _impl; │ │ │ │ │ +305 │ │ │ │ │ +306 }; │ │ │ │ │ 307 │ │ │ │ │ -308 int base = kuhnIndex * BackendRefinement::nVertices(nIntervals_); │ │ │ │ │ -309 indices += base; │ │ │ │ │ -310 │ │ │ │ │ -311 return indices; │ │ │ │ │ -312 } │ │ │ │ │ -313 │ │ │ │ │ -314 template │ │ │ │ │ -315 int │ │ │ │ │ -_3_1_6 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -317_ _i_n_d_e_x() const │ │ │ │ │ -318 { │ │ │ │ │ -319 return kuhnIndex*BackendRefinement::nElements(nIntervals_) + backend.index │ │ │ │ │ -(); │ │ │ │ │ -320 } │ │ │ │ │ -321 │ │ │ │ │ -322 template │ │ │ │ │ -323 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -_3_2_4 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -325_ _c_o_o_r_d_s() const │ │ │ │ │ -326 { │ │ │ │ │ -327 return global(backend.coords()); │ │ │ │ │ -328 } │ │ │ │ │ -329 │ │ │ │ │ -330 template │ │ │ │ │ -331 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ -_3_3_2 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_g_e_o_m_e_t_r_y () const │ │ │ │ │ -333 { │ │ │ │ │ -334 const typename BackendIterator::Geometry &bgeo = │ │ │ │ │ -335 backend.geometry(); │ │ │ │ │ -336 std::vector corners(dimension+1); │ │ │ │ │ -337 for(int i = 0; i <= dimension; ++i) │ │ │ │ │ -338 corners[i] = global(bgeo.corner(i)); │ │ │ │ │ -339 │ │ │ │ │ -340 return _G_e_o_m_e_t_r_y(bgeo.type(), corners); │ │ │ │ │ -341 } │ │ │ │ │ -342 │ │ │ │ │ -343 template │ │ │ │ │ -344 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -345 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -346_ _g_l_o_b_a_l(const CoordVector &local) const │ │ │ │ │ -347 { │ │ │ │ │ -348 return referenceToKuhn(local, getPermutation(kuhnIndex)); │ │ │ │ │ -349 } │ │ │ │ │ -350 │ │ │ │ │ -351 // common │ │ │ │ │ -352 template │ │ │ │ │ -353 template │ │ │ │ │ -_3_5_4 class _R_e_f_i_n_e_m_e_n_t_I_m_p::_C_o_d_i_m:: │ │ │ │ │ -SubEntityIterator │ │ │ │ │ -355 : public ForwardIteratorFacade::template Codim::SubEntityIterator, int>, │ │ │ │ │ -356 public _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ -357 { │ │ │ │ │ -358 public: │ │ │ │ │ -_3_5_9 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -_3_6_0 typedef SubEntityIterator _T_h_i_s; │ │ │ │ │ -361 │ │ │ │ │ -_3_6_2 _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r(int nIntervals, bool end = false); │ │ │ │ │ -363 │ │ │ │ │ -_3_6_4 bool _e_q_u_a_l_s(const _T_h_i_s &other) const; │ │ │ │ │ -365 protected: │ │ │ │ │ -366 using _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l<_d_i_m_e_n_s_i_o_n, CoordType, codimension>:: │ │ │ │ │ -kuhnIndex; │ │ │ │ │ -367 using _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l<_d_i_m_e_n_s_i_o_n, CoordType, codimension>:: │ │ │ │ │ -backend; │ │ │ │ │ -368 }; │ │ │ │ │ -369 │ │ │ │ │ -370#ifndef DOXYGEN │ │ │ │ │ -371 template │ │ │ │ │ -372 template │ │ │ │ │ -373 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_:_: │ │ │ │ │ -374_ _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r(int nIntervals, bool end) │ │ │ │ │ -375 : _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(nIntervals, │ │ │ │ │ -end) │ │ │ │ │ -376 {} │ │ │ │ │ -377 │ │ │ │ │ -378 template │ │ │ │ │ -379 template │ │ │ │ │ -380 bool │ │ │ │ │ -381 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_:_: │ │ │ │ │ -382_ _e_q_u_a_l_s(const This &other) const │ │ │ │ │ -383 { return kuhnIndex == other.kuhnIndex && backend == other.backend; } │ │ │ │ │ -384 │ │ │ │ │ -385#endif // DOXYGEN │ │ │ │ │ -386 │ │ │ │ │ -387 } // namespace HCubeTriangulation │ │ │ │ │ -388 } // namespace RefinementImp │ │ │ │ │ -389 │ │ │ │ │ -390 namespace RefinementImp │ │ │ │ │ -391 { │ │ │ │ │ -392 // /////////////////////// │ │ │ │ │ -393 // │ │ │ │ │ -394 // The refinement traits │ │ │ │ │ -395 // │ │ │ │ │ -396 │ │ │ │ │ -397#ifndef DOXYGEN │ │ │ │ │ -398 template │ │ │ │ │ -400 struct Traits< │ │ │ │ │ -401 topologyId, CoordType, coerceToId, dim, │ │ │ │ │ -402 typename _s_t_d::enable_if< │ │ │ │ │ -403 (dim >= 2 && │ │ │ │ │ -404 (GeometryTypes::cube(dim).id() >> 1) == │ │ │ │ │ -405 (topologyId >> 1) && │ │ │ │ │ -406 (GeometryTypes::simplex(dim).id() >> 1) == │ │ │ │ │ -407 (coerceToId >> 1) │ │ │ │ │ -408 )>::type │ │ │ │ │ -409 > │ │ │ │ │ -410 { │ │ │ │ │ -411 typedef HCubeTriangulation::RefinementImp Imp; │ │ │ │ │ -412 }; │ │ │ │ │ -413#endif │ │ │ │ │ -414 │ │ │ │ │ -415 } // namespace RefinementImp │ │ │ │ │ -416} // namespace Dune │ │ │ │ │ -417 │ │ │ │ │ -418#endif // DUNE_GEOMETRY_REFINEMENT_HCUBETRIANGULATION_CC │ │ │ │ │ -_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h │ │ │ │ │ -_s_i_m_p_l_e_x_._c_c │ │ │ │ │ -This file contains the Refinement implementation for simplices (triangles, │ │ │ │ │ -tetrahedrons.... │ │ │ │ │ -_b_a_s_e_._c_c │ │ │ │ │ -This file contains the parts independent of a particular Refinement │ │ │ │ │ -implementation. │ │ │ │ │ +308 } │ │ │ │ │ +309 │ │ │ │ │ +310} │ │ │ │ │ +311 │ │ │ │ │ +312 │ │ │ │ │ +313#endif // DUNE_GEOMETRY_REFERENCEELEMENT_HH │ │ │ │ │ _t_y_p_e_._h_h │ │ │ │ │ A unique label for each type of element that can occur in a grid. │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn affinegeometry.hh:21 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_g_e_t_P_e_r_m_u_t_a_t_i_o_n │ │ │ │ │ -FieldVector< int, n > getPermutation(int m) │ │ │ │ │ -Calculate permutation from it's index. │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:293 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_r_e_f_e_r_e_n_c_e_T_o_K_u_h_n │ │ │ │ │ -FieldVector< CoordType, dimension > referenceToKuhn(FieldVector< CoordType, │ │ │ │ │ -dimension > point, const FieldVector< int, dimension > &kuhn) │ │ │ │ │ -Map from the reference simplex to some Kuhn simplex. │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:322 │ │ │ │ │ -_D_u_n_e_:_:_C_o_d_i_m │ │ │ │ │ -Static tag representing a codimension. │ │ │ │ │ -DDeeffiinniittiioonn dimension.hh:24 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y │ │ │ │ │ -generic geometry implementation based on corner coordinates │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:181 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:63 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:67 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_v_E_n_d │ │ │ │ │ -static VertexIterator vEnd(int nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:121 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_v_B_e_g_i_n │ │ │ │ │ -static VertexIterator vBegin(int nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:113 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_n_E_l_e_m_e_n_t_s │ │ │ │ │ -static int nElements(int nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:129 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -FieldVector< CoordType, dimension > CoordVector │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:76 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_c_t_y_p_e │ │ │ │ │ -CoordType ctype │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:71 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ -Codim< 0 >::SubEntityIterator ElementIterator │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:77 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ -FieldVector< int, dimension+1 > IndexVector │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:78 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_e_B_e_g_i_n │ │ │ │ │ -static ElementIterator eBegin(int nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:137 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_e_E_n_d │ │ │ │ │ -static ElementIterator eEnd(int nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:145 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ +This class provides access to geometric and topological properties of a │ │ │ │ │ +reference element. │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_v_o_l_u_m_e │ │ │ │ │ +CoordinateField volume() const │ │ │ │ │ +obtain the volume of the reference element │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:228 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_t_y_p_e │ │ │ │ │ +GeometryType type(int i, int c) const │ │ │ │ │ +obtain the type of subentity (i,c) │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:167 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ +ReferenceElement() │ │ │ │ │ +Constructs an empty reference element. │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:254 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ +bool operator!=(const ReferenceElement &r) const │ │ │ │ │ +Compares for inequality with another reference element. │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:275 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_p_o_s_i_t_i_o_n │ │ │ │ │ +Coordinate position(int i, int c) const │ │ │ │ │ +position of the barycenter of entity (i,c) │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:190 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ +typename Implementation::Coordinate Coordinate │ │ │ │ │ +The coordinate type. │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:81 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_g_e_o_m_e_t_r_y │ │ │ │ │ +Codim< codim >::Geometry geometry(int i) const │ │ │ │ │ +obtain the embedding of subentity (i,codim) into the reference element │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:221 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ static constexpr int dimension │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:69 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ -Codim< dimension >::SubEntityIterator VertexIterator │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:75 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_n_V_e_r_t_i_c_e_s │ │ │ │ │ -static int nVertices(int nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:105 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:97 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ -Dune::MultiLinearGeometry< CoordType, dimension-codimension, dimension > │ │ │ │ │ -Geometry │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:99 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_n_I_n_t_e_r_v_a_l_s__ │ │ │ │ │ -int nIntervals_ │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:178 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_k_u_h_n_I_n_d_e_x │ │ │ │ │ -int kuhnIndex │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:180 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -Refinement::CoordVector CoordVector │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:161 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ -Refinement::template Codim< dimension >::Geometry Geometry │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:162 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_B_a_c_k_e_n_d_I_t_e_r_a_t_o_r │ │ │ │ │ -BackendRefinement::template Codim< dimension >::SubEntityIterator │ │ │ │ │ -BackendIterator │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:175 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -Refinement::BackendRefinement BackendRefinement │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:174 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_b_a_c_k_e_n_d │ │ │ │ │ -BackendIterator backend │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:181 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:160 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_b_a_c_k_e_n_d_E_n_d │ │ │ │ │ -const BackendIterator backendEnd │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:182 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_B_a_c_k_e_n_d_I_t_e_r_a_t_o_r │ │ │ │ │ -BackendRefinement::template Codim< 0 >::SubEntityIterator BackendIterator │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:260 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_b_a_c_k_e_n_d │ │ │ │ │ -BackendIterator backend │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:266 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -Refinement::CoordVector CoordVector │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:241 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_b_a_c_k_e_n_d_E_n_d │ │ │ │ │ -const BackendIterator backendEnd │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:267 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_k_u_h_n_I_n_d_e_x │ │ │ │ │ -int kuhnIndex │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:265 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -Refinement::BackendRefinement BackendRefinement │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:259 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_n_I_n_t_e_r_v_a_l_s__ │ │ │ │ │ -int nIntervals_ │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:263 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ -Refinement::IndexVector IndexVector │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:240 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:239 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ -Refinement::template Codim< 0 >::Geometry Geometry │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:242 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_: │ │ │ │ │ -_e_q_u_a_l_s │ │ │ │ │ -bool equals(const This &other) const │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_: │ │ │ │ │ -_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ -SubEntityIterator(int nIntervals, bool end=false) │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_: │ │ │ │ │ -_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:359 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_: │ │ │ │ │ -_T_h_i_s │ │ │ │ │ -SubEntityIterator This │ │ │ │ │ -DDeeffiinniittiioonn hcubetriangulation.cc:360 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:361 │ │ │ │ │ +The dimension of the reference element. │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:87 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_s_i_z_e │ │ │ │ │ +int size(int i, int c, int cc) const │ │ │ │ │ +number of subentities of codimension cc of subentity (i,c) │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:111 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_s_u_b_E_n_t_i_t_y │ │ │ │ │ +int subEntity(int i, int c, int ii, int cc) const │ │ │ │ │ +obtain number of ii-th subentity with codim cc of (i,c) │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:130 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_c_t_y_p_e │ │ │ │ │ +typename Implementation::ctype ctype │ │ │ │ │ +The coordinate field type. │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:75 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_s_i_z_e │ │ │ │ │ +int size(int c) const │ │ │ │ │ +number of subentities of codimension c │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:94 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_t_y_p_e │ │ │ │ │ +GeometryType type() const │ │ │ │ │ +obtain the type of this reference element │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:175 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_i_m_p_l │ │ │ │ │ +const Implementation & impl() const │ │ │ │ │ +Returns a reference to the internal implementation object. │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:263 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_c_h_e_c_k_I_n_s_i_d_e │ │ │ │ │ +bool checkInside(const Coordinate &local) const │ │ │ │ │ +check if a coordinate is in the reference element │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:203 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_i_n_t_e_g_r_a_t_i_o_n_O_u_t_e_r_N_o_r_m_a_l │ │ │ │ │ +Coordinate integrationOuterNormal(int face) const │ │ │ │ │ +obtain the integration outer normal of the reference element │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:241 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_C_o_o_r_d_i_n_a_t_e_F_i_e_l_d │ │ │ │ │ +ctype CoordinateField │ │ │ │ │ +The coordinate field type. │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:78 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ +bool operator==(const ReferenceElement &r) const │ │ │ │ │ +Compares for equality with another reference element. │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:269 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_h_a_s_h___v_a_l_u_e │ │ │ │ │ +friend std::size_t hash_value(const ReferenceElement &r) │ │ │ │ │ +Yields a hash value suitable for storing the reference element a in hash table. │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:281 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_s_u_b_E_n_t_i_t_i_e_s │ │ │ │ │ +auto subEntities(int i, int c, int cc) const │ │ │ │ │ +Obtain the range of numbers of subentities with codim cc of (i,c) │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:153 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_V_o_l_u_m_e │ │ │ │ │ +ctype Volume │ │ │ │ │ +Type used for volume. │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:84 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_C_o_d_i_m │ │ │ │ │ +Collection of types depending on the codimension. │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:67 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_C_o_d_i_m_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ +implementation-defined Geometry │ │ │ │ │ +type of geometry embedding a subentity into the reference element │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:69 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ +Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:114 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00209.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: hcube.cc File Reference │ │ │ │ +dune-geometry: virtualrefinement.cc File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,82 +65,96 @@ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ -Macros
│ │ │ │ -
hcube.cc File Reference
│ │ │ │ +Macros | │ │ │ │ +Functions
│ │ │ │ +
virtualrefinement.cc 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 <typeinfo>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ #include <dune/common/fvector.hh>
│ │ │ │ #include <dune/common/iteratorfacades.hh>
│ │ │ │ -#include <dune/geometry/referenceelements.hh>
│ │ │ │ -#include <dune/geometry/axisalignedcubegeometry.hh>
│ │ │ │ -#include "base.cc"
│ │ │ │ +#include "type.hh"
│ │ │ │ +#include "refinement.hh"
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::RefinementImp::HCube::RefinementImp< dimension_, CoordType >
 Refinement implementation for hypercubes More...
class  Dune::VirtualRefinementSubEntityIteratorSpecial< dimension, CoordType, dimension >
 
struct  Dune::RefinementImp::HCube::RefinementImp< dimension_, CoordType >::Codim< codimension >
class  Dune::VirtualRefinementSubEntityIteratorSpecial< dimension, CoordType, 0 >
 
class  Dune::RefinementImp::HCube::RefinementSubEntityIteratorSpecial< dimension, CoordType, codimension >
 SubEntityIterator base class for hypercube refinement. More...
class  Dune::VirtualRefinement< dimension, CoordType >::Codim< codimension >
 
class  Dune::RefinementImp::HCube::RefinementSubEntityIteratorSpecial< dimension, CoordType, dimension >
class  Dune::VirtualRefinementSubEntityIteratorBackSpecial< dimension, CoordType, dimension >
 
class  Dune::RefinementImp::HCube::RefinementSubEntityIteratorSpecial< dimension, CoordType, 0 >
class  Dune::VirtualRefinementSubEntityIteratorBackSpecial< dimension, CoordType, 0 >
 
class  Dune::RefinementImp::HCube::RefinementImp< dimension_, CoordType >::Codim< codimension >
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
 
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
 
#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
 
│ │ │ │

Detailed Description

│ │ │ │ -

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

│ │ │ │ -

See Refinement implementation for hypercubes.

│ │ │ │ +

This file contains the virtual wrapper around refinement.

│ │ │ │

Macro Definition Documentation

│ │ │ │ - │ │ │ │ -

◆ DUNE_GEOMETRY_REFINEMENT_HCUBE_CC

│ │ │ │ + │ │ │ │ +

◆ DUNE_GEOMETRY_VIRTUALREFINEMENT_CC

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │
#define DUNE_GEOMETRY_REFINEMENT_HCUBE_CC#define DUNE_GEOMETRY_VIRTUALREFINEMENT_CC
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,60 +1,74 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ - * _r_e_f_i_n_e_m_e_n_t │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s │ │ │ │ │ -hcube.cc File Reference │ │ │ │ │ -This file contains the _R_e_f_i_n_e_m_e_n_t implementation for hypercubes │ │ │ │ │ -(quadrilaterals, hexahedrons, etc.). _M_o_r_e_._._. │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +virtualrefinement.cc File Reference │ │ │ │ │ +This file contains the virtual wrapper around refinement. _M_o_r_e_._._. │ │ │ │ │ #include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ #include │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_a_x_i_s_a_l_i_g_n_e_d_c_u_b_e_g_e_o_m_e_t_r_y_._h_h> │ │ │ │ │ -#include "_b_a_s_e_._c_c" │ │ │ │ │ +#include "_t_y_p_e_._h_h" │ │ │ │ │ +#include "_r_e_f_i_n_e_m_e_n_t_._h_h" │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ - class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___,_ _C_o_o_r_d_T_y_p_e_ _> │ │ │ │ │ -  _R_e_f_i_n_e_m_e_n_t implementation for hypercubes _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ + _d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___,_ _C_o_o_r_d_T_y_p_e_ _>_:_: │ │ │ │ │ - _C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ + _0_ _> │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ - _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ -  SubEntityIterator base class for hypercube refinement. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_ _>_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ - _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ + _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ - _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ + _C_o_o_r_d_T_y_p_e_,_ _0_ _> │ │ │ │ │   │ │ │ │ │ - class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___,_ _C_o_o_r_d_T_y_p_e_ _>_:_: │ │ │ │ │ - _C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_ _>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_< │ │ │ │ │ + _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_ _> │ │ │ │ │   │ │ │ │ │ -NNaammeessppaacceess │ │ │ │ │ -namespace   _D_u_n_e │ │ │ │ │ +class   _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_, │ │ │ │ │ + _d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_ _t_o_p_o_l_o_g_y_I_d_, │ │ │ │ │ + _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_,_ _d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_ _t_o_p_o_l_o_g_y_I_d_, │ │ │ │ │ + _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_,_ _0_ _> │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_, │ │ │ │ │ + _d_i_m_e_n_s_i_o_n_ _>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ -  This namespace contains the implementation of _R_e_f_i_n_e_m_e_n_t. │ │ │ │ │ +class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_B_u_i_l_d_e_r_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_ _> │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e │ │ │ │ │ -  This namespace contains the _R_e_f_i_n_e_m_e_n_t implementation for │ │ │ │ │ - hypercubes (_G_e_o_m_e_t_r_y_T_y_p_e_:_:_c_u_b_e). │ │ │ │ │ +class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_B_u_i_l_d_e_r_<_ _1_,_ _C_o_o_r_d_T_y_p_e_ _> │ │ │ │ │ +  │ │ │ │ │ +class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_B_u_i_l_d_e_r_<_ _3_,_ _C_o_o_r_d_T_y_p_e_ _> │ │ │ │ │ +  │ │ │ │ │ +NNaammeessppaacceess │ │ │ │ │ +namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ MMaaccrrooss │ │ │ │ │ -#define  _D_U_N_E___G_E_O_M_E_T_R_Y___R_E_F_I_N_E_M_E_N_T___H_C_U_B_E___C_C │ │ │ │ │ +#define  _D_U_N_E___G_E_O_M_E_T_R_Y___V_I_R_T_U_A_L_R_E_F_I_N_E_M_E_N_T___C_C │ │ │ │ │ +  │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t< dimension, CoordType > _D_u_n_e_:_:_b_u_i_l_d_R_e_f_i_n_e_m_e_n_t (_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ + &  geometryType, _G_e_o_m_e_t_r_y_T_y_p_e coerceTo) │ │ │ │ │ + return a reference to the │ │ │ │ │ +  _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t according to the │ │ │ │ │ + parameters │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -This file contains the _R_e_f_i_n_e_m_e_n_t implementation for hypercubes │ │ │ │ │ -(quadrilaterals, hexahedrons, etc.). │ │ │ │ │ -See _R_e_f_i_n_e_m_e_n_t_ _i_m_p_l_e_m_e_n_t_a_t_i_o_n_ _f_o_r_ _h_y_p_e_r_c_u_b_e_s. │ │ │ │ │ +This file contains the virtual wrapper around refinement. │ │ │ │ │ ********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ -********** _?◆_? DDUUNNEE__GGEEOOMMEETTRRYY__RREEFFIINNEEMMEENNTT__HHCCUUBBEE__CCCC ********** │ │ │ │ │ -#define DUNE_GEOMETRY_REFINEMENT_HCUBE_CC │ │ │ │ │ +********** _?◆_? DDUUNNEE__GGEEOOMMEETTRRYY__VVIIRRTTUUAALLRREEFFIINNEEMMEENNTT__CCCC ********** │ │ │ │ │ +#define DUNE_GEOMETRY_VIRTUALREFINEMENT_CC │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00209_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: hcube.cc Source File │ │ │ │ +dune-geometry: virtualrefinement.cc Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,478 +70,821 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
hcube.cc
│ │ │ │ +
virtualrefinement.cc
│ │ │ │
│ │ │ │
│ │ │ │ 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 © 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_HCUBE_CC
│ │ │ │ -
6#define DUNE_GEOMETRY_REFINEMENT_HCUBE_CC
│ │ │ │ -
7
│ │ │ │ -
41#include <cassert>
│ │ │ │ +
5
│ │ │ │ +
6#ifndef DUNE_GEOMETRY_VIRTUALREFINEMENT_CC
│ │ │ │ +
7#define DUNE_GEOMETRY_VIRTUALREFINEMENT_CC
│ │ │ │ +
8
│ │ │ │ +
14#include <cassert>
│ │ │ │ +
15#include <typeinfo>
│ │ │ │ +
16
│ │ │ │ +
17#include <dune/common/exceptions.hh>
│ │ │ │ +
18#include <dune/common/fvector.hh>
│ │ │ │ +
19#include <dune/common/iteratorfacades.hh>
│ │ │ │ +
20
│ │ │ │ +
21#include "type.hh"
│ │ │ │ +
22#include "refinement.hh"
│ │ │ │ +
23
│ │ │ │ +
24namespace Dune
│ │ │ │ +
25{
│ │ │ │ +
26 // //////////////////////////////////////////
│ │ │ │ +
27 //
│ │ │ │ +
28 // The virtual base class and its iterators
│ │ │ │ +
29 //
│ │ │ │ +
30
│ │ │ │ +
31 //
│ │ │ │ +
32 // Refinement
│ │ │ │ +
33 //
│ │ │ │ +
34
│ │ │ │ +
35 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
39 {
│ │ │ │ +
40 return VertexIterator(vBeginBack(tag));
│ │ │ │ +
41 }
│ │ │ │ +
│ │ │ │
42
│ │ │ │ -
43#include <dune/common/fvector.hh>
│ │ │ │ -
44#include <dune/common/iteratorfacades.hh>
│ │ │ │ -
45
│ │ │ │ - │ │ │ │ - │ │ │ │ -
48
│ │ │ │ -
49#include "base.cc" // for RefinementTraits
│ │ │ │ +
43 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
47 {
│ │ │ │ +
48 return VertexIterator(vEndBack(tag));
│ │ │ │ +
49 }
│ │ │ │ +
│ │ │ │
50
│ │ │ │ -
51namespace Dune
│ │ │ │ -
52{
│ │ │ │ -
53 namespace RefinementImp
│ │ │ │ -
54 {
│ │ │ │ +
51 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
55 {
│ │ │ │ +
56 return ElementIterator(eBeginBack(tag));
│ │ │ │ +
57 }
│ │ │ │ +
│ │ │ │ +
58
│ │ │ │ +
59 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │
│ │ │ │ -
61 namespace HCube
│ │ │ │ -
62 {
│ │ │ │ -
72 template<int dimension_, class CoordType>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
74 {
│ │ │ │ -
75 public:
│ │ │ │ -
77 constexpr static int dimension = dimension_;
│ │ │ │ -
78 //- Know yourself
│ │ │ │ - │ │ │ │ -
80
│ │ │ │ -
81 template<int codimension>
│ │ │ │ -
82 struct Codim;
│ │ │ │ - │ │ │ │ -
84 typedef FieldVector<CoordType, dimension> CoordVector;
│ │ │ │ - │ │ │ │ -
86 typedef FieldVector<int, (1<<dimension)> IndexVector;
│ │ │ │ + │ │ │ │ + │ │ │ │ +
63 {
│ │ │ │ +
64 return ElementIterator(eEndBack(tag));
│ │ │ │ +
65 }
│ │ │ │ +
│ │ │ │ +
66
│ │ │ │ +
67 //
│ │ │ │ +
68 // The iterators
│ │ │ │ +
69 //
│ │ │ │ +
70
│ │ │ │ +
71 template<int dimension, class CoordType, int codimension>
│ │ │ │ + │ │ │ │ +
73
│ │ │ │ +
74 // The iterator for vertices
│ │ │ │ +
75 template<int dimension, class CoordType>
│ │ │ │ +
│ │ │ │ +
76 class VirtualRefinementSubEntityIteratorSpecial<dimension, CoordType, dimension>
│ │ │ │ +
77 {};
│ │ │ │ +
│ │ │ │ +
78
│ │ │ │ +
79 // The iterator for elements
│ │ │ │ +
80 template<int dimension, class CoordType>
│ │ │ │ +
│ │ │ │ +
81 class VirtualRefinementSubEntityIteratorSpecial<dimension, CoordType, 0>
│ │ │ │ +
82 {
│ │ │ │ +
83 public:
│ │ │ │ + │ │ │ │ +
85 typedef typename Refinement::template Codim<0>::SubEntityIterator Common;
│ │ │ │ +
86 typedef typename Refinement::IndexVector IndexVector;
│ │ │ │
87
│ │ │ │ -
88 static unsigned nVertices(unsigned nIntervals);
│ │ │ │ -
89 static VertexIterator vBegin(unsigned nIntervals);
│ │ │ │ -
90 static VertexIterator vEnd(unsigned nIntervals);
│ │ │ │ -
91
│ │ │ │ -
92 static unsigned nElements(unsigned nIntervals);
│ │ │ │ -
93 static ElementIterator eBegin(unsigned nIntervals);
│ │ │ │ -
94 static ElementIterator eEnd(unsigned nIntervals);
│ │ │ │ -
95 };
│ │ │ │ -
│ │ │ │ -
96
│ │ │ │ -
97 template<int dimension, class CoordType>
│ │ │ │ -
98 template<int codimension>
│ │ │ │ -
│ │ │ │ -
99 struct RefinementImp<dimension, CoordType>::Codim
│ │ │ │ -
100 {
│ │ │ │ -
101 class SubEntityIterator;
│ │ │ │ - │ │ │ │ -
103 };
│ │ │ │ -
│ │ │ │ -
104
│ │ │ │ -
105 template<int dimension, class CoordType>
│ │ │ │ -
106 unsigned
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
108 nVertices(unsigned nIntervals)
│ │ │ │ -
109 {
│ │ │ │ -
110 // return (nIntervals + 1)^dim
│ │ │ │ -
111 return Dune::power(nIntervals+1u, static_cast<unsigned>(dimension));
│ │ │ │ -
112 }
│ │ │ │ -
│ │ │ │ -
113
│ │ │ │ -
114 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
117 vBegin(unsigned nIntervals)
│ │ │ │ -
118 {
│ │ │ │ -
119 return VertexIterator(0,nIntervals);
│ │ │ │ -
120 }
│ │ │ │ -
│ │ │ │ -
121
│ │ │ │ -
122 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
125 vEnd(unsigned nIntervals)
│ │ │ │ -
126 {
│ │ │ │ -
127 return VertexIterator(nVertices(nIntervals),nIntervals);
│ │ │ │ -
128 }
│ │ │ │ -
│ │ │ │ -
129
│ │ │ │ -
130 template<int dimension, class CoordType>
│ │ │ │ -
131 unsigned
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
133 nElements(unsigned nIntervals)
│ │ │ │ -
134 {
│ │ │ │ -
135 static_assert(dimension >= 0,
│ │ │ │ -
136 "Negative dimension given, what the heck is that supposed to mean?");
│ │ │ │ -
137 // return nIntervals^dim
│ │ │ │ -
138 return Dune::power(nIntervals, static_cast<unsigned>(dimension));
│ │ │ │ -
139 }
│ │ │ │ -
│ │ │ │ -
140
│ │ │ │ -
141 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
144 eBegin(unsigned nIntervals)
│ │ │ │ -
145 {
│ │ │ │ -
146 return ElementIterator(0,nIntervals);
│ │ │ │ -
147 }
│ │ │ │ -
│ │ │ │ -
148
│ │ │ │ -
149 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
152 eEnd(unsigned nIntervals)
│ │ │ │ -
153 {
│ │ │ │ -
154 return ElementIterator(nElements(nIntervals),nIntervals);
│ │ │ │ -
155 }
│ │ │ │ -
│ │ │ │ -
156
│ │ │ │ -
157 //
│ │ │ │ -
158 // The iterators
│ │ │ │ -
159 //
│ │ │ │ -
160
│ │ │ │ -
161#ifdef DOXYGEN
│ │ │ │ -
173 template<int dimension, class CoordType, int codimension>
│ │ │ │ - │ │ │ │ -
175#else
│ │ │ │ -
176 template<int dimension, class CoordType, int codimension>
│ │ │ │ - │ │ │ │ -
178#endif //DOXYGEN
│ │ │ │ -
179
│ │ │ │ -
180 // for vertices
│ │ │ │ -
181
│ │ │ │ -
182 template<int dimension, class CoordType>
│ │ │ │ -
│ │ │ │ -
183 class RefinementSubEntityIteratorSpecial<dimension, CoordType, dimension>
│ │ │ │ -
184 {
│ │ │ │ -
185 public:
│ │ │ │ - │ │ │ │ -
187 typedef typename Refinement::template Codim<dimension>::SubEntityIterator Common;
│ │ │ │ -
188 typedef typename Refinement::CoordVector CoordVector;
│ │ │ │ -
189
│ │ │ │ -
190 CoordVector coords() const;
│ │ │ │ -
191
│ │ │ │ -
192 private:
│ │ │ │ -
193 const Common & asCommon() const
│ │ │ │ -
194 {
│ │ │ │ -
195 return *static_cast<const Common*>(this);
│ │ │ │ -
196 }
│ │ │ │ -
197 };
│ │ │ │ +
88 IndexVector vertexIndices() const;
│ │ │ │ +
89 };
│ │ │ │
│ │ │ │ +
90
│ │ │ │ +
91 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
94 vertexIndices() const
│ │ │ │ +
95 {
│ │ │ │ +
96 return static_cast<const Common *>(this)->backend->vertexIndices();
│ │ │ │ +
97 }
│ │ │ │ +
│ │ │ │ +
98
│ │ │ │ +
99 // The iterator common stuff
│ │ │ │ +
100 template<int dimension, class CoordType>
│ │ │ │ +
101 template<int codimension>
│ │ │ │ +
│ │ │ │ +
102 class VirtualRefinement<dimension, CoordType>::Codim<codimension>::SubEntityIterator
│ │ │ │ +
103 : public ForwardIteratorFacade<typename VirtualRefinement<dimension, CoordType>::template Codim<codimension>::SubEntityIterator, int>,
│ │ │ │ +
104 public VirtualRefinementSubEntityIteratorSpecial<dimension, CoordType, codimension>
│ │ │ │ +
105 {
│ │ │ │ +
106 public:
│ │ │ │ + │ │ │ │ +
108 typedef typename Refinement::template Codim<codimension>::SubEntityIterator This;
│ │ │ │ +
109 typedef typename Refinement::template SubEntityIteratorBack<codimension> IteratorBack;
│ │ │ │ +
110 typedef typename Refinement::CoordVector CoordVector;
│ │ │ │ +
111
│ │ │ │ + │ │ │ │ +
113 SubEntityIterator(const This &other);
│ │ │ │ + │ │ │ │ +
115
│ │ │ │ +
116 This &operator=(const This &other);
│ │ │ │ +
117
│ │ │ │ +
118 bool equals(const This &other) const;
│ │ │ │ +
119 void increment();
│ │ │ │ +
120
│ │ │ │ +
121 int index() const;
│ │ │ │ +
122
│ │ │ │ +
123 // If you simply use an unqualified CoordVector here g++-4.2 chokes
│ │ │ │ + │ │ │ │ +
125 CoordVector coords() const;
│ │ │ │ +
126 private:
│ │ │ │ +
127 friend class VirtualRefinementSubEntityIteratorSpecial<dimension, CoordType, codimension>;
│ │ │ │ +
128 IteratorBack *backend;
│ │ │ │ +
129 };
│ │ │ │ +
│ │ │ │ +
130
│ │ │ │ +
131#ifndef DOXYGEN
│ │ │ │ +
132 template<int dimension, class CoordType>
│ │ │ │ +
133 template<int codimension>
│ │ │ │ + │ │ │ │ +
135 SubEntityIterator(IteratorBack *backend_)
│ │ │ │ +
136 : backend(backend_)
│ │ │ │ +
137 {}
│ │ │ │ +
138
│ │ │ │ +
139 template<int dimension, class CoordType>
│ │ │ │ +
140 template<int codimension>
│ │ │ │ + │ │ │ │ +
142 SubEntityIterator(const This &other)
│ │ │ │ +
143 : backend(other.backend->clone())
│ │ │ │ +
144 {}
│ │ │ │ +
145
│ │ │ │ +
146 template<int dimension, class CoordType>
│ │ │ │ +
147 template<int codimension>
│ │ │ │ +
148 VirtualRefinement<dimension, CoordType>::Codim<codimension>::SubEntityIterator::
│ │ │ │ +
149 ~SubEntityIterator()
│ │ │ │ +
150 {
│ │ │ │ +
151 delete backend;
│ │ │ │ +
152 }
│ │ │ │ +
153
│ │ │ │ +
154 template<int dimension, class CoordType>
│ │ │ │ +
155 template<int codimension>
│ │ │ │ +
156 typename VirtualRefinement<dimension, CoordType>::template Codim<codimension>::SubEntityIterator &
│ │ │ │ +
157 VirtualRefinement<dimension, CoordType>::Codim<codimension>::SubEntityIterator::
│ │ │ │ +
158 operator=(const This &other)
│ │ │ │ +
159 {
│ │ │ │ +
160 delete backend;
│ │ │ │ +
161 backend = other.backend->clone();
│ │ │ │ +
162 }
│ │ │ │ +
163
│ │ │ │ +
164 template<int dimension, class CoordType>
│ │ │ │ +
165 template<int codimension>
│ │ │ │ +
166 bool
│ │ │ │ +
167 VirtualRefinement<dimension, CoordType>::Codim<codimension>::SubEntityIterator::
│ │ │ │ +
168 equals(const This &other) const
│ │ │ │ +
169 { return *backend == *(other.backend); }
│ │ │ │ +
170
│ │ │ │ +
171 template<int dimension, class CoordType>
│ │ │ │ +
172 template<int codimension>
│ │ │ │ +
173 void
│ │ │ │ +
174 VirtualRefinement<dimension, CoordType>::Codim<codimension>::SubEntityIterator::
│ │ │ │ +
175 increment()
│ │ │ │ +
176 {
│ │ │ │ +
177 ++*backend;
│ │ │ │ +
178 }
│ │ │ │ +
179
│ │ │ │ +
180 template<int dimension, class CoordType>
│ │ │ │ +
181 template<int codimension>
│ │ │ │ +
182 int
│ │ │ │ +
183 VirtualRefinement<dimension, CoordType>::Codim<codimension>::SubEntityIterator::
│ │ │ │ +
184 index() const
│ │ │ │ +
185 { return backend->index(); }
│ │ │ │ +
186
│ │ │ │ +
187 template<int dimension, class CoordType>
│ │ │ │ +
188 template<int codimension>
│ │ │ │ +
189 typename VirtualRefinement<dimension, CoordType>::template Codim<codimension>::SubEntityIterator::CoordVector
│ │ │ │ +
190 VirtualRefinement<dimension, CoordType>::Codim<codimension>::SubEntityIterator::
│ │ │ │ +
191 coords() const
│ │ │ │ +
192 { return backend->coords(); }
│ │ │ │ +
193#endif // DOXYGEN
│ │ │ │ +
194
│ │ │ │ +
195 //
│ │ │ │ +
196 // The iterator backend
│ │ │ │ +
197 //
│ │ │ │
198
│ │ │ │ -
199 template<int dimension, class CoordType>
│ │ │ │ -
200 typename RefinementSubEntityIteratorSpecial<dimension, CoordType, dimension>::CoordVector
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
202 coords() const
│ │ │ │ -
203 {
│ │ │ │ -
204 std::array<unsigned int, dimension> v(asCommon().vertexCoord());
│ │ │ │ -
205 CoordVector c;
│ │ │ │ -
206 for (int d = 0; d < dimension; d++)
│ │ │ │ -
207 {
│ │ │ │ -
208 c[d] = v[d]*1.0 / asCommon()._nIntervals;
│ │ │ │ -
209 }
│ │ │ │ -
210 return c;
│ │ │ │ -
211 }
│ │ │ │ -
│ │ │ │ -
212
│ │ │ │ -
213 // for elements
│ │ │ │ -
214
│ │ │ │ -
215 template<int dimension, class CoordType>
│ │ │ │ -
│ │ │ │ -
216 class RefinementSubEntityIteratorSpecial<dimension, CoordType, 0>
│ │ │ │ -
217 {
│ │ │ │ -
218 public:
│ │ │ │ - │ │ │ │ -
220 typedef typename Refinement::template Codim<0>::SubEntityIterator Common;
│ │ │ │ -
221 typedef typename Refinement::IndexVector IndexVector;
│ │ │ │ -
222 typedef typename Refinement::CoordVector CoordVector;
│ │ │ │ -
223
│ │ │ │ -
224 IndexVector vertexIndices() const;
│ │ │ │ -
225 CoordVector coords() const;
│ │ │ │ -
226
│ │ │ │ -
227 private:
│ │ │ │ -
228 const Common & asCommon() const
│ │ │ │ -
229 {
│ │ │ │ -
230 return *static_cast<const Common*>(this);
│ │ │ │ -
231 }
│ │ │ │ -
232 };
│ │ │ │ -
│ │ │ │ -
233
│ │ │ │ -
234 template<int dimension, class CoordType>
│ │ │ │ -
235 typename RefinementSubEntityIteratorSpecial<dimension, CoordType, 0>::IndexVector
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
237 vertexIndices() const
│ │ │ │ -
238 {
│ │ │ │ -
239 constexpr static int nIndices = 1 << dimension;
│ │ │ │ +
199 template<int dimension, class CoordType, int codimension>
│ │ │ │ + │ │ │ │ +
201
│ │ │ │ +
202 // The iterator backend for vertices
│ │ │ │ +
203 template<int dimension, class CoordType>
│ │ │ │ +
│ │ │ │ +
204 class VirtualRefinementSubEntityIteratorBackSpecial<dimension, CoordType, dimension>
│ │ │ │ +
205 {
│ │ │ │ +
206 public:
│ │ │ │ +
207
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
209 {}
│ │ │ │ +
│ │ │ │ +
210 };
│ │ │ │ +
│ │ │ │ +
211
│ │ │ │ +
212 // The iterator backend for elements
│ │ │ │ +
213 template<int dimension, class CoordType>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
215 {
│ │ │ │ +
216 public:
│ │ │ │ + │ │ │ │ +
218 typedef typename Refinement::IndexVector IndexVector;
│ │ │ │ +
219
│ │ │ │ +
220 virtual IndexVector vertexIndices() const = 0;
│ │ │ │ +
221
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
223 {}
│ │ │ │ +
│ │ │ │ +
224 };
│ │ │ │ +
│ │ │ │ +
225
│ │ │ │ +
226 // The iterator backend common stuff
│ │ │ │ +
227 template<int dimension, class CoordType>
│ │ │ │ +
228 template<int codimension>
│ │ │ │ +
│ │ │ │ +
229 class VirtualRefinement<dimension, CoordType>::SubEntityIteratorBack
│ │ │ │ +
230 : public VirtualRefinementSubEntityIteratorBackSpecial<dimension, CoordType, codimension>
│ │ │ │ +
231 {
│ │ │ │ +
232 public:
│ │ │ │ + │ │ │ │ +
234 typedef typename Refinement::template SubEntityIteratorBack<codimension> This;
│ │ │ │ +
235 typedef typename Refinement::CoordVector CoordVector;
│ │ │ │ +
236
│ │ │ │ + │ │ │ │ +
238
│ │ │ │ +
239 virtual This *clone() const = 0;
│ │ │ │
240
│ │ │ │ -
241 // cell index tuple
│ │ │ │ -
242 std::array<unsigned int, dimension> e(asCommon().cellCoord());
│ │ │ │ +
241 virtual bool operator==(const This &other) const = 0;
│ │ │ │ +
242 virtual This &operator++() = 0;
│ │ │ │
243
│ │ │ │ -
244 // vertices
│ │ │ │ -
245 IndexVector vec;
│ │ │ │ -
246 for(int i = 0; i < nIndices; ++i)
│ │ │ │ -
247 {
│ │ │ │ -
248 int base = 1;
│ │ │ │ -
249 std::array<unsigned int, dimension> alpha(asCommon().idx2multiidx(i));
│ │ │ │ -
250 for (int d = 0; d < dimension; d++) {
│ │ │ │ -
251 vec[i] += (alpha[d] + e[d]) * base;
│ │ │ │ -
252 base *= asCommon()._nIntervals+1;
│ │ │ │ -
253 }
│ │ │ │ -
254 }
│ │ │ │ -
255 return vec;
│ │ │ │ -
256 }
│ │ │ │ -
│ │ │ │ -
257
│ │ │ │ -
258 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
261 coords() const
│ │ │ │ -
262 {
│ │ │ │ -
263 std::array<unsigned int, dimension> v(asCommon().cellCoord());
│ │ │ │ -
264 CoordVector c;
│ │ │ │ -
265 for (int d=0; d<dimension; d++)
│ │ │ │ -
266 {
│ │ │ │ -
267 c[d] = (v[d]*1.0 + 0.5) / asCommon()._nIntervals;
│ │ │ │ -
268 }
│ │ │ │ -
269 return c;
│ │ │ │ -
270 }
│ │ │ │ -
│ │ │ │ -
271
│ │ │ │ -
272 // common
│ │ │ │ -
273 template<int dimension, class CoordType>
│ │ │ │ -
274 template<int codimension>
│ │ │ │ -
│ │ │ │ -
275 class RefinementImp<dimension, CoordType>::Codim<codimension>::SubEntityIterator
│ │ │ │ -
276 : public ForwardIteratorFacade<typename RefinementImp<dimension,
│ │ │ │ -
277 CoordType>::template Codim<codimension>::SubEntityIterator, int>,
│ │ │ │ -
278 public RefinementSubEntityIteratorSpecial<dimension, CoordType, codimension>
│ │ │ │ -
279 {
│ │ │ │ -
280 public:
│ │ │ │ - │ │ │ │ -
282 typedef typename Refinement::template Codim<codimension>::SubEntityIterator This;
│ │ │ │ -
283
│ │ │ │ -
284 SubEntityIterator(unsigned int index, unsigned int nIntervals);
│ │ │ │ -
285
│ │ │ │ -
286 bool equals(const This &other) const;
│ │ │ │ -
287 void increment();
│ │ │ │ -
288
│ │ │ │ -
289 int index() const;
│ │ │ │ -
290 Geometry geometry () const;
│ │ │ │ -
291 private:
│ │ │ │ -
292 friend class RefinementSubEntityIteratorSpecial<dimension, CoordType, codimension>;
│ │ │ │ -
293 unsigned int _index;
│ │ │ │ -
294 unsigned int _nIntervals;
│ │ │ │ -
295
│ │ │ │ -
296 std::array<unsigned int, dimension>
│ │ │ │ -
297 cellCoord(unsigned int idx) const
│ │ │ │ -
298 {
│ │ │ │ -
299 return idx2coord(idx, _nIntervals);
│ │ │ │ -
300 }
│ │ │ │ -
301
│ │ │ │ -
302 std::array<unsigned int, dimension>
│ │ │ │ -
303 vertexCoord(unsigned int idx) const
│ │ │ │ -
304 {
│ │ │ │ -
305 return idx2coord(idx, _nIntervals+1u);
│ │ │ │ -
306 }
│ │ │ │ -
307
│ │ │ │ -
308 std::array<unsigned int, dimension>
│ │ │ │ -
309 cellCoord() const
│ │ │ │ -
310 {
│ │ │ │ -
311 return cellCoord(_index);
│ │ │ │ -
312 }
│ │ │ │ -
313
│ │ │ │ -
314 std::array<unsigned int, dimension>
│ │ │ │ -
315 vertexCoord() const
│ │ │ │ -
316 {
│ │ │ │ -
317 return vertexCoord(_index);
│ │ │ │ -
318 }
│ │ │ │ -
319
│ │ │ │ -
320 std::array<unsigned int, dimension>
│ │ │ │ -
321 idx2coord(unsigned int idx, unsigned int w) const
│ │ │ │ -
322 {
│ │ │ │ -
323 std::array<unsigned int, dimension> c;
│ │ │ │ -
324 for (unsigned int d = 0; d < dimension; d++)
│ │ │ │ -
325 {
│ │ │ │ -
326 c[d] = idx%w;
│ │ │ │ -
327 idx = idx/w;
│ │ │ │ -
328 }
│ │ │ │ -
329 return c;
│ │ │ │ -
330 }
│ │ │ │ -
331
│ │ │ │ -
332 unsigned int
│ │ │ │ -
333 coord2idx(std::array<unsigned int, dimension> c, unsigned int w) const
│ │ │ │ -
334 {
│ │ │ │ -
335 unsigned int i = 0;
│ │ │ │ -
336 for (unsigned int d = dimension; d > 0; d--)
│ │ │ │ -
337 {
│ │ │ │ -
338 i *= w;
│ │ │ │ -
339 i += c[d-1];
│ │ │ │ -
340 }
│ │ │ │ -
341 return i;
│ │ │ │ -
342 }
│ │ │ │ -
343
│ │ │ │ -
344 std::array<unsigned int, dimension>
│ │ │ │ -
345 idx2multiidx(unsigned int idx) const
│ │ │ │ -
346 {
│ │ │ │ -
347 std::array<unsigned int, dimension> alpha;
│ │ │ │ -
348 for (unsigned int i = 0; i < dimension; ++i)
│ │ │ │ -
349 alpha[i] = (idx >> i) & 1u;
│ │ │ │ -
350 return alpha;
│ │ │ │ -
351 }
│ │ │ │ -
352 };
│ │ │ │ -
│ │ │ │ -
353
│ │ │ │ -
354#ifndef DOXYGEN
│ │ │ │ -
355 template<int dimension, class CoordType>
│ │ │ │ -
356 template<int codimension>
│ │ │ │ -
357 RefinementImp<dimension, CoordType>::Codim<codimension>::SubEntityIterator::
│ │ │ │ -
358 SubEntityIterator(unsigned int index, unsigned int nIntervals)
│ │ │ │ -
359 : _index(index), _nIntervals(nIntervals)
│ │ │ │ -
360 {}
│ │ │ │ -
361
│ │ │ │ -
362 template<int dimension, class CoordType>
│ │ │ │ -
363 template<int codimension>
│ │ │ │ -
364 bool
│ │ │ │ -
365 RefinementImp<dimension, CoordType>::Codim<codimension>::SubEntityIterator::
│ │ │ │ -
366 equals(const This &other) const
│ │ │ │ -
367 {
│ │ │ │ -
368 return ((_index == other._index) && (_nIntervals == other._nIntervals));
│ │ │ │ -
369 }
│ │ │ │ -
370
│ │ │ │ -
371 template<int dimension, class CoordType>
│ │ │ │ -
372 template<int codimension>
│ │ │ │ -
373 void
│ │ │ │ -
374 RefinementImp<dimension, CoordType>::Codim<codimension>::SubEntityIterator::
│ │ │ │ -
375 increment()
│ │ │ │ -
376 {
│ │ │ │ -
377 ++_index;
│ │ │ │ -
378 }
│ │ │ │ -
379
│ │ │ │ -
380 template<int dimension, class CoordType>
│ │ │ │ -
381 template<int codimension>
│ │ │ │ -
382 int
│ │ │ │ -
383 RefinementImp<dimension, CoordType>::Codim<codimension>::SubEntityIterator::
│ │ │ │ -
384 index() const
│ │ │ │ -
385 {
│ │ │ │ -
386 return _index;
│ │ │ │ -
387 }
│ │ │ │ -
388
│ │ │ │ -
389 template<int dimension, class CoordType>
│ │ │ │ -
390 template<int codimension>
│ │ │ │ -
391 typename RefinementImp<dimension, CoordType>::template Codim<codimension>::Geometry
│ │ │ │ -
392 RefinementImp<dimension, CoordType>::Codim<codimension>::SubEntityIterator::geometry () const
│ │ │ │ -
393 {
│ │ │ │ -
394 std::array<unsigned int,dimension> intCoords = idx2coord(_index,_nIntervals);
│ │ │ │ -
395
│ │ │ │ -
396 Dune::FieldVector<CoordType,dimension> lower;
│ │ │ │ -
397 Dune::FieldVector<CoordType,dimension> upper;
│ │ │ │ -
398
│ │ │ │ -
399 assert(codimension == 0 or codimension == dimension);
│ │ │ │ -
400
│ │ │ │ -
401 if constexpr (codimension == 0) {
│ │ │ │ -
402 for (size_t j = 0; j < dimension; j++)
│ │ │ │ -
403 {
│ │ │ │ -
404 lower[j] = double(intCoords[j]) / double(_nIntervals);
│ │ │ │ -
405 upper[j] = double(intCoords[j] + 1) / double(_nIntervals);
│ │ │ │ -
406 }
│ │ │ │ -
407
│ │ │ │ -
408 return typename RefinementImp<dimension,
│ │ │ │ -
409 CoordType>::template Codim<codimension>::Geometry(lower,upper);
│ │ │ │ -
410 } else {
│ │ │ │ -
411 for (size_t j = 0; j < dimension; j++)
│ │ │ │ -
412 lower[j] = upper[j] = double(intCoords[j]) / double(_nIntervals);
│ │ │ │ -
413
│ │ │ │ -
414 return typename RefinementImp<dimension,
│ │ │ │ -
415 CoordType>::template Codim<codimension>::Geometry(lower,upper,std::bitset<dimension>(0));
│ │ │ │ -
416 }
│ │ │ │ -
417 }
│ │ │ │ -
418
│ │ │ │ -
419#endif // DOXYGEN
│ │ │ │ -
420
│ │ │ │ -
421 } // namespace HCube
│ │ │ │ -
│ │ │ │ -
422
│ │ │ │ -
423 // ///////////////////////
│ │ │ │ -
424 //
│ │ │ │ -
425 // The refinement traits
│ │ │ │ -
426 //
│ │ │ │ +
244 virtual int index() const = 0;
│ │ │ │ +
245 virtual CoordVector coords() const = 0;
│ │ │ │ +
246 };
│ │ │ │ +
│ │ │ │ +
247
│ │ │ │ +
248 // /////////////////////////////////////////////////
│ │ │ │ +
249 //
│ │ │ │ +
250 // The derived classes and their iterator backends
│ │ │ │ +
251 //
│ │ │ │ +
252
│ │ │ │ +
253 //
│ │ │ │ +
254 // The refinement implementation
│ │ │ │ +
255 //
│ │ │ │ +
256
│ │ │ │ +
257 template<unsigned topologyId, class CoordType,
│ │ │ │ +
258 unsigned coerceToId, int dimension>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
260 : public Dune::VirtualRefinement<dimension, CoordType>
│ │ │ │ +
261 {
│ │ │ │ +
262 public:
│ │ │ │ + │ │ │ │ + │ │ │ │ +
265
│ │ │ │ +
266 template<int codimension>
│ │ │ │ + │ │ │ │ +
268
│ │ │ │ +
269 int nVertices(Dune::RefinementIntervals tag) const override;
│ │ │ │ +
270
│ │ │ │ +
271 int nElements(Dune::RefinementIntervals tag) const override;
│ │ │ │ +
272
│ │ │ │ + │ │ │ │ +
274 private:
│ │ │ │ + │ │ │ │ +
276
│ │ │ │ +
277 typename VirtualRefinement::VertexIteratorBack *vBeginBack(Dune::RefinementIntervals tag) const override;
│ │ │ │ +
278 typename VirtualRefinement::VertexIteratorBack *vEndBack(Dune::RefinementIntervals tag) const override;
│ │ │ │ +
279 typename VirtualRefinement::ElementIteratorBack *eBeginBack(Dune::RefinementIntervals tag) const override;
│ │ │ │ +
280 typename VirtualRefinement::ElementIteratorBack *eEndBack(Dune::RefinementIntervals tag) const override;
│ │ │ │ +
281 };
│ │ │ │ +
│ │ │ │ +
282
│ │ │ │ +
283 template<unsigned topologyId, class CoordType,
│ │ │ │ +
284 unsigned coerceToId, int dimension>
│ │ │ │ +
285 VirtualRefinementImp<topologyId, CoordType, coerceToId, dimension> &
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
287 {
│ │ │ │ +
288 static VirtualRefinementImp instance_{};
│ │ │ │ +
289 return instance_;
│ │ │ │ +
290 }
│ │ │ │ +
│ │ │ │ +
291
│ │ │ │ +
292 template<unsigned topologyId, class CoordType,
│ │ │ │ +
293 unsigned coerceToId, int dimension>
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
296 {
│ │ │ │ +
297 return StaticRefinement::nVertices(tag);
│ │ │ │ +
298 }
│ │ │ │ +
│ │ │ │ +
299
│ │ │ │ +
300 template<unsigned topologyId, class CoordType,
│ │ │ │ +
301 unsigned coerceToId, int dimension>
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
305 {
│ │ │ │ +
306 return new SubEntityIteratorBack<dimension>(StaticRefinement::vBegin(tag));
│ │ │ │ +
307 }
│ │ │ │ +
308
│ │ │ │ +
309 template<unsigned topologyId, class CoordType,
│ │ │ │ +
310 unsigned coerceToId, int dimension>
│ │ │ │ + │ │ │ │ +
312 VirtualRefinementImp<topologyId, CoordType, coerceToId, dimension>::
│ │ │ │ +
313 vEndBack(Dune::RefinementIntervals tag) const
│ │ │ │ +
314 {
│ │ │ │ +
315 return new SubEntityIteratorBack<dimension>(StaticRefinement::vEnd(tag));
│ │ │ │ +
316 }
│ │ │ │ +
317
│ │ │ │ +
318 template<unsigned topologyId, class CoordType,
│ │ │ │ +
319 unsigned coerceToId, int dimension>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
321 {
│ │ │ │ +
322 return StaticRefinement::nElements(tag);
│ │ │ │ +
323 }
│ │ │ │ +
│ │ │ │ +
324
│ │ │ │ +
325 template<unsigned topologyId, class CoordType,
│ │ │ │ +
326 unsigned coerceToId, int dimension>
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
330 {
│ │ │ │ +
331 return new SubEntityIteratorBack<0>(StaticRefinement::eBegin(tag));
│ │ │ │ +
332 }
│ │ │ │ +
333
│ │ │ │ +
334 template<unsigned topologyId, class CoordType,
│ │ │ │ +
335 unsigned coerceToId, int dimension>
│ │ │ │ + │ │ │ │ +
337 VirtualRefinementImp<topologyId, CoordType, coerceToId, dimension>::
│ │ │ │ +
338 eEndBack(Dune::RefinementIntervals tag) const
│ │ │ │ +
339 {
│ │ │ │ +
340 return new SubEntityIteratorBack<0>(StaticRefinement::eEnd(tag));
│ │ │ │ +
341 }
│ │ │ │ +
342
│ │ │ │ +
343 //
│ │ │ │ +
344 // The iterator backend implementation
│ │ │ │ +
345 //
│ │ │ │ +
346
│ │ │ │ +
347 // The iterator backend implementation specialties
│ │ │ │ +
348 template<unsigned topologyId, class CoordType,
│ │ │ │ +
349 unsigned coerceToId, int dimension, int codimension>
│ │ │ │ + │ │ │ │ +
351
│ │ │ │ +
352 // The iterator backend implementation specialties for vertices
│ │ │ │ +
353 template<unsigned topologyId, class CoordType,
│ │ │ │ +
354 unsigned coerceToId, int dimension>
│ │ │ │ +
│ │ │ │ +
355 class VirtualRefinementImpSubEntityIteratorBackSpecial<topologyId, CoordType, coerceToId, dimension, dimension>
│ │ │ │ +
356 : public VirtualRefinement<dimension, CoordType>::template SubEntityIteratorBack<dimension>
│ │ │ │ +
357 {};
│ │ │ │ +
│ │ │ │ +
358
│ │ │ │ +
359 // The iterator backend implementation specialties for elements
│ │ │ │ +
360
│ │ │ │ +
361 template<unsigned topologyId, class CoordType,
│ │ │ │ +
362 unsigned coerceToId, int dimension>
│ │ │ │ +
│ │ │ │ +
363 class VirtualRefinementImpSubEntityIteratorBackSpecial<topologyId, CoordType, coerceToId, dimension, 0>
│ │ │ │ +
364 : public VirtualRefinement<dimension, CoordType>::template SubEntityIteratorBack<0>
│ │ │ │ +
365 {
│ │ │ │ +
366 public:
│ │ │ │ + │ │ │ │ +
368 typedef typename VirtualRefinementImp::template SubEntityIteratorBack<0> Common;
│ │ │ │ + │ │ │ │ + │ │ │ │ +
371 typedef typename RefinementBase::IndexVector IndexVector;
│ │ │ │ +
372
│ │ │ │ +
373 IndexVector vertexIndices() const;
│ │ │ │ +
374 };
│ │ │ │ +
│ │ │ │ +
375
│ │ │ │ +
376 template<unsigned topologyId, class CoordType,
│ │ │ │ +
377 unsigned coerceToId, int dimension>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
380 vertexIndices() const
│ │ │ │ +
381 {
│ │ │ │ +
382 IndexVector vIndices;
│ │ │ │ +
383 vIndices.reserve(StaticRefinement::IndexVector::dimension);
│ │ │ │ +
384
│ │ │ │ +
385 typename StaticRefinement::IndexVector sIndices = static_cast<const Common *>(this)->backend.vertexIndices();
│ │ │ │ +
386 for(int i = 0; i < StaticRefinement::IndexVector::dimension; ++i)
│ │ │ │ +
387 vIndices.push_back(sIndices[i]);
│ │ │ │ +
388 return vIndices;
│ │ │ │ +
389 }
│ │ │ │ +
│ │ │ │ +
390
│ │ │ │ +
391 // The shared iterator backend implementation
│ │ │ │ +
392 template<unsigned topologyId, class CoordType,
│ │ │ │ +
393 unsigned coerceToId, int dimension>
│ │ │ │ +
394 template<int codimension>
│ │ │ │ +
│ │ │ │ +
395 class VirtualRefinementImp<topologyId, CoordType, coerceToId, dimension>::SubEntityIteratorBack
│ │ │ │ +
396 : public VirtualRefinementImpSubEntityIteratorBackSpecial<topologyId, CoordType, coerceToId, dimension, codimension>
│ │ │ │ +
397 {
│ │ │ │ +
398 public:
│ │ │ │ +
399 typedef typename StaticRefinement::template Codim<codimension>::SubEntityIterator BackendIterator;
│ │ │ │ + │ │ │ │ +
401 typedef typename VirtualRefinement::template SubEntityIteratorBack<codimension> Base;
│ │ │ │ + │ │ │ │ +
403
│ │ │ │ + │ │ │ │ +
405 SubEntityIteratorBack(const This &other);
│ │ │ │ +
406
│ │ │ │ +
407 Base *clone() const;
│ │ │ │ +
408
│ │ │ │ +
409 bool operator==(const Base &other) const;
│ │ │ │ +
410 Base &operator++();
│ │ │ │ +
411
│ │ │ │ +
412 int index() const;
│ │ │ │ +
413 CoordVector coords() const;
│ │ │ │ +
414
│ │ │ │ +
415 private:
│ │ │ │ +
416 friend class VirtualRefinementImpSubEntityIteratorBackSpecial<topologyId, CoordType, coerceToId, dimension, codimension>;
│ │ │ │ +
417 BackendIterator backend;
│ │ │ │ +
418 };
│ │ │ │ +
│ │ │ │ +
419
│ │ │ │ +
420 template<unsigned topologyId, class CoordType,
│ │ │ │ +
421 unsigned coerceToId, int dimension>
│ │ │ │ +
422 template<int codimension>
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
425 : backend(backend_)
│ │ │ │ +
426 {}
│ │ │ │ +
│ │ │ │
427
│ │ │ │ -
428#ifndef DOXYGEN
│ │ │ │ -
429 template<unsigned topologyId, class CoordType, unsigned coerceToId,
│ │ │ │ -
430 int dim>
│ │ │ │ -
431 struct Traits<
│ │ │ │ -
432 topologyId, CoordType, coerceToId, dim,
│ │ │ │ -
433 typename std::enable_if<
│ │ │ │ -
434 (dim >= 2 &&
│ │ │ │ -
435 (GeometryTypes::cube(dim).id() >> 1) ==
│ │ │ │ -
436 (topologyId >> 1) &&
│ │ │ │ -
437 (GeometryTypes::cube(dim).id() >> 1) ==
│ │ │ │ -
438 (coerceToId >> 1)
│ │ │ │ -
439 )>::type
│ │ │ │ -
440 >
│ │ │ │ -
441 {
│ │ │ │ -
442 typedef HCube::RefinementImp<dim, CoordType> Imp;
│ │ │ │ -
443 };
│ │ │ │ -
444#endif
│ │ │ │ -
445
│ │ │ │ -
446 } // namespace RefinementImp
│ │ │ │ -
447
│ │ │ │ -
448} // namespace Dune
│ │ │ │ -
449
│ │ │ │ -
450#endif // DUNE_GEOMETRY_REFINEMENT_HCUBE_CC
│ │ │ │ - │ │ │ │ -
This file contains the parts independent of a particular Refinement implementation.
│ │ │ │ -
A geometry implementation for axis-aligned hypercubes.
│ │ │ │ -
STL namespace.
│ │ │ │ +
428 template<unsigned topologyId, class CoordType,
│ │ │ │ +
429 unsigned coerceToId, int dimension>
│ │ │ │ +
430 template<int codimension>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
432 SubEntityIteratorBack(const This &other)
│ │ │ │ +
433 : VirtualRefinementImpSubEntityIteratorBackSpecial<topologyId, CoordType, coerceToId, dimension, codimension>(other),
│ │ │ │ +
434 backend(other.backend)
│ │ │ │ +
435 {}
│ │ │ │ +
│ │ │ │ +
436
│ │ │ │ +
437 template<unsigned topologyId, class CoordType, unsigned coerceToId, int dimension>
│ │ │ │ +
438 template<int codimension>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
441 clone() const
│ │ │ │ +
442 { return new This(*this); }
│ │ │ │ +
│ │ │ │ +
443
│ │ │ │ +
444 template<unsigned topologyId, class CoordType, unsigned coerceToId, int dimension>
│ │ │ │ +
445 template<int codimension>
│ │ │ │ +
446 bool
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
448 operator==(const Base &other) const
│ │ │ │ +
449 {
│ │ │ │ +
450 try {
│ │ │ │ +
451 return backend == dynamic_cast<const This &>(other).backend;
│ │ │ │ +
452 }
│ │ │ │ +
453 catch(const std::bad_cast&)
│ │ │ │ +
454 {
│ │ │ │ +
455 return false;
│ │ │ │ +
456 }
│ │ │ │ +
457 }
│ │ │ │ +
│ │ │ │ +
458
│ │ │ │ +
459 template<unsigned topologyId, class CoordType, unsigned coerceToId, int dimension>
│ │ │ │ +
460 template<int codimension>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ +
464 {
│ │ │ │ +
465 ++backend;
│ │ │ │ +
466 return *this;
│ │ │ │ +
467 }
│ │ │ │ +
│ │ │ │ +
468
│ │ │ │ +
469 template<unsigned topologyId, class CoordType, unsigned coerceToId, int dimension>
│ │ │ │ +
470 template<int codimension>
│ │ │ │ +
471 int
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
473 index() const
│ │ │ │ +
474 { return backend.index(); }
│ │ │ │ +
│ │ │ │ +
475
│ │ │ │ +
476 template<unsigned topologyId, class CoordType, unsigned coerceToId, int dimension>
│ │ │ │ +
477 template<int codimension>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
480 coords() const
│ │ │ │ +
481 { return backend.coords(); }
│ │ │ │ +
│ │ │ │ +
482
│ │ │ │ +
483 // ////////////////////////
│ │ │ │ +
484 //
│ │ │ │ +
485 // The refinement builder
│ │ │ │ +
486 //
│ │ │ │ +
487
│ │ │ │ +
488 template<int dimension, class CoordType>
│ │ │ │ +
489 class RefinementBuilder;
│ │ │ │ +
490
│ │ │ │ +
501 template<int dimension, class CoordType>
│ │ │ │ + │ │ │ │ +
│ │ │ │ + │ │ │ │ +
504 GeometryType geometryType,
│ │ │ │ +
506 GeometryType coerceTo)
│ │ │ │ +
507 {
│ │ │ │ +
508 // Check that the user used valid geometry types
│ │ │ │ +
509 assert(geometryType.dim() == dimension && coerceTo.dim() == dimension);
│ │ │ │ +
510 return RefinementBuilder<dimension, CoordType>::build( geometryType.id(), coerceTo.id() );
│ │ │ │ +
511 }
│ │ │ │ +
│ │ │ │ +
512
│ │ │ │ +
513 // In principle the trick with the class is no longer necessary,
│ │ │ │ +
514 // but I'm keeping it in here so it will be easier to specialize
│ │ │ │ +
515 // buildRefinement when someone implements pyramids and prisms
│ │ │ │ +
516 template<int dimension, class CoordType>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
518 {
│ │ │ │ +
519 public:
│ │ │ │ +
520 static
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
522 build(unsigned topologyId, unsigned coerceToId)
│ │ │ │ +
523 {
│ │ │ │ +
524 topologyId &= ~1;
│ │ │ │ +
525 coerceToId &= ~1;
│ │ │ │ +
526
│ │ │ │ +
527 constexpr unsigned idSimplex = GeometryTypes::simplex(dimension).id() & ~1;
│ │ │ │ +
528 constexpr unsigned idCube = GeometryTypes::cube(dimension).id() & ~1;
│ │ │ │ +
529
│ │ │ │ +
530 switch( topologyId )
│ │ │ │ +
531 {
│ │ │ │ +
532 //case GeometryType::simplex:
│ │ │ │ +
533 case idSimplex :
│ │ │ │ +
534 //switch( coerceTo )
│ │ │ │ +
535 switch( coerceToId )
│ │ │ │ +
536 {
│ │ │ │ +
537 //case GeometryType::simplex:
│ │ │ │ +
538 case idSimplex :
│ │ │ │ + │ │ │ │ +
540 default :
│ │ │ │ +
541 break;
│ │ │ │ +
542 }
│ │ │ │ +
543 break;
│ │ │ │ +
544
│ │ │ │ +
545 //case GeometryType::cube:
│ │ │ │ +
546 case idCube :
│ │ │ │ +
547 switch( coerceToId )
│ │ │ │ +
548 {
│ │ │ │ +
549 case idSimplex :
│ │ │ │ + │ │ │ │ +
551 case idCube :
│ │ │ │ + │ │ │ │ +
553 default :
│ │ │ │ +
554 break;
│ │ │ │ +
555 }
│ │ │ │ +
556 break;
│ │ │ │ +
557
│ │ │ │ +
558 default :
│ │ │ │ +
559 break;
│ │ │ │ +
560 }
│ │ │ │ +
561 DUNE_THROW( NotImplemented, "No Refinement<" << topologyId << ", CoordType, "
│ │ │ │ +
562 << coerceToId << " >.");
│ │ │ │ +
563 }
│ │ │ │ +
│ │ │ │ +
564 };
│ │ │ │ +
│ │ │ │ +
565
│ │ │ │ +
566 template<class CoordType>
│ │ │ │ +
│ │ │ │ +
567 class RefinementBuilder<1, CoordType>
│ │ │ │ +
568 {
│ │ │ │ +
569 static const std::size_t dimension = 1;
│ │ │ │ +
570 public:
│ │ │ │ +
571 static
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
573 build(unsigned topologyId, unsigned coerceToId)
│ │ │ │ +
574 {
│ │ │ │ +
575 topologyId &= ~1;
│ │ │ │ +
576 coerceToId &= ~1;
│ │ │ │ +
577
│ │ │ │ +
578 constexpr unsigned idSimplex = GeometryTypes::simplex(dimension).id() & ~1;
│ │ │ │ +
579
│ │ │ │ +
580 if (topologyId == 0 && coerceToId == 0)
│ │ │ │ + │ │ │ │ +
582
│ │ │ │ +
583 DUNE_THROW( NotImplemented, "No Refinement<" << topologyId << ", CoordType, "
│ │ │ │ +
584 << coerceToId << " >.");
│ │ │ │ +
585 }
│ │ │ │ +
│ │ │ │ +
586 };
│ │ │ │ +
│ │ │ │ +
587
│ │ │ │ +
588 template<class CoordType>
│ │ │ │ +
│ │ │ │ +
589 class RefinementBuilder<3, CoordType>
│ │ │ │ +
590 {
│ │ │ │ +
591 static const std::size_t dimension = 3;
│ │ │ │ +
592 public:
│ │ │ │ +
593 static
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
595 build(unsigned topologyId, unsigned coerceToId)
│ │ │ │ +
596 {
│ │ │ │ +
597 topologyId &= ~1;
│ │ │ │ +
598 coerceToId &= ~1;
│ │ │ │ +
599
│ │ │ │ +
600 constexpr unsigned idSimplex = GeometryTypes::simplex(dimension).id() & ~1;
│ │ │ │ +
601 constexpr unsigned idCube = GeometryTypes::cube(dimension).id() & ~1;
│ │ │ │ +
602 constexpr unsigned idPrism = GeometryTypes::prism.id() & ~1;
│ │ │ │ +
603 constexpr unsigned idPyramid = GeometryTypes::pyramid.id() & ~1;
│ │ │ │ +
604
│ │ │ │ +
605 switch( topologyId )
│ │ │ │ +
606 {
│ │ │ │ +
607 //case GeometryType::simplex:
│ │ │ │ +
608 case idSimplex :
│ │ │ │ +
609 //switch( coerceTo )
│ │ │ │ +
610 switch( coerceToId )
│ │ │ │ +
611 {
│ │ │ │ +
612 //case GeometryType::simplex:
│ │ │ │ +
613 case idSimplex :
│ │ │ │ + │ │ │ │ +
615 default :
│ │ │ │ +
616 break;
│ │ │ │ +
617 }
│ │ │ │ +
618 break;
│ │ │ │ +
619
│ │ │ │ +
620 //case GeometryType::cube:
│ │ │ │ +
621 case idCube :
│ │ │ │ +
622 switch( coerceToId )
│ │ │ │ +
623 {
│ │ │ │ +
624 case idSimplex :
│ │ │ │ + │ │ │ │ +
626 case idCube :
│ │ │ │ + │ │ │ │ +
628 default :
│ │ │ │ +
629 break;
│ │ │ │ +
630 }
│ │ │ │ +
631 break;
│ │ │ │ +
632
│ │ │ │ +
633 //case GeometryType::prism:
│ │ │ │ +
634 case idPrism :
│ │ │ │ +
635 switch( coerceToId )
│ │ │ │ +
636 {
│ │ │ │ +
637 case idSimplex :
│ │ │ │ + │ │ │ │ +
639 default :
│ │ │ │ +
640 break;
│ │ │ │ +
641 }
│ │ │ │ +
642 break;
│ │ │ │ +
643
│ │ │ │ +
644 //case GeometryType::pyramid:
│ │ │ │ +
645 case idPyramid :
│ │ │ │ +
646 switch( coerceToId )
│ │ │ │ +
647 {
│ │ │ │ +
648 case idSimplex :
│ │ │ │ + │ │ │ │ +
650 default :
│ │ │ │ +
651 break;
│ │ │ │ +
652 }
│ │ │ │ +
653 break;
│ │ │ │ +
654
│ │ │ │ +
655 default :
│ │ │ │ +
656 break;
│ │ │ │ +
657 }
│ │ │ │ +
658 DUNE_THROW( NotImplemented, "No Refinement<" << topologyId << ", CoordType, "
│ │ │ │ +
659 << coerceToId << " >.");
│ │ │ │ +
660 }
│ │ │ │ +
│ │ │ │ +
661 };
│ │ │ │ +
│ │ │ │ +
662
│ │ │ │ +
663} // namespace Dune
│ │ │ │ +
664
│ │ │ │ +
665#endif // DUNE_GEOMETRY_VIRTUALREFINEMENT_CC
│ │ │ │ +
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.
│ │ │ │
Definition affinegeometry.hh:21
│ │ │ │ -
A geometry implementation for axis-aligned hypercubes.
Definition axisalignedcubegeometry.hh:50
│ │ │ │ +
VirtualRefinement< dimension, CoordType > & buildRefinement(GeometryType geometryType, GeometryType coerceTo)
return a reference to the VirtualRefinement according to the parameters
Definition virtualrefinement.cc:503
│ │ │ │
Static tag representing a codimension.
Definition dimension.hh:24
│ │ │ │ -
Refinement implementation for hypercubes
Definition hcube.cc:74
│ │ │ │ -
Codim< 0 >::SubEntityIterator ElementIterator
Definition hcube.cc:85
│ │ │ │ -
static ElementIterator eEnd(unsigned nIntervals)
Definition hcube.cc:152
│ │ │ │ -
static unsigned nVertices(unsigned nIntervals)
Definition hcube.cc:108
│ │ │ │ -
static VertexIterator vEnd(unsigned nIntervals)
Definition hcube.cc:125
│ │ │ │ -
FieldVector< int,(1<< dimension)> IndexVector
Definition hcube.cc:86
│ │ │ │ -
Codim< dimension >::SubEntityIterator VertexIterator
Definition hcube.cc:83
│ │ │ │ -
FieldVector< CoordType, dimension > CoordVector
Definition hcube.cc:84
│ │ │ │ -
static unsigned nElements(unsigned nIntervals)
Definition hcube.cc:133
│ │ │ │ -
RefinementImp< dimension, CoordType > Refinement
Definition hcube.cc:79
│ │ │ │ -
static ElementIterator eBegin(unsigned nIntervals)
Definition hcube.cc:144
│ │ │ │ -
static constexpr int dimension
Know your own dimension.
Definition hcube.cc:77
│ │ │ │ -
static VertexIterator vBegin(unsigned nIntervals)
Definition hcube.cc:117
│ │ │ │ - │ │ │ │ -
Dune::AxisAlignedCubeGeometry< CoordType, dimension-codimension, dimension > Geometry
Definition hcube.cc:102
│ │ │ │ -
SubEntityIterator base class for hypercube refinement.
Definition hcube.cc:174
│ │ │ │ - │ │ │ │ -
Refinement::template Codim< dimension >::SubEntityIterator Common
Definition hcube.cc:187
│ │ │ │ - │ │ │ │ -
RefinementImp< dimension, CoordType > Refinement
Definition hcube.cc:219
│ │ │ │ -
Refinement::template Codim< 0 >::SubEntityIterator Common
Definition hcube.cc:220
│ │ │ │ - │ │ │ │ - │ │ │ │ -
SubEntityIterator(unsigned int index, unsigned int nIntervals)
│ │ │ │ - │ │ │ │ - │ │ │ │ -
RefinementImp< dimension, CoordType > Refinement
Definition hcube.cc:281
│ │ │ │ - │ │ │ │ - │ │ │ │ -
Refinement::template Codim< codimension >::SubEntityIterator This
Definition hcube.cc:282
│ │ │ │ +
Holds the number of refined intervals per axis needed for virtual and static refinement.
Definition base.cc:94
│ │ │ │ +
Wrap each Refinement implementation to get a consistent interface.
Definition base.cc:141
│ │ │ │ +
static ElementIterator eEnd(Dune::RefinementIntervals tag)
Get an ElementIterator.
Definition base.cc:247
│ │ │ │ +
static ElementIterator eBegin(Dune::RefinementIntervals tag)
Get an ElementIterator.
Definition base.cc:237
│ │ │ │ +
static int nElements(Dune::RefinementIntervals tag)
Get the number of Elements.
Definition base.cc:227
│ │ │ │ +
static int nVertices(Dune::RefinementIntervals tag)
Get the number of Vertices.
Definition base.cc:197
│ │ │ │ +
static VertexIterator vBegin(Dune::RefinementIntervals tag)
Get a VertexIterator.
Definition base.cc:207
│ │ │ │ +
typedef IndexVector
The IndexVector of the Refinement.
Definition base.cc:177
│ │ │ │ +
static VertexIterator vEnd(Dune::RefinementIntervals tag)
Get a VertexIterator.
Definition base.cc:217
│ │ │ │ +
Unique label for each type of entities that can occur in DUNE grids.
Definition type.hh:114
│ │ │ │ +
constexpr unsigned int dim() const
Return dimension of the type.
Definition type.hh:360
│ │ │ │ +
constexpr unsigned int id() const
Return the topology id of the type.
Definition type.hh:365
│ │ │ │ +
Definition virtualrefinement.cc:72
│ │ │ │ +
Refinement::template Codim< 0 >::SubEntityIterator Common
Definition virtualrefinement.cc:85
│ │ │ │ +
VirtualRefinement< dimension, CoordType > Refinement
Definition virtualrefinement.cc:84
│ │ │ │ +
Refinement::IndexVector IndexVector
Definition virtualrefinement.cc:86
│ │ │ │ +
VirtualRefinement< dimension, CoordType >::template Codim< codimension >::SubEntityIterator::CoordVector coords() const
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
Refinement::template SubEntityIteratorBack< codimension > IteratorBack
Definition virtualrefinement.cc:109
│ │ │ │ +
Refinement::CoordVector CoordVector
Definition virtualrefinement.cc:110
│ │ │ │ +
Refinement::template Codim< codimension >::SubEntityIterator This
Definition virtualrefinement.cc:108
│ │ │ │ +
bool equals(const This &other) const
│ │ │ │ +
VirtualRefinement< dimension, CoordType > Refinement
Definition virtualrefinement.cc:107
│ │ │ │ + │ │ │ │ +
Definition virtualrefinement.cc:200
│ │ │ │ +
virtual ~VirtualRefinementSubEntityIteratorBackSpecial()
Definition virtualrefinement.cc:208
│ │ │ │ + │ │ │ │ +
VirtualRefinement< dimension, CoordType > Refinement
Definition virtualrefinement.cc:217
│ │ │ │ +
Refinement::IndexVector IndexVector
Definition virtualrefinement.cc:218
│ │ │ │ +
virtual ~VirtualRefinementSubEntityIteratorBackSpecial()
Definition virtualrefinement.cc:222
│ │ │ │ +
Definition virtualrefinement.cc:231
│ │ │ │ + │ │ │ │ +
Refinement::template SubEntityIteratorBack< codimension > This
Definition virtualrefinement.cc:234
│ │ │ │ + │ │ │ │ +
Refinement::CoordVector CoordVector
Definition virtualrefinement.cc:235
│ │ │ │ +
VirtualRefinement< dimension, CoordType > Refinement
Definition virtualrefinement.cc:233
│ │ │ │ +
virtual bool operator==(const This &other) const =0
│ │ │ │ +
virtual CoordVector coords() const =0
│ │ │ │ +
virtual ~SubEntityIteratorBack()
Definition virtualrefinement.cc:237
│ │ │ │ + │ │ │ │ +
Definition virtualrefinement.cc:261
│ │ │ │ +
int nVertices(Dune::RefinementIntervals tag) const override
Get the number of Vertices.
Definition virtualrefinement.cc:295
│ │ │ │ +
int nElements(Dune::RefinementIntervals tag) const override
Get the number of Elements.
Definition virtualrefinement.cc:320
│ │ │ │ +
Dune::VirtualRefinement< dimension, CoordType > VirtualRefinement
Definition virtualrefinement.cc:264
│ │ │ │ +
static VirtualRefinementImp< topologyId, CoordType, coerceToId, dimension > & instance()
Definition virtualrefinement.cc:286
│ │ │ │ +
Dune::StaticRefinement< topologyId, CoordType, coerceToId, dimension > StaticRefinement
Definition virtualrefinement.cc:263
│ │ │ │ +
Definition virtualrefinement.cc:397
│ │ │ │ +
VirtualRefinement::template SubEntityIteratorBack< codimension > Base
Definition virtualrefinement.cc:401
│ │ │ │ +
VirtualRefinementImp< topologyId, CoordType, coerceToId, dimension >::template SubEntityIteratorBack< codimension > This
Definition virtualrefinement.cc:400
│ │ │ │ +
StaticRefinement::template Codim< codimension >::SubEntityIterator BackendIterator
Definition virtualrefinement.cc:399
│ │ │ │ +
VirtualRefinement::CoordVector CoordVector
Definition virtualrefinement.cc:402
│ │ │ │ + │ │ │ │ +
VirtualRefinementImp::template SubEntityIteratorBack< 0 > Common
Definition virtualrefinement.cc:368
│ │ │ │ + │ │ │ │ +
VirtualRefinement< dimension, CoordType > RefinementBase
Definition virtualrefinement.cc:370
│ │ │ │ +
Dune::VirtualRefinementImp< topologyId, CoordType, coerceToId, dimension > VirtualRefinementImp
Definition virtualrefinement.cc:367
│ │ │ │ +
VirtualRefinementImp::StaticRefinement StaticRefinement
Definition virtualrefinement.cc:369
│ │ │ │ +
Definition virtualrefinement.cc:518
│ │ │ │ +
static VirtualRefinement< dimension, CoordType > & build(unsigned topologyId, unsigned coerceToId)
Definition virtualrefinement.cc:522
│ │ │ │ +
static VirtualRefinement< dimension, CoordType > & build(unsigned topologyId, unsigned coerceToId)
Definition virtualrefinement.cc:573
│ │ │ │ +
static VirtualRefinement< dimension, CoordType > & build(unsigned topologyId, unsigned coerceToId)
Definition virtualrefinement.cc:595
│ │ │ │ +
VirtualRefinement base class.
Definition virtualrefinement.hh:283
│ │ │ │ +
SubEntityIteratorBack< dimension > VertexIteratorBack
Definition virtualrefinement.hh:307
│ │ │ │ +
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
│ │ │ │ +
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:290
│ │ │ │ +
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:297
│ │ │ │ +
Codim< dimension >::SubEntityIterator VertexIterator
The VertexIterator of the VirtualRefinement.
Definition virtualrefinement.hh:288
│ │ │ │ +
SubEntityIteratorBack< 0 > ElementIteratorBack
Definition virtualrefinement.hh:308
│ │ │ │ +
codim database of VirtualRefinement
Definition virtualrefinement.hh:367
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,529 +1,1002 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ - * _r_e_f_i_n_e_m_e_n_t │ │ │ │ │ -hcube.cc │ │ │ │ │ +virtualrefinement.cc │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 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 © 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_HCUBE_CC │ │ │ │ │ -_6#define DUNE_GEOMETRY_REFINEMENT_HCUBE_CC │ │ │ │ │ -7 │ │ │ │ │ -41#include │ │ │ │ │ +5 │ │ │ │ │ +6#ifndef DUNE_GEOMETRY_VIRTUALREFINEMENT_CC │ │ │ │ │ +_7#define DUNE_GEOMETRY_VIRTUALREFINEMENT_CC │ │ │ │ │ +8 │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16 │ │ │ │ │ +17#include │ │ │ │ │ +18#include │ │ │ │ │ +19#include │ │ │ │ │ +20 │ │ │ │ │ +21#include "_t_y_p_e_._h_h" │ │ │ │ │ +22#include "_r_e_f_i_n_e_m_e_n_t_._h_h" │ │ │ │ │ +23 │ │ │ │ │ +24namespace _D_u_n_e │ │ │ │ │ +25{ │ │ │ │ │ +26 // ////////////////////////////////////////// │ │ │ │ │ +27 // │ │ │ │ │ +28 // The virtual base class and its iterators │ │ │ │ │ +29 // │ │ │ │ │ +30 │ │ │ │ │ +31 // │ │ │ │ │ +32 // Refinement │ │ │ │ │ +33 // │ │ │ │ │ +34 │ │ │ │ │ +35 template │ │ │ │ │ +36 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ +_3_7 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +38_ _v_B_e_g_i_n(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const │ │ │ │ │ +39 { │ │ │ │ │ +40 return _V_e_r_t_e_x_I_t_e_r_a_t_o_r(vBeginBack(tag)); │ │ │ │ │ +41 } │ │ │ │ │ 42 │ │ │ │ │ -43#include │ │ │ │ │ -44#include │ │ │ │ │ -45 │ │ │ │ │ -46#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ -47#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_a_x_i_s_a_l_i_g_n_e_d_c_u_b_e_g_e_o_m_e_t_r_y_._h_h> │ │ │ │ │ -48 │ │ │ │ │ -49#include "_b_a_s_e_._c_c" // for RefinementTraits │ │ │ │ │ +43 template │ │ │ │ │ +44 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ +_4_5 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +46_ _v_E_n_d(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const │ │ │ │ │ +47 { │ │ │ │ │ +48 return _V_e_r_t_e_x_I_t_e_r_a_t_o_r(vEndBack(tag)); │ │ │ │ │ +49 } │ │ │ │ │ 50 │ │ │ │ │ -51namespace _D_u_n_e │ │ │ │ │ -52{ │ │ │ │ │ -53 namespace RefinementImp │ │ │ │ │ -54 { │ │ │ │ │ -_6_1 namespace HCube │ │ │ │ │ -62 { │ │ │ │ │ -72 template │ │ │ │ │ -_7_3 class _R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ -74 { │ │ │ │ │ -75 public: │ │ │ │ │ -_7_7 constexpr static int _d_i_m_e_n_s_i_o_n = dimension_; │ │ │ │ │ -78 //- Know yourself │ │ │ │ │ -_7_9 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -80 │ │ │ │ │ -81 template │ │ │ │ │ -82 struct _C_o_d_i_m; │ │ │ │ │ -_8_3 typedef typename _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _V_e_r_t_e_x_I_t_e_r_a_t_o_r; │ │ │ │ │ -_8_4 typedef FieldVector _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ -_8_5 typedef typename _C_o_d_i_m_<_0_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r; │ │ │ │ │ -_8_6 typedef FieldVector _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ +51 template │ │ │ │ │ +52 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ +_5_3 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +54_ _e_B_e_g_i_n(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const │ │ │ │ │ +55 { │ │ │ │ │ +56 return _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r(eBeginBack(tag)); │ │ │ │ │ +57 } │ │ │ │ │ +58 │ │ │ │ │ +59 template │ │ │ │ │ +60 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ +_6_1 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ +62_ _e_E_n_d(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const │ │ │ │ │ +63 { │ │ │ │ │ +64 return _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r(eEndBack(tag)); │ │ │ │ │ +65 } │ │ │ │ │ +66 │ │ │ │ │ +67 // │ │ │ │ │ +68 // The iterators │ │ │ │ │ +69 // │ │ │ │ │ +70 │ │ │ │ │ +71 template │ │ │ │ │ +_7_2 class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l; │ │ │ │ │ +73 │ │ │ │ │ +74 // The iterator for vertices │ │ │ │ │ +75 template │ │ │ │ │ +_7_6 class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ +77 {}; │ │ │ │ │ +78 │ │ │ │ │ +79 // The iterator for elements │ │ │ │ │ +80 template │ │ │ │ │ +_8_1 class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ +82 { │ │ │ │ │ +83 public: │ │ │ │ │ +_8_4 typedef _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +_8_5 typedef typename Refinement::template _C_o_d_i_m_<_0_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _C_o_m_m_o_n; │ │ │ │ │ +_8_6 typedef typename Refinement::IndexVector _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ 87 │ │ │ │ │ -88 static unsigned _n_V_e_r_t_i_c_e_s(unsigned nIntervals); │ │ │ │ │ -89 static _V_e_r_t_e_x_I_t_e_r_a_t_o_r _v_B_e_g_i_n(unsigned nIntervals); │ │ │ │ │ -90 static _V_e_r_t_e_x_I_t_e_r_a_t_o_r _v_E_n_d(unsigned nIntervals); │ │ │ │ │ -91 │ │ │ │ │ -92 static unsigned _n_E_l_e_m_e_n_t_s(unsigned nIntervals); │ │ │ │ │ -93 static _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r _e_B_e_g_i_n(unsigned nIntervals); │ │ │ │ │ -94 static _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r _e_E_n_d(unsigned nIntervals); │ │ │ │ │ -95 }; │ │ │ │ │ -96 │ │ │ │ │ -97 template │ │ │ │ │ -98 template │ │ │ │ │ -_9_9 struct _R_e_f_i_n_e_m_e_n_t_I_m_p::_C_o_d_i_m │ │ │ │ │ -100 { │ │ │ │ │ -101 class SubEntityIterator; │ │ │ │ │ -_1_0_2 typedef _D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y _G_e_o_m_e_t_r_y; │ │ │ │ │ -103 }; │ │ │ │ │ -104 │ │ │ │ │ -105 template │ │ │ │ │ -106 unsigned │ │ │ │ │ -_1_0_7 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -108_ _n_V_e_r_t_i_c_e_s(unsigned nIntervals) │ │ │ │ │ -109 { │ │ │ │ │ -110 // return (nIntervals + 1)^dim │ │ │ │ │ -111 return Dune::power(nIntervals+1u, static_cast(dimension)); │ │ │ │ │ -112 } │ │ │ │ │ -113 │ │ │ │ │ -114 template │ │ │ │ │ -115 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ -_1_1_6 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -117_ _v_B_e_g_i_n(unsigned nIntervals) │ │ │ │ │ -118 { │ │ │ │ │ -119 return _V_e_r_t_e_x_I_t_e_r_a_t_o_r(0,nIntervals); │ │ │ │ │ -120 } │ │ │ │ │ -121 │ │ │ │ │ -122 template │ │ │ │ │ -123 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ -_1_2_4 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -125_ _v_E_n_d(unsigned nIntervals) │ │ │ │ │ -126 { │ │ │ │ │ -127 return _V_e_r_t_e_x_I_t_e_r_a_t_o_r(nVertices(nIntervals),nIntervals); │ │ │ │ │ -128 } │ │ │ │ │ -129 │ │ │ │ │ -130 template │ │ │ │ │ -131 unsigned │ │ │ │ │ -_1_3_2 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -133_ _n_E_l_e_m_e_n_t_s(unsigned nIntervals) │ │ │ │ │ -134 { │ │ │ │ │ -135 static_assert(dimension >= 0, │ │ │ │ │ -136 "Negative dimension given, what the heck is that supposed to mean?"); │ │ │ │ │ -137 // return nIntervals^dim │ │ │ │ │ -138 return Dune::power(nIntervals, static_cast(dimension)); │ │ │ │ │ -139 } │ │ │ │ │ -140 │ │ │ │ │ -141 template │ │ │ │ │ -142 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ -_1_4_3 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -144_ _e_B_e_g_i_n(unsigned nIntervals) │ │ │ │ │ -145 { │ │ │ │ │ -146 return _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r(0,nIntervals); │ │ │ │ │ -147 } │ │ │ │ │ -148 │ │ │ │ │ -149 template │ │ │ │ │ -150 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ -_1_5_1 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -152_ _e_E_n_d(unsigned nIntervals) │ │ │ │ │ -153 { │ │ │ │ │ -154 return _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r(nElements(nIntervals),nIntervals); │ │ │ │ │ -155 } │ │ │ │ │ -156 │ │ │ │ │ -157 // │ │ │ │ │ -158 // The iterators │ │ │ │ │ -159 // │ │ │ │ │ -160 │ │ │ │ │ -161#ifdef DOXYGEN │ │ │ │ │ -173 template │ │ │ │ │ -_1_7_4 class _R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l {}; │ │ │ │ │ -175#else │ │ │ │ │ -176 template │ │ │ │ │ -177 class _R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l; │ │ │ │ │ -178#endif //DOXYGEN │ │ │ │ │ -179 │ │ │ │ │ -180 // for vertices │ │ │ │ │ -181 │ │ │ │ │ -182 template │ │ │ │ │ -_1_8_3 class _R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ -184 { │ │ │ │ │ -185 public: │ │ │ │ │ -_1_8_6 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -_1_8_7 typedef typename Refinement::template _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ -_C_o_m_m_o_n; │ │ │ │ │ -_1_8_8 typedef typename Refinement::CoordVector _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ -189 │ │ │ │ │ -190 _C_o_o_r_d_V_e_c_t_o_r coords() const; │ │ │ │ │ -191 │ │ │ │ │ -192 private: │ │ │ │ │ -193 const _C_o_m_m_o_n & asCommon() const │ │ │ │ │ -194 { │ │ │ │ │ -195 return *static_cast(this); │ │ │ │ │ -196 } │ │ │ │ │ -197 }; │ │ │ │ │ -198 │ │ │ │ │ -199 template │ │ │ │ │ -200 typename RefinementSubEntityIteratorSpecial::CoordVector │ │ │ │ │ -_2_0_1 _R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -202_ _c_o_o_r_d_s() const │ │ │ │ │ -203 { │ │ │ │ │ -204 std::array v(asCommon().vertexCoord()); │ │ │ │ │ -205 _C_o_o_r_d_V_e_c_t_o_r c; │ │ │ │ │ -206 for (int d = 0; d < dimension; d++) │ │ │ │ │ -207 { │ │ │ │ │ -208 c[d] = v[d]*1.0 / asCommon()._nIntervals; │ │ │ │ │ -209 } │ │ │ │ │ -210 return c; │ │ │ │ │ -211 } │ │ │ │ │ -212 │ │ │ │ │ -213 // for elements │ │ │ │ │ -214 │ │ │ │ │ -215 template │ │ │ │ │ -_2_1_6 class _R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ -217 { │ │ │ │ │ -218 public: │ │ │ │ │ -_2_1_9 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -_2_2_0 typedef typename Refinement::template _C_o_d_i_m_<_0_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _C_o_m_m_o_n; │ │ │ │ │ -_2_2_1 typedef typename Refinement::IndexVector _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ -_2_2_2 typedef typename Refinement::CoordVector _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ -223 │ │ │ │ │ -224 _I_n_d_e_x_V_e_c_t_o_r vertexIndices() const; │ │ │ │ │ -225 _C_o_o_r_d_V_e_c_t_o_r coords() const; │ │ │ │ │ -226 │ │ │ │ │ -227 private: │ │ │ │ │ -228 const _C_o_m_m_o_n & asCommon() const │ │ │ │ │ -229 { │ │ │ │ │ -230 return *static_cast(this); │ │ │ │ │ -231 } │ │ │ │ │ -232 }; │ │ │ │ │ -233 │ │ │ │ │ -234 template │ │ │ │ │ -235 typename RefinementSubEntityIteratorSpecial:: │ │ │ │ │ -IndexVector │ │ │ │ │ -_2_3_6 _R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -237_ _v_e_r_t_e_x_I_n_d_i_c_e_s() const │ │ │ │ │ -238 { │ │ │ │ │ -239 constexpr static int nIndices = 1 << dimension; │ │ │ │ │ -240 │ │ │ │ │ -241 // cell index tuple │ │ │ │ │ -242 std::array e(asCommon().cellCoord()); │ │ │ │ │ -243 │ │ │ │ │ -244 // vertices │ │ │ │ │ -245 _I_n_d_e_x_V_e_c_t_o_r vec; │ │ │ │ │ -246 for(int i = 0; i < nIndices; ++i) │ │ │ │ │ -247 { │ │ │ │ │ -248 int base = 1; │ │ │ │ │ -249 std::array alpha(asCommon().idx2multiidx(i)); │ │ │ │ │ -250 for (int d = 0; d < dimension; d++) { │ │ │ │ │ -251 vec[i] += (alpha[d] + e[d]) * base; │ │ │ │ │ -252 base *= asCommon()._nIntervals+1; │ │ │ │ │ -253 } │ │ │ │ │ -254 } │ │ │ │ │ -255 return vec; │ │ │ │ │ -256 } │ │ │ │ │ -257 │ │ │ │ │ -258 template │ │ │ │ │ -259 typename _R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -_2_6_0 _R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -261_ _c_o_o_r_d_s() const │ │ │ │ │ -262 { │ │ │ │ │ -263 std::array v(asCommon().cellCoord()); │ │ │ │ │ -264 _C_o_o_r_d_V_e_c_t_o_r c; │ │ │ │ │ -265 for (int d=0; d │ │ │ │ │ -274 template │ │ │ │ │ -_2_7_5 class _R_e_f_i_n_e_m_e_n_t_I_m_p::_C_o_d_i_m:: │ │ │ │ │ +88 _I_n_d_e_x_V_e_c_t_o_r vertexIndices() const; │ │ │ │ │ +89 }; │ │ │ │ │ +90 │ │ │ │ │ +91 template │ │ │ │ │ +92 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ +_0_>_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ +_9_3 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ +94_ _v_e_r_t_e_x_I_n_d_i_c_e_s() const │ │ │ │ │ +95 { │ │ │ │ │ +96 return static_cast(this)->backend->vertexIndices(); │ │ │ │ │ +97 } │ │ │ │ │ +98 │ │ │ │ │ +99 // The iterator common stuff │ │ │ │ │ +100 template │ │ │ │ │ +101 template │ │ │ │ │ +_1_0_2 class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t::_C_o_d_i_m:: │ │ │ │ │ SubEntityIterator │ │ │ │ │ -276 : public ForwardIteratorFacade::template Codim::SubEntityIterator, int>, │ │ │ │ │ -278 public _R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l::template Codim::SubEntityIterator, int>, │ │ │ │ │ +104 public _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ -279 { │ │ │ │ │ -280 public: │ │ │ │ │ -_2_8_1 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -_2_8_2 typedef typename Refinement::template _C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ +105 { │ │ │ │ │ +106 public: │ │ │ │ │ +_1_0_7 typedef _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +_1_0_8 typedef typename Refinement::template _C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ _T_h_i_s; │ │ │ │ │ -283 │ │ │ │ │ -_2_8_4 _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r(unsigned int index, unsigned int nIntervals); │ │ │ │ │ -285 │ │ │ │ │ -_2_8_6 bool _e_q_u_a_l_s(const _T_h_i_s &other) const; │ │ │ │ │ -_2_8_7 void _i_n_c_r_e_m_e_n_t(); │ │ │ │ │ -288 │ │ │ │ │ -_2_8_9 int _i_n_d_e_x() const; │ │ │ │ │ -_2_9_0 Geometry _g_e_o_m_e_t_r_y () const; │ │ │ │ │ -291 private: │ │ │ │ │ -292 friend class _R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l<_d_i_m_e_n_s_i_o_n, CoordType, │ │ │ │ │ -codimension>; │ │ │ │ │ -293 unsigned int _index; │ │ │ │ │ -294 unsigned int _nIntervals; │ │ │ │ │ -295 │ │ │ │ │ -296 std::array │ │ │ │ │ -297 cellCoord(unsigned int idx) const │ │ │ │ │ -298 { │ │ │ │ │ -299 return idx2coord(idx, _nIntervals); │ │ │ │ │ -300 } │ │ │ │ │ -301 │ │ │ │ │ -302 std::array │ │ │ │ │ -303 vertexCoord(unsigned int idx) const │ │ │ │ │ -304 { │ │ │ │ │ -305 return idx2coord(idx, _nIntervals+1u); │ │ │ │ │ -306 } │ │ │ │ │ -307 │ │ │ │ │ -308 std::array │ │ │ │ │ -309 cellCoord() const │ │ │ │ │ -310 { │ │ │ │ │ -311 return cellCoord(_index); │ │ │ │ │ -312 } │ │ │ │ │ -313 │ │ │ │ │ -314 std::array │ │ │ │ │ -315 vertexCoord() const │ │ │ │ │ -316 { │ │ │ │ │ -317 return vertexCoord(_index); │ │ │ │ │ -318 } │ │ │ │ │ -319 │ │ │ │ │ -320 std::array │ │ │ │ │ -321 idx2coord(unsigned int idx, unsigned int w) const │ │ │ │ │ -322 { │ │ │ │ │ -323 std::array c; │ │ │ │ │ -324 for (unsigned int d = 0; d < _d_i_m_e_n_s_i_o_n; d++) │ │ │ │ │ -325 { │ │ │ │ │ -326 c[d] = idx%w; │ │ │ │ │ -327 idx = idx/w; │ │ │ │ │ -328 } │ │ │ │ │ -329 return c; │ │ │ │ │ -330 } │ │ │ │ │ -331 │ │ │ │ │ -332 unsigned int │ │ │ │ │ -333 coord2idx(std::array c, unsigned int w) const │ │ │ │ │ -334 { │ │ │ │ │ -335 unsigned int i = 0; │ │ │ │ │ -336 for (unsigned int d = _d_i_m_e_n_s_i_o_n; d > 0; d--) │ │ │ │ │ -337 { │ │ │ │ │ -338 i *= w; │ │ │ │ │ -339 i += c[d-1]; │ │ │ │ │ -340 } │ │ │ │ │ -341 return i; │ │ │ │ │ -342 } │ │ │ │ │ -343 │ │ │ │ │ -344 std::array │ │ │ │ │ -345 idx2multiidx(unsigned int idx) const │ │ │ │ │ -346 { │ │ │ │ │ -347 std::array alpha; │ │ │ │ │ -348 for (unsigned int i = 0; i < _d_i_m_e_n_s_i_o_n; ++i) │ │ │ │ │ -349 alpha[i] = (idx >> i) & 1u; │ │ │ │ │ -350 return alpha; │ │ │ │ │ -351 } │ │ │ │ │ -352 }; │ │ │ │ │ -353 │ │ │ │ │ -354#ifndef DOXYGEN │ │ │ │ │ -355 template │ │ │ │ │ -356 template │ │ │ │ │ -357 RefinementImp::Codim:: │ │ │ │ │ +_1_0_9 typedef typename Refinement::template _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_c_o_d_i_m_e_n_s_i_o_n_> │ │ │ │ │ +_I_t_e_r_a_t_o_r_B_a_c_k; │ │ │ │ │ +_1_1_0 typedef typename Refinement::CoordVector _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ +111 │ │ │ │ │ +_1_1_2 _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r(_I_t_e_r_a_t_o_r_B_a_c_k *backend); │ │ │ │ │ +_1_1_3 _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r(const _T_h_i_s &other); │ │ │ │ │ +_1_1_4 _~_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r(); │ │ │ │ │ +115 │ │ │ │ │ +_1_1_6 _T_h_i_s &_o_p_e_r_a_t_o_r_=(const _T_h_i_s &other); │ │ │ │ │ +117 │ │ │ │ │ +_1_1_8 bool _e_q_u_a_l_s(const _T_h_i_s &other) const; │ │ │ │ │ +_1_1_9 void _i_n_c_r_e_m_e_n_t(); │ │ │ │ │ +120 │ │ │ │ │ +_1_2_1 int _i_n_d_e_x() const; │ │ │ │ │ +122 │ │ │ │ │ +123 // If you simply use an unqualified CoordVector here g++-4.2 chokes │ │ │ │ │ +124 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_t_e_m_p_l_a_t_e │ │ │ │ │ +_C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r:: │ │ │ │ │ +_1_2_5 CoordVector _c_o_o_r_d_s() const; │ │ │ │ │ +126 private: │ │ │ │ │ +127 friend class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l; │ │ │ │ │ +128 _I_t_e_r_a_t_o_r_B_a_c_k *backend; │ │ │ │ │ +129 }; │ │ │ │ │ +130 │ │ │ │ │ +131#ifndef DOXYGEN │ │ │ │ │ +132 template │ │ │ │ │ +133 template │ │ │ │ │ +134 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_:_: │ │ │ │ │ +135_ _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r(IteratorBack *backend_) │ │ │ │ │ +136 : backend(backend_) │ │ │ │ │ +137 {} │ │ │ │ │ +138 │ │ │ │ │ +139 template │ │ │ │ │ +140 template │ │ │ │ │ +141 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_:_: │ │ │ │ │ +142_ _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r(const This &other) │ │ │ │ │ +143 : backend(other.backend->clone()) │ │ │ │ │ +144 {} │ │ │ │ │ +145 │ │ │ │ │ +146 template │ │ │ │ │ +147 template │ │ │ │ │ +148 VirtualRefinement::Codim:: │ │ │ │ │ +SubEntityIterator:: │ │ │ │ │ +149 ~SubEntityIterator() │ │ │ │ │ +150 { │ │ │ │ │ +151 delete backend; │ │ │ │ │ +152 } │ │ │ │ │ +153 │ │ │ │ │ +154 template │ │ │ │ │ +155 template │ │ │ │ │ +156 typename VirtualRefinement::template │ │ │ │ │ +Codim::SubEntityIterator & │ │ │ │ │ +157 VirtualRefinement::Codim:: │ │ │ │ │ +SubEntityIterator:: │ │ │ │ │ +158 operator=(const This &other) │ │ │ │ │ +159 { │ │ │ │ │ +160 delete backend; │ │ │ │ │ +161 backend = other.backend->clone(); │ │ │ │ │ +162 } │ │ │ │ │ +163 │ │ │ │ │ +164 template │ │ │ │ │ +165 template │ │ │ │ │ +166 bool │ │ │ │ │ +167 VirtualRefinement::Codim:: │ │ │ │ │ SubEntityIterator:: │ │ │ │ │ -358 SubEntityIterator(unsigned int index, unsigned int nIntervals) │ │ │ │ │ -359 : _index(index), _nIntervals(nIntervals) │ │ │ │ │ -360 {} │ │ │ │ │ -361 │ │ │ │ │ -362 template │ │ │ │ │ -363 template │ │ │ │ │ -364 bool │ │ │ │ │ -365 RefinementImp::Codim:: │ │ │ │ │ +168 equals(const This &other) const │ │ │ │ │ +169 { return *backend == *(other.backend); } │ │ │ │ │ +170 │ │ │ │ │ +171 template │ │ │ │ │ +172 template │ │ │ │ │ +173 void │ │ │ │ │ +174 VirtualRefinement::Codim:: │ │ │ │ │ SubEntityIterator:: │ │ │ │ │ -366 equals(const This &other) const │ │ │ │ │ -367 { │ │ │ │ │ -368 return ((_index == other._index) && (_nIntervals == other._nIntervals)); │ │ │ │ │ -369 } │ │ │ │ │ -370 │ │ │ │ │ -371 template │ │ │ │ │ -372 template │ │ │ │ │ -373 void │ │ │ │ │ -374 RefinementImp::Codim:: │ │ │ │ │ +175 increment() │ │ │ │ │ +176 { │ │ │ │ │ +177 ++*backend; │ │ │ │ │ +178 } │ │ │ │ │ +179 │ │ │ │ │ +180 template │ │ │ │ │ +181 template │ │ │ │ │ +182 int │ │ │ │ │ +183 VirtualRefinement::Codim:: │ │ │ │ │ SubEntityIterator:: │ │ │ │ │ -375 increment() │ │ │ │ │ -376 { │ │ │ │ │ -377 ++_index; │ │ │ │ │ -378 } │ │ │ │ │ -379 │ │ │ │ │ -380 template │ │ │ │ │ -381 template │ │ │ │ │ -382 int │ │ │ │ │ -383 RefinementImp::Codim:: │ │ │ │ │ +184 index() const │ │ │ │ │ +185 { return backend->index(); } │ │ │ │ │ +186 │ │ │ │ │ +187 template │ │ │ │ │ +188 template │ │ │ │ │ +189 typename VirtualRefinement::template │ │ │ │ │ +Codim::SubEntityIterator::CoordVector │ │ │ │ │ +190 VirtualRefinement::Codim:: │ │ │ │ │ SubEntityIterator:: │ │ │ │ │ -384 index() const │ │ │ │ │ -385 { │ │ │ │ │ -386 return _index; │ │ │ │ │ -387 } │ │ │ │ │ -388 │ │ │ │ │ -389 template │ │ │ │ │ -390 template │ │ │ │ │ -391 typename RefinementImp::template Codim:: │ │ │ │ │ -Geometry │ │ │ │ │ -392 RefinementImp::Codim:: │ │ │ │ │ -SubEntityIterator::geometry () const │ │ │ │ │ -393 { │ │ │ │ │ -394 std::array intCoords = idx2coord │ │ │ │ │ -(_index,_nIntervals); │ │ │ │ │ -395 │ │ │ │ │ -396 Dune::FieldVector lower; │ │ │ │ │ -397 Dune::FieldVector upper; │ │ │ │ │ -398 │ │ │ │ │ -399 assert(codimension == 0 or codimension == _d_i_m_e_n_s_i_o_n); │ │ │ │ │ -400 │ │ │ │ │ -401 if constexpr (codimension == 0) { │ │ │ │ │ -402 for (size_t j = 0; j < _d_i_m_e_n_s_i_o_n; j++) │ │ │ │ │ -403 { │ │ │ │ │ -404 lower[j] = double(intCoords[j]) / double(_nIntervals); │ │ │ │ │ -405 upper[j] = double(intCoords[j] + 1) / double(_nIntervals); │ │ │ │ │ -406 } │ │ │ │ │ -407 │ │ │ │ │ -408 return typename RefinementImp<_d_i_m_e_n_s_i_o_n, │ │ │ │ │ -409 CoordType>::template _C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_:_G_e_o_m_e_t_r_y(lower,upper); │ │ │ │ │ -410 } else { │ │ │ │ │ -411 for (size_t j = 0; j < _d_i_m_e_n_s_i_o_n; j++) │ │ │ │ │ -412 lower[j] = upper[j] = double(intCoords[j]) / double(_nIntervals); │ │ │ │ │ -413 │ │ │ │ │ -414 return typename RefinementImp<_d_i_m_e_n_s_i_o_n, │ │ │ │ │ -415 CoordType>::template _C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_:_G_e_o_m_e_t_r_y(lower,upper,std:: │ │ │ │ │ -bitset(0)); │ │ │ │ │ -416 } │ │ │ │ │ -417 } │ │ │ │ │ -418 │ │ │ │ │ -419#endif // DOXYGEN │ │ │ │ │ -420 │ │ │ │ │ -421 } // namespace HCube │ │ │ │ │ -422 │ │ │ │ │ -423 // /////////////////////// │ │ │ │ │ -424 // │ │ │ │ │ -425 // The refinement traits │ │ │ │ │ -426 // │ │ │ │ │ +191 coords() const │ │ │ │ │ +192 { return backend->coords(); } │ │ │ │ │ +193#endif // DOXYGEN │ │ │ │ │ +194 │ │ │ │ │ +195 // │ │ │ │ │ +196 // The iterator backend │ │ │ │ │ +197 // │ │ │ │ │ +198 │ │ │ │ │ +199 template │ │ │ │ │ +_2_0_0 class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l; │ │ │ │ │ +201 │ │ │ │ │ +202 // The iterator backend for vertices │ │ │ │ │ +203 template │ │ │ │ │ +_2_0_4 class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l │ │ │ │ │ +205 { │ │ │ │ │ +206 public: │ │ │ │ │ +207 │ │ │ │ │ +_2_0_8 virtual _~_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l() │ │ │ │ │ +209 {} │ │ │ │ │ +210 }; │ │ │ │ │ +211 │ │ │ │ │ +212 // The iterator backend for elements │ │ │ │ │ +213 template │ │ │ │ │ +_2_1_4 class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l │ │ │ │ │ +215 { │ │ │ │ │ +216 public: │ │ │ │ │ +_2_1_7 typedef _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +_2_1_8 typedef typename Refinement::IndexVector _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ +219 │ │ │ │ │ +_2_2_0 virtual _I_n_d_e_x_V_e_c_t_o_r _v_e_r_t_e_x_I_n_d_i_c_e_s() const = 0; │ │ │ │ │ +221 │ │ │ │ │ +_2_2_2 virtual _~_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l() │ │ │ │ │ +223 {} │ │ │ │ │ +224 }; │ │ │ │ │ +225 │ │ │ │ │ +226 // The iterator backend common stuff │ │ │ │ │ +227 template │ │ │ │ │ +228 template │ │ │ │ │ +_2_2_9 class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t::_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k │ │ │ │ │ +230 : public _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l │ │ │ │ │ +231 { │ │ │ │ │ +232 public: │ │ │ │ │ +_2_3_3 typedef _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +_2_3_4 typedef typename Refinement::template _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_c_o_d_i_m_e_n_s_i_o_n_> │ │ │ │ │ +_T_h_i_s; │ │ │ │ │ +_2_3_5 typedef typename Refinement::CoordVector _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ +236 │ │ │ │ │ +_2_3_7 virtual _~_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k() {} │ │ │ │ │ +238 │ │ │ │ │ +_2_3_9 virtual _T_h_i_s *_c_l_o_n_e() const = 0; │ │ │ │ │ +240 │ │ │ │ │ +_2_4_1 virtual bool _o_p_e_r_a_t_o_r_=_=(const _T_h_i_s &other) const = 0; │ │ │ │ │ +_2_4_2 virtual _T_h_i_s &_o_p_e_r_a_t_o_r_+_+() = 0; │ │ │ │ │ +243 │ │ │ │ │ +_2_4_4 virtual int _i_n_d_e_x() const = 0; │ │ │ │ │ +_2_4_5 virtual _C_o_o_r_d_V_e_c_t_o_r _c_o_o_r_d_s() const = 0; │ │ │ │ │ +246 }; │ │ │ │ │ +247 │ │ │ │ │ +248 // ///////////////////////////////////////////////// │ │ │ │ │ +249 // │ │ │ │ │ +250 // The derived classes and their iterator backends │ │ │ │ │ +251 // │ │ │ │ │ +252 │ │ │ │ │ +253 // │ │ │ │ │ +254 // The refinement implementation │ │ │ │ │ +255 // │ │ │ │ │ +256 │ │ │ │ │ +257 template │ │ │ │ │ +_2_5_9 class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ +260 : public _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +261 { │ │ │ │ │ +262 public: │ │ │ │ │ +_2_6_3 typedef _D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_, │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_> _S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +_2_6_4 typedef _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +265 │ │ │ │ │ +266 template │ │ │ │ │ +267 class _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k; │ │ │ │ │ +268 │ │ │ │ │ +269 int nVertices(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const override; │ │ │ │ │ +270 │ │ │ │ │ +271 int nElements(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const override; │ │ │ │ │ +272 │ │ │ │ │ +273 static _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_> │ │ │ │ │ +&instance(); │ │ │ │ │ +274 private: │ │ │ │ │ +275 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p() {} │ │ │ │ │ +276 │ │ │ │ │ +277 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_B_a_c_k *vBeginBack(_D_u_n_e_:_: │ │ │ │ │ +_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const override; │ │ │ │ │ +278 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_B_a_c_k *vEndBack(_D_u_n_e_:_: │ │ │ │ │ +_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const override; │ │ │ │ │ +279 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r_B_a_c_k *eBeginBack(_D_u_n_e_:_: │ │ │ │ │ +_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const override; │ │ │ │ │ +280 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r_B_a_c_k *eEndBack(_D_u_n_e_:_: │ │ │ │ │ +_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const override; │ │ │ │ │ +281 }; │ │ │ │ │ +282 │ │ │ │ │ +283 template │ │ │ │ │ +285 VirtualRefinementImp & │ │ │ │ │ +_2_8_6 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_i_n_s_t_a_n_c_e() │ │ │ │ │ +287 { │ │ │ │ │ +288 static _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p instance_{}; │ │ │ │ │ +289 return instance_; │ │ │ │ │ +290 } │ │ │ │ │ +291 │ │ │ │ │ +292 template │ │ │ │ │ +_2_9_4 int _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +295_ _n_V_e_r_t_i_c_e_s(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const │ │ │ │ │ +296 { │ │ │ │ │ +297 return _S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_n_V_e_r_t_i_c_e_s(tag); │ │ │ │ │ +298 } │ │ │ │ │ +299 │ │ │ │ │ +300 template │ │ │ │ │ +302 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_, │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_>_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_B_a_c_k * │ │ │ │ │ +303 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +304_ _v_B_e_g_i_n_B_a_c_k(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const │ │ │ │ │ +305 { │ │ │ │ │ +306 return new SubEntityIteratorBack(_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_v_B_e_g_i_n(tag)); │ │ │ │ │ +307 } │ │ │ │ │ +308 │ │ │ │ │ +309 template │ │ │ │ │ +311 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_, │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_>_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_B_a_c_k * │ │ │ │ │ +312 VirtualRefinementImp:: │ │ │ │ │ +313 vEndBack(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const │ │ │ │ │ +314 { │ │ │ │ │ +315 return new SubEntityIteratorBack(_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_v_E_n_d(tag)); │ │ │ │ │ +316 } │ │ │ │ │ +317 │ │ │ │ │ +318 template │ │ │ │ │ +_3_2_0 int _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_n_E_l_e_m_e_n_t_s(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const │ │ │ │ │ +321 { │ │ │ │ │ +322 return _S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_n_E_l_e_m_e_n_t_s(tag); │ │ │ │ │ +323 } │ │ │ │ │ +324 │ │ │ │ │ +325 template │ │ │ │ │ +327 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_, │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_>_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r_B_a_c_k * │ │ │ │ │ +328 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +329_ _e_B_e_g_i_n_B_a_c_k(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const │ │ │ │ │ +330 { │ │ │ │ │ +331 return new SubEntityIteratorBack<0>(_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_e_B_e_g_i_n(tag)); │ │ │ │ │ +332 } │ │ │ │ │ +333 │ │ │ │ │ +334 template │ │ │ │ │ +336 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_, │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_>_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r_B_a_c_k * │ │ │ │ │ +337 VirtualRefinementImp:: │ │ │ │ │ +338 eEndBack(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) const │ │ │ │ │ +339 { │ │ │ │ │ +340 return new SubEntityIteratorBack<0>(_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_e_E_n_d(tag)); │ │ │ │ │ +341 } │ │ │ │ │ +342 │ │ │ │ │ +343 // │ │ │ │ │ +344 // The iterator backend implementation │ │ │ │ │ +345 // │ │ │ │ │ +346 │ │ │ │ │ +347 // The iterator backend implementation specialties │ │ │ │ │ +348 template │ │ │ │ │ +_3_5_0 class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l; │ │ │ │ │ +351 │ │ │ │ │ +352 // The iterator backend implementation specialties for vertices │ │ │ │ │ +353 template │ │ │ │ │ +_3_5_5 class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l │ │ │ │ │ +356 : public _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t::template │ │ │ │ │ +SubEntityIteratorBack │ │ │ │ │ +357 {}; │ │ │ │ │ +358 │ │ │ │ │ +359 // The iterator backend implementation specialties for elements │ │ │ │ │ +360 │ │ │ │ │ +361 template │ │ │ │ │ +_3_6_3 class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l │ │ │ │ │ +364 : public _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t::template │ │ │ │ │ +SubEntityIteratorBack<0> │ │ │ │ │ +365 { │ │ │ │ │ +366 public: │ │ │ │ │ +_3_6_7 typedef _D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_, │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_> _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p; │ │ │ │ │ +_3_6_8 typedef typename VirtualRefinementImp::template SubEntityIteratorBack<0> │ │ │ │ │ +_C_o_m_m_o_n; │ │ │ │ │ +_3_6_9 typedef typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t _S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ +_3_7_0 typedef _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t_B_a_s_e; │ │ │ │ │ +_3_7_1 typedef typename RefinementBase::IndexVector _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ +372 │ │ │ │ │ +373 _I_n_d_e_x_V_e_c_t_o_r vertexIndices() const; │ │ │ │ │ +374 }; │ │ │ │ │ +375 │ │ │ │ │ +376 template │ │ │ │ │ +378 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_t_o_p_o_l_o_g_y_I_d_, │ │ │ │ │ +_C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_,_ _0_>_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ +_3_7_9 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ +_c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_,_ _0_>_:_: │ │ │ │ │ +380_ _v_e_r_t_e_x_I_n_d_i_c_e_s() const │ │ │ │ │ +381 { │ │ │ │ │ +382 _I_n_d_e_x_V_e_c_t_o_r vIndices; │ │ │ │ │ +383 vIndices.reserve(StaticRefinement::IndexVector::dimension); │ │ │ │ │ +384 │ │ │ │ │ +385 typename _S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_I_n_d_e_x_V_e_c_t_o_r sIndices = static_cast(this)->backend.vertexIndices(); │ │ │ │ │ +386 for(int i = 0; i < StaticRefinement::IndexVector::dimension; ++i) │ │ │ │ │ +387 vIndices.push_back(sIndices[i]); │ │ │ │ │ +388 return vIndices; │ │ │ │ │ +389 } │ │ │ │ │ +390 │ │ │ │ │ +391 // The shared iterator backend implementation │ │ │ │ │ +392 template │ │ │ │ │ +394 template │ │ │ │ │ +_3_9_5 class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p:: │ │ │ │ │ +_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k │ │ │ │ │ +396 : public _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l │ │ │ │ │ +397 { │ │ │ │ │ +398 public: │ │ │ │ │ +_3_9_9 typedef typename StaticRefinement::template _C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r; │ │ │ │ │ +_4_0_0 typedef typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_, │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_>_:_:_t_e_m_p_l_a_t_e _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_c_o_d_i_m_e_n_s_i_o_n_> _T_h_i_s; │ │ │ │ │ +_4_0_1 typedef typename VirtualRefinement::template │ │ │ │ │ +_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_c_o_d_i_m_e_n_s_i_o_n_> _B_a_s_e; │ │ │ │ │ +_4_0_2 typedef typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_o_r_d_V_e_c_t_o_r _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ +403 │ │ │ │ │ +404 _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k(const _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r &backend); │ │ │ │ │ +405 _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k(const _T_h_i_s &other); │ │ │ │ │ +406 │ │ │ │ │ +407 _B_a_s_e *clone() const; │ │ │ │ │ +408 │ │ │ │ │ +409 bool operator==(const _B_a_s_e &other) const; │ │ │ │ │ +410 _B_a_s_e &operator++(); │ │ │ │ │ +411 │ │ │ │ │ +412 int index() const; │ │ │ │ │ +_4_1_3 _C_o_o_r_d_V_e_c_t_o_r coords() const; │ │ │ │ │ +414 │ │ │ │ │ +415 private: │ │ │ │ │ +416 friend class _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l; │ │ │ │ │ +417 _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r backend; │ │ │ │ │ +418 }; │ │ │ │ │ +419 │ │ │ │ │ +420 template │ │ │ │ │ +422 template │ │ │ │ │ +_4_2_3 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +424_ _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k(const _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r &backend_) │ │ │ │ │ +425 : backend(backend_) │ │ │ │ │ +426 {} │ │ │ │ │ 427 │ │ │ │ │ -428#ifndef DOXYGEN │ │ │ │ │ -429 template │ │ │ │ │ -431 struct Traits< │ │ │ │ │ -432 topologyId, CoordType, coerceToId, dim, │ │ │ │ │ -433 typename _s_t_d::enable_if< │ │ │ │ │ -434 (dim >= 2 && │ │ │ │ │ -435 (GeometryTypes::cube(dim).id() >> 1) == │ │ │ │ │ -436 (topologyId >> 1) && │ │ │ │ │ -437 (GeometryTypes::cube(dim).id() >> 1) == │ │ │ │ │ -438 (coerceToId >> 1) │ │ │ │ │ -439 )>::type │ │ │ │ │ -440 > │ │ │ │ │ -441 { │ │ │ │ │ -442 typedef HCube::RefinementImp Imp; │ │ │ │ │ -443 }; │ │ │ │ │ -444#endif │ │ │ │ │ -445 │ │ │ │ │ -446 } // namespace RefinementImp │ │ │ │ │ -447 │ │ │ │ │ -448} // namespace Dune │ │ │ │ │ -449 │ │ │ │ │ -450#endif // DUNE_GEOMETRY_REFINEMENT_HCUBE_CC │ │ │ │ │ -_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h │ │ │ │ │ -_b_a_s_e_._c_c │ │ │ │ │ -This file contains the parts independent of a particular Refinement │ │ │ │ │ -implementation. │ │ │ │ │ -_a_x_i_s_a_l_i_g_n_e_d_c_u_b_e_g_e_o_m_e_t_r_y_._h_h │ │ │ │ │ -A geometry implementation for axis-aligned hypercubes. │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ +428 template │ │ │ │ │ +430 template │ │ │ │ │ +_4_3_1 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +432_ _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k(const _T_h_i_s &other) │ │ │ │ │ +433 : _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l(other), │ │ │ │ │ +434 backend(other.backend) │ │ │ │ │ +435 {} │ │ │ │ │ +436 │ │ │ │ │ +437 template │ │ │ │ │ +438 template │ │ │ │ │ +439 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_, │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_>_:_:_t_e_m_p_l_a_t_e _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_c_o_d_i_m_e_n_s_i_o_n_>_:_:_B_a_s_e * │ │ │ │ │ +_4_4_0 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +441_ _c_l_o_n_e() const │ │ │ │ │ +442 { return new _T_h_i_s(*this); } │ │ │ │ │ +443 │ │ │ │ │ +444 template │ │ │ │ │ +445 template │ │ │ │ │ +446 bool │ │ │ │ │ +_4_4_7 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +448_ _o_p_e_r_a_t_o_r_=_=(const _B_a_s_e &other) const │ │ │ │ │ +449 { │ │ │ │ │ +450 try { │ │ │ │ │ +451 return backend == dynamic_cast(other).backend; │ │ │ │ │ +452 } │ │ │ │ │ +453 catch(const std::bad_cast&) │ │ │ │ │ +454 { │ │ │ │ │ +455 return false; │ │ │ │ │ +456 } │ │ │ │ │ +457 } │ │ │ │ │ +458 │ │ │ │ │ +459 template │ │ │ │ │ +460 template │ │ │ │ │ +461 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_, │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_>_:_:_t_e_m_p_l_a_t_e _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_c_o_d_i_m_e_n_s_i_o_n_>_:_:_B_a_s_e & │ │ │ │ │ +_4_6_2 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +463_ _o_p_e_r_a_t_o_r_+_+() │ │ │ │ │ +464 { │ │ │ │ │ +465 ++backend; │ │ │ │ │ +466 return *this; │ │ │ │ │ +467 } │ │ │ │ │ +468 │ │ │ │ │ +469 template │ │ │ │ │ +470 template │ │ │ │ │ +471 int │ │ │ │ │ +_4_7_2 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +473_ _i_n_d_e_x() const │ │ │ │ │ +474 { return backend.index(); } │ │ │ │ │ +475 │ │ │ │ │ +476 template │ │ │ │ │ +477 template │ │ │ │ │ +478 typename _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_, │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_>_:_:_t_e_m_p_l_a_t_e _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_c_o_d_i_m_e_n_s_i_o_n_>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +_4_7_9 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +480_ _c_o_o_r_d_s() const │ │ │ │ │ +481 { return backend.coords(); } │ │ │ │ │ +482 │ │ │ │ │ +483 // //////////////////////// │ │ │ │ │ +484 // │ │ │ │ │ +485 // The refinement builder │ │ │ │ │ +486 // │ │ │ │ │ +487 │ │ │ │ │ +488 template │ │ │ │ │ +489 class _R_e_f_i_n_e_m_e_n_t_B_u_i_l_d_e_r; │ │ │ │ │ +490 │ │ │ │ │ +501 template │ │ │ │ │ +502 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> & │ │ │ │ │ +_5_0_3 _b_u_i_l_d_R_e_f_i_n_e_m_e_n_t( │ │ │ │ │ +504 _G_e_o_m_e_t_r_y_T_y_p_e geometryType, │ │ │ │ │ +506 _G_e_o_m_e_t_r_y_T_y_p_e coerceTo) │ │ │ │ │ +507 { │ │ │ │ │ +508 // Check that the user used valid geometry types │ │ │ │ │ +509 assert(geometryType._d_i_m() == dimension && coerceTo._d_i_m() == dimension); │ │ │ │ │ +510 return _R_e_f_i_n_e_m_e_n_t_B_u_i_l_d_e_r_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_b_u_i_l_d( geometryType._i_d(), │ │ │ │ │ +coerceTo._i_d() ); │ │ │ │ │ +511 } │ │ │ │ │ +512 │ │ │ │ │ +513 // In principle the trick with the class is no longer necessary, │ │ │ │ │ +514 // but I'm keeping it in here so it will be easier to specialize │ │ │ │ │ +515 // buildRefinement when someone implements pyramids and prisms │ │ │ │ │ +516 template │ │ │ │ │ +_5_1_7 class _R_e_f_i_n_e_m_e_n_t_B_u_i_l_d_e_r │ │ │ │ │ +518 { │ │ │ │ │ +519 public: │ │ │ │ │ +520 static │ │ │ │ │ +521 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> & │ │ │ │ │ +_5_2_2 _b_u_i_l_d(unsigned topologyId, unsigned coerceToId) │ │ │ │ │ +523 { │ │ │ │ │ +524 topologyId &= ~1; │ │ │ │ │ +525 coerceToId &= ~1; │ │ │ │ │ +526 │ │ │ │ │ +527 constexpr unsigned idSimplex = GeometryTypes::simplex(dimension).id() & ~1; │ │ │ │ │ +528 constexpr unsigned idCube = GeometryTypes::cube(dimension).id() & ~1; │ │ │ │ │ +529 │ │ │ │ │ +530 switch( topologyId ) │ │ │ │ │ +531 { │ │ │ │ │ +532 //case GeometryType::simplex: │ │ │ │ │ +533 case idSimplex : │ │ │ │ │ +534 //switch( coerceTo ) │ │ │ │ │ +535 switch( coerceToId ) │ │ │ │ │ +536 { │ │ │ │ │ +537 //case GeometryType::simplex: │ │ │ │ │ +538 case idSimplex : │ │ │ │ │ +539 return _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _i_d_S_i_m_p_l_e_x_,_ _C_o_o_r_d_T_y_p_e_,_ _i_d_S_i_m_p_l_e_x_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_i_n_s_t_a_n_c_e(); │ │ │ │ │ +540 default : │ │ │ │ │ +541 break; │ │ │ │ │ +542 } │ │ │ │ │ +543 break; │ │ │ │ │ +544 │ │ │ │ │ +545 //case GeometryType::cube: │ │ │ │ │ +546 case idCube : │ │ │ │ │ +547 switch( coerceToId ) │ │ │ │ │ +548 { │ │ │ │ │ +549 case idSimplex : │ │ │ │ │ +550 return _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _i_d_C_u_b_e_,_ _C_o_o_r_d_T_y_p_e_,_ _i_d_S_i_m_p_l_e_x_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_i_n_s_t_a_n_c_e(); │ │ │ │ │ +551 case idCube : │ │ │ │ │ +552 return _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _i_d_C_u_b_e_,_ _C_o_o_r_d_T_y_p_e_,_ _i_d_C_u_b_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_i_n_s_t_a_n_c_e(); │ │ │ │ │ +553 default : │ │ │ │ │ +554 break; │ │ │ │ │ +555 } │ │ │ │ │ +556 break; │ │ │ │ │ +557 │ │ │ │ │ +558 default : │ │ │ │ │ +559 break; │ │ │ │ │ +560 } │ │ │ │ │ +561 DUNE_THROW( NotImplemented, "No Refinement<" << topologyId << ", CoordType, │ │ │ │ │ +" │ │ │ │ │ +562 << coerceToId << " >."); │ │ │ │ │ +563 } │ │ │ │ │ +564 }; │ │ │ │ │ +565 │ │ │ │ │ +566 template │ │ │ │ │ +_5_6_7 class _R_e_f_i_n_e_m_e_n_t_B_u_i_l_d_e_r<1, CoordType> │ │ │ │ │ +568 { │ │ │ │ │ +569 static const std::size_t dimension = 1; │ │ │ │ │ +570 public: │ │ │ │ │ +571 static │ │ │ │ │ +572 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> & │ │ │ │ │ +_5_7_3 _b_u_i_l_d(unsigned topologyId, unsigned coerceToId) │ │ │ │ │ +574 { │ │ │ │ │ +575 topologyId &= ~1; │ │ │ │ │ +576 coerceToId &= ~1; │ │ │ │ │ +577 │ │ │ │ │ +578 constexpr unsigned idSimplex = GeometryTypes::simplex(dimension).id() & ~1; │ │ │ │ │ +579 │ │ │ │ │ +580 if (topologyId == 0 && coerceToId == 0) │ │ │ │ │ +581 return _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _i_d_S_i_m_p_l_e_x_,_ _C_o_o_r_d_T_y_p_e_,_ _i_d_S_i_m_p_l_e_x_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_i_n_s_t_a_n_c_e(); │ │ │ │ │ +582 │ │ │ │ │ +583 DUNE_THROW( NotImplemented, "No Refinement<" << topologyId << ", CoordType, │ │ │ │ │ +" │ │ │ │ │ +584 << coerceToId << " >."); │ │ │ │ │ +585 } │ │ │ │ │ +586 }; │ │ │ │ │ +587 │ │ │ │ │ +588 template │ │ │ │ │ +_5_8_9 class _R_e_f_i_n_e_m_e_n_t_B_u_i_l_d_e_r<3, CoordType> │ │ │ │ │ +590 { │ │ │ │ │ +591 static const std::size_t dimension = 3; │ │ │ │ │ +592 public: │ │ │ │ │ +593 static │ │ │ │ │ +594 _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> & │ │ │ │ │ +_5_9_5 _b_u_i_l_d(unsigned topologyId, unsigned coerceToId) │ │ │ │ │ +596 { │ │ │ │ │ +597 topologyId &= ~1; │ │ │ │ │ +598 coerceToId &= ~1; │ │ │ │ │ +599 │ │ │ │ │ +600 constexpr unsigned idSimplex = GeometryTypes::simplex(dimension).id() & ~1; │ │ │ │ │ +601 constexpr unsigned idCube = GeometryTypes::cube(dimension).id() & ~1; │ │ │ │ │ +602 constexpr unsigned idPrism = GeometryTypes::prism.id() & ~1; │ │ │ │ │ +603 constexpr unsigned idPyramid = GeometryTypes::pyramid.id() & ~1; │ │ │ │ │ +604 │ │ │ │ │ +605 switch( topologyId ) │ │ │ │ │ +606 { │ │ │ │ │ +607 //case GeometryType::simplex: │ │ │ │ │ +608 case idSimplex : │ │ │ │ │ +609 //switch( coerceTo ) │ │ │ │ │ +610 switch( coerceToId ) │ │ │ │ │ +611 { │ │ │ │ │ +612 //case GeometryType::simplex: │ │ │ │ │ +613 case idSimplex : │ │ │ │ │ +614 return _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _i_d_S_i_m_p_l_e_x_,_ _C_o_o_r_d_T_y_p_e_,_ _i_d_S_i_m_p_l_e_x_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_i_n_s_t_a_n_c_e(); │ │ │ │ │ +615 default : │ │ │ │ │ +616 break; │ │ │ │ │ +617 } │ │ │ │ │ +618 break; │ │ │ │ │ +619 │ │ │ │ │ +620 //case GeometryType::cube: │ │ │ │ │ +621 case idCube : │ │ │ │ │ +622 switch( coerceToId ) │ │ │ │ │ +623 { │ │ │ │ │ +624 case idSimplex : │ │ │ │ │ +625 return _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _i_d_C_u_b_e_,_ _C_o_o_r_d_T_y_p_e_,_ _i_d_S_i_m_p_l_e_x_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_i_n_s_t_a_n_c_e(); │ │ │ │ │ +626 case idCube : │ │ │ │ │ +627 return _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _i_d_C_u_b_e_,_ _C_o_o_r_d_T_y_p_e_,_ _i_d_C_u_b_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_i_n_s_t_a_n_c_e(); │ │ │ │ │ +628 default : │ │ │ │ │ +629 break; │ │ │ │ │ +630 } │ │ │ │ │ +631 break; │ │ │ │ │ +632 │ │ │ │ │ +633 //case GeometryType::prism: │ │ │ │ │ +634 case idPrism : │ │ │ │ │ +635 switch( coerceToId ) │ │ │ │ │ +636 { │ │ │ │ │ +637 case idSimplex : │ │ │ │ │ +638 return _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _i_d_P_r_i_s_m_,_ _C_o_o_r_d_T_y_p_e_,_ _i_d_S_i_m_p_l_e_x_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_i_n_s_t_a_n_c_e(); │ │ │ │ │ +639 default : │ │ │ │ │ +640 break; │ │ │ │ │ +641 } │ │ │ │ │ +642 break; │ │ │ │ │ +643 │ │ │ │ │ +644 //case GeometryType::pyramid: │ │ │ │ │ +645 case idPyramid : │ │ │ │ │ +646 switch( coerceToId ) │ │ │ │ │ +647 { │ │ │ │ │ +648 case idSimplex : │ │ │ │ │ +649 return _V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _i_d_P_y_r_a_m_i_d_,_ _C_o_o_r_d_T_y_p_e_,_ _i_d_S_i_m_p_l_e_x_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ +_i_n_s_t_a_n_c_e(); │ │ │ │ │ +650 default : │ │ │ │ │ +651 break; │ │ │ │ │ +652 } │ │ │ │ │ +653 break; │ │ │ │ │ +654 │ │ │ │ │ +655 default : │ │ │ │ │ +656 break; │ │ │ │ │ +657 } │ │ │ │ │ +658 DUNE_THROW( NotImplemented, "No Refinement<" << topologyId << ", CoordType, │ │ │ │ │ +" │ │ │ │ │ +659 << coerceToId << " >."); │ │ │ │ │ +660 } │ │ │ │ │ +661 }; │ │ │ │ │ +662 │ │ │ │ │ +663} // namespace Dune │ │ │ │ │ +664 │ │ │ │ │ +665#endif // DUNE_GEOMETRY_VIRTUALREFINEMENT_CC │ │ │ │ │ +_r_e_f_i_n_e_m_e_n_t_._h_h │ │ │ │ │ +This file simply includes all Refinement implementations so you don't have to │ │ │ │ │ +do them separately. │ │ │ │ │ +_t_y_p_e_._h_h │ │ │ │ │ +A unique label for each type of element that can occur in a grid. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn affinegeometry.hh:21 │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y │ │ │ │ │ -A geometry implementation for axis-aligned hypercubes. │ │ │ │ │ -DDeeffiinniittiioonn axisalignedcubegeometry.hh:50 │ │ │ │ │ +_D_u_n_e_:_:_b_u_i_l_d_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +VirtualRefinement< dimension, CoordType > & buildRefinement(GeometryType │ │ │ │ │ +geometryType, GeometryType coerceTo) │ │ │ │ │ +return a reference to the VirtualRefinement according to the parameters │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:503 │ │ │ │ │ _D_u_n_e_:_:_C_o_d_i_m │ │ │ │ │ Static tag representing a codimension. │ │ │ │ │ DDeeffiinniittiioonn dimension.hh:24 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ -Refinement implementation for hypercubes │ │ │ │ │ -DDeeffiinniittiioonn hcube.cc:74 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ -Codim< 0 >::SubEntityIterator ElementIterator │ │ │ │ │ -DDeeffiinniittiioonn hcube.cc:85 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_e_E_n_d │ │ │ │ │ -static ElementIterator eEnd(unsigned nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn hcube.cc:152 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_n_V_e_r_t_i_c_e_s │ │ │ │ │ -static unsigned nVertices(unsigned nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn hcube.cc:108 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_v_E_n_d │ │ │ │ │ -static VertexIterator vEnd(unsigned nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn hcube.cc:125 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ -FieldVector< int,(1<< dimension)> IndexVector │ │ │ │ │ -DDeeffiinniittiioonn hcube.cc:86 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ -Codim< dimension >::SubEntityIterator VertexIterator │ │ │ │ │ -DDeeffiinniittiioonn hcube.cc:83 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -FieldVector< CoordType, dimension > CoordVector │ │ │ │ │ -DDeeffiinniittiioonn hcube.cc:84 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_n_E_l_e_m_e_n_t_s │ │ │ │ │ -static unsigned nElements(unsigned nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn hcube.cc:133 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ -DDeeffiinniittiioonn hcube.cc:79 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_e_B_e_g_i_n │ │ │ │ │ -static ElementIterator eBegin(unsigned nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn hcube.cc:144 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ -static constexpr int dimension │ │ │ │ │ -Know your own dimension. │ │ │ │ │ -DDeeffiinniittiioonn hcube.cc:77 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_v_B_e_g_i_n │ │ │ │ │ -static VertexIterator vBegin(unsigned nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn hcube.cc:117 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m │ │ │ │ │ -DDeeffiinniittiioonn hcube.cc:100 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ -Dune::AxisAlignedCubeGeometry< CoordType, dimension-codimension, dimension > │ │ │ │ │ -Geometry │ │ │ │ │ -DDeeffiinniittiioonn hcube.cc:102 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ -SubEntityIterator base class for hypercube refinement. │ │ │ │ │ -DDeeffiinniittiioonn hcube.cc:174 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -Refinement::CoordVector CoordVector │ │ │ │ │ -DDeeffiinniittiioonn hcube.cc:188 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_C_o_m_m_o_n │ │ │ │ │ -Refinement::template Codim< dimension >::SubEntityIterator Common │ │ │ │ │ -DDeeffiinniittiioonn hcube.cc:187 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ -DDeeffiinniittiioonn hcube.cc:186 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ -DDeeffiinniittiioonn hcube.cc:219 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_C_o_m_m_o_n │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s │ │ │ │ │ +Holds the number of refined intervals per axis needed for virtual and static │ │ │ │ │ +refinement. │ │ │ │ │ +DDeeffiinniittiioonn base.cc:94 │ │ │ │ │ +_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +Wrap each Refinement implementation to get a consistent interface. │ │ │ │ │ +DDeeffiinniittiioonn base.cc:141 │ │ │ │ │ +_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_e_E_n_d │ │ │ │ │ +static ElementIterator eEnd(Dune::RefinementIntervals tag) │ │ │ │ │ +Get an ElementIterator. │ │ │ │ │ +DDeeffiinniittiioonn base.cc:247 │ │ │ │ │ +_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_e_B_e_g_i_n │ │ │ │ │ +static ElementIterator eBegin(Dune::RefinementIntervals tag) │ │ │ │ │ +Get an ElementIterator. │ │ │ │ │ +DDeeffiinniittiioonn base.cc:237 │ │ │ │ │ +_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_n_E_l_e_m_e_n_t_s │ │ │ │ │ +static int nElements(Dune::RefinementIntervals tag) │ │ │ │ │ +Get the number of Elements. │ │ │ │ │ +DDeeffiinniittiioonn base.cc:227 │ │ │ │ │ +_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_n_V_e_r_t_i_c_e_s │ │ │ │ │ +static int nVertices(Dune::RefinementIntervals tag) │ │ │ │ │ +Get the number of Vertices. │ │ │ │ │ +DDeeffiinniittiioonn base.cc:197 │ │ │ │ │ +_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_v_B_e_g_i_n │ │ │ │ │ +static VertexIterator vBegin(Dune::RefinementIntervals tag) │ │ │ │ │ +Get a VertexIterator. │ │ │ │ │ +DDeeffiinniittiioonn base.cc:207 │ │ │ │ │ +_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ +typedef IndexVector │ │ │ │ │ +The IndexVector of the Refinement. │ │ │ │ │ +DDeeffiinniittiioonn base.cc:177 │ │ │ │ │ +_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_v_E_n_d │ │ │ │ │ +static VertexIterator vEnd(Dune::RefinementIntervals tag) │ │ │ │ │ +Get a VertexIterator. │ │ │ │ │ +DDeeffiinniittiioonn base.cc:217 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ +Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:114 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_d_i_m │ │ │ │ │ +constexpr unsigned int dim() const │ │ │ │ │ +Return dimension of the type. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:360 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_d │ │ │ │ │ +constexpr unsigned int id() const │ │ │ │ │ +Return the topology id of the type. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:365 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:72 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_: │ │ │ │ │ +_C_o_m_m_o_n │ │ │ │ │ Refinement::template Codim< 0 >::SubEntityIterator Common │ │ │ │ │ -DDeeffiinniittiioonn hcube.cc:220 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -Refinement::CoordVector CoordVector │ │ │ │ │ -DDeeffiinniittiioonn hcube.cc:222 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:85 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_: │ │ │ │ │ +_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +VirtualRefinement< dimension, CoordType > Refinement │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:84 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_: │ │ │ │ │ +_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ Refinement::IndexVector IndexVector │ │ │ │ │ -DDeeffiinniittiioonn hcube.cc:221 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_: │ │ │ │ │ -_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ -SubEntityIterator(unsigned int index, unsigned int nIntervals) │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_e_q_u_a_l_s │ │ │ │ │ -bool equals(const This &other) const │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_g_e_o_m_e_t_r_y │ │ │ │ │ -Geometry geometry() const │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ -DDeeffiinniittiioonn hcube.cc:281 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_i_n_d_e_x │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:86 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_c_o_o_r_d_s │ │ │ │ │ +VirtualRefinement< dimension, CoordType >::template Codim< codimension >:: │ │ │ │ │ +SubEntityIterator::CoordVector coords() const │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ +SubEntityIterator(const This &other) │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ │ +This & operator=(const This &other) │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_i_n_d_e_x │ │ │ │ │ int index() const │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_i_n_c_r_e_m_e_n_t │ │ │ │ │ -void increment() │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_H_C_u_b_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_T_h_i_s │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_~_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ +~SubEntityIterator() │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ +SubEntityIterator(IteratorBack *backend) │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_I_t_e_r_a_t_o_r_B_a_c_k │ │ │ │ │ +Refinement::template SubEntityIteratorBack< codimension > IteratorBack │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:109 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +Refinement::CoordVector CoordVector │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:110 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_T_h_i_s │ │ │ │ │ Refinement::template Codim< codimension >::SubEntityIterator This │ │ │ │ │ -DDeeffiinniittiioonn hcube.cc:282 │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:108 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_e_q_u_a_l_s │ │ │ │ │ +bool equals(const This &other) const │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +VirtualRefinement< dimension, CoordType > Refinement │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:107 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_i_n_c_r_e_m_e_n_t │ │ │ │ │ +void increment() │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:200 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_ _>_:_:_~_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l │ │ │ │ │ +virtual ~VirtualRefinementSubEntityIteratorBackSpecial() │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:208 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0 │ │ │ │ │ +_>_:_:_v_e_r_t_e_x_I_n_d_i_c_e_s │ │ │ │ │ +virtual IndexVector vertexIndices() const =0 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0 │ │ │ │ │ +_>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +VirtualRefinement< dimension, CoordType > Refinement │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:217 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0 │ │ │ │ │ +_>_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ +Refinement::IndexVector IndexVector │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:218 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0 │ │ │ │ │ +_>_:_:_~_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l │ │ │ │ │ +virtual ~VirtualRefinementSubEntityIteratorBackSpecial() │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:222 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:231 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_:_:_i_n_d_e_x │ │ │ │ │ +virtual int index() const =0 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_:_:_T_h_i_s │ │ │ │ │ +Refinement::template SubEntityIteratorBack< codimension > This │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:234 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_:_:_c_l_o_n_e │ │ │ │ │ +virtual This * clone() const =0 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +Refinement::CoordVector CoordVector │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:235 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +VirtualRefinement< dimension, CoordType > Refinement │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:233 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ +virtual bool operator==(const This &other) const =0 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_:_:_c_o_o_r_d_s │ │ │ │ │ +virtual CoordVector coords() const =0 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_:_:_~_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k │ │ │ │ │ +virtual ~SubEntityIteratorBack() │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:237 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_:_:_o_p_e_r_a_t_o_r_+_+ │ │ │ │ │ +virtual This & operator++()=0 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:261 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_n_V_e_r_t_i_c_e_s │ │ │ │ │ +int nVertices(Dune::RefinementIntervals tag) const override │ │ │ │ │ +Get the number of Vertices. │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:295 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_n_E_l_e_m_e_n_t_s │ │ │ │ │ +int nElements(Dune::RefinementIntervals tag) const override │ │ │ │ │ +Get the number of Elements. │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:320 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +Dune::VirtualRefinement< dimension, CoordType > VirtualRefinement │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:264 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_i_n_s_t_a_n_c_e │ │ │ │ │ +static VirtualRefinementImp< topologyId, CoordType, coerceToId, dimension > & │ │ │ │ │ +instance() │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:286 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +Dune::StaticRefinement< topologyId, CoordType, coerceToId, dimension > │ │ │ │ │ +StaticRefinement │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:263 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:397 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_:_:_B_a_s_e │ │ │ │ │ +VirtualRefinement::template SubEntityIteratorBack< codimension > Base │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:401 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_:_:_T_h_i_s │ │ │ │ │ +VirtualRefinementImp< topologyId, CoordType, coerceToId, dimension >::template │ │ │ │ │ +SubEntityIteratorBack< codimension > This │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:400 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_:_:_B_a_c_k_e_n_d_I_t_e_r_a_t_o_r │ │ │ │ │ +StaticRefinement::template Codim< codimension >::SubEntityIterator │ │ │ │ │ +BackendIterator │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:399 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +VirtualRefinement::CoordVector CoordVector │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:402 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:350 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_ _t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ +_c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_,_ _0_ _>_:_:_C_o_m_m_o_n │ │ │ │ │ +VirtualRefinementImp::template SubEntityIteratorBack< 0 > Common │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:368 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_ _t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ +_c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_,_ _0_ _>_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ +RefinementBase::IndexVector IndexVector │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:371 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_ _t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ +_c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_,_ _0_ _>_:_:_R_e_f_i_n_e_m_e_n_t_B_a_s_e │ │ │ │ │ +VirtualRefinement< dimension, CoordType > RefinementBase │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:370 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_ _t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ +_c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_,_ _0_ _>_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ +Dune::VirtualRefinementImp< topologyId, CoordType, coerceToId, dimension > │ │ │ │ │ +VirtualRefinementImp │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:367 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_I_m_p_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_B_a_c_k_S_p_e_c_i_a_l_<_ _t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ +_c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n_,_ _0_ _>_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +VirtualRefinementImp::StaticRefinement StaticRefinement │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:369 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_B_u_i_l_d_e_r │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:518 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_B_u_i_l_d_e_r_:_:_b_u_i_l_d │ │ │ │ │ +static VirtualRefinement< dimension, CoordType > & build(unsigned topologyId, │ │ │ │ │ +unsigned coerceToId) │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:522 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_B_u_i_l_d_e_r_<_ _1_,_ _C_o_o_r_d_T_y_p_e_ _>_:_:_b_u_i_l_d │ │ │ │ │ +static VirtualRefinement< dimension, CoordType > & build(unsigned topologyId, │ │ │ │ │ +unsigned coerceToId) │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:573 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_B_u_i_l_d_e_r_<_ _3_,_ _C_o_o_r_d_T_y_p_e_ _>_:_:_b_u_i_l_d │ │ │ │ │ +static VirtualRefinement< dimension, CoordType > & build(unsigned topologyId, │ │ │ │ │ +unsigned coerceToId) │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:595 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ +VirtualRefinement base class. │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.hh:283 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r_B_a_c_k │ │ │ │ │ +SubEntityIteratorBack< dimension > VertexIteratorBack │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.hh:307 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_v_B_e_g_i_n │ │ │ │ │ +VertexIterator vBegin(Dune::RefinementIntervals tag) const │ │ │ │ │ +Get an VertexIterator. │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:38 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_e_B_e_g_i_n │ │ │ │ │ +ElementIterator eBegin(Dune::RefinementIntervals tag) const │ │ │ │ │ +Get an ElementIterator. │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:54 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_e_E_n_d │ │ │ │ │ +ElementIterator eEnd(Dune::RefinementIntervals tag) const │ │ │ │ │ +Get an ElementIterator. │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:62 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ +Codim< 0 >::SubEntityIterator ElementIterator │ │ │ │ │ +The ElementIterator of the VirtualRefinement. │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.hh:290 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_v_E_n_d │ │ │ │ │ +VertexIterator vEnd(Dune::RefinementIntervals tag) const │ │ │ │ │ +Get an VertexIterator. │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.cc:46 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ +FieldVector< CoordType, dimension > CoordVector │ │ │ │ │ +The CoordVector of the VirtualRefinement. │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.hh:297 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ +Codim< dimension >::SubEntityIterator VertexIterator │ │ │ │ │ +The VertexIterator of the VirtualRefinement. │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.hh:288 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r_B_a_c_k │ │ │ │ │ +SubEntityIteratorBack< 0 > ElementIteratorBack │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.hh:308 │ │ │ │ │ +_D_u_n_e_:_:_V_i_r_t_u_a_l_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m │ │ │ │ │ +codim database of VirtualRefinement │ │ │ │ │ +DDeeffiinniittiioonn virtualrefinement.hh:367 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00212.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: simplex.cc File Reference │ │ │ │ +dune-geometry: type.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,105 +65,60 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ -Macros
│ │ │ │ -
simplex.cc File Reference
│ │ │ │ +Functions
│ │ │ │ +
type.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

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

A unique label for each type of element that can occur in a grid. │ │ │ │ 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 <cstdint>
│ │ │ │ +#include <string>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │ +#include <dune/common/unused.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::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::GeometryType
 Unique label for each type of entities that can occur in DUNE grids. 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...)
namespace  Dune::GeometryTypes
 Predefined GeometryTypes for common geometries.
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Macros

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

│ │ │ │ Functions

Utilities
template<int dimension>
int Dune::RefinementImp::Simplex::pointIndex (const FieldVector< int, dimension > &point)
 calculate the index of a given gridpoint within a Kuhn0 simplex
 
template<int n>
FieldVector< int, n > Dune::RefinementImp::Simplex::getPermutation (int m)
 Calculate permutation from it's index.
 
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.
 
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.
 
std::ostream & Dune::operator<< (std::ostream &s, const GeometryType &a)
 Prints the type to an output stream.
 
│ │ │ │

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
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ +

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

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,86 +1,36 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ - * _r_e_f_i_n_e_m_e_n_t │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s │ │ │ │ │ -simplex.cc File Reference │ │ │ │ │ -This file contains the _R_e_f_i_n_e_m_e_n_t implementation for simplices (triangles, │ │ │ │ │ -tetrahedrons...) _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_m_u_l_t_i_l_i_n_e_a_r_g_e_o_m_e_t_r_y_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ -#include "_b_a_s_e_._c_c" │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +type.hh File Reference │ │ │ │ │ +A unique label for each type of element that can occur in a grid. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ - class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___,_ _C_o_o_r_d_T_y_p_e_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___,_ _C_o_o_r_d_T_y_p_e_ _>_:_: │ │ │ │ │ - _C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ - _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ - _C_o_o_r_d_T_y_p_e_,_ _0_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___,_ _C_o_o_r_d_T_y_p_e_ _>_:_: │ │ │ │ │ - _C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ +  Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ -  This namespace contains the implementation of _R_e_f_i_n_e_m_e_n_t. │ │ │ │ │ -  │ │ │ │ │ -namespace   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x │ │ │ │ │ -  This namespace contains the _R_e_f_i_n_e_m_e_n_t implementation for simplices │ │ │ │ │ - (triangles, tetrahedrons...) │ │ │ │ │ -  │ │ │ │ │ -MMaaccrrooss │ │ │ │ │ -#define  _D_U_N_E___G_R_I_D___C_O_M_M_O_N___R_E_F_I_N_E_M_E_N_T___S_I_M_P_L_E_X___C_C │ │ │ │ │ +namespace   _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_s │ │ │ │ │ +  Predefined _G_e_o_m_e_t_r_y_T_y_p_e_s for common geometries. │ │ │ │ │   │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -Utilities │ │ │ │ │ -template │ │ │ │ │ - int  _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_p_o_i_n_t_I_n_d_e_x │ │ │ │ │ - (const FieldVector< int, dimension > │ │ │ │ │ - &point) │ │ │ │ │ -  calculate the index of a given gridpoint │ │ │ │ │ - within a Kuhn0 simplex │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - FieldVector< int, n >  _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_: │ │ │ │ │ - _g_e_t_P_e_r_m_u_t_a_t_i_o_n (int m) │ │ │ │ │ -  Calculate permutation from it's index. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -FieldVector< CoordType, dimension >  _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_: │ │ │ │ │ - _r_e_f_e_r_e_n_c_e_T_o_K_u_h_n (FieldVector< CoordType, │ │ │ │ │ - dimension > point, const FieldVector< int, │ │ │ │ │ - dimension > &kuhn) │ │ │ │ │ -  Map from the reference simplex to some │ │ │ │ │ - Kuhn simplex. │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -FieldVector< CoordType, dimension >  _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_: │ │ │ │ │ - _k_u_h_n_T_o_R_e_f_e_r_e_n_c_e (FieldVector< CoordType, │ │ │ │ │ - dimension > point, const FieldVector< int, │ │ │ │ │ - dimension > &kuhn) │ │ │ │ │ -  Map from some Kuhn simplex to the │ │ │ │ │ - reference simplex. │ │ │ │ │ +std::ostream &  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream &s, const _G_e_o_m_e_t_r_y_T_y_p_e &a) │ │ │ │ │ +  Prints the type to an output stream. │ │ │ │ │   │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -This file contains the _R_e_f_i_n_e_m_e_n_t implementation for simplices (triangles, │ │ │ │ │ -tetrahedrons...) │ │ │ │ │ -See _R_e_f_i_n_e_m_e_n_t_ _i_m_p_l_e_m_e_n_t_a_t_i_o_n_ _f_o_r_ _s_i_m_p_l_i_c_e_s. │ │ │ │ │ -********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ -********** _?◆_? DDUUNNEE__GGRRIIDD__CCOOMMMMOONN__RREEFFIINNEEMMEENNTT__SSIIMMPPLLEEXX__CCCC ********** │ │ │ │ │ -#define DUNE_GRID_COMMON_REFINEMENT_SIMPLEX_CC │ │ │ │ │ +A unique label for each type of element that can occur in a grid. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00212_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: simplex.cc Source File │ │ │ │ +dune-geometry: type.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,621 +70,481 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
simplex.cc
│ │ │ │ +
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 © 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_GRID_COMMON_REFINEMENT_SIMPLEX_CC
│ │ │ │ -
6#define DUNE_GRID_COMMON_REFINEMENT_SIMPLEX_CC
│ │ │ │ +
5#ifndef DUNE_GEOMETRY_TYPE_HH
│ │ │ │ +
6#define DUNE_GEOMETRY_TYPE_HH
│ │ │ │
7
│ │ │ │ -
8// This file is part of DUNE, a Distributed and Unified Numerics Environment
│ │ │ │ -
9// This file is copyright (C) 2005 Jorrit Fahlke <jorrit@jorrit.de>
│ │ │ │ -
10// This file is licensed under version 2 of the GNU General Public License,
│ │ │ │ -
11// with a special "runtime exception." See COPYING at the top of the source
│ │ │ │ -
12// tree for the full licence.
│ │ │ │ -
13
│ │ │ │ -
243#include <algorithm>
│ │ │ │ -
244
│ │ │ │ -
245#include <dune/common/fvector.hh>
│ │ │ │ -
246#include <dune/common/math.hh>
│ │ │ │ -
247
│ │ │ │ - │ │ │ │ - │ │ │ │ -
250#include <dune/geometry/type.hh>
│ │ │ │ -
251
│ │ │ │ -
252#include "base.cc"
│ │ │ │ -
253
│ │ │ │ -
254namespace Dune {
│ │ │ │ -
255
│ │ │ │ -
256 namespace RefinementImp {
│ │ │ │ -
257
│ │ │ │ -
│ │ │ │ -
264 namespace Simplex {
│ │ │ │ -
265
│ │ │ │ -
266 // //////////////////
│ │ │ │ -
267 //
│ │ │ │ -
269 //
│ │ │ │ -
270
│ │ │ │ +
12#include <cassert>
│ │ │ │ +
13#include <cstdint>
│ │ │ │ +
14
│ │ │ │ +
15#include <string>
│ │ │ │ +
16#include <type_traits>
│ │ │ │ +
17
│ │ │ │ +
18#include <dune/common/exceptions.hh>
│ │ │ │ +
19#include <dune/common/typetraits.hh>
│ │ │ │ +
20#include <dune/common/unused.hh>
│ │ │ │ +
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 // GeometryType
│ │ │ │ +
99 // -------------
│ │ │ │ +
100
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
114 {
│ │ │ │ +
115 public:
│ │ │ │ +
116
│ │ │ │ +
│ │ │ │ +
119 enum
│ │ │ │ +
120 BasicType {
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
126 none
│ │ │ │ +
127 };
│ │ │ │ +
│ │ │ │ +
128
│ │ │ │ +
129 private:
│ │ │ │ +
130
│ │ │ │ +
132 unsigned char dim_;
│ │ │ │ +
133
│ │ │ │ +
135 bool none_;
│ │ │ │ +
136
│ │ │ │ +
138 unsigned int topologyId_;
│ │ │ │ +
139
│ │ │ │ +
140 // Internal type used for the Id. The exact nature of this type is kept
│ │ │ │ +
141 // as an implementation detail on purpose. We use a scoped enum here because scoped enums
│ │ │ │ +
142 // can be used as template parameters, but are not implicitly converted to other integral
│ │ │ │ +
143 // types by the compiler. That way, we avoid unfortunate implicit conversion chains, e.g.
│ │ │ │ +
144 // people trying to work with GlobalGeometryTypeIndex, but forgetting to actually call
│ │ │ │ +
145 // GlobalGeometryTypeIndex::index(gt) and just using gt directly.
│ │ │ │ +
146 enum class IdType : std::uint64_t
│ │ │ │ +
147 {};
│ │ │ │ +
148
│ │ │ │ +
149 public:
│ │ │ │ +
150
│ │ │ │ +
181 using Id = IdType;
│ │ │ │ +
182
│ │ │ │ +
│ │ │ │ +
190 constexpr operator Id() const
│ │ │ │ +
191 {
│ │ │ │ +
192 // recreate the exact storage layout that this class is using, making conversion
│ │ │ │ +
193 // extremely cheap
│ │ │ │ +
194 std::uint64_t id = dim_ | (std::uint64_t(none_) << 8) | (std::uint64_t(topologyId_) << 32);
│ │ │ │ +
195 return static_cast<Id>(id);
│ │ │ │ +
196 }
│ │ │ │ +
│ │ │ │ +
197
│ │ │ │ +
│ │ │ │ +
210 constexpr Id toId() const
│ │ │ │ +
211 {
│ │ │ │ +
212 return static_cast<Id>(*this);
│ │ │ │ +
213 }
│ │ │ │ +
│ │ │ │ +
214
│ │ │ │ +
│ │ │ │ +
222 constexpr GeometryType(Id id)
│ │ │ │ +
223 : dim_(static_cast<std::uint64_t>(id) & 0xFF)
│ │ │ │ +
224 , none_(static_cast<std::uint64_t>(id) & 0x100)
│ │ │ │ +
225 , topologyId_(static_cast<std::uint64_t>(id) >> 32)
│ │ │ │ +
226 {}
│ │ │ │ +
│ │ │ │ +
227
│ │ │ │ +
230
│ │ │ │ +
│ │ │ │ +
232 constexpr GeometryType ()
│ │ │ │ +
233 : dim_(0), none_(true), topologyId_(0)
│ │ │ │ +
234 {}
│ │ │ │ +
│ │ │ │ +
235
│ │ │ │ +
│ │ │ │ +
242 constexpr GeometryType(unsigned int topologyId, unsigned int dim, bool isNone)
│ │ │ │ +
243 : dim_(dim), none_(isNone), topologyId_(topologyId)
│ │ │ │ +
244 {}
│ │ │ │ +
│ │ │ │ +
245
│ │ │ │ +
│ │ │ │ +
251 constexpr GeometryType(unsigned int topologyId, unsigned int dim)
│ │ │ │ +
252 : dim_(dim), none_(false), topologyId_(topologyId)
│ │ │ │ +
253 {}
│ │ │ │ +
│ │ │ │ +
254
│ │ │ │ +
265 template<class TopologyType,
│ │ │ │ +
266 class = std::void_t<decltype(TopologyType::dimension), decltype(TopologyType::id)>>
│ │ │ │ +
│ │ │ │ +
267 explicit GeometryType(TopologyType t)
│ │ │ │ +
268 : dim_(TopologyType::dimension), none_(false), topologyId_(TopologyType::id)
│ │ │ │ +
269 {
│ │ │ │ +
270 DUNE_UNUSED_PARAMETER(t);
│ │ │ │ +
271 }
│ │ │ │ +
│ │ │ │
272
│ │ │ │ -
279 template<int dimension>
│ │ │ │ -
│ │ │ │ -
280 int pointIndex(const FieldVector<int, dimension> &point)
│ │ │ │ -
281 {
│ │ │ │ -
282 int index = 0;
│ │ │ │ -
283 for(int i = 0; i < dimension; ++i)
│ │ │ │ -
284 index += Dune::binomial(dimension-i + point[i]-1, dimension-i);
│ │ │ │ -
285 return index;
│ │ │ │ -
286 }
│ │ │ │ +
│ │ │ │ +
279 constexpr bool isVertex() const {
│ │ │ │ +
280 return dim_==0;
│ │ │ │ +
281 }
│ │ │ │ +
│ │ │ │ +
282
│ │ │ │ +
│ │ │ │ +
284 constexpr bool isLine() const {
│ │ │ │ +
285 return dim_==1;
│ │ │ │ +
286 }
│ │ │ │
│ │ │ │
287
│ │ │ │ -
292 template<int n>
│ │ │ │ -
│ │ │ │ -
293 FieldVector<int, n> getPermutation(int m)
│ │ │ │ -
294 {
│ │ │ │ -
295 FieldVector<int, n> perm;
│ │ │ │ -
296 for(int i = 0; i < n; ++i)
│ │ │ │ -
297 perm[i] = i;
│ │ │ │ -
298
│ │ │ │ -
299 int base = 1;
│ │ │ │ -
300 for(int i = 1; i <= n; ++i)
│ │ │ │ -
301 base *= i;
│ │ │ │ +
│ │ │ │ +
289 constexpr bool isTriangle() const {
│ │ │ │ +
290 return ! none_ && dim_==2 && (topologyId_ | 1) == 0b0001;
│ │ │ │ +
291 }
│ │ │ │ +
│ │ │ │ +
292
│ │ │ │ +
│ │ │ │ +
294 constexpr bool isQuadrilateral() const {
│ │ │ │ +
295 return ! none_ && dim_==2 && (topologyId_ | 1) == 0b0011;
│ │ │ │ +
296 }
│ │ │ │ +
│ │ │ │ +
297
│ │ │ │ +
│ │ │ │ +
299 constexpr bool isTetrahedron() const {
│ │ │ │ +
300 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0001;
│ │ │ │ +
301 }
│ │ │ │ +
│ │ │ │
302
│ │ │ │ -
303 for(int i = n; i > 0; --i) {
│ │ │ │ -
304 base /= i;
│ │ │ │ -
305 int d = m / base;
│ │ │ │ -
306 m %= base;
│ │ │ │ -
307 int t = perm[i-1]; perm[i-1] = perm[i-1-d]; perm[i-1-d] = t;
│ │ │ │ -
308 }
│ │ │ │ -
309 return perm;
│ │ │ │ -
310 }
│ │ │ │ -
│ │ │ │ -
311
│ │ │ │ -
312 // map between the reference simplex and some arbitrary kuhn simplex (denoted by it's permutation)
│ │ │ │ -
320 template<int dimension, class CoordType>
│ │ │ │ -
321 FieldVector<CoordType, dimension>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
323 FieldVector<CoordType, dimension> point,
│ │ │ │ -
325 const FieldVector<int, dimension> &kuhn)
│ │ │ │ -
326 {
│ │ │ │ -
327 for(int i = dimension - 1; i > 0; --i)
│ │ │ │ -
328 point[kuhn[i-1]] += point[kuhn[i]];
│ │ │ │ -
329 return point;
│ │ │ │ -
330 }
│ │ │ │ -
│ │ │ │ -
331
│ │ │ │ -
339 template<int dimension, class CoordType>
│ │ │ │ -
340 FieldVector<CoordType, dimension>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
342 FieldVector<CoordType, dimension> point,
│ │ │ │ -
344 const FieldVector<int, dimension> &kuhn)
│ │ │ │ -
345 {
│ │ │ │ -
346 for(int i = 0; i < dimension - 1; ++i)
│ │ │ │ -
347 point[kuhn[i]] -= point[kuhn[i+1]];
│ │ │ │ -
348 return point;
│ │ │ │ -
349 }
│ │ │ │ +
│ │ │ │ +
304 constexpr bool isPyramid() const {
│ │ │ │ +
305 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0011;
│ │ │ │ +
306 }
│ │ │ │ +
│ │ │ │ +
307
│ │ │ │ +
│ │ │ │ +
309 constexpr bool isPrism() const {
│ │ │ │ +
310 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0101;
│ │ │ │ +
311 }
│ │ │ │ +
│ │ │ │ +
312
│ │ │ │ +
│ │ │ │ +
314 constexpr bool isHexahedron() const {
│ │ │ │ +
315 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0111;
│ │ │ │ +
316 }
│ │ │ │ +
│ │ │ │ +
317
│ │ │ │ +
│ │ │ │ +
319 constexpr bool isSimplex() const {
│ │ │ │ +
320 return ! none_ && (topologyId_ | 1) == 1;
│ │ │ │ +
321 }
│ │ │ │ +
│ │ │ │ +
322
│ │ │ │ +
│ │ │ │ +
324 constexpr bool isCube() const {
│ │ │ │ +
325 return ! none_ && ((topologyId_ ^ ((1 << dim_)-1)) >> 1 == 0);
│ │ │ │ +
326 }
│ │ │ │ +
│ │ │ │ +
327
│ │ │ │ +
│ │ │ │ +
329 constexpr bool isConical() const {
│ │ │ │ +
330 return ! none_ && (((topologyId_ & ~1) & (1u << (dim_-1))) == 0);
│ │ │ │ +
331 }
│ │ │ │ +
│ │ │ │ +
332
│ │ │ │ +
│ │ │ │ +
337 constexpr bool isConical(const int& step) const {
│ │ │ │ +
338 return ! none_ && (((topologyId_ & ~1) & (1u << step)) == 0);
│ │ │ │ +
339 }
│ │ │ │ +
│ │ │ │ +
340
│ │ │ │ +
│ │ │ │ +
342 constexpr bool isPrismatic() const {
│ │ │ │ +
343 return ! none_ && (( (topologyId_ | 1) & (1u << (dim_-1))) != 0);
│ │ │ │ +
344 }
│ │ │ │ +
│ │ │ │ +
345
│ │ │ │ +
│ │ │ │ +
350 constexpr bool isPrismatic(const int& step) const {
│ │ │ │ +
351 return ! none_ && (( (topologyId_ | 1) & (1u << step)) != 0);
│ │ │ │ +
352 }
│ │ │ │
│ │ │ │ -
350
│ │ │ │ -
351
│ │ │ │
353
│ │ │ │ -
354 // /////////////////////////////////////////
│ │ │ │ -
355 //
│ │ │ │ -
356 // refinement implementation for simplices
│ │ │ │ -
357 //
│ │ │ │ +
│ │ │ │ +
355 constexpr bool isNone() const {
│ │ │ │ +
356 return none_;
│ │ │ │ +
357 }
│ │ │ │ +
│ │ │ │
358
│ │ │ │ -
359 template<int dimension_, class CoordType>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
361 {
│ │ │ │ -
362 public:
│ │ │ │ -
363 constexpr static int dimension = dimension_;
│ │ │ │ -
364 typedef CoordType ctype;
│ │ │ │ -
365
│ │ │ │ -
366 template<int codimension>
│ │ │ │ -
367 struct Codim;
│ │ │ │ - │ │ │ │ -
369 typedef FieldVector<CoordType, dimension> CoordVector;
│ │ │ │ - │ │ │ │ -
371 typedef FieldVector<int, dimension+1> IndexVector;
│ │ │ │ -
372
│ │ │ │ -
373 static int nVertices(int nIntervals);
│ │ │ │ -
374 static VertexIterator vBegin(int nIntervals);
│ │ │ │ -
375 static VertexIterator vEnd(int nIntervals);
│ │ │ │ -
376
│ │ │ │ -
377 static int nElements(int nIntervals);
│ │ │ │ -
378 static ElementIterator eBegin(int nIntervals);
│ │ │ │ -
379 static ElementIterator eEnd(int nIntervals);
│ │ │ │ -
380 };
│ │ │ │ -
│ │ │ │ -
381
│ │ │ │ -
382 template<int dimension, class CoordType>
│ │ │ │ -
383 template<int codimension>
│ │ │ │ -
│ │ │ │ -
384 struct RefinementImp<dimension, CoordType>::Codim
│ │ │ │ -
385 {
│ │ │ │ -
386 class SubEntityIterator;
│ │ │ │ -
387 // We don't need the caching, but the uncached MultiLinearGeometry has bug FS#1209
│ │ │ │ - │ │ │ │ -
389 };
│ │ │ │ -
│ │ │ │ -
390
│ │ │ │ -
391 template<int dimension, class CoordType>
│ │ │ │ -
392 int
│ │ │ │ +
│ │ │ │ +
360 constexpr unsigned int dim() const {
│ │ │ │ +
361 return dim_;
│ │ │ │ +
362 }
│ │ │ │ +
│ │ │ │ +
363
│ │ │ │ +
│ │ │ │ +
365 constexpr unsigned int id() const {
│ │ │ │ +
366 return topologyId_;
│ │ │ │ +
367 }
│ │ │ │ +
│ │ │ │ +
368
│ │ │ │ +
373
│ │ │ │ +
│ │ │ │ +
377 constexpr bool operator==(const GeometryType& other) const {
│ │ │ │ +
378 return ( ( none_ == other.none_ )
│ │ │ │ +
379 && ( ( none_ == true )
│ │ │ │ +
380 || ( ( dim_ == other.dim_ )
│ │ │ │ +
381 && ( (topologyId_ >> 1) == (other.topologyId_ >> 1) )
│ │ │ │ +
382 )
│ │ │ │ +
383 )
│ │ │ │ +
384 );
│ │ │ │ +
385 }
│ │ │ │ +
│ │ │ │ +
386
│ │ │ │ +
│ │ │ │ +
388 constexpr bool operator!=(const GeometryType& other) const {
│ │ │ │ +
389 return ! ((*this)==other);
│ │ │ │ +
390 }
│ │ │ │ +
│ │ │ │ +
391
│ │ │ │
│ │ │ │ - │ │ │ │ -
394 nVertices(int nIntervals)
│ │ │ │ -
395 {
│ │ │ │ -
396 return Dune::binomial(dimension + nIntervals, (int)dimension);
│ │ │ │ -
397 }
│ │ │ │ -
│ │ │ │ -
398
│ │ │ │ -
399 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
402 vBegin(int nIntervals)
│ │ │ │ -
403 {
│ │ │ │ -
404 return VertexIterator(nIntervals);
│ │ │ │ -
405 }
│ │ │ │ -
│ │ │ │ -
406
│ │ │ │ -
407 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
410 vEnd(int nIntervals)
│ │ │ │ -
411 {
│ │ │ │ -
412 return VertexIterator(nIntervals, true);
│ │ │ │ -
413 }
│ │ │ │ -
│ │ │ │ -
414
│ │ │ │ -
415 template<int dimension, class CoordType>
│ │ │ │ -
416 int
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
418 nElements(int nIntervals)
│ │ │ │ -
419 {
│ │ │ │ -
420 return Dune::power(nIntervals, int(dimension));
│ │ │ │ -
421 }
│ │ │ │ -
│ │ │ │ -
422
│ │ │ │ -
423 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
426 eBegin(int nIntervals)
│ │ │ │ -
427 {
│ │ │ │ -
428 return ElementIterator(nIntervals);
│ │ │ │ -
429 }
│ │ │ │ -
│ │ │ │ -
430
│ │ │ │ -
431 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
434 eEnd(int nIntervals)
│ │ │ │ -
435 {
│ │ │ │ -
436 return ElementIterator(nIntervals, true);
│ │ │ │ -
437 }
│ │ │ │ -
│ │ │ │ -
438
│ │ │ │ -
439 // //////////////
│ │ │ │ -
440 //
│ │ │ │ -
441 // The iterator
│ │ │ │ -
442 //
│ │ │ │ +
393 constexpr bool operator < (const GeometryType& other) const {
│ │ │ │ +
394 return ( ( none_ < other.none_ )
│ │ │ │ +
395 || ( !( other.none_ < none_ )
│ │ │ │ +
396 && ( ( dim_ < other.dim_ )
│ │ │ │ +
397 || ( (other.dim_ == dim_)
│ │ │ │ +
398 && ((topologyId_ >> 1) < (other.topologyId_ >> 1) )
│ │ │ │ +
399 )
│ │ │ │ +
400 )
│ │ │ │ +
401 )
│ │ │ │ +
402 );
│ │ │ │ +
403 }
│ │ │ │ +
│ │ │ │ +
404
│ │ │ │ +
407 };
│ │ │ │ +
│ │ │ │ +
408
│ │ │ │ +
│ │ │ │ +
410 inline std::ostream& operator<< (std::ostream& s, const GeometryType& a)
│ │ │ │ +
411 {
│ │ │ │ +
412 if (a.isSimplex())
│ │ │ │ +
413 {
│ │ │ │ +
414 s << "(simplex, " << a.dim() << ")";
│ │ │ │ +
415 return s;
│ │ │ │ +
416 }
│ │ │ │ +
417 if (a.isCube())
│ │ │ │ +
418 {
│ │ │ │ +
419 s << "(cube, " << a.dim() << ")";
│ │ │ │ +
420 return s;
│ │ │ │ +
421 }
│ │ │ │ +
422 if (a.isPyramid())
│ │ │ │ +
423 {
│ │ │ │ +
424 s << "(pyramid, 3)";
│ │ │ │ +
425 return s;
│ │ │ │ +
426 }
│ │ │ │ +
427 if (a.isPrism())
│ │ │ │ +
428 {
│ │ │ │ +
429 s << "(prism, 3)";
│ │ │ │ +
430 return s;
│ │ │ │ +
431 }
│ │ │ │ +
432 if (a.isNone())
│ │ │ │ +
433 {
│ │ │ │ +
434 s << "(none, " << a.dim() << ")";
│ │ │ │ +
435 return s;
│ │ │ │ +
436 }
│ │ │ │ +
437 s << "(other [" << a.id() << "], " << a.dim() << ")";
│ │ │ │ +
438 return s;
│ │ │ │ +
439 }
│ │ │ │ +
│ │ │ │ +
440
│ │ │ │ +
441
│ │ │ │
443
│ │ │ │ -
444 template<int dimension, class CoordType, int codimension>
│ │ │ │ - │ │ │ │ -
446
│ │ │ │ -
447 // vertices
│ │ │ │ +
│ │ │ │ +
447 namespace GeometryTypes {
│ │ │ │
448
│ │ │ │ -
449 template<int dimension, class CoordType>
│ │ │ │ -
│ │ │ │ -
450 class RefinementIteratorSpecial<dimension, CoordType, dimension>
│ │ │ │ -
451 {
│ │ │ │ -
452 public:
│ │ │ │ - │ │ │ │ -
454 typedef typename Refinement::CoordVector CoordVector;
│ │ │ │ -
455 typedef typename Refinement::template Codim<dimension>::Geometry Geometry;
│ │ │ │ - │ │ │ │ +
450
│ │ │ │ +
453 inline constexpr GeometryType simplex(unsigned int dim)
│ │ │ │ +
454 {
│ │ │ │ +
455 return GeometryType(0,dim,false);
│ │ │ │ +
456 }
│ │ │ │
457
│ │ │ │ -
458 RefinementIteratorSpecial(int nIntervals, bool end = false);
│ │ │ │
459
│ │ │ │ -
460 void increment();
│ │ │ │ -
461 bool equals(const This &other) const;
│ │ │ │ -
462
│ │ │ │ -
463 CoordVector coords() const;
│ │ │ │ -
464 Geometry geometry () const;
│ │ │ │ -
465
│ │ │ │ -
466 int index() const;
│ │ │ │ -
467 protected:
│ │ │ │ -
468 typedef FieldVector<int, dimension> Vertex;
│ │ │ │ -
469
│ │ │ │ -
470 int size;
│ │ │ │ - │ │ │ │ -
472 };
│ │ │ │ -
│ │ │ │ -
473
│ │ │ │ -
474 template<int dimension, class CoordType>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
476 RefinementIteratorSpecial(int nIntervals, bool end)
│ │ │ │ -
477 : size(nIntervals)
│ │ │ │ -
478 {
│ │ │ │ -
479 vertex[0] = (end) ? size + 1 : 0;
│ │ │ │ -
480 for(int i = 1; i < dimension; ++ i)
│ │ │ │ -
481 vertex[i] = 0;
│ │ │ │ -
482 }
│ │ │ │ -
│ │ │ │ -
483
│ │ │ │ -
484 template<int dimension, class CoordType>
│ │ │ │ -
485 void
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
488 {
│ │ │ │ -
489 assert(vertex[0] <= size);
│ │ │ │ -
490 for(int i = dimension - 1; i >= 0; --i) {
│ │ │ │ -
491 ++vertex[i];
│ │ │ │ -
492 if(i == 0 || vertex[i] <= vertex[i-1])
│ │ │ │ -
493 break;
│ │ │ │ -
494 else
│ │ │ │ -
495 vertex[i] = 0;
│ │ │ │ -
496 }
│ │ │ │ -
497 }
│ │ │ │ -
│ │ │ │ -
498
│ │ │ │ -
499 template<int dimension, class CoordType>
│ │ │ │ -
500 bool
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
502 equals(const This &other) const
│ │ │ │ -
503 {
│ │ │ │ -
504 return size == other.size && vertex == other.vertex;
│ │ │ │ -
505 }
│ │ │ │ -
│ │ │ │ -
506
│ │ │ │ -
507 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
510 coords() const
│ │ │ │ -
511 {
│ │ │ │ -
512 Vertex ref = kuhnToReference(vertex, getPermutation<dimension>(0));
│ │ │ │ +
462 inline constexpr GeometryType cube(unsigned int dim)
│ │ │ │ +
463 {
│ │ │ │ +
464 return GeometryType(((dim>1) ? ((1 << dim) - 1) : 0),dim,false);
│ │ │ │ +
465 }
│ │ │ │ +
466
│ │ │ │ +
468
│ │ │ │ +
471 inline constexpr GeometryType none(unsigned int dim)
│ │ │ │ +
472 {
│ │ │ │ +
473 return GeometryType(0,dim,true);
│ │ │ │ +
474 }
│ │ │ │ +
475
│ │ │ │ +
477 inline constexpr GeometryType conicalExtension(const GeometryType& gt)
│ │ │ │ +
478 {
│ │ │ │ +
479 return GeometryType(gt.id(), gt.dim()+1, gt.isNone());
│ │ │ │ +
480 }
│ │ │ │ +
481
│ │ │ │ +
483 inline constexpr GeometryType prismaticExtension(const GeometryType& gt)
│ │ │ │ +
484 {
│ │ │ │ +
485 return GeometryType(gt.id() | ((1 << gt.dim())), gt.dim()+1, gt.isNone());
│ │ │ │ +
486 }
│ │ │ │ +
487
│ │ │ │ +
489
│ │ │ │ +
492 inline constexpr GeometryType vertex = GeometryType(0,0,false);
│ │ │ │ +
493
│ │ │ │ +
495
│ │ │ │ +
498 inline constexpr GeometryType line = GeometryType(0,1,false);
│ │ │ │ +
499
│ │ │ │ +
501
│ │ │ │ +
504 inline constexpr GeometryType triangle = simplex(2);
│ │ │ │ +
505
│ │ │ │ +
507
│ │ │ │ +
510 inline constexpr GeometryType quadrilateral = cube(2);
│ │ │ │ +
511
│ │ │ │
513
│ │ │ │ -
514 CoordVector coords;
│ │ │ │ -
515 for(int i = 0; i < dimension; ++i)
│ │ │ │ -
516 coords[i] = CoordType(ref[i]) / size;
│ │ │ │ -
517 return coords;
│ │ │ │ -
518 }
│ │ │ │ -
│ │ │ │ +
516 inline constexpr GeometryType tetrahedron = simplex(3);
│ │ │ │ +
517
│ │ │ │
519
│ │ │ │ -
520 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
523 {
│ │ │ │ -
524 std::vector<CoordVector> corners(1);
│ │ │ │ -
525 corners[0] = (CoordVector)vertex;
│ │ │ │ -
526 return Geometry(GeometryTypes::vertex, corners);
│ │ │ │ -
527 }
│ │ │ │ -
│ │ │ │ -
528
│ │ │ │ -
529 template<int dimension, class CoordType>
│ │ │ │ -
530 int
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
532 index() const
│ │ │ │ -
533 {
│ │ │ │ -
534 return pointIndex(vertex);
│ │ │ │ -
535 }
│ │ │ │ -
│ │ │ │ -
536
│ │ │ │ -
537 // elements
│ │ │ │ -
538
│ │ │ │ -
539 template<int dimension, class CoordType>
│ │ │ │ -
│ │ │ │ -
540 class RefinementIteratorSpecial<dimension, CoordType, 0>
│ │ │ │ -
541 {
│ │ │ │ -
542 public:
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
546 typedef typename Refinement::template Codim<0>::Geometry Geometry;
│ │ │ │ - │ │ │ │ -
548
│ │ │ │ -
549 RefinementIteratorSpecial(int nIntervals, bool end = false);
│ │ │ │ -
550
│ │ │ │ -
551 void increment();
│ │ │ │ -
552 bool equals(const This &other) const;
│ │ │ │ -
553
│ │ │ │ -
554 IndexVector vertexIndices() const;
│ │ │ │ -
555 int index() const;
│ │ │ │ -
556 CoordVector coords() const;
│ │ │ │ -
557
│ │ │ │ -
558 Geometry geometry () const;
│ │ │ │ -
559
│ │ │ │ -
560 private:
│ │ │ │ -
561 CoordVector global(const CoordVector &local) const;
│ │ │ │ -
562
│ │ │ │ -
563 protected:
│ │ │ │ -
564 typedef FieldVector<int, dimension> Vertex;
│ │ │ │ -
565 constexpr static int nKuhnIntervals = Dune::factorial(dimension);
│ │ │ │ -
566
│ │ │ │ - │ │ │ │ - │ │ │ │ -
569 int size;
│ │ │ │ - │ │ │ │ -
571 };
│ │ │ │ -
│ │ │ │ -
572
│ │ │ │ -
573 template<int dimension, class CoordType>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
575 RefinementIteratorSpecial(int nIntervals, bool end)
│ │ │ │ -
576 : kuhnIndex(0), size(nIntervals), index_(0)
│ │ │ │ -
577 {
│ │ │ │ -
578 for(int i = 0; i < dimension; ++i)
│ │ │ │ -
579 origin[i] = 0;
│ │ │ │ -
580 if(end) {
│ │ │ │ -
581 index_ = Refinement::nElements(nIntervals);
│ │ │ │ -
582 origin[0] = size;
│ │ │ │ -
583 }
│ │ │ │ -
584 }
│ │ │ │ -
│ │ │ │ -
585
│ │ │ │ -
586 template<int dimension, class CoordType>
│ │ │ │ -
587 void
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
590 {
│ │ │ │ -
591 assert(origin[0] < size);
│ │ │ │ -
592
│ │ │ │ -
593 ++index_;
│ │ │ │ -
594
│ │ │ │ -
595 while(1) {
│ │ │ │ -
596 ++kuhnIndex;
│ │ │ │ -
597 if(kuhnIndex == nKuhnIntervals) {
│ │ │ │ -
598 kuhnIndex = 0;
│ │ │ │ -
599 // increment origin
│ │ │ │ -
600 for(int i = dimension - 1; i >= 0; --i) {
│ │ │ │ -
601 ++origin[i];
│ │ │ │ -
602 if(i == 0 || origin[i] <= origin[i-1])
│ │ │ │ -
603 break;
│ │ │ │ -
604 else
│ │ │ │ -
605 origin[i] = 0;
│ │ │ │ -
606 }
│ │ │ │ -
607 }
│ │ │ │ -
608
│ │ │ │ -
609 // test whether the current simplex has any corner outside the kuhn0 simplex
│ │ │ │ -
610 FieldVector<int, dimension> perm = getPermutation<dimension>(kuhnIndex);
│ │ │ │ -
611 Vertex corner = origin;
│ │ │ │ -
612 bool outside = false;
│ │ │ │ -
613 for(int i = 0; i < dimension; ++i) {
│ │ │ │ -
614 // next corner
│ │ │ │ -
615 ++corner[perm[i]];
│ │ │ │ -
616 if(perm[i] > 0)
│ │ │ │ -
617 if(corner[perm[i]] > corner[perm[i]-1]) {
│ │ │ │ -
618 outside = true;
│ │ │ │ -
619 break;
│ │ │ │ -
620 }
│ │ │ │ -
621 }
│ │ │ │ -
622 if(!outside)
│ │ │ │ -
623 return;
│ │ │ │ -
624 }
│ │ │ │ -
625 }
│ │ │ │ -
│ │ │ │ -
626
│ │ │ │ -
627 template<int dimension, class CoordType>
│ │ │ │ -
628 bool
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
630 equals(const This &other) const
│ │ │ │ -
631 {
│ │ │ │ -
632 return size == other.size && index_ == other.index_;
│ │ │ │ -
633 }
│ │ │ │ -
│ │ │ │ -
634
│ │ │ │ -
635 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
638 vertexIndices() const
│ │ │ │ -
639 {
│ │ │ │ -
640 IndexVector indices;
│ │ │ │ -
641 FieldVector<int, dimension> perm = getPermutation<dimension>(kuhnIndex);
│ │ │ │ -
642 Vertex vertex = origin;
│ │ │ │ -
643 indices[0] = pointIndex(vertex);
│ │ │ │ -
644 for(int i = 0; i < dimension; ++i) {
│ │ │ │ -
645 ++vertex[perm[i]];
│ │ │ │ -
646 indices[i+1] = pointIndex(vertex);
│ │ │ │ -
647 }
│ │ │ │ -
648 if (kuhnIndex%2 == 1)
│ │ │ │ -
649 for(int i = 0; i < (dimension+1)/2; ++i) {
│ │ │ │ -
650 int t = indices[i];
│ │ │ │ -
651 indices[i] = indices[dimension-i];
│ │ │ │ -
652 indices[dimension-i] = t;
│ │ │ │ -
653 }
│ │ │ │ -
654 return indices;
│ │ │ │ -
655 }
│ │ │ │ -
│ │ │ │ -
656
│ │ │ │ -
657 template<int dimension, class CoordType>
│ │ │ │ -
658 int
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
660 index() const
│ │ │ │ -
661 {
│ │ │ │ -
662 return index_;
│ │ │ │ -
663 }
│ │ │ │ -
│ │ │ │ -
664
│ │ │ │ -
665 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
668 coords() const
│ │ │ │ -
669 {
│ │ │ │ - │ │ │ │ -
671 ::simplex().position(0,0));
│ │ │ │ -
672 }
│ │ │ │ -
│ │ │ │ -
673
│ │ │ │ -
674 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
677 {
│ │ │ │ -
678 std::vector<CoordVector> corners(dimension+1);
│ │ │ │ - │ │ │ │ -
680 for(int i = 0; i <= dimension; ++i)
│ │ │ │ -
681 corners[i] = global(refelem.position(i, dimension));
│ │ │ │ -
682 return Geometry(refelem.type(), corners);
│ │ │ │ -
683 }
│ │ │ │ -
│ │ │ │ -
684
│ │ │ │ -
685 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ - │ │ │ │ -
688 global(const CoordVector &local) const {
│ │ │ │ -
689 CoordVector v =
│ │ │ │ -
690 referenceToKuhn(local, getPermutation<dimension>(kuhnIndex));
│ │ │ │ -
691 v += origin;
│ │ │ │ -
692 v /= (typename CoordVector::value_type)size;
│ │ │ │ -
693 return kuhnToReference(v, getPermutation<dimension>(0));
│ │ │ │ -
694 }
│ │ │ │ -
695
│ │ │ │ -
696 // common
│ │ │ │ -
697
│ │ │ │ -
698 template<int dimension, class CoordType>
│ │ │ │ -
699 template<int codimension>
│ │ │ │ -
│ │ │ │ -
700 class RefinementImp<dimension, CoordType>::Codim<codimension>::SubEntityIterator
│ │ │ │ -
701 : public ForwardIteratorFacade<typename RefinementImp<dimension, CoordType>::template Codim<codimension>::SubEntityIterator, int>,
│ │ │ │ -
702 public RefinementIteratorSpecial<dimension, CoordType, codimension>
│ │ │ │ -
703 {
│ │ │ │ -
704 public:
│ │ │ │ - │ │ │ │ -
706
│ │ │ │ -
707 SubEntityIterator(int nIntervals, bool end = false);
│ │ │ │ -
708 };
│ │ │ │ -
│ │ │ │ -
709
│ │ │ │ -
710#ifndef DOXYGEN
│ │ │ │ -
711
│ │ │ │ -
712 template<int dimension, class CoordType>
│ │ │ │ -
713 template<int codimension>
│ │ │ │ - │ │ │ │ -
715 SubEntityIterator(int nIntervals, bool end)
│ │ │ │ -
716 : RefinementIteratorSpecial<dimension, CoordType, codimension>(nIntervals, end)
│ │ │ │ -
717 {}
│ │ │ │ -
718
│ │ │ │ -
719#endif
│ │ │ │ -
720
│ │ │ │ -
721 } // namespace Simplex
│ │ │ │ -
│ │ │ │ -
722
│ │ │ │ -
723 } // namespace RefinementImp
│ │ │ │ -
724
│ │ │ │ -
725
│ │ │ │ -
726 namespace RefinementImp {
│ │ │ │ -
727
│ │ │ │ -
728 // ///////////////////////
│ │ │ │ -
729 //
│ │ │ │ -
730 // The refinement traits
│ │ │ │ -
731 //
│ │ │ │ -
732
│ │ │ │ -
733#ifndef DOXYGEN
│ │ │ │ -
734 template<unsigned topologyId, class CoordType, unsigned coerceToId,
│ │ │ │ -
735 int dim>
│ │ │ │ -
736 struct Traits<
│ │ │ │ -
737 topologyId, CoordType, coerceToId, dim,
│ │ │ │ -
738 typename std::enable_if<
│ │ │ │ -
739 ((GeometryTypes::simplex(dim).id() >> 1) ==
│ │ │ │ -
740 (topologyId >> 1) &&
│ │ │ │ -
741 (GeometryTypes::simplex(dim).id() >> 1) ==
│ │ │ │ -
742 (coerceToId >> 1)
│ │ │ │ -
743 )>::type
│ │ │ │ -
744 >
│ │ │ │ -
745 {
│ │ │ │ -
746 typedef Simplex::RefinementImp<dim, CoordType> Imp;
│ │ │ │ -
747 };
│ │ │ │ -
748#endif
│ │ │ │ -
749
│ │ │ │ -
750
│ │ │ │ -
751 } // namespace RefinementImp
│ │ │ │ -
752
│ │ │ │ -
753} // namespace Dune
│ │ │ │ -
754
│ │ │ │ -
755#endif //DUNE_GRID_COMMON_REFINEMENT_SIMPLEX_CC
│ │ │ │ - │ │ │ │ - │ │ │ │ -
This file contains the parts independent of a particular Refinement implementation.
│ │ │ │ -
A unique label for each type of element that can occur in a grid.
│ │ │ │ +
522 inline constexpr GeometryType pyramid = GeometryType(0b0011,3,false);
│ │ │ │ +
523
│ │ │ │ +
525
│ │ │ │ +
528 inline constexpr GeometryType prism = GeometryType(0b0101,3,false);
│ │ │ │ +
529
│ │ │ │ +
531
│ │ │ │ +
534 inline constexpr GeometryType hexahedron = cube(3);
│ │ │ │ +
535
│ │ │ │ +
536 }
│ │ │ │ +
│ │ │ │ +
537
│ │ │ │ +
538 namespace Impl
│ │ │ │ +
539 {
│ │ │ │ +
540
│ │ │ │ +
542 inline constexpr GeometryType getBase(const GeometryType& gt) {
│ │ │ │ +
543 return GeometryType(gt.id() & ((1 << (gt.dim()-1))-1), gt.dim()-1, gt.isNone());
│ │ │ │ +
544 }
│ │ │ │ +
545
│ │ │ │ +
546
│ │ │ │ +
547 // IfGeometryType
│ │ │ │ +
548 // ----------
│ │ │ │ +
549
│ │ │ │ +
550 template< template< GeometryType::Id > class Operation, int dim, GeometryType::Id geometryId = GeometryTypes::vertex >
│ │ │ │ +
551 struct IfGeometryType
│ │ │ │ +
552 {
│ │ │ │ +
553 static constexpr GeometryType geometry = geometryId;
│ │ │ │ +
554 template< class... Args >
│ │ │ │ +
555 static auto apply ( GeometryType gt, Args &&... args )
│ │ │ │ +
556 {
│ │ │ │ +
557 GeometryType lowerGeometry(gt.id() >>1 , gt.dim()-1, gt.isNone());
│ │ │ │ +
558
│ │ │ │ +
559 if( gt.id() & 1 )
│ │ │ │ +
560 return IfGeometryType< Operation, dim-1, GeometryTypes::prismaticExtension(geometry).toId() >::apply( lowerGeometry, std::forward< Args >( args )... );
│ │ │ │ +
561 else
│ │ │ │ +
562 return IfGeometryType< Operation, dim-1, GeometryTypes::conicalExtension(geometry).toId() >::apply( lowerGeometry, std::forward< Args >( args )... );
│ │ │ │ +
563 }
│ │ │ │ +
564 };
│ │ │ │ +
565
│ │ │ │ +
566 template< template< GeometryType::Id > class Operation, GeometryType::Id geometryId >
│ │ │ │ +
567 struct IfGeometryType< Operation, 0, geometryId>
│ │ │ │ +
568 {
│ │ │ │ +
569 template< class... Args >
│ │ │ │ +
570 static auto apply ([[maybe_unused]] GeometryType gt, Args &&... args )
│ │ │ │ +
571 {
│ │ │ │ +
572 return Operation< geometryId >::apply( std::forward< Args >( args )... );
│ │ │ │ +
573 }
│ │ │ │ +
574 };
│ │ │ │ +
575 } // namespace Impl
│ │ │ │ +
576} // namespace Dune
│ │ │ │ +
577
│ │ │ │ +
578#endif // DUNE_GEOMETRY_TYPE_HH
│ │ │ │
STL namespace.
│ │ │ │
Definition affinegeometry.hh:21
│ │ │ │ -
int pointIndex(const FieldVector< int, dimension > &point)
calculate the index of a given gridpoint within a Kuhn0 simplex
Definition simplex.cc:280
│ │ │ │ -
FieldVector< int, n > getPermutation(int m)
Calculate permutation from it's index.
Definition simplex.cc:293
│ │ │ │ -
FieldVector< CoordType, dimension > referenceToKuhn(FieldVector< CoordType, dimension > point, const FieldVector< int, dimension > &kuhn)
Map from the reference simplex to some Kuhn simplex.
Definition simplex.cc:322
│ │ │ │ -
FieldVector< CoordType, dimension > kuhnToReference(FieldVector< CoordType, dimension > point, const FieldVector< int, dimension > &kuhn)
Map from some Kuhn simplex to the reference simplex.
Definition simplex.cc:341
│ │ │ │ -
Class providing access to the singletons of the reference elements.
Definition referenceelements.hh:128
│ │ │ │ -
static const ReferenceElement & simplex()
get simplex reference elements
Definition referenceelements.hh:162
│ │ │ │ -
Static tag representing a codimension.
Definition dimension.hh:24
│ │ │ │ -
Implement a MultiLinearGeometry with additional caching.
Definition multilineargeometry.hh:526
│ │ │ │ - │ │ │ │ -
Codim< dimension >::SubEntityIterator VertexIterator
Definition simplex.cc:368
│ │ │ │ -
FieldVector< int, dimension+1 > IndexVector
Definition simplex.cc:371
│ │ │ │ -
CoordType ctype
Definition simplex.cc:364
│ │ │ │ -
static int nVertices(int nIntervals)
Definition simplex.cc:394
│ │ │ │ -
static int nElements(int nIntervals)
Definition simplex.cc:418
│ │ │ │ -
static ElementIterator eEnd(int nIntervals)
Definition simplex.cc:434
│ │ │ │ -
static VertexIterator vEnd(int nIntervals)
Definition simplex.cc:410
│ │ │ │ -
Codim< 0 >::SubEntityIterator ElementIterator
Definition simplex.cc:370
│ │ │ │ -
static VertexIterator vBegin(int nIntervals)
Definition simplex.cc:402
│ │ │ │ -
static ElementIterator eBegin(int nIntervals)
Definition simplex.cc:426
│ │ │ │ -
FieldVector< CoordType, dimension > CoordVector
Definition simplex.cc:369
│ │ │ │ -
static constexpr int dimension
Definition simplex.cc:363
│ │ │ │ - │ │ │ │ -
Dune::CachedMultiLinearGeometry< CoordType, dimension-codimension, dimension > Geometry
Definition simplex.cc:388
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
RefinementImp< dimension, CoordType > Refinement
Definition simplex.cc:453
│ │ │ │ - │ │ │ │ -
Refinement::template Codim< dimension >::Geometry Geometry
Definition simplex.cc:455
│ │ │ │ -
RefinementIteratorSpecial< dimension, CoordType, dimension > This
Definition simplex.cc:456
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
FieldVector< int, dimension > Vertex
Definition simplex.cc:564
│ │ │ │ - │ │ │ │ - │ │ │ │ -
Refinement::template Codim< 0 >::Geometry Geometry
Definition simplex.cc:546
│ │ │ │ - │ │ │ │ - │ │ │ │ -
RefinementIteratorSpecial< dimension, CoordType, 0 > This
Definition simplex.cc:547
│ │ │ │ -
RefinementImp< dimension, CoordType > Refinement
Definition simplex.cc:543
│ │ │ │ - │ │ │ │ - │ │ │ │ -
RefinementImp< dimension, CoordType > Refinement
Definition simplex.cc:705
│ │ │ │ +
std::ostream & operator<<(std::ostream &s, const GeometryType &a)
Prints the type to an output stream.
Definition type.hh:410
│ │ │ │ +
Unique label for each type of entities that can occur in DUNE grids.
Definition type.hh:114
│ │ │ │ +
constexpr GeometryType(unsigned int topologyId, unsigned int dim)
Constructor, using the topologyId (integer) and the dimension.
Definition type.hh:251
│ │ │ │ +
constexpr bool operator<(const GeometryType &other) const
less-than operation for use with maps
Definition type.hh:393
│ │ │ │ +
constexpr bool operator!=(const GeometryType &other) const
Check for inequality.
Definition type.hh:388
│ │ │ │ +
constexpr bool isPyramid() const
Return true if entity is a pyramid.
Definition type.hh:304
│ │ │ │ +
constexpr bool isTetrahedron() const
Return true if entity is a tetrahedron.
Definition type.hh:299
│ │ │ │ +
constexpr bool isPrism() const
Return true if entity is a prism.
Definition type.hh:309
│ │ │ │ +
constexpr bool isVertex() const
Return true if entity is a vertex.
Definition type.hh:279
│ │ │ │ +
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:377
│ │ │ │ +
constexpr Id toId() const
Create an Id representation of this GeometryType.
Definition type.hh:210
│ │ │ │ +
constexpr bool isConical(const int &step) const
Return true if entity was constructed with a conical product in the chosen step.
Definition type.hh:337
│ │ │ │ +
constexpr unsigned int dim() const
Return dimension of the type.
Definition type.hh:360
│ │ │ │ +
constexpr bool isPrismatic(const int &step) const
Return true if entity was constructed with a prismatic product in the chosen step.
Definition type.hh:350
│ │ │ │ +
constexpr bool isTriangle() const
Return true if entity is a triangle.
Definition type.hh:289
│ │ │ │ +
GeometryType(TopologyType t)
Constructor from static TopologyType class.
Definition type.hh:267
│ │ │ │ +
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:242
│ │ │ │ +
BasicType
Each entity can be tagged by one of these basic types plus its space dimension.
Definition type.hh:120
│ │ │ │ +
@ cube
Cube element in any nonnegative dimension.
Definition type.hh:122
│ │ │ │ +
@ simplex
Simplicial element in any nonnegative dimension.
Definition type.hh:121
│ │ │ │ +
@ pyramid
Four sided pyramid in three dimensions.
Definition type.hh:123
│ │ │ │ +
@ extended
Other, more general topology, representable as topologyId.
Definition type.hh:125
│ │ │ │ +
@ none
Even more general topology, cannot be specified by a topologyId. Two GeometryTypes with 'none' type a...
Definition type.hh:126
│ │ │ │ +
@ prism
Prism element in three dimensions.
Definition type.hh:124
│ │ │ │ +
constexpr GeometryType(Id id)
Reconstruct a Geometry type from a GeometryType::Id.
Definition type.hh:222
│ │ │ │ +
constexpr bool isCube() const
Return true if entity is a cube of any dimension.
Definition type.hh:324
│ │ │ │ +
constexpr GeometryType()
Default constructor, not initializing anything.
Definition type.hh:232
│ │ │ │ +
constexpr bool isConical() const
Return true if entity was constructed with a conical product in the last step.
Definition type.hh:329
│ │ │ │ +
constexpr bool isLine() const
Return true if entity is a line segment.
Definition type.hh:284
│ │ │ │ +
constexpr bool isQuadrilateral() const
Return true if entity is a quadrilateral.
Definition type.hh:294
│ │ │ │ +
constexpr bool isPrismatic() const
Return true if entity was constructed with a prismatic product in the last step.
Definition type.hh:342
│ │ │ │ +
constexpr unsigned int id() const
Return the topology id of the type.
Definition type.hh:365
│ │ │ │ +
constexpr bool isNone() const
Return true if entity is a singular of any dimension.
Definition type.hh:355
│ │ │ │ +
constexpr bool isHexahedron() const
Return true if entity is a hexahedron.
Definition type.hh:314
│ │ │ │ +
constexpr bool isSimplex() const
Return true if entity is a simplex of any dimension.
Definition type.hh:319
│ │ │ │ +
IdType Id
An integral id representing a GeometryType.
Definition type.hh:181
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,682 +1,542 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ - * _r_e_f_i_n_e_m_e_n_t │ │ │ │ │ -simplex.cc │ │ │ │ │ +type.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 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 © 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_GRID_COMMON_REFINEMENT_SIMPLEX_CC │ │ │ │ │ -_6#define DUNE_GRID_COMMON_REFINEMENT_SIMPLEX_CC │ │ │ │ │ +5#ifndef DUNE_GEOMETRY_TYPE_HH │ │ │ │ │ +6#define DUNE_GEOMETRY_TYPE_HH │ │ │ │ │ 7 │ │ │ │ │ -8// This file is part of DUNE, a Distributed and Unified Numerics Environment │ │ │ │ │ -9// This file is copyright (C) 2005 Jorrit Fahlke │ │ │ │ │ -10// This file is licensed under version 2 of the GNU General Public License, │ │ │ │ │ -11// with a special "runtime exception." See COPYING at the top of the source │ │ │ │ │ -12// tree for the full licence. │ │ │ │ │ -13 │ │ │ │ │ -243#include │ │ │ │ │ -244 │ │ │ │ │ -245#include │ │ │ │ │ -246#include │ │ │ │ │ -247 │ │ │ │ │ -248#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_m_u_l_t_i_l_i_n_e_a_r_g_e_o_m_e_t_r_y_._h_h> │ │ │ │ │ -249#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ -250#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ -251 │ │ │ │ │ -252#include "_b_a_s_e_._c_c" │ │ │ │ │ -253 │ │ │ │ │ -254namespace _D_u_n_e { │ │ │ │ │ -255 │ │ │ │ │ -256 namespace RefinementImp { │ │ │ │ │ -257 │ │ │ │ │ -_2_6_4 namespace Simplex { │ │ │ │ │ -265 │ │ │ │ │ -266 // ////////////////// │ │ │ │ │ -267 // │ │ │ │ │ -269 // │ │ │ │ │ -270 │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14 │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ +17 │ │ │ │ │ +18#include │ │ │ │ │ +19#include │ │ │ │ │ +20#include │ │ │ │ │ +21 │ │ │ │ │ +22namespace _D_u_n_e │ │ │ │ │ +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 // GeometryType │ │ │ │ │ +99 // ------------- │ │ │ │ │ +100 │ │ │ │ │ +_1_1_3 class _G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ +114 { │ │ │ │ │ +115 public: │ │ │ │ │ +116 │ │ │ │ │ +_1_1_9 enum │ │ │ │ │ +120 _B_a_s_i_c_T_y_p_e { │ │ │ │ │ +_1_2_1 _s_i_m_p_l_e_x, │ │ │ │ │ +_1_2_2 _c_u_b_e, │ │ │ │ │ +_1_2_3 _p_y_r_a_m_i_d, │ │ │ │ │ +_1_2_4 _p_r_i_s_m, │ │ │ │ │ +_1_2_5 _e_x_t_e_n_d_e_d, │ │ │ │ │ +126 _n_o_n_e │ │ │ │ │ +_1_2_7 }; │ │ │ │ │ +128 │ │ │ │ │ +129 private: │ │ │ │ │ +130 │ │ │ │ │ +132 unsigned char dim_; │ │ │ │ │ +133 │ │ │ │ │ +135 bool none_; │ │ │ │ │ +136 │ │ │ │ │ +138 unsigned int topologyId_; │ │ │ │ │ +139 │ │ │ │ │ +140 // Internal type used for the Id. The exact nature of this type is kept │ │ │ │ │ +141 // as an implementation detail on purpose. We use a scoped enum here │ │ │ │ │ +because scoped enums │ │ │ │ │ +142 // can be used as template parameters, but are not implicitly converted to │ │ │ │ │ +other integral │ │ │ │ │ +143 // types by the compiler. That way, we avoid unfortunate implicit │ │ │ │ │ +conversion chains, e.g. │ │ │ │ │ +144 // people trying to work with GlobalGeometryTypeIndex, but forgetting to │ │ │ │ │ +actually call │ │ │ │ │ +145 // GlobalGeometryTypeIndex::index(gt) and just using gt directly. │ │ │ │ │ +146 enum class IdType : std::uint64_t │ │ │ │ │ +147 {}; │ │ │ │ │ +148 │ │ │ │ │ +149 public: │ │ │ │ │ +150 │ │ │ │ │ +_1_8_1 using Id = IdType; │ │ │ │ │ +182 │ │ │ │ │ +_1_9_0 constexpr operator _I_d() const │ │ │ │ │ +191 { │ │ │ │ │ +192 // recreate the exact storage layout that this class is using, making │ │ │ │ │ +conversion │ │ │ │ │ +193 // extremely cheap │ │ │ │ │ +194 std::uint64_t id = dim_ | (std::uint64_t(none_) << 8) | (std::uint64_t │ │ │ │ │ +(topologyId_) << 32); │ │ │ │ │ +195 return static_cast(_i_d); │ │ │ │ │ +196 } │ │ │ │ │ +197 │ │ │ │ │ +_2_1_0 constexpr Id _t_o_I_d() const │ │ │ │ │ +211 { │ │ │ │ │ +212 return static_cast(*this); │ │ │ │ │ +213 } │ │ │ │ │ +214 │ │ │ │ │ +_2_2_2 constexpr _G_e_o_m_e_t_r_y_T_y_p_e(Id id) │ │ │ │ │ +223 : dim_(static_cast<_s_t_d::uint64_t>(_i_d) & 0xFF) │ │ │ │ │ +224 , none_(static_cast<_s_t_d::uint64_t>(_i_d) & 0x100) │ │ │ │ │ +225 , topologyId_(static_cast<_s_t_d::uint64_t>(_i_d) >> 32) │ │ │ │ │ +226 {} │ │ │ │ │ +227 │ │ │ │ │ +230 │ │ │ │ │ +_2_3_2 constexpr _G_e_o_m_e_t_r_y_T_y_p_e () │ │ │ │ │ +233 : dim_(0), none_(true), topologyId_(0) │ │ │ │ │ +234 {} │ │ │ │ │ +235 │ │ │ │ │ +_2_4_2 constexpr _G_e_o_m_e_t_r_y_T_y_p_e(unsigned int topologyId, unsigned int _d_i_m, bool │ │ │ │ │ +_i_s_N_o_n_e) │ │ │ │ │ +243 : dim_(_d_i_m), none_(_i_s_N_o_n_e), topologyId_(topologyId) │ │ │ │ │ +244 {} │ │ │ │ │ +245 │ │ │ │ │ +_2_5_1 constexpr _G_e_o_m_e_t_r_y_T_y_p_e(unsigned int topologyId, unsigned int _d_i_m) │ │ │ │ │ +252 : dim_(_d_i_m), none_(false), topologyId_(topologyId) │ │ │ │ │ +253 {} │ │ │ │ │ +254 │ │ │ │ │ +265 template> │ │ │ │ │ +_2_6_7 explicit _G_e_o_m_e_t_r_y_T_y_p_e(TopologyType t) │ │ │ │ │ +268 : dim_(TopologyType::dimension), none_(false), topologyId_(TopologyType:: │ │ │ │ │ +_i_d) │ │ │ │ │ +269 { │ │ │ │ │ +270 DUNE_UNUSED_PARAMETER(t); │ │ │ │ │ +271 } │ │ │ │ │ 272 │ │ │ │ │ -279 template │ │ │ │ │ -_2_8_0 int _p_o_i_n_t_I_n_d_e_x(const FieldVector &point) │ │ │ │ │ -281 { │ │ │ │ │ -282 int index = 0; │ │ │ │ │ -283 for(int i = 0; i < dimension; ++i) │ │ │ │ │ -284 index += Dune::binomial(dimension-i + point[i]-1, dimension-i); │ │ │ │ │ -285 return index; │ │ │ │ │ +_2_7_9 constexpr bool _i_s_V_e_r_t_e_x() const { │ │ │ │ │ +280 return dim_==0; │ │ │ │ │ +281 } │ │ │ │ │ +282 │ │ │ │ │ +_2_8_4 constexpr bool _i_s_L_i_n_e() const { │ │ │ │ │ +285 return dim_==1; │ │ │ │ │ 286 } │ │ │ │ │ 287 │ │ │ │ │ -292 template │ │ │ │ │ -_2_9_3 FieldVector _g_e_t_P_e_r_m_u_t_a_t_i_o_n(int m) │ │ │ │ │ -294 { │ │ │ │ │ -295 FieldVector perm; │ │ │ │ │ -296 for(int i = 0; i < n; ++i) │ │ │ │ │ -297 perm[i] = i; │ │ │ │ │ -298 │ │ │ │ │ -299 int base = 1; │ │ │ │ │ -300 for(int i = 1; i <= n; ++i) │ │ │ │ │ -301 base *= i; │ │ │ │ │ +_2_8_9 constexpr bool _i_s_T_r_i_a_n_g_l_e() const { │ │ │ │ │ +290 return ! none_ && dim_==2 && (topologyId_ | 1) == 0b0001; │ │ │ │ │ +291 } │ │ │ │ │ +292 │ │ │ │ │ +_2_9_4 constexpr bool _i_s_Q_u_a_d_r_i_l_a_t_e_r_a_l() const { │ │ │ │ │ +295 return ! none_ && dim_==2 && (topologyId_ | 1) == 0b0011; │ │ │ │ │ +296 } │ │ │ │ │ +297 │ │ │ │ │ +_2_9_9 constexpr bool _i_s_T_e_t_r_a_h_e_d_r_o_n() const { │ │ │ │ │ +300 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0001; │ │ │ │ │ +301 } │ │ │ │ │ 302 │ │ │ │ │ -303 for(int i = n; i > 0; --i) { │ │ │ │ │ -304 base /= i; │ │ │ │ │ -305 int d = m / base; │ │ │ │ │ -306 m %= base; │ │ │ │ │ -307 int t = perm[i-1]; perm[i-1] = perm[i-1-d]; perm[i-1-d] = t; │ │ │ │ │ -308 } │ │ │ │ │ -309 return perm; │ │ │ │ │ -310 } │ │ │ │ │ -311 │ │ │ │ │ -312 // map between the reference simplex and some arbitrary kuhn simplex │ │ │ │ │ -(denoted by it's permutation) │ │ │ │ │ -320 template │ │ │ │ │ -321 FieldVector │ │ │ │ │ -_3_2_2 _r_e_f_e_r_e_n_c_e_T_o_K_u_h_n( │ │ │ │ │ -323 FieldVector point, │ │ │ │ │ -325 const FieldVector &kuhn) │ │ │ │ │ -326 { │ │ │ │ │ -327 for(int i = dimension - 1; i > 0; --i) │ │ │ │ │ -328 point[kuhn[i-1]] += point[kuhn[i]]; │ │ │ │ │ -329 return point; │ │ │ │ │ -330 } │ │ │ │ │ -331 │ │ │ │ │ -339 template │ │ │ │ │ -340 FieldVector │ │ │ │ │ -_3_4_1 _k_u_h_n_T_o_R_e_f_e_r_e_n_c_e( │ │ │ │ │ -342 FieldVector point, │ │ │ │ │ -344 const FieldVector &kuhn) │ │ │ │ │ -345 { │ │ │ │ │ -346 for(int i = 0; i < dimension - 1; ++i) │ │ │ │ │ -347 point[kuhn[i]] -= point[kuhn[i+1]]; │ │ │ │ │ -348 return point; │ │ │ │ │ -349 } │ │ │ │ │ -350 │ │ │ │ │ -351 │ │ │ │ │ +_3_0_4 constexpr bool _i_s_P_y_r_a_m_i_d() const { │ │ │ │ │ +305 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0011; │ │ │ │ │ +306 } │ │ │ │ │ +307 │ │ │ │ │ +_3_0_9 constexpr bool _i_s_P_r_i_s_m() const { │ │ │ │ │ +310 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0101; │ │ │ │ │ +311 } │ │ │ │ │ +312 │ │ │ │ │ +_3_1_4 constexpr bool _i_s_H_e_x_a_h_e_d_r_o_n() const { │ │ │ │ │ +315 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0111; │ │ │ │ │ +316 } │ │ │ │ │ +317 │ │ │ │ │ +_3_1_9 constexpr bool _i_s_S_i_m_p_l_e_x() const { │ │ │ │ │ +320 return ! none_ && (topologyId_ | 1) == 1; │ │ │ │ │ +321 } │ │ │ │ │ +322 │ │ │ │ │ +_3_2_4 constexpr bool _i_s_C_u_b_e() const { │ │ │ │ │ +325 return ! none_ && ((topologyId_ ^ ((1 << dim_)-1)) >> 1 == 0); │ │ │ │ │ +326 } │ │ │ │ │ +327 │ │ │ │ │ +_3_2_9 constexpr bool _i_s_C_o_n_i_c_a_l() const { │ │ │ │ │ +330 return ! none_ && (((topologyId_ & ~1) & (1u << (dim_-1))) == 0); │ │ │ │ │ +331 } │ │ │ │ │ +332 │ │ │ │ │ +_3_3_7 constexpr bool _i_s_C_o_n_i_c_a_l(const int& step) const { │ │ │ │ │ +338 return ! none_ && (((topologyId_ & ~1) & (1u << step)) == 0); │ │ │ │ │ +339 } │ │ │ │ │ +340 │ │ │ │ │ +_3_4_2 constexpr bool _i_s_P_r_i_s_m_a_t_i_c() const { │ │ │ │ │ +343 return ! none_ && (( (topologyId_ | 1) & (1u << (dim_-1))) != 0); │ │ │ │ │ +344 } │ │ │ │ │ +345 │ │ │ │ │ +_3_5_0 constexpr bool _i_s_P_r_i_s_m_a_t_i_c(const int& step) const { │ │ │ │ │ +351 return ! none_ && (( (topologyId_ | 1) & (1u << step)) != 0); │ │ │ │ │ +352 } │ │ │ │ │ 353 │ │ │ │ │ -354 // ///////////////////////////////////////// │ │ │ │ │ -355 // │ │ │ │ │ -356 // refinement implementation for simplices │ │ │ │ │ -357 // │ │ │ │ │ +_3_5_5 constexpr bool _i_s_N_o_n_e() const { │ │ │ │ │ +356 return none_; │ │ │ │ │ +357 } │ │ │ │ │ 358 │ │ │ │ │ -359 template │ │ │ │ │ -_3_6_0 class _R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ -361 { │ │ │ │ │ -362 public: │ │ │ │ │ -_3_6_3 constexpr static int _d_i_m_e_n_s_i_o_n = dimension_; │ │ │ │ │ -_3_6_4 typedef CoordType _c_t_y_p_e; │ │ │ │ │ -365 │ │ │ │ │ -366 template │ │ │ │ │ -367 struct _C_o_d_i_m; │ │ │ │ │ -_3_6_8 typedef typename _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _V_e_r_t_e_x_I_t_e_r_a_t_o_r; │ │ │ │ │ -_3_6_9 typedef FieldVector _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ -_3_7_0 typedef typename _C_o_d_i_m_<_0_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r; │ │ │ │ │ -_3_7_1 typedef FieldVector _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ -372 │ │ │ │ │ -373 static int _n_V_e_r_t_i_c_e_s(int nIntervals); │ │ │ │ │ -374 static _V_e_r_t_e_x_I_t_e_r_a_t_o_r _v_B_e_g_i_n(int nIntervals); │ │ │ │ │ -375 static _V_e_r_t_e_x_I_t_e_r_a_t_o_r _v_E_n_d(int nIntervals); │ │ │ │ │ -376 │ │ │ │ │ -377 static int _n_E_l_e_m_e_n_t_s(int nIntervals); │ │ │ │ │ -378 static _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r _e_B_e_g_i_n(int nIntervals); │ │ │ │ │ -379 static _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r _e_E_n_d(int nIntervals); │ │ │ │ │ -380 }; │ │ │ │ │ -381 │ │ │ │ │ -382 template │ │ │ │ │ -383 template │ │ │ │ │ -_3_8_4 struct _R_e_f_i_n_e_m_e_n_t_I_m_p::_C_o_d_i_m │ │ │ │ │ -385 { │ │ │ │ │ -386 class SubEntityIterator; │ │ │ │ │ -387 // We don't need the caching, but the uncached MultiLinearGeometry has bug │ │ │ │ │ -FS#1209 │ │ │ │ │ -_3_8_8 typedef _D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y _G_e_o_m_e_t_r_y; │ │ │ │ │ -389 }; │ │ │ │ │ -390 │ │ │ │ │ -391 template │ │ │ │ │ -392 int │ │ │ │ │ -_3_9_3 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -394_ _n_V_e_r_t_i_c_e_s(int nIntervals) │ │ │ │ │ -395 { │ │ │ │ │ -396 return Dune::binomial(dimension + nIntervals, (int)dimension); │ │ │ │ │ -397 } │ │ │ │ │ -398 │ │ │ │ │ -399 template │ │ │ │ │ -400 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ -_4_0_1 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -402_ _v_B_e_g_i_n(int nIntervals) │ │ │ │ │ -403 { │ │ │ │ │ -404 return _V_e_r_t_e_x_I_t_e_r_a_t_o_r(nIntervals); │ │ │ │ │ -405 } │ │ │ │ │ -406 │ │ │ │ │ -407 template │ │ │ │ │ -408 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ -_4_0_9 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -410_ _v_E_n_d(int nIntervals) │ │ │ │ │ +_3_6_0 constexpr unsigned int _d_i_m() const { │ │ │ │ │ +361 return dim_; │ │ │ │ │ +362 } │ │ │ │ │ +363 │ │ │ │ │ +_3_6_5 constexpr unsigned int _i_d() const { │ │ │ │ │ +366 return topologyId_; │ │ │ │ │ +367 } │ │ │ │ │ +368 │ │ │ │ │ +373 │ │ │ │ │ +_3_7_7 constexpr bool _o_p_e_r_a_t_o_r_=_=(const _G_e_o_m_e_t_r_y_T_y_p_e& other) const { │ │ │ │ │ +378 return ( ( none_ == other.none_ ) │ │ │ │ │ +379 && ( ( none_ == true ) │ │ │ │ │ +380 || ( ( dim_ == other.dim_ ) │ │ │ │ │ +381 && ( (topologyId_ >> 1) == (other.topologyId_ >> 1) ) │ │ │ │ │ +382 ) │ │ │ │ │ +383 ) │ │ │ │ │ +384 ); │ │ │ │ │ +385 } │ │ │ │ │ +386 │ │ │ │ │ +_3_8_8 constexpr bool _o_p_e_r_a_t_o_r_!_=(const _G_e_o_m_e_t_r_y_T_y_p_e& other) const { │ │ │ │ │ +389 return ! ((*this)==other); │ │ │ │ │ +390 } │ │ │ │ │ +391 │ │ │ │ │ +_3_9_3 constexpr bool _o_p_e_r_a_t_o_r_ _<_ (const _G_e_o_m_e_t_r_y_T_y_p_e& other) const { │ │ │ │ │ +394 return ( ( none_ < other.none_ ) │ │ │ │ │ +395 || ( !( other.none_ < none_ ) │ │ │ │ │ +396 && ( ( dim_ < other.dim_ ) │ │ │ │ │ +397 || ( (other.dim_ == dim_) │ │ │ │ │ +398 && ((topologyId_ >> 1) < (other.topologyId_ >> 1) ) │ │ │ │ │ +399 ) │ │ │ │ │ +400 ) │ │ │ │ │ +401 ) │ │ │ │ │ +402 ); │ │ │ │ │ +403 } │ │ │ │ │ +404 │ │ │ │ │ +407 }; │ │ │ │ │ +408 │ │ │ │ │ +_4_1_0 inline std::ostream& _o_p_e_r_a_t_o_r_<_<_ (std::ostream& s, const _G_e_o_m_e_t_r_y_T_y_p_e& a) │ │ │ │ │ 411 { │ │ │ │ │ -412 return _V_e_r_t_e_x_I_t_e_r_a_t_o_r(nIntervals, true); │ │ │ │ │ -413 } │ │ │ │ │ -414 │ │ │ │ │ -415 template │ │ │ │ │ -416 int │ │ │ │ │ -_4_1_7 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -418_ _n_E_l_e_m_e_n_t_s(int nIntervals) │ │ │ │ │ -419 { │ │ │ │ │ -420 return Dune::power(nIntervals, int(dimension)); │ │ │ │ │ +412 if (a._i_s_S_i_m_p_l_e_x()) │ │ │ │ │ +413 { │ │ │ │ │ +414 s << "(simplex, " << a._d_i_m() << ")"; │ │ │ │ │ +415 return s; │ │ │ │ │ +416 } │ │ │ │ │ +417 if (a._i_s_C_u_b_e()) │ │ │ │ │ +418 { │ │ │ │ │ +419 s << "(cube, " << a._d_i_m() << ")"; │ │ │ │ │ +420 return s; │ │ │ │ │ 421 } │ │ │ │ │ -422 │ │ │ │ │ -423 template │ │ │ │ │ -424 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ -_4_2_5 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -426_ _e_B_e_g_i_n(int nIntervals) │ │ │ │ │ -427 { │ │ │ │ │ -428 return _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r(nIntervals); │ │ │ │ │ -429 } │ │ │ │ │ -430 │ │ │ │ │ -431 template │ │ │ │ │ -432 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ -_4_3_3 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -434_ _e_E_n_d(int nIntervals) │ │ │ │ │ -435 { │ │ │ │ │ -436 return _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r(nIntervals, true); │ │ │ │ │ -437 } │ │ │ │ │ -438 │ │ │ │ │ -439 // ////////////// │ │ │ │ │ -440 // │ │ │ │ │ -441 // The iterator │ │ │ │ │ -442 // │ │ │ │ │ +422 if (a._i_s_P_y_r_a_m_i_d()) │ │ │ │ │ +423 { │ │ │ │ │ +424 s << "(pyramid, 3)"; │ │ │ │ │ +425 return s; │ │ │ │ │ +426 } │ │ │ │ │ +427 if (a._i_s_P_r_i_s_m()) │ │ │ │ │ +428 { │ │ │ │ │ +429 s << "(prism, 3)"; │ │ │ │ │ +430 return s; │ │ │ │ │ +431 } │ │ │ │ │ +432 if (a._i_s_N_o_n_e()) │ │ │ │ │ +433 { │ │ │ │ │ +434 s << "(none, " << a._d_i_m() << ")"; │ │ │ │ │ +435 return s; │ │ │ │ │ +436 } │ │ │ │ │ +437 s << "(other [" << a._i_d() << "], " << a._d_i_m() << ")"; │ │ │ │ │ +438 return s; │ │ │ │ │ +439 } │ │ │ │ │ +440 │ │ │ │ │ +441 │ │ │ │ │ 443 │ │ │ │ │ -444 template │ │ │ │ │ -_4_4_5 class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l; │ │ │ │ │ -446 │ │ │ │ │ -447 // vertices │ │ │ │ │ +_4_4_7 namespace GeometryTypes { │ │ │ │ │ 448 │ │ │ │ │ -449 template │ │ │ │ │ -_4_5_0 class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ -451 { │ │ │ │ │ -452 public: │ │ │ │ │ -_4_5_3 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -_4_5_4 typedef typename Refinement::CoordVector _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ -_4_5_5 typedef typename Refinement::template _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_:_G_e_o_m_e_t_r_y _G_e_o_m_e_t_r_y; │ │ │ │ │ -_4_5_6 typedef _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_> _T_h_i_s; │ │ │ │ │ +450 │ │ │ │ │ +453 inline constexpr _G_e_o_m_e_t_r_y_T_y_p_e simplex(unsigned int dim) │ │ │ │ │ +454 { │ │ │ │ │ +455 return _G_e_o_m_e_t_r_y_T_y_p_e(0,dim,false); │ │ │ │ │ +456 } │ │ │ │ │ 457 │ │ │ │ │ -458 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end = false); │ │ │ │ │ 459 │ │ │ │ │ -460 void increment(); │ │ │ │ │ -461 bool equals(const _T_h_i_s &other) const; │ │ │ │ │ -462 │ │ │ │ │ -463 _C_o_o_r_d_V_e_c_t_o_r coords() const; │ │ │ │ │ -464 _G_e_o_m_e_t_r_y geometry () const; │ │ │ │ │ -465 │ │ │ │ │ -466 int index() const; │ │ │ │ │ -467 protected: │ │ │ │ │ -_4_6_8 typedef FieldVector _V_e_r_t_e_x; │ │ │ │ │ -469 │ │ │ │ │ -_4_7_0 int _s_i_z_e; │ │ │ │ │ -_4_7_1 _V_e_r_t_e_x _v_e_r_t_e_x; │ │ │ │ │ -472 }; │ │ │ │ │ -473 │ │ │ │ │ -474 template │ │ │ │ │ -_4_7_5 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -476_ _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end) │ │ │ │ │ -477 : size(nIntervals) │ │ │ │ │ +462 inline constexpr _G_e_o_m_e_t_r_y_T_y_p_e cube(unsigned int dim) │ │ │ │ │ +463 { │ │ │ │ │ +464 return _G_e_o_m_e_t_r_y_T_y_p_e(((dim>1) ? ((1 << dim) - 1) : 0),dim,false); │ │ │ │ │ +465 } │ │ │ │ │ +466 │ │ │ │ │ +468 │ │ │ │ │ +471 inline constexpr _G_e_o_m_e_t_r_y_T_y_p_e none(unsigned int dim) │ │ │ │ │ +472 { │ │ │ │ │ +473 return _G_e_o_m_e_t_r_y_T_y_p_e(0,dim,true); │ │ │ │ │ +474 } │ │ │ │ │ +475 │ │ │ │ │ +477 inline constexpr _G_e_o_m_e_t_r_y_T_y_p_e conicalExtension(const _G_e_o_m_e_t_r_y_T_y_p_e& gt) │ │ │ │ │ 478 { │ │ │ │ │ -479 vertex[0] = (end) ? size + 1 : 0; │ │ │ │ │ -480 for(int i = 1; i < dimension; ++ i) │ │ │ │ │ -481 vertex[i] = 0; │ │ │ │ │ -482 } │ │ │ │ │ -483 │ │ │ │ │ -484 template │ │ │ │ │ -485 void │ │ │ │ │ -_4_8_6 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -487_ _i_n_c_r_e_m_e_n_t() │ │ │ │ │ -488 { │ │ │ │ │ -489 assert(vertex[0] <= size); │ │ │ │ │ -490 for(int i = dimension - 1; i >= 0; --i) { │ │ │ │ │ -491 ++vertex[i]; │ │ │ │ │ -492 if(i == 0 || vertex[i] <= vertex[i-1]) │ │ │ │ │ -493 break; │ │ │ │ │ -494 else │ │ │ │ │ -495 vertex[i] = 0; │ │ │ │ │ -496 } │ │ │ │ │ -497 } │ │ │ │ │ -498 │ │ │ │ │ -499 template │ │ │ │ │ -500 bool │ │ │ │ │ -_5_0_1 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -502_ _e_q_u_a_l_s(const _T_h_i_s &other) const │ │ │ │ │ -503 { │ │ │ │ │ -504 return size == other._s_i_z_e && vertex == other._v_e_r_t_e_x; │ │ │ │ │ -505 } │ │ │ │ │ -506 │ │ │ │ │ -507 template │ │ │ │ │ -508 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -_5_0_9 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -510_ _c_o_o_r_d_s() const │ │ │ │ │ -511 { │ │ │ │ │ -512 _V_e_r_t_e_x ref = _k_u_h_n_T_o_R_e_f_e_r_e_n_c_e(vertex, getPermutation(0)); │ │ │ │ │ +479 return _G_e_o_m_e_t_r_y_T_y_p_e(gt._i_d(), gt._d_i_m()+1, gt._i_s_N_o_n_e()); │ │ │ │ │ +480 } │ │ │ │ │ +481 │ │ │ │ │ +483 inline constexpr _G_e_o_m_e_t_r_y_T_y_p_e prismaticExtension(const _G_e_o_m_e_t_r_y_T_y_p_e& gt) │ │ │ │ │ +484 { │ │ │ │ │ +485 return _G_e_o_m_e_t_r_y_T_y_p_e(gt._i_d() | ((1 << gt._d_i_m())), gt._d_i_m()+1, gt._i_s_N_o_n_e()); │ │ │ │ │ +486 } │ │ │ │ │ +487 │ │ │ │ │ +489 │ │ │ │ │ +492 inline constexpr _G_e_o_m_e_t_r_y_T_y_p_e vertex = _G_e_o_m_e_t_r_y_T_y_p_e(0,0,false); │ │ │ │ │ +493 │ │ │ │ │ +495 │ │ │ │ │ +498 inline constexpr _G_e_o_m_e_t_r_y_T_y_p_e line = _G_e_o_m_e_t_r_y_T_y_p_e(0,1,false); │ │ │ │ │ +499 │ │ │ │ │ +501 │ │ │ │ │ +504 inline constexpr _G_e_o_m_e_t_r_y_T_y_p_e triangle = simplex(2); │ │ │ │ │ +505 │ │ │ │ │ +507 │ │ │ │ │ +510 inline constexpr _G_e_o_m_e_t_r_y_T_y_p_e quadrilateral = cube(2); │ │ │ │ │ +511 │ │ │ │ │ 513 │ │ │ │ │ -514 _C_o_o_r_d_V_e_c_t_o_r coords; │ │ │ │ │ -515 for(int i = 0; i < dimension; ++i) │ │ │ │ │ -516 coords[i] = CoordType(ref[i]) / size; │ │ │ │ │ -517 return coords; │ │ │ │ │ -518 } │ │ │ │ │ +516 inline constexpr _G_e_o_m_e_t_r_y_T_y_p_e tetrahedron = simplex(3); │ │ │ │ │ +517 │ │ │ │ │ 519 │ │ │ │ │ -520 template │ │ │ │ │ -521 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_G_e_o_m_e_t_r_y │ │ │ │ │ -_5_2_2 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_:_g_e_o_m_e_t_r_y () │ │ │ │ │ -const │ │ │ │ │ -523 { │ │ │ │ │ -524 std::vector corners(1); │ │ │ │ │ -525 corners[0] = (_C_o_o_r_d_V_e_c_t_o_r)vertex; │ │ │ │ │ -526 return _G_e_o_m_e_t_r_y(GeometryTypes::vertex, corners); │ │ │ │ │ -527 } │ │ │ │ │ -528 │ │ │ │ │ -529 template │ │ │ │ │ -530 int │ │ │ │ │ -_5_3_1 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -532_ _i_n_d_e_x() const │ │ │ │ │ -533 { │ │ │ │ │ -534 return _p_o_i_n_t_I_n_d_e_x(vertex); │ │ │ │ │ -535 } │ │ │ │ │ -536 │ │ │ │ │ -537 // elements │ │ │ │ │ -538 │ │ │ │ │ -539 template │ │ │ │ │ -_5_4_0 class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ -541 { │ │ │ │ │ -542 public: │ │ │ │ │ -_5_4_3 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -_5_4_4 typedef typename _R_e_f_i_n_e_m_e_n_t_:_:_I_n_d_e_x_V_e_c_t_o_r _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ -_5_4_5 typedef typename _R_e_f_i_n_e_m_e_n_t_:_:_C_o_o_r_d_V_e_c_t_o_r _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ -_5_4_6 typedef typename Refinement::template _C_o_d_i_m_<_0_>_:_:_G_e_o_m_e_t_r_y _G_e_o_m_e_t_r_y; │ │ │ │ │ -_5_4_7 typedef _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_> _T_h_i_s; │ │ │ │ │ -548 │ │ │ │ │ -549 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end = false); │ │ │ │ │ -550 │ │ │ │ │ -551 void increment(); │ │ │ │ │ -552 bool equals(const _T_h_i_s &other) const; │ │ │ │ │ -553 │ │ │ │ │ -554 _I_n_d_e_x_V_e_c_t_o_r vertexIndices() const; │ │ │ │ │ -555 int index() const; │ │ │ │ │ -556 _C_o_o_r_d_V_e_c_t_o_r coords() const; │ │ │ │ │ -557 │ │ │ │ │ -558 _G_e_o_m_e_t_r_y geometry () const; │ │ │ │ │ -559 │ │ │ │ │ -560 private: │ │ │ │ │ -561 _C_o_o_r_d_V_e_c_t_o_r global(const _C_o_o_r_d_V_e_c_t_o_r &local) const; │ │ │ │ │ -562 │ │ │ │ │ -563 protected: │ │ │ │ │ -_5_6_4 typedef FieldVector _V_e_r_t_e_x; │ │ │ │ │ -_5_6_5 constexpr static int nKuhnIntervals = Dune::factorial(dimension); │ │ │ │ │ -566 │ │ │ │ │ -_5_6_7 _V_e_r_t_e_x _o_r_i_g_i_n; │ │ │ │ │ -_5_6_8 int _k_u_h_n_I_n_d_e_x; │ │ │ │ │ -_5_6_9 int _s_i_z_e; │ │ │ │ │ -_5_7_0 int _i_n_d_e_x__; │ │ │ │ │ -571 }; │ │ │ │ │ -572 │ │ │ │ │ -573 template │ │ │ │ │ -_5_7_4 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -575_ _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end) │ │ │ │ │ -576 : kuhnIndex(0), size(nIntervals), index_(0) │ │ │ │ │ -577 { │ │ │ │ │ -578 for(int i = 0; i < dimension; ++i) │ │ │ │ │ -579 origin[i] = 0; │ │ │ │ │ -580 if(end) { │ │ │ │ │ -581 index_ = Refinement::nElements(nIntervals); │ │ │ │ │ -582 origin[0] = size; │ │ │ │ │ -583 } │ │ │ │ │ -584 } │ │ │ │ │ -585 │ │ │ │ │ -586 template │ │ │ │ │ -587 void │ │ │ │ │ -_5_8_8 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -589_ _i_n_c_r_e_m_e_n_t() │ │ │ │ │ -590 { │ │ │ │ │ -591 assert(origin[0] < size); │ │ │ │ │ -592 │ │ │ │ │ -593 ++index_; │ │ │ │ │ -594 │ │ │ │ │ -595 while(1) { │ │ │ │ │ -596 ++kuhnIndex; │ │ │ │ │ -597 if(kuhnIndex == nKuhnIntervals) { │ │ │ │ │ -598 kuhnIndex = 0; │ │ │ │ │ -599 // increment origin │ │ │ │ │ -600 for(int i = dimension - 1; i >= 0; --i) { │ │ │ │ │ -601 ++origin[i]; │ │ │ │ │ -602 if(i == 0 || origin[i] <= origin[i-1]) │ │ │ │ │ -603 break; │ │ │ │ │ -604 else │ │ │ │ │ -605 origin[i] = 0; │ │ │ │ │ -606 } │ │ │ │ │ -607 } │ │ │ │ │ -608 │ │ │ │ │ -609 // test whether the current simplex has any corner outside the kuhn0 │ │ │ │ │ -simplex │ │ │ │ │ -610 FieldVector perm = getPermutation(kuhnIndex); │ │ │ │ │ -611 _V_e_r_t_e_x corner = origin; │ │ │ │ │ -612 bool outside = false; │ │ │ │ │ -613 for(int i = 0; i < dimension; ++i) { │ │ │ │ │ -614 // next corner │ │ │ │ │ -615 ++corner[perm[i]]; │ │ │ │ │ -616 if(perm[i] > 0) │ │ │ │ │ -617 if(corner[perm[i]] > corner[perm[i]-1]) { │ │ │ │ │ -618 outside = true; │ │ │ │ │ -619 break; │ │ │ │ │ -620 } │ │ │ │ │ -621 } │ │ │ │ │ -622 if(!outside) │ │ │ │ │ -623 return; │ │ │ │ │ -624 } │ │ │ │ │ -625 } │ │ │ │ │ -626 │ │ │ │ │ -627 template │ │ │ │ │ -628 bool │ │ │ │ │ -_6_2_9 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -630_ _e_q_u_a_l_s(const _T_h_i_s &other) const │ │ │ │ │ -631 { │ │ │ │ │ -632 return size == other._s_i_z_e && index_ == other._i_n_d_e_x__; │ │ │ │ │ -633 } │ │ │ │ │ -634 │ │ │ │ │ -635 template │ │ │ │ │ -636 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ -_6_3_7 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -638_ _v_e_r_t_e_x_I_n_d_i_c_e_s() const │ │ │ │ │ -639 { │ │ │ │ │ -640 _I_n_d_e_x_V_e_c_t_o_r indices; │ │ │ │ │ -641 FieldVector perm = getPermutation(kuhnIndex); │ │ │ │ │ -642 _V_e_r_t_e_x vertex = origin; │ │ │ │ │ -643 indices[0] = _p_o_i_n_t_I_n_d_e_x(vertex); │ │ │ │ │ -644 for(int i = 0; i < dimension; ++i) { │ │ │ │ │ -645 ++vertex[perm[i]]; │ │ │ │ │ -646 indices[i+1] = _p_o_i_n_t_I_n_d_e_x(vertex); │ │ │ │ │ -647 } │ │ │ │ │ -648 if (kuhnIndex%2 == 1) │ │ │ │ │ -649 for(int i = 0; i < (dimension+1)/2; ++i) { │ │ │ │ │ -650 int t = indices[i]; │ │ │ │ │ -651 indices[i] = indices[dimension-i]; │ │ │ │ │ -652 indices[dimension-i] = t; │ │ │ │ │ -653 } │ │ │ │ │ -654 return indices; │ │ │ │ │ -655 } │ │ │ │ │ -656 │ │ │ │ │ -657 template │ │ │ │ │ -658 int │ │ │ │ │ -_6_5_9 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -660_ _i_n_d_e_x() const │ │ │ │ │ -661 { │ │ │ │ │ -662 return index_; │ │ │ │ │ -663 } │ │ │ │ │ -664 │ │ │ │ │ -665 template │ │ │ │ │ -666 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -_6_6_7 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -668_ _c_o_o_r_d_s() const │ │ │ │ │ -669 { │ │ │ │ │ -670 return global(_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_<_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_> │ │ │ │ │ -671 ::simplex().position(0,0)); │ │ │ │ │ -672 } │ │ │ │ │ -673 │ │ │ │ │ -674 template │ │ │ │ │ -675 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ -_6_7_6 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_g_e_o_m_e_t_r_y () const │ │ │ │ │ -677 { │ │ │ │ │ -678 std::vector corners(dimension+1); │ │ │ │ │ -679 auto refelem = _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_<_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_:_s_i_m_p_l_e_x(); │ │ │ │ │ -680 for(int i = 0; i <= dimension; ++i) │ │ │ │ │ -681 corners[i] = global(refelem.position(i, dimension)); │ │ │ │ │ -682 return _G_e_o_m_e_t_r_y(refelem.type(), corners); │ │ │ │ │ -683 } │ │ │ │ │ -684 │ │ │ │ │ -685 template │ │ │ │ │ -686 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -687 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -688_ _g_l_o_b_a_l(const CoordVector &local) const { │ │ │ │ │ -689 CoordVector v = │ │ │ │ │ -690 _r_e_f_e_r_e_n_c_e_T_o_K_u_h_n(local, getPermutation(kuhnIndex)); │ │ │ │ │ -691 v += origin; │ │ │ │ │ -692 v /= (typename CoordVector::value_type)size; │ │ │ │ │ -693 return _k_u_h_n_T_o_R_e_f_e_r_e_n_c_e(v, getPermutation(0)); │ │ │ │ │ -694 } │ │ │ │ │ -695 │ │ │ │ │ -696 // common │ │ │ │ │ -697 │ │ │ │ │ -698 template │ │ │ │ │ -699 template │ │ │ │ │ -_7_0_0 class _R_e_f_i_n_e_m_e_n_t_I_m_p::_C_o_d_i_m:: │ │ │ │ │ -SubEntityIterator │ │ │ │ │ -701 : public ForwardIteratorFacade::template Codim::SubEntityIterator, int>, │ │ │ │ │ -702 public _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ -703 { │ │ │ │ │ -704 public: │ │ │ │ │ -_7_0_5 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -706 │ │ │ │ │ -_7_0_7 _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r(int nIntervals, bool end = false); │ │ │ │ │ -708 }; │ │ │ │ │ -709 │ │ │ │ │ -710#ifndef DOXYGEN │ │ │ │ │ -711 │ │ │ │ │ -712 template │ │ │ │ │ -713 template │ │ │ │ │ -714 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_:_: │ │ │ │ │ -715_ _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r(int nIntervals, bool end) │ │ │ │ │ -716 : _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(nIntervals, │ │ │ │ │ -end) │ │ │ │ │ -717 {} │ │ │ │ │ -718 │ │ │ │ │ -719#endif │ │ │ │ │ -720 │ │ │ │ │ -721 } // namespace Simplex │ │ │ │ │ -722 │ │ │ │ │ -723 } // namespace RefinementImp │ │ │ │ │ -724 │ │ │ │ │ -725 │ │ │ │ │ -726 namespace RefinementImp { │ │ │ │ │ -727 │ │ │ │ │ -728 // /////////////////////// │ │ │ │ │ -729 // │ │ │ │ │ -730 // The refinement traits │ │ │ │ │ -731 // │ │ │ │ │ -732 │ │ │ │ │ -733#ifndef DOXYGEN │ │ │ │ │ -734 template │ │ │ │ │ -736 struct Traits< │ │ │ │ │ -737 topologyId, CoordType, coerceToId, dim, │ │ │ │ │ -738 typename _s_t_d::enable_if< │ │ │ │ │ -739 ((GeometryTypes::simplex(dim).id() >> 1) == │ │ │ │ │ -740 (topologyId >> 1) && │ │ │ │ │ -741 (GeometryTypes::simplex(dim).id() >> 1) == │ │ │ │ │ -742 (coerceToId >> 1) │ │ │ │ │ -743 )>::type │ │ │ │ │ -744 > │ │ │ │ │ -745 { │ │ │ │ │ -746 typedef Simplex::RefinementImp Imp; │ │ │ │ │ -747 }; │ │ │ │ │ -748#endif │ │ │ │ │ -749 │ │ │ │ │ -750 │ │ │ │ │ -751 } // namespace RefinementImp │ │ │ │ │ -752 │ │ │ │ │ -753} // namespace Dune │ │ │ │ │ -754 │ │ │ │ │ -755#endif //DUNE_GRID_COMMON_REFINEMENT_SIMPLEX_CC │ │ │ │ │ -_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h │ │ │ │ │ -_m_u_l_t_i_l_i_n_e_a_r_g_e_o_m_e_t_r_y_._h_h │ │ │ │ │ -_b_a_s_e_._c_c │ │ │ │ │ -This file contains the parts independent of a particular Refinement │ │ │ │ │ -implementation. │ │ │ │ │ -_t_y_p_e_._h_h │ │ │ │ │ -A unique label for each type of element that can occur in a grid. │ │ │ │ │ +522 inline constexpr _G_e_o_m_e_t_r_y_T_y_p_e pyramid = _G_e_o_m_e_t_r_y_T_y_p_e(0b0011,3,false); │ │ │ │ │ +523 │ │ │ │ │ +525 │ │ │ │ │ +528 inline constexpr _G_e_o_m_e_t_r_y_T_y_p_e prism = _G_e_o_m_e_t_r_y_T_y_p_e(0b0101,3,false); │ │ │ │ │ +529 │ │ │ │ │ +531 │ │ │ │ │ +534 inline constexpr _G_e_o_m_e_t_r_y_T_y_p_e hexahedron = cube(3); │ │ │ │ │ +535 │ │ │ │ │ +536 } │ │ │ │ │ +537 │ │ │ │ │ +538 namespace Impl │ │ │ │ │ +539 { │ │ │ │ │ +540 │ │ │ │ │ +542 inline constexpr _G_e_o_m_e_t_r_y_T_y_p_e getBase(const _G_e_o_m_e_t_r_y_T_y_p_e& gt) { │ │ │ │ │ +543 return _G_e_o_m_e_t_r_y_T_y_p_e(gt._i_d() & ((1 << (gt._d_i_m()-1))-1), gt._d_i_m()-1, │ │ │ │ │ +gt._i_s_N_o_n_e()); │ │ │ │ │ +544 } │ │ │ │ │ +545 │ │ │ │ │ +546 │ │ │ │ │ +547 // IfGeometryType │ │ │ │ │ +548 // ---------- │ │ │ │ │ +549 │ │ │ │ │ +550 template< template< GeometryType::Id > class Operation, int dim, │ │ │ │ │ +_G_e_o_m_e_t_r_y_T_y_p_e_:_:_I_d geometryId = GeometryTypes::vertex > │ │ │ │ │ +551 struct IfGeometryType │ │ │ │ │ +552 { │ │ │ │ │ +553 static constexpr GeometryType geometry = geometryId; │ │ │ │ │ +554 template< class... Args > │ │ │ │ │ +555 static auto apply ( GeometryType gt, Args &&... args ) │ │ │ │ │ +556 { │ │ │ │ │ +557 GeometryType lowerGeometry(gt.id() >>1 , gt.dim()-1, gt.isNone()); │ │ │ │ │ +558 │ │ │ │ │ +559 if( gt.id() & 1 ) │ │ │ │ │ +560 return IfGeometryType< Operation, dim-1, GeometryTypes::prismaticExtension │ │ │ │ │ +(geometry).toId() >::apply( lowerGeometry, std::forward< Args >( args )... ); │ │ │ │ │ +561 else │ │ │ │ │ +562 return IfGeometryType< Operation, dim-1, GeometryTypes::conicalExtension │ │ │ │ │ +(geometry).toId() >::apply( lowerGeometry, std::forward< Args >( args )... ); │ │ │ │ │ +563 } │ │ │ │ │ +564 }; │ │ │ │ │ +565 │ │ │ │ │ +566 template< template< GeometryType::Id > class Operation, _G_e_o_m_e_t_r_y_T_y_p_e_:_:_I_d │ │ │ │ │ +geometryId > │ │ │ │ │ +567 struct IfGeometryType< Operation, 0, geometryId> │ │ │ │ │ +568 { │ │ │ │ │ +569 template< class... Args > │ │ │ │ │ +570 static auto apply ([[maybe_unused]] GeometryType gt, Args &&... args ) │ │ │ │ │ +571 { │ │ │ │ │ +572 return Operation< geometryId >::apply( std::forward< Args >( args )... ); │ │ │ │ │ +573 } │ │ │ │ │ +574 }; │ │ │ │ │ +575 } // namespace Impl │ │ │ │ │ +576} // namespace Dune │ │ │ │ │ +577 │ │ │ │ │ +578#endif // DUNE_GEOMETRY_TYPE_HH │ │ │ │ │ _s_t_d │ │ │ │ │ STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn affinegeometry.hh:21 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_p_o_i_n_t_I_n_d_e_x │ │ │ │ │ -int pointIndex(const FieldVector< int, dimension > &point) │ │ │ │ │ -calculate the index of a given gridpoint within a Kuhn0 simplex │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:280 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_g_e_t_P_e_r_m_u_t_a_t_i_o_n │ │ │ │ │ -FieldVector< int, n > getPermutation(int m) │ │ │ │ │ -Calculate permutation from it's index. │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:293 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_r_e_f_e_r_e_n_c_e_T_o_K_u_h_n │ │ │ │ │ -FieldVector< CoordType, dimension > referenceToKuhn(FieldVector< CoordType, │ │ │ │ │ -dimension > point, const FieldVector< int, dimension > &kuhn) │ │ │ │ │ -Map from the reference simplex to some Kuhn simplex. │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:322 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_k_u_h_n_T_o_R_e_f_e_r_e_n_c_e │ │ │ │ │ -FieldVector< CoordType, dimension > kuhnToReference(FieldVector< CoordType, │ │ │ │ │ -dimension > point, const FieldVector< int, dimension > &kuhn) │ │ │ │ │ -Map from some Kuhn simplex to the reference simplex. │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:341 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s │ │ │ │ │ -Class providing access to the singletons of the reference elements. │ │ │ │ │ -DDeeffiinniittiioonn referenceelements.hh:128 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_s_i_m_p_l_e_x │ │ │ │ │ -static const ReferenceElement & simplex() │ │ │ │ │ -get simplex reference elements │ │ │ │ │ -DDeeffiinniittiioonn referenceelements.hh:162 │ │ │ │ │ -_D_u_n_e_:_:_C_o_d_i_m │ │ │ │ │ -Static tag representing a codimension. │ │ │ │ │ -DDeeffiinniittiioonn dimension.hh:24 │ │ │ │ │ -_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y │ │ │ │ │ -Implement a MultiLinearGeometry with additional caching. │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:526 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:361 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ -Codim< dimension >::SubEntityIterator VertexIterator │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:368 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ -FieldVector< int, dimension+1 > IndexVector │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:371 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_c_t_y_p_e │ │ │ │ │ -CoordType ctype │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:364 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_n_V_e_r_t_i_c_e_s │ │ │ │ │ -static int nVertices(int nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:394 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_n_E_l_e_m_e_n_t_s │ │ │ │ │ -static int nElements(int nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:418 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_e_E_n_d │ │ │ │ │ -static ElementIterator eEnd(int nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:434 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_v_E_n_d │ │ │ │ │ -static VertexIterator vEnd(int nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:410 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ -Codim< 0 >::SubEntityIterator ElementIterator │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:370 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_v_B_e_g_i_n │ │ │ │ │ -static VertexIterator vBegin(int nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:402 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_e_B_e_g_i_n │ │ │ │ │ -static ElementIterator eBegin(int nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:426 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -FieldVector< CoordType, dimension > CoordVector │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:369 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ -static constexpr int dimension │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:363 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:385 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ -Dune::CachedMultiLinearGeometry< CoordType, dimension-codimension, dimension > │ │ │ │ │ -Geometry │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:388 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:445 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:451 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_ _>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -Refinement::CoordVector CoordVector │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:454 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_ _>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:453 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_ _>_:_:_v_e_r_t_e_x │ │ │ │ │ -Vertex vertex │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:471 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_ _>_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ -Refinement::template Codim< dimension >::Geometry Geometry │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:455 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_ _>_:_:_T_h_i_s │ │ │ │ │ -RefinementIteratorSpecial< dimension, CoordType, dimension > This │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:456 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_ _>_:_:_V_e_r_t_e_x │ │ │ │ │ -FieldVector< int, dimension > Vertex │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:468 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_ _>_:_:_s_i_z_e │ │ │ │ │ -int size │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:470 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ -_0_ _> │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:541 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ -_0_ _>_:_:_k_u_h_n_I_n_d_e_x │ │ │ │ │ -int kuhnIndex │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:568 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ -_0_ _>_:_:_V_e_r_t_e_x │ │ │ │ │ -FieldVector< int, dimension > Vertex │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:564 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ -_0_ _>_:_:_o_r_i_g_i_n │ │ │ │ │ -Vertex origin │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:567 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ -_0_ _>_:_:_i_n_d_e_x__ │ │ │ │ │ -int index_ │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:570 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ -_0_ _>_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ -Refinement::template Codim< 0 >::Geometry Geometry │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:546 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ -_0_ _>_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ -Refinement::IndexVector IndexVector │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:544 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ -_0_ _>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -Refinement::CoordVector CoordVector │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:545 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ -_0_ _>_:_:_T_h_i_s │ │ │ │ │ -RefinementIteratorSpecial< dimension, CoordType, 0 > This │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:547 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ -_0_ _>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:543 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_, │ │ │ │ │ -_0_ _>_:_:_s_i_z_e │ │ │ │ │ -int size │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:569 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_: │ │ │ │ │ -_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ -SubEntityIterator(int nIntervals, bool end=false) │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:705 │ │ │ │ │ +_D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ +std::ostream & operator<<(std::ostream &s, const GeometryType &a) │ │ │ │ │ +Prints the type to an output stream. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:410 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ +Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:114 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ +constexpr GeometryType(unsigned int topologyId, unsigned int dim) │ │ │ │ │ +Constructor, using the topologyId (integer) and the dimension. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:251 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_o_p_e_r_a_t_o_r_< │ │ │ │ │ +constexpr bool operator<(const GeometryType &other) const │ │ │ │ │ +less-than operation for use with maps │ │ │ │ │ +DDeeffiinniittiioonn type.hh:393 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ +constexpr bool operator!=(const GeometryType &other) const │ │ │ │ │ +Check for inequality. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:388 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_P_y_r_a_m_i_d │ │ │ │ │ +constexpr bool isPyramid() const │ │ │ │ │ +Return true if entity is a pyramid. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:304 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_T_e_t_r_a_h_e_d_r_o_n │ │ │ │ │ +constexpr bool isTetrahedron() const │ │ │ │ │ +Return true if entity is a tetrahedron. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:299 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_P_r_i_s_m │ │ │ │ │ +constexpr bool isPrism() const │ │ │ │ │ +Return true if entity is a prism. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:309 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_V_e_r_t_e_x │ │ │ │ │ +constexpr bool isVertex() const │ │ │ │ │ +Return true if entity is a vertex. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:279 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ +constexpr bool operator==(const GeometryType &other) const │ │ │ │ │ +Check for equality. This method knows that in dimension 0 and 1 all BasicTypes │ │ │ │ │ +are equal. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:377 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_t_o_I_d │ │ │ │ │ +constexpr Id toId() const │ │ │ │ │ +Create an Id representation of this GeometryType. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:210 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_C_o_n_i_c_a_l │ │ │ │ │ +constexpr bool isConical(const int &step) const │ │ │ │ │ +Return true if entity was constructed with a conical product in the chosen │ │ │ │ │ +step. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:337 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_d_i_m │ │ │ │ │ +constexpr unsigned int dim() const │ │ │ │ │ +Return dimension of the type. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:360 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_P_r_i_s_m_a_t_i_c │ │ │ │ │ +constexpr bool isPrismatic(const int &step) const │ │ │ │ │ +Return true if entity was constructed with a prismatic product in the chosen │ │ │ │ │ +step. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:350 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_T_r_i_a_n_g_l_e │ │ │ │ │ +constexpr bool isTriangle() const │ │ │ │ │ +Return true if entity is a triangle. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:289 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ +GeometryType(TopologyType t) │ │ │ │ │ +Constructor from static TopologyType class. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:267 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ +constexpr GeometryType(unsigned int topologyId, unsigned int dim, bool isNone) │ │ │ │ │ +Constructor, using the topologyId (integer), the dimension and a flag for type │ │ │ │ │ +none. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:242 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_B_a_s_i_c_T_y_p_e │ │ │ │ │ +BasicType │ │ │ │ │ +Each entity can be tagged by one of these basic types plus its space dimension. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:120 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_c_u_b_e │ │ │ │ │ +@ cube │ │ │ │ │ +Cube element in any nonnegative dimension. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:122 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_s_i_m_p_l_e_x │ │ │ │ │ +@ simplex │ │ │ │ │ +Simplicial element in any nonnegative dimension. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:121 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_p_y_r_a_m_i_d │ │ │ │ │ +@ pyramid │ │ │ │ │ +Four sided pyramid in three dimensions. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:123 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_e_x_t_e_n_d_e_d │ │ │ │ │ +@ extended │ │ │ │ │ +Other, more general topology, representable as topologyId. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:125 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_n_o_n_e │ │ │ │ │ +@ none │ │ │ │ │ +Even more general topology, cannot be specified by a topologyId. Two │ │ │ │ │ +GeometryTypes with 'none' type a... │ │ │ │ │ +DDeeffiinniittiioonn type.hh:126 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_p_r_i_s_m │ │ │ │ │ +@ prism │ │ │ │ │ +Prism element in three dimensions. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:124 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ +constexpr GeometryType(Id id) │ │ │ │ │ +Reconstruct a Geometry type from a GeometryType::Id. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:222 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_C_u_b_e │ │ │ │ │ +constexpr bool isCube() const │ │ │ │ │ +Return true if entity is a cube of any dimension. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:324 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ +constexpr GeometryType() │ │ │ │ │ +Default constructor, not initializing anything. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:232 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_C_o_n_i_c_a_l │ │ │ │ │ +constexpr bool isConical() const │ │ │ │ │ +Return true if entity was constructed with a conical product in the last step. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:329 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_L_i_n_e │ │ │ │ │ +constexpr bool isLine() const │ │ │ │ │ +Return true if entity is a line segment. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:284 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_Q_u_a_d_r_i_l_a_t_e_r_a_l │ │ │ │ │ +constexpr bool isQuadrilateral() const │ │ │ │ │ +Return true if entity is a quadrilateral. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:294 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_P_r_i_s_m_a_t_i_c │ │ │ │ │ +constexpr bool isPrismatic() const │ │ │ │ │ +Return true if entity was constructed with a prismatic product in the last │ │ │ │ │ +step. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:342 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_d │ │ │ │ │ +constexpr unsigned int id() const │ │ │ │ │ +Return the topology id of the type. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:365 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_N_o_n_e │ │ │ │ │ +constexpr bool isNone() const │ │ │ │ │ +Return true if entity is a singular of any dimension. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:355 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_H_e_x_a_h_e_d_r_o_n │ │ │ │ │ +constexpr bool isHexahedron() const │ │ │ │ │ +Return true if entity is a hexahedron. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:314 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_S_i_m_p_l_e_x │ │ │ │ │ +constexpr bool isSimplex() const │ │ │ │ │ +Return true if entity is a simplex of any dimension. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:319 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_I_d │ │ │ │ │ +IdType Id │ │ │ │ │ +An integral id representing a GeometryType. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:181 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00215.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: pyramidtriangulation.cc File Reference │ │ │ │ +dune-geometry: mappedgeometry.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,86 +65,65 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ -Macros | │ │ │ │ Functions
│ │ │ │ -
pyramidtriangulation.cc File Reference
│ │ │ │ +
mappedgeometry.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 <cassert>
│ │ │ │ +#include <limits>
│ │ │ │ +#include <optional>
│ │ │ │ +#include <stdexcept>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <dune/common/copyableoptional.hh>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/common/fmatrix.hh>
│ │ │ │ +#include <dune/common/fvector.hh>
│ │ │ │ +#include <dune/common/math.hh>
│ │ │ │ +#include <dune/common/transpose.hh>
│ │ │ │ +#include <dune/geometry/affinegeometry.hh>
│ │ │ │ +#include <dune/geometry/quadraturerules.hh>
│ │ │ │ +#include <dune/geometry/referenceelements.hh>
│ │ │ │ +#include <dune/geometry/type.hh>
│ │ │ │ +#include <dune/geometry/utility/algorithms.hh>
│ │ │ │ +#include <dune/geometry/utility/convergence.hh>
│ │ │ │
│ │ │ │

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 >
 
class  Dune::RefinementImp::PyramidTriangulation::RefinementIteratorSpecial< dimension, CoordType, 0 >
 
class  Dune::RefinementImp::PyramidTriangulation::RefinementImp< dimension_, CoordType >::Codim< codimension >
class  Dune::MappedGeometry< Map, Geo >
 Geometry parametrized by a LocalFunction and a LocalGeometry. 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)
 
template<class Map , class Geo >
 Dune::MappedGeometry (const Map &, const Geo &) -> MappedGeometry< Map, Geo >
 
template<class Map , class Geo >
 Dune::MappedGeometry (const Map &, const Geo &, bool) -> MappedGeometry< Map, Geo >
 
│ │ │ │ -

Macro Definition Documentation

│ │ │ │ - │ │ │ │ -

◆ DUNE_GEOMETRY_REFINEMENT_PYRAMIDTRIANGULATION_CC

│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
#define DUNE_GEOMETRY_REFINEMENT_PYRAMIDTRIANGULATION_CC
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,59 +1,43 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ - * _r_e_f_i_n_e_m_e_n_t │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -pyramidtriangulation.cc File Reference │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +mappedgeometry.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_a_f_f_i_n_e_g_e_o_m_e_t_r_y_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_q_u_a_d_r_a_t_u_r_e_r_u_l_e_s_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ -#include "_b_a_s_e_._c_c" │ │ │ │ │ -#include "_s_i_m_p_l_e_x_._c_c" │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_u_t_i_l_i_t_y_/_a_l_g_o_r_i_t_h_m_s_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_u_t_i_l_i_t_y_/_c_o_n_v_e_r_g_e_n_c_e_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ - class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___, │ │ │ │ │ - _C_o_o_r_d_T_y_p_e_ _> │ │ │ │ │ -  Implementation of the refinement of a pyramid into simplices. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___, │ │ │ │ │ - _C_o_o_r_d_T_y_p_e_ _>_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ - _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ - _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___, │ │ │ │ │ - _C_o_o_r_d_T_y_p_e_ _>_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ +class   _D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_<_ _M_a_p_,_ _G_e_o_ _> │ │ │ │ │ +  Geometry parametrized by a LocalFunction and a LocalGeometry. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ -  This namespace contains the implementation of _R_e_f_i_n_e_m_e_n_t. │ │ │ │ │ -  │ │ │ │ │ -namespace   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n │ │ │ │ │ - This namespace contains the _R_e_f_i_n_e_m_e_n_t implementation for │ │ │ │ │ -  triangulating pyramids (_G_e_o_m_e_t_r_y_T_y_p_e_:_:_p_y_r_a_m_i_d -> _G_e_o_m_e_t_r_y_T_y_p_e_:_: │ │ │ │ │ - _s_i_m_p_l_e_x) │ │ │ │ │ -  │ │ │ │ │ -MMaaccrrooss │ │ │ │ │ -#define  _D_U_N_E___G_E_O_M_E_T_R_Y___R_E_F_I_N_E_M_E_N_T___P_Y_R_A_M_I_D_T_R_I_A_N_G_U_L_A_T_I_O_N___C_C │ │ │ │ │ -  │ │ │ │ │ FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -FieldVector< CoordType, dimension >  _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_: │ │ │ │ │ - _P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_t_r_a_n_s_f_o_r_m_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ - (FieldVector< CoordType, dimension > │ │ │ │ │ - point) │ │ │ │ │ +template │ │ │ │ │ +  _D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y (const Map &, const Geo &) -> _M_a_p_p_e_d_G_e_o_m_e_t_r_y< Map, Geo > │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +  _D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y (const Map &, const Geo &, bool) -> _M_a_p_p_e_d_G_e_o_m_e_t_r_y< Map, │ │ │ │ │ + Geo > │ │ │ │ │   │ │ │ │ │ -********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ -********** _?◆_? DDUUNNEE__GGEEOOMMEETTRRYY__RREEFFIINNEEMMEENNTT__PPYYRRAAMMIIDDTTRRIIAANNGGUULLAATTIIOONN__CCCC ********** │ │ │ │ │ -#define DUNE_GEOMETRY_REFINEMENT_PYRAMIDTRIANGULATION_CC │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00215_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: pyramidtriangulation.cc Source File │ │ │ │ +dune-geometry: mappedgeometry.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,524 +70,331 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
pyramidtriangulation.cc
│ │ │ │ +
mappedgeometry.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 © 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_PYRAMIDTRIANGULATION_CC
│ │ │ │ -
6#define DUNE_GEOMETRY_REFINEMENT_PYRAMIDTRIANGULATION_CC
│ │ │ │ +
5#ifndef DUNE_GEOMETRY_MAPPEDGEOMETRY_HH
│ │ │ │ +
6#define DUNE_GEOMETRY_MAPPEDGEOMETRY_HH
│ │ │ │
7
│ │ │ │ -
8#include <dune/common/fvector.hh>
│ │ │ │ -
9#include <dune/common/typetraits.hh>
│ │ │ │ -
10
│ │ │ │ - │ │ │ │ -
12#include <dune/geometry/type.hh>
│ │ │ │ +
8#include <cassert>
│ │ │ │ +
9#include <limits>
│ │ │ │ +
10#include <optional>
│ │ │ │ +
11#include <stdexcept>
│ │ │ │ +
12#include <type_traits>
│ │ │ │
13
│ │ │ │ -
14#include "base.cc"
│ │ │ │ -
15#include "simplex.cc"
│ │ │ │ -
16
│ │ │ │ -
17namespace Dune
│ │ │ │ -
18{
│ │ │ │ -
19 namespace RefinementImp
│ │ │ │ -
20 {
│ │ │ │ -
│ │ │ │ -
26 namespace PyramidTriangulation
│ │ │ │ -
27 {
│ │ │ │ -
28 // ////////////
│ │ │ │ -
29 //
│ │ │ │ -
30 // Utilities
│ │ │ │ -
31 //
│ │ │ │ -
32
│ │ │ │ - │ │ │ │ - │ │ │ │ -
35
│ │ │ │ -
36 // ////////////////////////////////////
│ │ │ │ -
37 //
│ │ │ │ -
38 // Refine a pyramid with simplices
│ │ │ │ -
39 //
│ │ │ │ -
40
│ │ │ │ -
41 // forward declaration of the iterator base
│ │ │ │ -
42 template<int dimension, class CoordType, int codimension>
│ │ │ │ - │ │ │ │ -
44
│ │ │ │ -
45 /*
│ │ │ │ -
46 * The permutations 0 and 1 of the Kuhn-decomposition of a cube into simplices form a pyramid.
│ │ │ │ -
47 * The resulting pyramid is not oriented the same as the reference pyramid and so the Kuhn-coordinates
│ │ │ │ -
48 * have to be transformed using the method below.
│ │ │ │ -
49 */
│ │ │ │ -
50 template<int dimension, class CoordType> FieldVector<CoordType, dimension>
│ │ │ │ -
│ │ │ │ -
51 transformCoordinate( FieldVector<CoordType, dimension> point)
│ │ │ │ -
52 {
│ │ │ │ -
53 FieldVector<CoordType, dimension> transform;
│ │ │ │ -
54 transform[0]=1-point[0];
│ │ │ │ -
55 transform[1]=1-point[1];
│ │ │ │ -
56 transform[2]=point[2];
│ │ │ │ -
57 return transform;
│ │ │ │ -
58 }
│ │ │ │ -
│ │ │ │ -
59
│ │ │ │ -
66 template<int dimension_, class CoordType>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
68 {
│ │ │ │ -
69 public:
│ │ │ │ -
70 constexpr static int dimension = dimension_;
│ │ │ │ -
71
│ │ │ │ -
72 typedef CoordType ctype;
│ │ │ │ -
73
│ │ │ │ -
74 template<int codimension>
│ │ │ │ -
75 struct Codim;
│ │ │ │ - │ │ │ │ -
77 typedef FieldVector<CoordType, dimension> CoordVector;
│ │ │ │ - │ │ │ │ -
79 typedef FieldVector<int, dimension+1> IndexVector;
│ │ │ │ -
80
│ │ │ │ -
81 static int nVertices(int nIntervals);
│ │ │ │ -
82 static VertexIterator vBegin(int nIntervals);
│ │ │ │ -
83 static VertexIterator vEnd(int nIntervals);
│ │ │ │ +
14#include <dune/common/copyableoptional.hh>
│ │ │ │ +
15#include <dune/common/exceptions.hh>
│ │ │ │ +
16#include <dune/common/fmatrix.hh>
│ │ │ │ +
17#include <dune/common/fvector.hh>
│ │ │ │ +
18#include <dune/common/math.hh>
│ │ │ │ +
19#include <dune/common/transpose.hh>
│ │ │ │ +
20#include <dune/geometry/affinegeometry.hh> // for FieldMatrixHelper
│ │ │ │ + │ │ │ │ + │ │ │ │ +
23#include <dune/geometry/type.hh>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
26
│ │ │ │ +
27namespace Dune {
│ │ │ │ +
28
│ │ │ │ +
63template <class Map, class Geo>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
65{
│ │ │ │ +
66public:
│ │ │ │ +
68 using LocalCoordinate = typename Geo::LocalCoordinate;
│ │ │ │ +
69
│ │ │ │ +
71 using GlobalCoordinate = std::remove_reference_t<decltype(std::declval<Map>()(std::declval<typename Geo::GlobalCoordinate>()))>;
│ │ │ │ +
72
│ │ │ │ +
74 using ctype = typename Geo::ctype;
│ │ │ │ +
75
│ │ │ │ +
77 static constexpr int mydimension = LocalCoordinate::size();
│ │ │ │ +
78
│ │ │ │ +
80 static constexpr int coorddimension = GlobalCoordinate::size();
│ │ │ │ +
81
│ │ │ │ +
83 using Volume = std::remove_reference_t<decltype(Dune::power(std::declval<ctype>(),mydimension))>;
│ │ │ │
84
│ │ │ │ -
85 static int nElements(int nIntervals);
│ │ │ │ -
86 static ElementIterator eBegin(int nIntervals);
│ │ │ │ -
87 static ElementIterator eEnd(int nIntervals);
│ │ │ │ -
88
│ │ │ │ -
89 private:
│ │ │ │ -
90 friend class RefinementIteratorSpecial<dimension, CoordType, 0>;
│ │ │ │ -
91 friend class RefinementIteratorSpecial<dimension, CoordType, dimension>;
│ │ │ │ -
92
│ │ │ │ - │ │ │ │ -
94
│ │ │ │ -
95 constexpr static int nKuhnSimplices = 2;
│ │ │ │ -
96 };
│ │ │ │ -
│ │ │ │ -
97
│ │ │ │ -
98 template<int dimension, class CoordType>
│ │ │ │ -
99 template<int codimension>
│ │ │ │ -
│ │ │ │ -
100 struct RefinementImp<dimension, CoordType>::Codim
│ │ │ │ -
101 {
│ │ │ │ -
102 class SubEntityIterator;
│ │ │ │ - │ │ │ │ -
104 };
│ │ │ │ -
│ │ │ │ -
105
│ │ │ │ -
106 template<int dimension, class CoordType>
│ │ │ │ -
107 int
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
109 nVertices(int nIntervals)
│ │ │ │ -
110 {
│ │ │ │ -
111 return BackendRefinement::nVertices(nIntervals) * nKuhnSimplices;
│ │ │ │ -
112 }
│ │ │ │ -
│ │ │ │ -
113
│ │ │ │ -
114 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
117 vBegin(int nIntervals)
│ │ │ │ -
118 {
│ │ │ │ -
119 return VertexIterator(nIntervals);
│ │ │ │ -
120 }
│ │ │ │ -
│ │ │ │ -
121
│ │ │ │ -
122 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
125 vEnd(int nIntervals)
│ │ │ │ -
126 {
│ │ │ │ -
127 return VertexIterator(nIntervals, true);
│ │ │ │ -
128 }
│ │ │ │ -
│ │ │ │ -
129
│ │ │ │ -
130 template<int dimension, class CoordType>
│ │ │ │ -
131 int
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
133 nElements(int nIntervals)
│ │ │ │ -
134 {
│ │ │ │ -
135 return BackendRefinement::nElements(nIntervals) * nKuhnSimplices;
│ │ │ │ -
136 }
│ │ │ │ -
│ │ │ │ -
137
│ │ │ │ -
138 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
141 eBegin(int nIntervals)
│ │ │ │ -
142 {
│ │ │ │ -
143 return ElementIterator(nIntervals);
│ │ │ │ -
144 }
│ │ │ │ -
│ │ │ │ -
145
│ │ │ │ -
146 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
149 eEnd(int nIntervals)
│ │ │ │ -
150 {
│ │ │ │ -
151 return ElementIterator(nIntervals, true);
│ │ │ │ -
152 }
│ │ │ │ +
86 using Jacobian = FieldMatrix<ctype, coorddimension, mydimension>;
│ │ │ │ +
87
│ │ │ │ +
89 using JacobianTransposed = FieldMatrix<ctype, mydimension, coorddimension>;
│ │ │ │ +
90
│ │ │ │ +
92 using JacobianInverse = FieldMatrix<ctype, mydimension, coorddimension>;
│ │ │ │ +
93
│ │ │ │ +
95 using JacobianInverseTransposed = FieldMatrix<ctype, coorddimension, mydimension>;
│ │ │ │ +
96
│ │ │ │ +
97private:
│ │ │ │ + │ │ │ │ +
99 using ReferenceElement = typename ReferenceElements::ReferenceElement;
│ │ │ │ +
100
│ │ │ │ +
101protected:
│ │ │ │ +
102 using MatrixHelper = Impl::FieldMatrixHelper<ctype>;
│ │ │ │ +
103
│ │ │ │ +
104 // type of the mapping representation the geometry parametrization
│ │ │ │ +
105 using Mapping = Map;
│ │ │ │ +
106
│ │ │ │ +
107 // type of the geometry that is wrapped
│ │ │ │ +
108 using Geometry = Geo;
│ │ │ │ +
109
│ │ │ │ +
110 // type of a mapping representing the derivative of `Map` w.r.t. `GlobalCoordinate`
│ │ │ │ +
111 using DerivativeMapping = std::remove_reference_t<decltype(derivative(std::declval<Map>()))>;
│ │ │ │ +
112
│ │ │ │ +
113public:
│ │ │ │ +
122 template <class Geo_, class Map_,
│ │ │ │ +
123 std::enable_if_t<Dune::IsInteroperable<Map, Map_>::value, int> = 0,
│ │ │ │ +
124 std::enable_if_t<Dune::IsInteroperable<Geo, Geo_>::value, int> = 0>
│ │ │ │ +
│ │ │ │ +
125 MappedGeometry (Map_&& mapping, Geo_&& geometry, bool affine = false)
│ │ │ │ +
126 : mapping_(std::forward<Map_>(mapping))
│ │ │ │ +
127 , dMapping_(derivative(*mapping_))
│ │ │ │ +
128 , geometry_(std::forward<Geo_>(geometry))
│ │ │ │ +
129 , affine_(affine)
│ │ │ │ +
130 {}
│ │ │ │ +
│ │ │ │ +
131
│ │ │ │ +
│ │ │ │ +
137 bool affine () const
│ │ │ │ +
138 {
│ │ │ │ +
139 return affine_;
│ │ │ │ +
140 }
│ │ │ │ +
│ │ │ │ +
141
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
144 {
│ │ │ │ +
145 return geometry_.type();
│ │ │ │ +
146 }
│ │ │ │ +
│ │ │ │ +
147
│ │ │ │ +
│ │ │ │ +
149 int corners () const
│ │ │ │ +
150 {
│ │ │ │ +
151 return geometry_.corners();
│ │ │ │ +
152 }
│ │ │ │
│ │ │ │
153
│ │ │ │ -
154 // //////////////
│ │ │ │ -
155 //
│ │ │ │ -
156 // The iterator
│ │ │ │ -
157 //
│ │ │ │ -
158
│ │ │ │ -
159 // vertices
│ │ │ │ -
160 template<int dimension, class CoordType>
│ │ │ │ -
│ │ │ │ -
161 class RefinementIteratorSpecial<dimension, CoordType, dimension>
│ │ │ │ -
162 {
│ │ │ │ -
163 public:
│ │ │ │ - │ │ │ │ -
165 typedef typename Refinement::CoordVector CoordVector;
│ │ │ │ -
166 typedef typename Refinement::template Codim<dimension>::Geometry Geometry;
│ │ │ │ -
167
│ │ │ │ -
168 RefinementIteratorSpecial(int nIntervals, bool end = false);
│ │ │ │ -
169
│ │ │ │ -
170 void increment();
│ │ │ │ -
171
│ │ │ │ -
172 CoordVector coords() const;
│ │ │ │ -
173
│ │ │ │ -
174 Geometry geometry() const;
│ │ │ │ -
175
│ │ │ │ -
176 int index() const;
│ │ │ │ -
177 protected:
│ │ │ │ -
178 typedef typename Refinement::BackendRefinement BackendRefinement;
│ │ │ │ -
179 typedef typename BackendRefinement::template Codim<dimension>::SubEntityIterator BackendIterator;
│ │ │ │ -
180 constexpr static int nKuhnSimplices = 2;
│ │ │ │ -
181
│ │ │ │ - │ │ │ │ -
183
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
187 };
│ │ │ │ -
│ │ │ │ -
188
│ │ │ │ -
189 template<int dimension, class CoordType>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
191 RefinementIteratorSpecial(int nIntervals, bool end)
│ │ │ │ -
192 : nIntervals_(nIntervals), kuhnIndex(0),
│ │ │ │ -
193 backend(BackendRefinement::vBegin(nIntervals_)),
│ │ │ │ -
194 backendEnd(BackendRefinement::vEnd(nIntervals_))
│ │ │ │ -
195 {
│ │ │ │ -
196 if (end)
│ │ │ │ -
197 kuhnIndex = nKuhnSimplices;
│ │ │ │ -
198 }
│ │ │ │ -
│ │ │ │ -
199
│ │ │ │ -
200 template<int dimension, class CoordType>
│ │ │ │ -
201 void
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
204 {
│ │ │ │ -
205 ++backend;
│ │ │ │ -
206 if(backend == backendEnd)
│ │ │ │ -
207 {
│ │ │ │ -
208 backend = BackendRefinement::vBegin(nIntervals_);
│ │ │ │ -
209 ++kuhnIndex;
│ │ │ │ -
210 }
│ │ │ │ -
211 }
│ │ │ │ -
│ │ │ │ -
212
│ │ │ │ -
213 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
216 coords() const
│ │ │ │ -
217 {
│ │ │ │ -
218 return transformCoordinate(referenceToKuhn(backend.coords(),
│ │ │ │ -
219 getPermutation<dimension>(kuhnIndex)));
│ │ │ │ -
220 }
│ │ │ │ -
│ │ │ │ -
221
│ │ │ │ -
222 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
225 {
│ │ │ │ -
226 std::vector<CoordVector> corners(1);
│ │ │ │ -
227 corners[0] = referenceToKuhn(backend.coords(), getPermutation<dimension>(kuhnIndex));
│ │ │ │ -
228 return Geometry(GeometryTypes::vertex, corners);
│ │ │ │ -
229 }
│ │ │ │ -
│ │ │ │ -
230
│ │ │ │ -
231 template<int dimension, class CoordType>
│ │ │ │ -
232 int
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
234 index() const
│ │ │ │ -
235 {
│ │ │ │ -
236 return kuhnIndex*BackendRefinement::nVertices(nIntervals_) + backend.index();
│ │ │ │ -
237 }
│ │ │ │ -
│ │ │ │ -
238
│ │ │ │ -
239 // elements
│ │ │ │ -
240 template<int dimension, class CoordType>
│ │ │ │ -
│ │ │ │ -
241 class RefinementIteratorSpecial<dimension, CoordType, 0>
│ │ │ │ -
242 {
│ │ │ │ -
243 public:
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
247 typedef typename Refinement::template Codim<0>::Geometry Geometry;
│ │ │ │ -
248
│ │ │ │ -
249 RefinementIteratorSpecial(int nIntervals, bool end = false);
│ │ │ │ -
250
│ │ │ │ -
251 void increment();
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
156 {
│ │ │ │ +
157 assert( (i >= 0) && (i < corners()) );
│ │ │ │ +
158 return mapping()(geometry_.corner(i));
│ │ │ │ +
159 }
│ │ │ │ +
│ │ │ │ +
160
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
163 {
│ │ │ │ +
164 return mapping()(geometry_.center());
│ │ │ │ +
165 }
│ │ │ │ +
│ │ │ │ +
166
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
177 {
│ │ │ │ +
178 return mapping()(geometry_.global(local));
│ │ │ │ +
179 }
│ │ │ │ +
│ │ │ │ +
180
│ │ │ │ +
│ │ │ │ +
197 LocalCoordinate local (const GlobalCoordinate& y, Impl::GaussNewtonOptions<ctype> opts = {}) const
│ │ │ │ +
198 {
│ │ │ │ +
199 LocalCoordinate x = refElement().position(0,0);
│ │ │ │ +
200 Impl::GaussNewtonErrorCode err = Impl::gaussNewton(
│ │ │ │ +
201 [&](const LocalCoordinate& local) { return this->global(local); },
│ │ │ │ +
202 [&](const LocalCoordinate& local) { return this->jacobianTransposed(local); },
│ │ │ │ +
203 y, x, opts
│ │ │ │ +
204 );
│ │ │ │ +
205
│ │ │ │ +
206 if (err != Impl::GaussNewtonErrorCode::OK)
│ │ │ │ +
207 DUNE_THROW(Dune::Exception,
│ │ │ │ +
208 "Local coordinate can not be recovered from global coordinate, error code = " << int(err) << "\n"
│ │ │ │ +
209 << " (global(x) - y).two_norm() = " << (global(x) - y).two_norm()
│ │ │ │ +
210 << " > tol = " << opts.absTol);
│ │ │ │ +
211
│ │ │ │ +
212 return x;
│ │ │ │ +
213 }
│ │ │ │ +
│ │ │ │ +
214
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
226 {
│ │ │ │ +
227 return MatrixHelper::sqrtDetAAT(jacobianTransposed(local));
│ │ │ │ +
228 }
│ │ │ │ +
│ │ │ │ +
229
│ │ │ │ +
│ │ │ │ +
241 Volume volume (Impl::ConvergenceOptions<ctype> opts = {}) const
│ │ │ │ +
242 {
│ │ │ │ + │ │ │ │ +
244 if (affine())
│ │ │ │ +
245 return vol0;
│ │ │ │ +
246
│ │ │ │ +
247 using std::abs;
│ │ │ │ +
248 for (int p = 2; p < opts.maxIt; ++p) {
│ │ │ │ + │ │ │ │ +
250 if (abs(vol1 - vol0) < opts.absTol)
│ │ │ │ +
251 return vol1;
│ │ │ │
252
│ │ │ │ -
253 IndexVector vertexIndices() const;
│ │ │ │ -
254 int index() const;
│ │ │ │ -
255 CoordVector coords() const;
│ │ │ │ -
256
│ │ │ │ -
257 Geometry geometry() const;
│ │ │ │ -
258
│ │ │ │ -
259 private:
│ │ │ │ -
260 CoordVector global(const CoordVector &local) const;
│ │ │ │ -
261
│ │ │ │ -
262 protected:
│ │ │ │ - │ │ │ │ -
264 typedef typename BackendRefinement::template Codim<0>::SubEntityIterator BackendIterator;
│ │ │ │ -
265 constexpr static int nKuhnSimplices = 2;
│ │ │ │ -
266
│ │ │ │ - │ │ │ │ -
268
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
272 };
│ │ │ │ -
│ │ │ │ -
273
│ │ │ │ -
274 template<int dimension, class CoordType>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
276 RefinementIteratorSpecial(int nIntervals, bool end)
│ │ │ │ -
277 : nIntervals_(nIntervals), kuhnIndex(0),
│ │ │ │ -
278 backend(BackendRefinement::eBegin(nIntervals_)),
│ │ │ │ -
279 backendEnd(BackendRefinement::eEnd(nIntervals_))
│ │ │ │ -
280 {
│ │ │ │ -
281 if (end)
│ │ │ │ -
282 kuhnIndex = nKuhnSimplices;
│ │ │ │ -
283 }
│ │ │ │ -
│ │ │ │ -
284
│ │ │ │ -
285 template<int dimension, class CoordType>
│ │ │ │ -
286 void
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
289 {
│ │ │ │ -
290 ++backend;
│ │ │ │ -
291 if (backend == backendEnd)
│ │ │ │ -
292 {
│ │ │ │ -
293 backend = BackendRefinement::eBegin(nIntervals_);
│ │ │ │ -
294 ++kuhnIndex;
│ │ │ │ -
295 }
│ │ │ │ -
296 }
│ │ │ │ -
│ │ │ │ -
297
│ │ │ │ -
298 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
301 vertexIndices() const
│ │ │ │ -
302 {
│ │ │ │ -
303 IndexVector indices = backend.vertexIndices();
│ │ │ │ -
304
│ │ │ │ -
305 int base = kuhnIndex * BackendRefinement::nVertices(nIntervals_);
│ │ │ │ -
306 indices += base;
│ │ │ │ -
307
│ │ │ │ -
308 return indices;
│ │ │ │ -
309 }
│ │ │ │ -
│ │ │ │ -
310
│ │ │ │ -
311 template<int dimension, class CoordType>
│ │ │ │ -
312 int
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
314 index() const
│ │ │ │ -
315 {
│ │ │ │ -
316 return kuhnIndex*BackendRefinement::nElements(nIntervals_) + backend.index();
│ │ │ │ -
317 }
│ │ │ │ -
│ │ │ │ -
318
│ │ │ │ -
319 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
322 coords() const
│ │ │ │ -
323 {
│ │ │ │ -
324 return global(backend.coords());
│ │ │ │ -
325 }
│ │ │ │ -
│ │ │ │ -
326
│ │ │ │ -
327 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
330 geometry() const
│ │ │ │ -
331 {
│ │ │ │ -
332 const typename BackendIterator::Geometry &
│ │ │ │ -
333 bgeo = backend.geometry();
│ │ │ │ -
334 std::vector<CoordVector> corners(dimension+1);
│ │ │ │ -
335 for(int i = 0; i <= dimension; ++i)
│ │ │ │ -
336 corners[i] = global(bgeo.corner(i));
│ │ │ │ -
337
│ │ │ │ -
338 return Geometry(bgeo.type(), corners);
│ │ │ │ -
339 }
│ │ │ │ +
253 vol0 = vol1;
│ │ │ │ +
254 }
│ │ │ │ +
255 return vol0;
│ │ │ │ +
256 }
│ │ │ │ +
│ │ │ │ +
257
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
260 {
│ │ │ │ +
261 Volume vol(0);
│ │ │ │ +
262 for (const auto& qp : quadRule)
│ │ │ │ +
263 vol += integrationElement(qp.position()) * qp.weight();
│ │ │ │ +
264 return vol;
│ │ │ │ +
265 }
│ │ │ │
│ │ │ │ +
266
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
273 {
│ │ │ │ +
274 auto&& jLocal = geometry_.jacobian(local);
│ │ │ │ +
275 auto&& jMapping = (*dMapping_)(geometry_.global(local));
│ │ │ │ +
276 return jMapping * jLocal;
│ │ │ │ +
277 }
│ │ │ │ +
│ │ │ │ +
278
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
285 {
│ │ │ │ +
286 return transpose(jacobian(local));
│ │ │ │ +
287 }
│ │ │ │ +
│ │ │ │ +
288
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
297 {
│ │ │ │ +
298 JacobianInverse out;
│ │ │ │ +
299 MatrixHelper::leftInvA(jacobian(local), out);
│ │ │ │ +
300 return out;
│ │ │ │ +
301 }
│ │ │ │ +
│ │ │ │ +
302
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
311 {
│ │ │ │ +
312 return transpose(jacobianInverse(local));
│ │ │ │ +
313 }
│ │ │ │ +
│ │ │ │ +
314
│ │ │ │ +
│ │ │ │ +
316 friend ReferenceElement referenceElement (const MappedGeometry& geometry)
│ │ │ │ +
317 {
│ │ │ │ +
318 return geometry.refElement();
│ │ │ │ +
319 }
│ │ │ │ +
│ │ │ │ +
320
│ │ │ │ +
321protected:
│ │ │ │ +
322 // the internal stored reference element
│ │ │ │ +
│ │ │ │ +
323 ReferenceElement refElement () const
│ │ │ │ +
324 {
│ │ │ │ +
325 return referenceElement(geometry_);
│ │ │ │ +
326 }
│ │ │ │ +
│ │ │ │ +
327
│ │ │ │ +
328private:
│ │ │ │ +
329 // internal reference to the stored mapping
│ │ │ │ +
330 const Mapping& mapping () const
│ │ │ │ +
331 {
│ │ │ │ +
332 return *mapping_;
│ │ │ │ +
333 }
│ │ │ │ +
334
│ │ │ │ +
335 // internal reference to the wrapped geometry
│ │ │ │ +
336 const Geometry& geometry () const
│ │ │ │ +
337 {
│ │ │ │ +
338 return geometry_;
│ │ │ │ +
339 }
│ │ │ │
340
│ │ │ │ -
341 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
343 CoordVector
│ │ │ │ - │ │ │ │ -
345 global(const CoordVector &local) const
│ │ │ │ -
346 {
│ │ │ │ -
347 return transformCoordinate(referenceToKuhn(local,
│ │ │ │ -
348 getPermutation<dimension>(kuhnIndex)));
│ │ │ │ -
349 }
│ │ │ │ +
341private:
│ │ │ │ +
343 CopyableOptional<Mapping> mapping_;
│ │ │ │ +
344
│ │ │ │ +
346 CopyableOptional<DerivativeMapping> dMapping_;
│ │ │ │ +
347
│ │ │ │ +
349 Geometry geometry_;
│ │ │ │
350
│ │ │ │ -
351 // common
│ │ │ │ -
352 template<int dimension, class CoordType>
│ │ │ │ -
353 template<int codimension>
│ │ │ │ -
│ │ │ │ -
354 class RefinementImp<dimension, CoordType>::Codim<codimension>::SubEntityIterator
│ │ │ │ -
355 : public ForwardIteratorFacade<typename RefinementImp<dimension, CoordType>::template Codim<codimension>::SubEntityIterator, int>,
│ │ │ │ -
356 public RefinementIteratorSpecial<dimension, CoordType, codimension>
│ │ │ │ -
357 {
│ │ │ │ -
358 public:
│ │ │ │ - │ │ │ │ -
360 typedef SubEntityIterator This;
│ │ │ │ -
361
│ │ │ │ -
362 SubEntityIterator(int nIntervals, bool end = false);
│ │ │ │ +
352 bool affine_;
│ │ │ │ +
353};
│ │ │ │ +
│ │ │ │ +
354
│ │ │ │ +
355// deduction guides
│ │ │ │ +
356template <class Map, class Geo>
│ │ │ │ +
357MappedGeometry (const Map&, const Geo&)
│ │ │ │ + │ │ │ │ +
359
│ │ │ │ +
360template <class Map, class Geo>
│ │ │ │ +
361MappedGeometry (const Map&, const Geo&, bool)
│ │ │ │ + │ │ │ │
363
│ │ │ │ -
364 bool equals(const This &other) const;
│ │ │ │ -
365 protected:
│ │ │ │ -
366 using RefinementIteratorSpecial<dimension, CoordType, codimension>::kuhnIndex;
│ │ │ │ -
367 using RefinementIteratorSpecial<dimension, CoordType, codimension>::backend;
│ │ │ │ -
368 };
│ │ │ │ -
│ │ │ │ -
369
│ │ │ │ -
370#ifndef DOXYGEN
│ │ │ │ -
371 template<int dimension, class CoordType>
│ │ │ │ -
372 template<int codimension>
│ │ │ │ - │ │ │ │ -
374 SubEntityIterator(int nIntervals, bool end)
│ │ │ │ -
375 : RefinementIteratorSpecial<dimension, CoordType, codimension>(nIntervals, end)
│ │ │ │ -
376 {}
│ │ │ │ -
377
│ │ │ │ -
378 template<int dimension, class CoordType>
│ │ │ │ -
379 template<int codimension>
│ │ │ │ -
380 bool
│ │ │ │ - │ │ │ │ -
382 equals(const This &other) const
│ │ │ │ -
383 {
│ │ │ │ -
384 return kuhnIndex == other.kuhnIndex && backend == other.backend;
│ │ │ │ -
385 }
│ │ │ │ -
386#endif
│ │ │ │ -
387
│ │ │ │ -
388 } // namespace PyramidTriangulation
│ │ │ │ -
│ │ │ │ -
389 } // namespace RefinementImp
│ │ │ │ -
390
│ │ │ │ -
391 namespace RefinementImp
│ │ │ │ -
392 {
│ │ │ │ -
393 // ///////////////////////
│ │ │ │ -
394 //
│ │ │ │ -
395 // The refinement traits
│ │ │ │ -
396 //
│ │ │ │ -
397#ifndef DOXYGEN
│ │ │ │ -
398 template<unsigned topologyId, class CoordType, unsigned coerceToId>
│ │ │ │ -
399 struct Traits<
│ │ │ │ -
400 topologyId, CoordType, coerceToId, 3,
│ │ │ │ -
401 typename std::enable_if<
│ │ │ │ -
402 (GeometryTypes::pyramid.id() >> 1) ==
│ │ │ │ -
403 (topologyId >> 1) &&
│ │ │ │ -
404 (GeometryTypes::simplex(3).id() >> 1) ==
│ │ │ │ -
405 (coerceToId >> 1)
│ │ │ │ -
406 >::type>
│ │ │ │ -
407 {
│ │ │ │ -
408 typedef PyramidTriangulation::RefinementImp<3, CoordType> Imp;
│ │ │ │ -
409 };
│ │ │ │ -
410#endif
│ │ │ │ -
411
│ │ │ │ -
412 } // namespace RefinementImp
│ │ │ │ -
413} // namespace Dune
│ │ │ │ -
414
│ │ │ │ -
415#endif // DUNE_GEOMETRY_REFINEMENT_PYRAMIDTRIANGULATION_CC
│ │ │ │ - │ │ │ │ -
This file contains the Refinement implementation for simplices (triangles, tetrahedrons....
│ │ │ │ -
This file contains the parts independent of a particular Refinement implementation.
│ │ │ │ -
A unique label for each type of element that can occur in a grid.
│ │ │ │ +
364} // end namespace Dune
│ │ │ │ +
365
│ │ │ │ +
366#endif // DUNE_GEOMETRY_MAPPEDGEOMETRY_HH
│ │ │ │ +
A unique label for each type of element that can occur in a grid.
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
An implementation of the Geometry interface for affine geometries.
│ │ │ │
STL namespace.
│ │ │ │
Definition affinegeometry.hh:21
│ │ │ │ -
FieldVector< CoordType, dimension > transformCoordinate(FieldVector< CoordType, dimension > point)
Definition pyramidtriangulation.cc:51
│ │ │ │ -
FieldVector< int, n > getPermutation(int m)
Calculate permutation from it's index.
Definition simplex.cc:293
│ │ │ │ -
FieldVector< CoordType, dimension > referenceToKuhn(FieldVector< CoordType, dimension > point, const FieldVector< int, dimension > &kuhn)
Map from the reference simplex to some Kuhn simplex.
Definition simplex.cc:322
│ │ │ │ -
Static tag representing a codimension.
Definition dimension.hh:24
│ │ │ │ -
generic geometry implementation based on corner coordinates
Definition multilineargeometry.hh:181
│ │ │ │ - │ │ │ │ -
Implementation of the refinement of a pyramid into simplices.
Definition pyramidtriangulation.cc:68
│ │ │ │ -
FieldVector< CoordType, dimension > CoordVector
Definition pyramidtriangulation.cc:77
│ │ │ │ -
static int nVertices(int nIntervals)
Definition pyramidtriangulation.cc:109
│ │ │ │ -
static int nElements(int nIntervals)
Definition pyramidtriangulation.cc:133
│ │ │ │ -
CoordType ctype
Definition pyramidtriangulation.cc:72
│ │ │ │ -
Codim< dimension >::SubEntityIterator VertexIterator
Definition pyramidtriangulation.cc:76
│ │ │ │ -
Codim< 0 >::SubEntityIterator ElementIterator
Definition pyramidtriangulation.cc:78
│ │ │ │ -
static constexpr int dimension
Definition pyramidtriangulation.cc:70
│ │ │ │ -
static ElementIterator eBegin(int nIntervals)
Definition pyramidtriangulation.cc:141
│ │ │ │ -
static ElementIterator eEnd(int nIntervals)
Definition pyramidtriangulation.cc:149
│ │ │ │ -
FieldVector< int, dimension+1 > IndexVector
Definition pyramidtriangulation.cc:79
│ │ │ │ -
static VertexIterator vBegin(int nIntervals)
Definition pyramidtriangulation.cc:117
│ │ │ │ -
static VertexIterator vEnd(int nIntervals)
Definition pyramidtriangulation.cc:125
│ │ │ │ - │ │ │ │ -
Dune::MultiLinearGeometry< CoordType, dimension-codimension, dimension > Geometry
Definition pyramidtriangulation.cc:103
│ │ │ │ -
RefinementImp< dimension, CoordType > Refinement
Definition pyramidtriangulation.cc:164
│ │ │ │ -
Refinement::template Codim< dimension >::Geometry Geometry
Definition pyramidtriangulation.cc:166
│ │ │ │ -
Refinement::BackendRefinement BackendRefinement
Definition pyramidtriangulation.cc:178
│ │ │ │ - │ │ │ │ -
BackendRefinement::template Codim< dimension >::SubEntityIterator BackendIterator
Definition pyramidtriangulation.cc:179
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
Refinement::CoordVector CoordVector
Definition pyramidtriangulation.cc:246
│ │ │ │ - │ │ │ │ -
Refinement::template Codim< 0 >::Geometry Geometry
Definition pyramidtriangulation.cc:247
│ │ │ │ -
Refinement::IndexVector IndexVector
Definition pyramidtriangulation.cc:245
│ │ │ │ -
BackendRefinement::template Codim< 0 >::SubEntityIterator BackendIterator
Definition pyramidtriangulation.cc:264
│ │ │ │ - │ │ │ │ - │ │ │ │ -
RefinementImp< dimension, CoordType > Refinement
Definition pyramidtriangulation.cc:244
│ │ │ │ -
Refinement::BackendRefinement BackendRefinement
Definition pyramidtriangulation.cc:263
│ │ │ │ - │ │ │ │ -
SubEntityIterator This
Definition pyramidtriangulation.cc:360
│ │ │ │ - │ │ │ │ -
RefinementImp< dimension, CoordType > Refinement
Definition pyramidtriangulation.cc:359
│ │ │ │ - │ │ │ │ +
Class providing access to the singletons of the reference elements.
Definition referenceelements.hh:128
│ │ │ │ +
typename Container::ReferenceElement ReferenceElement
The reference element type.
Definition referenceelements.hh:146
│ │ │ │ +
Geometry parametrized by a LocalFunction and a LocalGeometry.
Definition mappedgeometry.hh:65
│ │ │ │ +
std::remove_reference_t< decltype(std::declval< Map >()(std::declval< typename Geo::GlobalCoordinate >()))> GlobalCoordinate
type of global coordinates
Definition mappedgeometry.hh:71
│ │ │ │ +
GlobalCoordinate center() const
Map the center of the wrapped geometry.
Definition mappedgeometry.hh:162
│ │ │ │ +
JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate &local) const
Obtain the transposed of the Jacobian's inverse.
Definition mappedgeometry.hh:310
│ │ │ │ +
JacobianInverse jacobianInverse(const LocalCoordinate &local) const
Obtain the Jacobian's inverse.
Definition mappedgeometry.hh:296
│ │ │ │ +
JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const
Obtain the transposed of the Jacobian.
Definition mappedgeometry.hh:284
│ │ │ │ +
MappedGeometry(Map_ &&mapping, Geo_ &&geometry, bool affine=false)
Constructor from mapping to parametrize the geometry.
Definition mappedgeometry.hh:125
│ │ │ │ +
FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed
type of jacobian transposed
Definition mappedgeometry.hh:89
│ │ │ │ +
static constexpr int mydimension
geometry dimension
Definition mappedgeometry.hh:77
│ │ │ │ +
GeometryType type() const
Obtain the geometry type from the reference element.
Definition mappedgeometry.hh:143
│ │ │ │ +
typename Geo::LocalCoordinate LocalCoordinate
type of local coordinates
Definition mappedgeometry.hh:68
│ │ │ │ +
typename Geo::ctype ctype
coordinate type
Definition mappedgeometry.hh:74
│ │ │ │ +
LocalCoordinate local(const GlobalCoordinate &y, Impl::GaussNewtonOptions< ctype > opts={}) const
Evaluate the inverse coordinate mapping.
Definition mappedgeometry.hh:197
│ │ │ │ +
Geo Geometry
Definition mappedgeometry.hh:108
│ │ │ │ +
GlobalCoordinate corner(int i) const
Obtain coordinates of the i-th corner.
Definition mappedgeometry.hh:155
│ │ │ │ +
static constexpr int coorddimension
coordinate dimension
Definition mappedgeometry.hh:80
│ │ │ │ +
FieldMatrix< ctype, coorddimension, mydimension > JacobianInverseTransposed
type of jacobian inverse transposed
Definition mappedgeometry.hh:95
│ │ │ │ +
Map Mapping
Definition mappedgeometry.hh:105
│ │ │ │ +
GlobalCoordinate global(const LocalCoordinate &local) const
Evaluate the coordinate mapping.
Definition mappedgeometry.hh:176
│ │ │ │ +
ReferenceElement refElement() const
Definition mappedgeometry.hh:323
│ │ │ │ +
Volume volume(const QuadratureRule< ctype, mydimension > &quadRule) const
Obtain the volume of the mapping's image by given quadrature rules.
Definition mappedgeometry.hh:259
│ │ │ │ +
int corners() const
Obtain number of corners of the corresponding reference element.
Definition mappedgeometry.hh:149
│ │ │ │ +
FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse
type of jacobian inverse
Definition mappedgeometry.hh:92
│ │ │ │ +
friend ReferenceElement referenceElement(const MappedGeometry &geometry)
Obtain the reference-element related to this geometry.
Definition mappedgeometry.hh:316
│ │ │ │ +
Volume volume(Impl::ConvergenceOptions< ctype > opts={}) const
Obtain the volume of the mapping's image.
Definition mappedgeometry.hh:241
│ │ │ │ +
std::remove_reference_t< decltype(Dune::power(std::declval< ctype >(), mydimension))> Volume
type of volume
Definition mappedgeometry.hh:83
│ │ │ │ +
bool affine() const
Is this mapping affine? Not in general, since we don't know anything about the mapping....
Definition mappedgeometry.hh:137
│ │ │ │ +
std::remove_reference_t< decltype(derivative(std::declval< Map >()))> DerivativeMapping
Definition mappedgeometry.hh:111
│ │ │ │ +
Jacobian jacobian(const LocalCoordinate &local) const
Obtain the Jacobian.
Definition mappedgeometry.hh:272
│ │ │ │ +
Impl::FieldMatrixHelper< ctype > MatrixHelper
Definition mappedgeometry.hh:102
│ │ │ │ +
FieldMatrix< ctype, coorddimension, mydimension > Jacobian
type of jacobian
Definition mappedgeometry.hh:86
│ │ │ │ +
ctype integrationElement(const LocalCoordinate &local) const
Obtain the integration element.
Definition mappedgeometry.hh:225
│ │ │ │ +
Abstract base class for quadrature rules.
Definition quadraturerules.hh:214
│ │ │ │ +
A container for all quadrature rules of dimension dim
Definition quadraturerules.hh:260
│ │ │ │ +
Unique label for each type of entities that can occur in DUNE grids.
Definition type.hh:114
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,606 +1,405 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ - * _r_e_f_i_n_e_m_e_n_t │ │ │ │ │ -pyramidtriangulation.cc │ │ │ │ │ +mappedgeometry.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 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 © 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_PYRAMIDTRIANGULATION_CC │ │ │ │ │ -_6#define DUNE_GEOMETRY_REFINEMENT_PYRAMIDTRIANGULATION_CC │ │ │ │ │ +5#ifndef DUNE_GEOMETRY_MAPPEDGEOMETRY_HH │ │ │ │ │ +6#define DUNE_GEOMETRY_MAPPEDGEOMETRY_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10 │ │ │ │ │ -11#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ -12#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ 13 │ │ │ │ │ -14#include "_b_a_s_e_._c_c" │ │ │ │ │ -15#include "_s_i_m_p_l_e_x_._c_c" │ │ │ │ │ -16 │ │ │ │ │ -17namespace _D_u_n_e │ │ │ │ │ -18{ │ │ │ │ │ -19 namespace RefinementImp │ │ │ │ │ -20 { │ │ │ │ │ -_2_6 namespace PyramidTriangulation │ │ │ │ │ -27 { │ │ │ │ │ -28 // //////////// │ │ │ │ │ -29 // │ │ │ │ │ -30 // Utilities │ │ │ │ │ -31 // │ │ │ │ │ -32 │ │ │ │ │ -33 using _S_i_m_p_l_e_x_:_:_g_e_t_P_e_r_m_u_t_a_t_i_o_n; │ │ │ │ │ -34 using _S_i_m_p_l_e_x_:_:_r_e_f_e_r_e_n_c_e_T_o_K_u_h_n; │ │ │ │ │ -35 │ │ │ │ │ -36 // //////////////////////////////////// │ │ │ │ │ -37 // │ │ │ │ │ -38 // Refine a pyramid with simplices │ │ │ │ │ -39 // │ │ │ │ │ -40 │ │ │ │ │ -41 // forward declaration of the iterator base │ │ │ │ │ -42 template │ │ │ │ │ -_4_3 class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l; │ │ │ │ │ -44 │ │ │ │ │ -45 /* │ │ │ │ │ -46 * The permutations 0 and 1 of the Kuhn-decomposition of a cube into │ │ │ │ │ -simplices form a pyramid. │ │ │ │ │ -47 * The resulting pyramid is not oriented the same as the reference pyramid │ │ │ │ │ -and so the Kuhn-coordinates │ │ │ │ │ -48 * have to be transformed using the method below. │ │ │ │ │ -49 */ │ │ │ │ │ -50 template FieldVector │ │ │ │ │ -_5_1 _t_r_a_n_s_f_o_r_m_C_o_o_r_d_i_n_a_t_e( FieldVector point) │ │ │ │ │ -52 { │ │ │ │ │ -53 FieldVector transform; │ │ │ │ │ -54 transform[0]=1-point[0]; │ │ │ │ │ -55 transform[1]=1-point[1]; │ │ │ │ │ -56 transform[2]=point[2]; │ │ │ │ │ -57 return transform; │ │ │ │ │ -58 } │ │ │ │ │ -59 │ │ │ │ │ -66 template │ │ │ │ │ -_6_7 class _R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ -68 { │ │ │ │ │ -69 public: │ │ │ │ │ -_7_0 constexpr static int _d_i_m_e_n_s_i_o_n = dimension_; │ │ │ │ │ -71 │ │ │ │ │ -_7_2 typedef CoordType _c_t_y_p_e; │ │ │ │ │ -73 │ │ │ │ │ -74 template │ │ │ │ │ -75 struct _C_o_d_i_m; │ │ │ │ │ -_7_6 typedef typename _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _V_e_r_t_e_x_I_t_e_r_a_t_o_r; │ │ │ │ │ -_7_7 typedef FieldVector _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ -_7_8 typedef typename _C_o_d_i_m_<_0_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r; │ │ │ │ │ -_7_9 typedef FieldVector _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ -80 │ │ │ │ │ -81 static int _n_V_e_r_t_i_c_e_s(int nIntervals); │ │ │ │ │ -82 static _V_e_r_t_e_x_I_t_e_r_a_t_o_r _v_B_e_g_i_n(int nIntervals); │ │ │ │ │ -83 static _V_e_r_t_e_x_I_t_e_r_a_t_o_r _v_E_n_d(int nIntervals); │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ +17#include │ │ │ │ │ +18#include │ │ │ │ │ +19#include │ │ │ │ │ +20#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_a_f_f_i_n_e_g_e_o_m_e_t_r_y_._h_h> // for FieldMatrixHelper │ │ │ │ │ +21#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_q_u_a_d_r_a_t_u_r_e_r_u_l_e_s_._h_h> │ │ │ │ │ +22#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ +23#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ +24#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_u_t_i_l_i_t_y_/_a_l_g_o_r_i_t_h_m_s_._h_h> │ │ │ │ │ +25#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_u_t_i_l_i_t_y_/_c_o_n_v_e_r_g_e_n_c_e_._h_h> │ │ │ │ │ +26 │ │ │ │ │ +27namespace _D_u_n_e { │ │ │ │ │ +28 │ │ │ │ │ +63template │ │ │ │ │ +_6_4class _M_a_p_p_e_d_G_e_o_m_e_t_r_y │ │ │ │ │ +65{ │ │ │ │ │ +66public: │ │ │ │ │ +_6_8 using _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e = typename Geo::LocalCoordinate; │ │ │ │ │ +69 │ │ │ │ │ +_7_1 using _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e = std::remove_reference_t │ │ │ │ │ +()(std::declval()))>; │ │ │ │ │ +72 │ │ │ │ │ +_7_4 using _c_t_y_p_e = typename Geo::ctype; │ │ │ │ │ +75 │ │ │ │ │ +_7_7 static constexpr int _m_y_d_i_m_e_n_s_i_o_n = LocalCoordinate::size(); │ │ │ │ │ +78 │ │ │ │ │ +_8_0 static constexpr int _c_o_o_r_d_d_i_m_e_n_s_i_o_n = GlobalCoordinate::size(); │ │ │ │ │ +81 │ │ │ │ │ +_8_3 using _V_o_l_u_m_e = std::remove_reference_t(),_m_y_d_i_m_e_n_s_i_o_n))>; │ │ │ │ │ 84 │ │ │ │ │ -85 static int _n_E_l_e_m_e_n_t_s(int nIntervals); │ │ │ │ │ -86 static _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r _e_B_e_g_i_n(int nIntervals); │ │ │ │ │ -_8_7 static _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r _e_E_n_d(int nIntervals); │ │ │ │ │ -88 │ │ │ │ │ -89 private: │ │ │ │ │ -90 friend class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l<_d_i_m_e_n_s_i_o_n, CoordType, 0>; │ │ │ │ │ -91 friend class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l<_d_i_m_e_n_s_i_o_n, CoordType, _d_i_m_e_n_s_i_o_n>; │ │ │ │ │ -92 │ │ │ │ │ -93 typedef _S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -94 │ │ │ │ │ -95 constexpr static int nKuhnSimplices = 2; │ │ │ │ │ -96 }; │ │ │ │ │ -97 │ │ │ │ │ -98 template │ │ │ │ │ -99 template │ │ │ │ │ -_1_0_0 struct _R_e_f_i_n_e_m_e_n_t_I_m_p::_C_o_d_i_m │ │ │ │ │ -101 { │ │ │ │ │ -102 class SubEntityIterator; │ │ │ │ │ -_1_0_3 typedef _D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y _G_e_o_m_e_t_r_y; │ │ │ │ │ -104 }; │ │ │ │ │ -105 │ │ │ │ │ -106 template │ │ │ │ │ -107 int │ │ │ │ │ -_1_0_8 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -109_ _n_V_e_r_t_i_c_e_s(int nIntervals) │ │ │ │ │ -110 { │ │ │ │ │ -111 return BackendRefinement::nVertices(nIntervals) * nKuhnSimplices; │ │ │ │ │ -112 } │ │ │ │ │ -113 │ │ │ │ │ -114 template │ │ │ │ │ -115 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ -_1_1_6 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -117_ _v_B_e_g_i_n(int nIntervals) │ │ │ │ │ -118 { │ │ │ │ │ -119 return _V_e_r_t_e_x_I_t_e_r_a_t_o_r(nIntervals); │ │ │ │ │ -120 } │ │ │ │ │ -121 │ │ │ │ │ -122 template │ │ │ │ │ -123 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ -_1_2_4 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -125_ _v_E_n_d(int nIntervals) │ │ │ │ │ -126 { │ │ │ │ │ -127 return _V_e_r_t_e_x_I_t_e_r_a_t_o_r(nIntervals, true); │ │ │ │ │ -128 } │ │ │ │ │ -129 │ │ │ │ │ -130 template │ │ │ │ │ -131 int │ │ │ │ │ -_1_3_2 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -133_ _n_E_l_e_m_e_n_t_s(int nIntervals) │ │ │ │ │ -134 { │ │ │ │ │ -135 return BackendRefinement::nElements(nIntervals) * nKuhnSimplices; │ │ │ │ │ -136 } │ │ │ │ │ -137 │ │ │ │ │ -138 template │ │ │ │ │ -139 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ -_1_4_0 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -141_ _e_B_e_g_i_n(int nIntervals) │ │ │ │ │ -142 { │ │ │ │ │ -143 return _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r(nIntervals); │ │ │ │ │ -144 } │ │ │ │ │ -145 │ │ │ │ │ -146 template │ │ │ │ │ -147 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ -_1_4_8 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -149_ _e_E_n_d(int nIntervals) │ │ │ │ │ +_8_6 using _J_a_c_o_b_i_a_n = FieldMatrix; │ │ │ │ │ +87 │ │ │ │ │ +_8_9 using _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d = FieldMatrix; │ │ │ │ │ +90 │ │ │ │ │ +_9_2 using _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e = FieldMatrix; │ │ │ │ │ +93 │ │ │ │ │ +_9_5 using _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d = FieldMatrix; │ │ │ │ │ +96 │ │ │ │ │ +97private: │ │ │ │ │ +98 using _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s = _D_u_n_e_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_<_c_t_y_p_e_,_ _m_y_d_i_m_e_n_s_i_o_n_>; │ │ │ │ │ +99 using ReferenceElement = typename _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t; │ │ │ │ │ +100 │ │ │ │ │ +101protected: │ │ │ │ │ +_1_0_2 using _M_a_t_r_i_x_H_e_l_p_e_r = Impl::FieldMatrixHelper; │ │ │ │ │ +103 │ │ │ │ │ +104 // type of the mapping representation the geometry parametrization │ │ │ │ │ +_1_0_5 using _M_a_p_p_i_n_g = Map; │ │ │ │ │ +106 │ │ │ │ │ +107 // type of the geometry that is wrapped │ │ │ │ │ +_1_0_8 using _G_e_o_m_e_t_r_y = Geo; │ │ │ │ │ +109 │ │ │ │ │ +110 // type of a mapping representing the derivative of `Map` w.r.t. │ │ │ │ │ +`GlobalCoordinate` │ │ │ │ │ +_1_1_1 using _D_e_r_i_v_a_t_i_v_e_M_a_p_p_i_n_g = std::remove_reference_t()))>; │ │ │ │ │ +112 │ │ │ │ │ +113public: │ │ │ │ │ +122 template ::value, int> = 0, │ │ │ │ │ +124 std::enable_if_t::value, int> = 0> │ │ │ │ │ +_1_2_5 _M_a_p_p_e_d_G_e_o_m_e_t_r_y (Map_&& mapping, Geo_&& geometry, bool _a_f_f_i_n_e = false) │ │ │ │ │ +126 : mapping_(_s_t_d::forward(mapping)) │ │ │ │ │ +127 , dMapping_(derivative(*mapping_)) │ │ │ │ │ +128 , geometry_(_s_t_d::forward(geometry)) │ │ │ │ │ +129 , affine_(_a_f_f_i_n_e) │ │ │ │ │ +130 {} │ │ │ │ │ +131 │ │ │ │ │ +_1_3_7 bool _a_f_f_i_n_e () const │ │ │ │ │ +138 { │ │ │ │ │ +139 return affine_; │ │ │ │ │ +140 } │ │ │ │ │ +141 │ │ │ │ │ +_1_4_3 _G_e_o_m_e_t_r_y_T_y_p_e _t_y_p_e () const │ │ │ │ │ +144 { │ │ │ │ │ +145 return geometry_.type(); │ │ │ │ │ +146 } │ │ │ │ │ +147 │ │ │ │ │ +_1_4_9 int _c_o_r_n_e_r_s () const │ │ │ │ │ 150 { │ │ │ │ │ -151 return _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r(nIntervals, true); │ │ │ │ │ +151 return geometry_.corners(); │ │ │ │ │ 152 } │ │ │ │ │ 153 │ │ │ │ │ -154 // ////////////// │ │ │ │ │ -155 // │ │ │ │ │ -156 // The iterator │ │ │ │ │ -157 // │ │ │ │ │ -158 │ │ │ │ │ -159 // vertices │ │ │ │ │ -160 template │ │ │ │ │ -_1_6_1 class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ -162 { │ │ │ │ │ -163 public: │ │ │ │ │ -_1_6_4 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -_1_6_5 typedef typename Refinement::CoordVector _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ -_1_6_6 typedef typename Refinement::template _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_:_G_e_o_m_e_t_r_y _G_e_o_m_e_t_r_y; │ │ │ │ │ -167 │ │ │ │ │ -168 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end = false); │ │ │ │ │ -169 │ │ │ │ │ -170 void increment(); │ │ │ │ │ -171 │ │ │ │ │ -172 _C_o_o_r_d_V_e_c_t_o_r coords() const; │ │ │ │ │ -173 │ │ │ │ │ -174 _G_e_o_m_e_t_r_y geometry() const; │ │ │ │ │ -175 │ │ │ │ │ -176 int index() const; │ │ │ │ │ -177 protected: │ │ │ │ │ -_1_7_8 typedef typename Refinement::BackendRefinement _B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -_1_7_9 typedef typename BackendRefinement::template _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r; │ │ │ │ │ -_1_8_0 constexpr static int nKuhnSimplices = 2; │ │ │ │ │ -181 │ │ │ │ │ -_1_8_2 int _n_I_n_t_e_r_v_a_l_s__; │ │ │ │ │ -183 │ │ │ │ │ -_1_8_4 int _k_u_h_n_I_n_d_e_x; │ │ │ │ │ -_1_8_5 _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r _b_a_c_k_e_n_d; │ │ │ │ │ -_1_8_6 const _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r _b_a_c_k_e_n_d_E_n_d; │ │ │ │ │ -187 }; │ │ │ │ │ -188 │ │ │ │ │ -189 template │ │ │ │ │ -_1_9_0 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -191_ _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end) │ │ │ │ │ -192 : nIntervals_(nIntervals), kuhnIndex(0), │ │ │ │ │ -193 backend(_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t::vBegin(nIntervals_)), │ │ │ │ │ -194 backendEnd(_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t::vEnd(nIntervals_)) │ │ │ │ │ -195 { │ │ │ │ │ -196 if (end) │ │ │ │ │ -197 kuhnIndex = nKuhnSimplices; │ │ │ │ │ -198 } │ │ │ │ │ -199 │ │ │ │ │ -200 template │ │ │ │ │ -201 void │ │ │ │ │ -_2_0_2 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -203_ _i_n_c_r_e_m_e_n_t() │ │ │ │ │ -204 { │ │ │ │ │ -205 ++backend; │ │ │ │ │ -206 if(backend == backendEnd) │ │ │ │ │ -207 { │ │ │ │ │ -208 backend = BackendRefinement::vBegin(nIntervals_); │ │ │ │ │ -209 ++kuhnIndex; │ │ │ │ │ -210 } │ │ │ │ │ -211 } │ │ │ │ │ -212 │ │ │ │ │ -213 template │ │ │ │ │ -214 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -_2_1_5 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -216_ _c_o_o_r_d_s() const │ │ │ │ │ -217 { │ │ │ │ │ -218 return _t_r_a_n_s_f_o_r_m_C_o_o_r_d_i_n_a_t_e(referenceToKuhn(backend.coords(), │ │ │ │ │ -219 getPermutation(kuhnIndex))); │ │ │ │ │ -220 } │ │ │ │ │ -221 │ │ │ │ │ -222 template │ │ │ │ │ -223 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_G_e_o_m_e_t_r_y │ │ │ │ │ -_2_2_4 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_:_g_e_o_m_e_t_r_y () │ │ │ │ │ -const │ │ │ │ │ -225 { │ │ │ │ │ -226 std::vector corners(1); │ │ │ │ │ -227 corners[0] = referenceToKuhn(backend.coords(), getPermutation │ │ │ │ │ -(kuhnIndex)); │ │ │ │ │ -228 return _G_e_o_m_e_t_r_y(GeometryTypes::vertex, corners); │ │ │ │ │ -229 } │ │ │ │ │ -230 │ │ │ │ │ -231 template │ │ │ │ │ -232 int │ │ │ │ │ -_2_3_3 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -234_ _i_n_d_e_x() const │ │ │ │ │ -235 { │ │ │ │ │ -236 return kuhnIndex*BackendRefinement::nVertices(nIntervals_) + backend.index │ │ │ │ │ -(); │ │ │ │ │ -237 } │ │ │ │ │ -238 │ │ │ │ │ -239 // elements │ │ │ │ │ -240 template │ │ │ │ │ -_2_4_1 class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ +_1_5_5 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _c_o_r_n_e_r (int i) const │ │ │ │ │ +156 { │ │ │ │ │ +157 assert( (i >= 0) && (i < _c_o_r_n_e_r_s()) ); │ │ │ │ │ +158 return mapping()(geometry_.corner(i)); │ │ │ │ │ +159 } │ │ │ │ │ +160 │ │ │ │ │ +_1_6_2 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _c_e_n_t_e_r () const │ │ │ │ │ +163 { │ │ │ │ │ +164 return mapping()(geometry_.center()); │ │ │ │ │ +165 } │ │ │ │ │ +166 │ │ │ │ │ +_1_7_6 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _g_l_o_b_a_l (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) const │ │ │ │ │ +177 { │ │ │ │ │ +178 return mapping()(geometry_.global(_l_o_c_a_l)); │ │ │ │ │ +179 } │ │ │ │ │ +180 │ │ │ │ │ +_1_9_7 _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e _l_o_c_a_l (const _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e& y, Impl:: │ │ │ │ │ +GaussNewtonOptions opts = {}) const │ │ │ │ │ +198 { │ │ │ │ │ +199 _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e x = _r_e_f_E_l_e_m_e_n_t().position(0,0); │ │ │ │ │ +200 Impl::GaussNewtonErrorCode err = Impl::gaussNewton( │ │ │ │ │ +201 [&](const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) { return this->_g_l_o_b_a_l(local); }, │ │ │ │ │ +202 [&](const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) { return this->_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d(local); │ │ │ │ │ +}, │ │ │ │ │ +203 y, x, opts │ │ │ │ │ +204 ); │ │ │ │ │ +205 │ │ │ │ │ +206 if (err != Impl::GaussNewtonErrorCode::OK) │ │ │ │ │ +207 DUNE_THROW(Dune::Exception, │ │ │ │ │ +208 "Local coordinate can not be recovered from global coordinate, error code = │ │ │ │ │ +" << int(err) << "\n" │ │ │ │ │ +209 << " (global(x) - y).two_norm() = " << (_g_l_o_b_a_l(x) - y).two_norm() │ │ │ │ │ +210 << " > tol = " << opts.absTol); │ │ │ │ │ +211 │ │ │ │ │ +212 return x; │ │ │ │ │ +213 } │ │ │ │ │ +214 │ │ │ │ │ +_2_2_5 _c_t_y_p_e _i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) const │ │ │ │ │ +226 { │ │ │ │ │ +227 return MatrixHelper::sqrtDetAAT(_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d(_l_o_c_a_l)); │ │ │ │ │ +228 } │ │ │ │ │ +229 │ │ │ │ │ +_2_4_1 _V_o_l_u_m_e _v_o_l_u_m_e (Impl::ConvergenceOptions opts = {}) const │ │ │ │ │ 242 { │ │ │ │ │ -243 public: │ │ │ │ │ -_2_4_4 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -_2_4_5 typedef typename _R_e_f_i_n_e_m_e_n_t_:_:_I_n_d_e_x_V_e_c_t_o_r _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ -_2_4_6 typedef typename _R_e_f_i_n_e_m_e_n_t_:_:_C_o_o_r_d_V_e_c_t_o_r _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ -_2_4_7 typedef typename Refinement::template _C_o_d_i_m_<_0_>_:_:_G_e_o_m_e_t_r_y _G_e_o_m_e_t_r_y; │ │ │ │ │ -248 │ │ │ │ │ -249 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end = false); │ │ │ │ │ -250 │ │ │ │ │ -251 void increment(); │ │ │ │ │ +243 _V_o_l_u_m_e vol0 = _v_o_l_u_m_e(_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s_<_c_t_y_p_e_,_ _m_y_d_i_m_e_n_s_i_o_n_>_:_:_r_u_l_e(_t_y_p_e(), 1)); │ │ │ │ │ +244 if (_a_f_f_i_n_e()) │ │ │ │ │ +245 return vol0; │ │ │ │ │ +246 │ │ │ │ │ +247 using std::abs; │ │ │ │ │ +248 for (int p = 2; p < opts.maxIt; ++p) { │ │ │ │ │ +249 _V_o_l_u_m_e vol1 = _v_o_l_u_m_e(_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s_<_c_t_y_p_e_,_ _m_y_d_i_m_e_n_s_i_o_n_>_:_:_r_u_l_e(_t_y_p_e(), p)); │ │ │ │ │ +250 if (abs(vol1 - vol0) < opts.absTol) │ │ │ │ │ +251 return vol1; │ │ │ │ │ 252 │ │ │ │ │ -253 _I_n_d_e_x_V_e_c_t_o_r vertexIndices() const; │ │ │ │ │ -254 int index() const; │ │ │ │ │ -255 _C_o_o_r_d_V_e_c_t_o_r coords() const; │ │ │ │ │ -256 │ │ │ │ │ -257 _G_e_o_m_e_t_r_y geometry() const; │ │ │ │ │ -258 │ │ │ │ │ -259 private: │ │ │ │ │ -260 _C_o_o_r_d_V_e_c_t_o_r global(const _C_o_o_r_d_V_e_c_t_o_r &local) const; │ │ │ │ │ -261 │ │ │ │ │ -262 protected: │ │ │ │ │ -_2_6_3 typedef typename _R_e_f_i_n_e_m_e_n_t_:_:_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t _B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -_2_6_4 typedef typename BackendRefinement::template _C_o_d_i_m_<_0_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ -_B_a_c_k_e_n_d_I_t_e_r_a_t_o_r; │ │ │ │ │ -_2_6_5 constexpr static int nKuhnSimplices = 2; │ │ │ │ │ +253 vol0 = vol1; │ │ │ │ │ +254 } │ │ │ │ │ +255 return vol0; │ │ │ │ │ +256 } │ │ │ │ │ +257 │ │ │ │ │ +_2_5_9 _V_o_l_u_m_e _v_o_l_u_m_e (const _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_<_c_t_y_p_e_,_ _m_y_d_i_m_e_n_s_i_o_n_>& quadRule) const │ │ │ │ │ +260 { │ │ │ │ │ +261 _V_o_l_u_m_e vol(0); │ │ │ │ │ +262 for (const auto& qp : quadRule) │ │ │ │ │ +263 vol += _i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t(qp.position()) * qp.weight(); │ │ │ │ │ +264 return vol; │ │ │ │ │ +265 } │ │ │ │ │ 266 │ │ │ │ │ -_2_6_7 int _n_I_n_t_e_r_v_a_l_s__; │ │ │ │ │ -268 │ │ │ │ │ -_2_6_9 int _k_u_h_n_I_n_d_e_x; │ │ │ │ │ -_2_7_0 _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r _b_a_c_k_e_n_d; │ │ │ │ │ -_2_7_1 const _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r _b_a_c_k_e_n_d_E_n_d; │ │ │ │ │ -272 }; │ │ │ │ │ -273 │ │ │ │ │ -274 template │ │ │ │ │ -_2_7_5 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -276_ _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end) │ │ │ │ │ -277 : nIntervals_(nIntervals), kuhnIndex(0), │ │ │ │ │ -278 backend(_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t::eBegin(nIntervals_)), │ │ │ │ │ -279 backendEnd(_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t::eEnd(nIntervals_)) │ │ │ │ │ -280 { │ │ │ │ │ -281 if (end) │ │ │ │ │ -282 kuhnIndex = nKuhnSimplices; │ │ │ │ │ -283 } │ │ │ │ │ -284 │ │ │ │ │ -285 template │ │ │ │ │ -286 void │ │ │ │ │ -_2_8_7 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -288_ _i_n_c_r_e_m_e_n_t() │ │ │ │ │ -289 { │ │ │ │ │ -290 ++backend; │ │ │ │ │ -291 if (backend == backendEnd) │ │ │ │ │ -292 { │ │ │ │ │ -293 backend = BackendRefinement::eBegin(nIntervals_); │ │ │ │ │ -294 ++kuhnIndex; │ │ │ │ │ -295 } │ │ │ │ │ -296 } │ │ │ │ │ -297 │ │ │ │ │ -298 template │ │ │ │ │ -299 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ -_3_0_0 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -301_ _v_e_r_t_e_x_I_n_d_i_c_e_s() const │ │ │ │ │ -302 { │ │ │ │ │ -303 _I_n_d_e_x_V_e_c_t_o_r indices = backend.vertexIndices(); │ │ │ │ │ -304 │ │ │ │ │ -305 int base = kuhnIndex * BackendRefinement::nVertices(nIntervals_); │ │ │ │ │ -306 indices += base; │ │ │ │ │ -307 │ │ │ │ │ -308 return indices; │ │ │ │ │ -309 } │ │ │ │ │ -310 │ │ │ │ │ -311 template │ │ │ │ │ -312 int │ │ │ │ │ -_3_1_3 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -314_ _i_n_d_e_x() const │ │ │ │ │ -315 { │ │ │ │ │ -316 return kuhnIndex*BackendRefinement::nElements(nIntervals_) + backend.index │ │ │ │ │ -(); │ │ │ │ │ -317 } │ │ │ │ │ -318 │ │ │ │ │ -319 template │ │ │ │ │ -320 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -_3_2_1 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -322_ _c_o_o_r_d_s() const │ │ │ │ │ -323 { │ │ │ │ │ -324 return global(backend.coords()); │ │ │ │ │ -325 } │ │ │ │ │ -326 │ │ │ │ │ -327 template │ │ │ │ │ -328 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ -_3_2_9 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -330_ _g_e_o_m_e_t_r_y() const │ │ │ │ │ +_2_7_2 _J_a_c_o_b_i_a_n _j_a_c_o_b_i_a_n (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) const │ │ │ │ │ +273 { │ │ │ │ │ +274 auto&& jLocal = geometry_.jacobian(_l_o_c_a_l); │ │ │ │ │ +275 auto&& jMapping = (*dMapping_)(geometry_.global(_l_o_c_a_l)); │ │ │ │ │ +276 return jMapping * jLocal; │ │ │ │ │ +277 } │ │ │ │ │ +278 │ │ │ │ │ +_2_8_4 _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d _j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) const │ │ │ │ │ +285 { │ │ │ │ │ +286 return transpose(_j_a_c_o_b_i_a_n(_l_o_c_a_l)); │ │ │ │ │ +287 } │ │ │ │ │ +288 │ │ │ │ │ +_2_9_6 _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e _j_a_c_o_b_i_a_n_I_n_v_e_r_s_e (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) const │ │ │ │ │ +297 { │ │ │ │ │ +298 _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e out; │ │ │ │ │ +299 MatrixHelper::leftInvA(_j_a_c_o_b_i_a_n(_l_o_c_a_l), out); │ │ │ │ │ +300 return out; │ │ │ │ │ +301 } │ │ │ │ │ +302 │ │ │ │ │ +_3_1_0 _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d _j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& │ │ │ │ │ +_l_o_c_a_l) const │ │ │ │ │ +311 { │ │ │ │ │ +312 return transpose(_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e(_l_o_c_a_l)); │ │ │ │ │ +313 } │ │ │ │ │ +314 │ │ │ │ │ +_3_1_6 friend ReferenceElement _r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t (const _M_a_p_p_e_d_G_e_o_m_e_t_r_y& geometry) │ │ │ │ │ +317 { │ │ │ │ │ +318 return geometry._r_e_f_E_l_e_m_e_n_t(); │ │ │ │ │ +319 } │ │ │ │ │ +320 │ │ │ │ │ +321protected: │ │ │ │ │ +322 // the internal stored reference element │ │ │ │ │ +_3_2_3 ReferenceElement _r_e_f_E_l_e_m_e_n_t () const │ │ │ │ │ +324 { │ │ │ │ │ +325 return _r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t(geometry_); │ │ │ │ │ +326 } │ │ │ │ │ +327 │ │ │ │ │ +328private: │ │ │ │ │ +329 // internal reference to the stored mapping │ │ │ │ │ +330 const _M_a_p_p_i_n_g& mapping () const │ │ │ │ │ 331 { │ │ │ │ │ -332 const typename BackendIterator::Geometry & │ │ │ │ │ -333 bgeo = backend.geometry(); │ │ │ │ │ -334 std::vector corners(dimension+1); │ │ │ │ │ -335 for(int i = 0; i <= dimension; ++i) │ │ │ │ │ -336 corners[i] = global(bgeo.corner(i)); │ │ │ │ │ -337 │ │ │ │ │ -338 return _G_e_o_m_e_t_r_y(bgeo.type(), corners); │ │ │ │ │ +332 return *mapping_; │ │ │ │ │ +333 } │ │ │ │ │ +334 │ │ │ │ │ +335 // internal reference to the wrapped geometry │ │ │ │ │ +336 const _G_e_o_m_e_t_r_y& geometry () const │ │ │ │ │ +337 { │ │ │ │ │ +338 return geometry_; │ │ │ │ │ 339 } │ │ │ │ │ 340 │ │ │ │ │ -341 template │ │ │ │ │ -342 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>:: │ │ │ │ │ -343 CoordVector │ │ │ │ │ -344 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -345_ _g_l_o_b_a_l(const CoordVector &local) const │ │ │ │ │ -346 { │ │ │ │ │ -347 return _t_r_a_n_s_f_o_r_m_C_o_o_r_d_i_n_a_t_e(referenceToKuhn(local, │ │ │ │ │ -348 getPermutation(kuhnIndex))); │ │ │ │ │ -349 } │ │ │ │ │ +341private: │ │ │ │ │ +343 CopyableOptional mapping_; │ │ │ │ │ +344 │ │ │ │ │ +346 CopyableOptional dMapping_; │ │ │ │ │ +347 │ │ │ │ │ +349 _G_e_o_m_e_t_r_y geometry_; │ │ │ │ │ 350 │ │ │ │ │ -351 // common │ │ │ │ │ -352 template │ │ │ │ │ -353 template │ │ │ │ │ -_3_5_4 class _R_e_f_i_n_e_m_e_n_t_I_m_p::_C_o_d_i_m:: │ │ │ │ │ -SubEntityIterator │ │ │ │ │ -355 : public ForwardIteratorFacade::template Codim::SubEntityIterator, int>, │ │ │ │ │ -356 public _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ -357 { │ │ │ │ │ -358 public: │ │ │ │ │ -_3_5_9 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -_3_6_0 typedef SubEntityIterator _T_h_i_s; │ │ │ │ │ -361 │ │ │ │ │ -_3_6_2 _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r(int nIntervals, bool end = false); │ │ │ │ │ +352 bool affine_; │ │ │ │ │ +353}; │ │ │ │ │ +354 │ │ │ │ │ +355// deduction guides │ │ │ │ │ +356template │ │ │ │ │ +_3_5_7_M_a_p_p_e_d_G_e_o_m_e_t_r_y (const Map&, const Geo&) │ │ │ │ │ +358 -> _M_a_p_p_e_d_G_e_o_m_e_t_r_y_<_M_a_p_,_G_e_o_>; │ │ │ │ │ +359 │ │ │ │ │ +360template │ │ │ │ │ +_3_6_1_M_a_p_p_e_d_G_e_o_m_e_t_r_y (const Map&, const Geo&, bool) │ │ │ │ │ +362 -> _M_a_p_p_e_d_G_e_o_m_e_t_r_y_<_M_a_p_,_G_e_o_>; │ │ │ │ │ 363 │ │ │ │ │ -_3_6_4 bool _e_q_u_a_l_s(const _T_h_i_s &other) const; │ │ │ │ │ -365 protected: │ │ │ │ │ -366 using _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l<_d_i_m_e_n_s_i_o_n, CoordType, codimension>:: │ │ │ │ │ -kuhnIndex; │ │ │ │ │ -367 using _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l<_d_i_m_e_n_s_i_o_n, CoordType, codimension>:: │ │ │ │ │ -backend; │ │ │ │ │ -368 }; │ │ │ │ │ -369 │ │ │ │ │ -370#ifndef DOXYGEN │ │ │ │ │ -371 template │ │ │ │ │ -372 template │ │ │ │ │ -373 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_:_: │ │ │ │ │ -374_ _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r(int nIntervals, bool end) │ │ │ │ │ -375 : _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(nIntervals, │ │ │ │ │ -end) │ │ │ │ │ -376 {} │ │ │ │ │ -377 │ │ │ │ │ -378 template │ │ │ │ │ -379 template │ │ │ │ │ -380 bool │ │ │ │ │ -381 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_:_: │ │ │ │ │ -382_ _e_q_u_a_l_s(const This &other) const │ │ │ │ │ -383 { │ │ │ │ │ -384 return kuhnIndex == other.kuhnIndex && backend == other.backend; │ │ │ │ │ -385 } │ │ │ │ │ -386#endif │ │ │ │ │ -387 │ │ │ │ │ -388 } // namespace PyramidTriangulation │ │ │ │ │ -389 } // namespace RefinementImp │ │ │ │ │ -390 │ │ │ │ │ -391 namespace RefinementImp │ │ │ │ │ -392 { │ │ │ │ │ -393 // /////////////////////// │ │ │ │ │ -394 // │ │ │ │ │ -395 // The refinement traits │ │ │ │ │ -396 // │ │ │ │ │ -397#ifndef DOXYGEN │ │ │ │ │ -398 template │ │ │ │ │ -399 struct Traits< │ │ │ │ │ -400 topologyId, CoordType, coerceToId, 3, │ │ │ │ │ -401 typename _s_t_d::enable_if< │ │ │ │ │ -402 (GeometryTypes::pyramid.id() >> 1) == │ │ │ │ │ -403 (topologyId >> 1) && │ │ │ │ │ -404 (GeometryTypes::simplex(3).id() >> 1) == │ │ │ │ │ -405 (coerceToId >> 1) │ │ │ │ │ -406 >::type> │ │ │ │ │ -407 { │ │ │ │ │ -408 typedef PyramidTriangulation::RefinementImp<3, CoordType> Imp; │ │ │ │ │ -409 }; │ │ │ │ │ -410#endif │ │ │ │ │ -411 │ │ │ │ │ -412 } // namespace RefinementImp │ │ │ │ │ -413} // namespace Dune │ │ │ │ │ -414 │ │ │ │ │ -415#endif // DUNE_GEOMETRY_REFINEMENT_PYRAMIDTRIANGULATION_CC │ │ │ │ │ -_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h │ │ │ │ │ -_s_i_m_p_l_e_x_._c_c │ │ │ │ │ -This file contains the Refinement implementation for simplices (triangles, │ │ │ │ │ -tetrahedrons.... │ │ │ │ │ -_b_a_s_e_._c_c │ │ │ │ │ -This file contains the parts independent of a particular Refinement │ │ │ │ │ -implementation. │ │ │ │ │ +364} // end namespace Dune │ │ │ │ │ +365 │ │ │ │ │ +366#endif // DUNE_GEOMETRY_MAPPEDGEOMETRY_HH │ │ │ │ │ _t_y_p_e_._h_h │ │ │ │ │ A unique label for each type of element that can occur in a grid. │ │ │ │ │ +_q_u_a_d_r_a_t_u_r_e_r_u_l_e_s_._h_h │ │ │ │ │ +_a_l_g_o_r_i_t_h_m_s_._h_h │ │ │ │ │ +_c_o_n_v_e_r_g_e_n_c_e_._h_h │ │ │ │ │ +_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h │ │ │ │ │ +_a_f_f_i_n_e_g_e_o_m_e_t_r_y_._h_h │ │ │ │ │ +An implementation of the Geometry interface for affine geometries. │ │ │ │ │ _s_t_d │ │ │ │ │ STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn affinegeometry.hh:21 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_t_r_a_n_s_f_o_r_m_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ -FieldVector< CoordType, dimension > transformCoordinate(FieldVector< CoordType, │ │ │ │ │ -dimension > point) │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:51 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_g_e_t_P_e_r_m_u_t_a_t_i_o_n │ │ │ │ │ -FieldVector< int, n > getPermutation(int m) │ │ │ │ │ -Calculate permutation from it's index. │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:293 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_r_e_f_e_r_e_n_c_e_T_o_K_u_h_n │ │ │ │ │ -FieldVector< CoordType, dimension > referenceToKuhn(FieldVector< CoordType, │ │ │ │ │ -dimension > point, const FieldVector< int, dimension > &kuhn) │ │ │ │ │ -Map from the reference simplex to some Kuhn simplex. │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:322 │ │ │ │ │ -_D_u_n_e_:_:_C_o_d_i_m │ │ │ │ │ -Static tag representing a codimension. │ │ │ │ │ -DDeeffiinniittiioonn dimension.hh:24 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y │ │ │ │ │ -generic geometry implementation based on corner coordinates │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:181 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:43 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ -Implementation of the refinement of a pyramid into simplices. │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:68 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -FieldVector< CoordType, dimension > CoordVector │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:77 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_n_V_e_r_t_i_c_e_s │ │ │ │ │ -static int nVertices(int nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:109 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_n_E_l_e_m_e_n_t_s │ │ │ │ │ -static int nElements(int nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:133 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_c_t_y_p_e │ │ │ │ │ -CoordType ctype │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:72 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ -Codim< dimension >::SubEntityIterator VertexIterator │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:76 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ -Codim< 0 >::SubEntityIterator ElementIterator │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:78 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ -static constexpr int dimension │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:70 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_e_B_e_g_i_n │ │ │ │ │ -static ElementIterator eBegin(int nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:141 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_e_E_n_d │ │ │ │ │ -static ElementIterator eEnd(int nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:149 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ -FieldVector< int, dimension+1 > IndexVector │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:79 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_v_B_e_g_i_n │ │ │ │ │ -static VertexIterator vBegin(int nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:117 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_v_E_n_d │ │ │ │ │ -static VertexIterator vEnd(int nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:125 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:101 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ -Dune::MultiLinearGeometry< CoordType, dimension-codimension, dimension > │ │ │ │ │ -Geometry │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:103 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:164 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ -Refinement::template Codim< dimension >::Geometry Geometry │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:166 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -Refinement::BackendRefinement BackendRefinement │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:178 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_b_a_c_k_e_n_d │ │ │ │ │ -BackendIterator backend │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:185 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_B_a_c_k_e_n_d_I_t_e_r_a_t_o_r │ │ │ │ │ -BackendRefinement::template Codim< dimension >::SubEntityIterator │ │ │ │ │ -BackendIterator │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:179 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_k_u_h_n_I_n_d_e_x │ │ │ │ │ -int kuhnIndex │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:184 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -Refinement::CoordVector CoordVector │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:165 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_b_a_c_k_e_n_d_E_n_d │ │ │ │ │ -const BackendIterator backendEnd │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:186 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_n_I_n_t_e_r_v_a_l_s__ │ │ │ │ │ -int nIntervals_ │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:182 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_b_a_c_k_e_n_d_E_n_d │ │ │ │ │ -const BackendIterator backendEnd │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:271 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -Refinement::CoordVector CoordVector │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:246 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_n_I_n_t_e_r_v_a_l_s__ │ │ │ │ │ -int nIntervals_ │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:267 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ -Refinement::template Codim< 0 >::Geometry Geometry │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:247 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ -Refinement::IndexVector IndexVector │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:245 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_B_a_c_k_e_n_d_I_t_e_r_a_t_o_r │ │ │ │ │ -BackendRefinement::template Codim< 0 >::SubEntityIterator BackendIterator │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:264 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_k_u_h_n_I_n_d_e_x │ │ │ │ │ -int kuhnIndex │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:269 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_b_a_c_k_e_n_d │ │ │ │ │ -BackendIterator backend │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:270 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:244 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ -_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -Refinement::BackendRefinement BackendRefinement │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:263 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n │ │ │ │ │ -_>_:_:_e_q_u_a_l_s │ │ │ │ │ -bool equals(const This &other) const │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n │ │ │ │ │ -_>_:_:_T_h_i_s │ │ │ │ │ -SubEntityIterator This │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:360 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n │ │ │ │ │ -_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ -SubEntityIterator(int nIntervals, bool end=false) │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_y_r_a_m_i_d_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n │ │ │ │ │ -_>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ -DDeeffiinniittiioonn pyramidtriangulation.cc:359 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:361 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s │ │ │ │ │ +Class providing access to the singletons of the reference elements. │ │ │ │ │ +DDeeffiinniittiioonn referenceelements.hh:128 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ +typename Container::ReferenceElement ReferenceElement │ │ │ │ │ +The reference element type. │ │ │ │ │ +DDeeffiinniittiioonn referenceelements.hh:146 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y │ │ │ │ │ +Geometry parametrized by a LocalFunction and a LocalGeometry. │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:65 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ +std::remove_reference_t< decltype(std::declval< Map >()(std::declval< typename │ │ │ │ │ +Geo::GlobalCoordinate >()))> GlobalCoordinate │ │ │ │ │ +type of global coordinates │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:71 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_c_e_n_t_e_r │ │ │ │ │ +GlobalCoordinate center() const │ │ │ │ │ +Map the center of the wrapped geometry. │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:162 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ +JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate │ │ │ │ │ +&local) const │ │ │ │ │ +Obtain the transposed of the Jacobian's inverse. │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:310 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e │ │ │ │ │ +JacobianInverse jacobianInverse(const LocalCoordinate &local) const │ │ │ │ │ +Obtain the Jacobian's inverse. │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:296 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ +JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const │ │ │ │ │ +Obtain the transposed of the Jacobian. │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:284 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y │ │ │ │ │ +MappedGeometry(Map_ &&mapping, Geo_ &&geometry, bool affine=false) │ │ │ │ │ +Constructor from mapping to parametrize the geometry. │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:125 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ +FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed │ │ │ │ │ +type of jacobian transposed │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:89 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_m_y_d_i_m_e_n_s_i_o_n │ │ │ │ │ +static constexpr int mydimension │ │ │ │ │ +geometry dimension │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:77 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_t_y_p_e │ │ │ │ │ +GeometryType type() const │ │ │ │ │ +Obtain the geometry type from the reference element. │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:143 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ +typename Geo::LocalCoordinate LocalCoordinate │ │ │ │ │ +type of local coordinates │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:68 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_c_t_y_p_e │ │ │ │ │ +typename Geo::ctype ctype │ │ │ │ │ +coordinate type │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:74 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_l_o_c_a_l │ │ │ │ │ +LocalCoordinate local(const GlobalCoordinate &y, Impl::GaussNewtonOptions< │ │ │ │ │ +ctype > opts={}) const │ │ │ │ │ +Evaluate the inverse coordinate mapping. │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:197 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ +Geo Geometry │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:108 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_c_o_r_n_e_r │ │ │ │ │ +GlobalCoordinate corner(int i) const │ │ │ │ │ +Obtain coordinates of the i-th corner. │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:155 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_c_o_o_r_d_d_i_m_e_n_s_i_o_n │ │ │ │ │ +static constexpr int coorddimension │ │ │ │ │ +coordinate dimension │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:80 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ +FieldMatrix< ctype, coorddimension, mydimension > JacobianInverseTransposed │ │ │ │ │ +type of jacobian inverse transposed │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:95 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_M_a_p_p_i_n_g │ │ │ │ │ +Map Mapping │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:105 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_g_l_o_b_a_l │ │ │ │ │ +GlobalCoordinate global(const LocalCoordinate &local) const │ │ │ │ │ +Evaluate the coordinate mapping. │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:176 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_r_e_f_E_l_e_m_e_n_t │ │ │ │ │ +ReferenceElement refElement() const │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:323 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_v_o_l_u_m_e │ │ │ │ │ +Volume volume(const QuadratureRule< ctype, mydimension > &quadRule) const │ │ │ │ │ +Obtain the volume of the mapping's image by given quadrature rules. │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:259 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_c_o_r_n_e_r_s │ │ │ │ │ +int corners() const │ │ │ │ │ +Obtain number of corners of the corresponding reference element. │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:149 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e │ │ │ │ │ +FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse │ │ │ │ │ +type of jacobian inverse │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:92 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ +friend ReferenceElement referenceElement(const MappedGeometry &geometry) │ │ │ │ │ +Obtain the reference-element related to this geometry. │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:316 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_v_o_l_u_m_e │ │ │ │ │ +Volume volume(Impl::ConvergenceOptions< ctype > opts={}) const │ │ │ │ │ +Obtain the volume of the mapping's image. │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:241 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_V_o_l_u_m_e │ │ │ │ │ +std::remove_reference_t< decltype(Dune::power(std::declval< ctype >(), │ │ │ │ │ +mydimension))> Volume │ │ │ │ │ +type of volume │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:83 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_a_f_f_i_n_e │ │ │ │ │ +bool affine() const │ │ │ │ │ +Is this mapping affine? Not in general, since we don't know anything about the │ │ │ │ │ +mapping.... │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:137 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_D_e_r_i_v_a_t_i_v_e_M_a_p_p_i_n_g │ │ │ │ │ +std::remove_reference_t< decltype(derivative(std::declval< Map >()))> │ │ │ │ │ +DerivativeMapping │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:111 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n │ │ │ │ │ +Jacobian jacobian(const LocalCoordinate &local) const │ │ │ │ │ +Obtain the Jacobian. │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:272 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_M_a_t_r_i_x_H_e_l_p_e_r │ │ │ │ │ +Impl::FieldMatrixHelper< ctype > MatrixHelper │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:102 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n │ │ │ │ │ +FieldMatrix< ctype, coorddimension, mydimension > Jacobian │ │ │ │ │ +type of jacobian │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:86 │ │ │ │ │ +_D_u_n_e_:_:_M_a_p_p_e_d_G_e_o_m_e_t_r_y_:_:_i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t │ │ │ │ │ +ctype integrationElement(const LocalCoordinate &local) const │ │ │ │ │ +Obtain the integration element. │ │ │ │ │ +DDeeffiinniittiioonn mappedgeometry.hh:225 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e │ │ │ │ │ +Abstract base class for quadrature rules. │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:214 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s │ │ │ │ │ +A container for all quadrature rules of dimension dim │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:260 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ +Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:114 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00218.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: base.cc File Reference │ │ │ │ +dune-geometry: referenceelementimplementation.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,87 +65,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>
│ │ │ │ +
#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.

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

│ │ │ │ -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...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ -

│ │ │ │ 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.
 
RefinementIntervals Dune::refinementLevels (int levels)
 Creates a RefinementIntervals object.
 
│ │ │ │ -

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 {} │ │ │ │ │ @@ -1,56 +1,33 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ - * _r_e_f_i_n_e_m_e_n_t │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -base.cc File Reference │ │ │ │ │ -This file contains the parts independent of a particular _R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -implementation. _M_o_r_e_._._. │ │ │ │ │ +_N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +referenceelementimplementation.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_a_f_f_i_n_e_g_e_o_m_e_t_r_y_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_T_r_a_i_t_s_<_ _t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_, │ │ │ │ │ - _d_i_m_e_n_s_i_o_n_,_ _D_u_m_m_y_ _> │ │ │ │ │ -  Mapping from ggeeoommeettrryyTTyyppee, CCoooorrddTTyyppee and ccooeerrcceeTToo to a particular │ │ │ │ │ - _R_e_f_i_n_e_m_e_n_t implementation. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s │ │ │ │ │ -  Holds the number of refined intervals per axis needed for virtual and │ │ │ │ │ - static refinement. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_<_ _t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n__ │ │ │ │ │ - _> │ │ │ │ │ -  Wrap each _R_e_f_i_n_e_m_e_n_t implementation to get a consistent interface. │ │ │ │ │ - _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_<_ _t_o_p_o_l_o_g_y_I_d_,_ _C_o_o_r_d_T_y_p_e_,_ _c_o_e_r_c_e_T_o_I_d_,_ _d_i_m_e_n_s_i_o_n__ │ │ │ │ │ - _>_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ -  The _C_o_d_i_m struct inherited from the _R_e_f_i_n_e_m_e_n_t implementation. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ -  This namespace contains the implementation of _R_e_f_i_n_e_m_e_n_t. │ │ │ │ │ -  │ │ │ │ │ -MMaaccrrooss │ │ │ │ │ -#define  _D_U_N_E___G_E_O_M_E_T_R_Y___R_E_F_I_N_E_M_E_N_T___B_A_S_E___C_C │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s  _D_u_n_e_:_:_r_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s (int intervals) │ │ │ │ │ -  Creates a _R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s object. │ │ │ │ │ -  │ │ │ │ │ -_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s  _D_u_n_e_:_:_r_e_f_i_n_e_m_e_n_t_L_e_v_e_l_s (int levels) │ │ │ │ │ -  Creates a _R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s object. │ │ │ │ │ +namespace   _D_u_n_e_:_:_G_e_o │ │ │ │ │   │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -This file contains the parts independent of a particular _R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -implementation. │ │ │ │ │ -********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ -********** _?◆_? DDUUNNEE__GGEEOOMMEETTRRYY__RREEFFIINNEEMMEENNTT__BBAASSEE__CCCC ********** │ │ │ │ │ -#define DUNE_GEOMETRY_REFINEMENT_BASE_CC │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00218_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: base.cc Source File │ │ │ │ +dune-geometry: referenceelementimplementation.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,199 +70,728 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
base.cc
│ │ │ │ +
referenceelementimplementation.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 © 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_BASE_CC
│ │ │ │ -
6#define DUNE_GEOMETRY_REFINEMENT_BASE_CC
│ │ │ │ +
5#ifndef DUNE_GEOMETRY_REFERENCEELEMENTIMPLEMENTATION_HH
│ │ │ │ +
6#define DUNE_GEOMETRY_REFERENCEELEMENTIMPLEMENTATION_HH
│ │ │ │
7
│ │ │ │ -
15#include <dune/geometry/type.hh>
│ │ │ │ -
16
│ │ │ │ -
17namespace Dune
│ │ │ │ -
18{
│ │ │ │ -
│ │ │ │ -
28 namespace RefinementImp
│ │ │ │ -
29 {
│ │ │ │ -
30 // /////////////////////////////////
│ │ │ │ -
31 //
│ │ │ │ -
32 // Declaration of RefinementImp::Traits
│ │ │ │ -
33 //
│ │ │ │ +
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>
│ │ │ │ +
24
│ │ │ │ + │ │ │ │ + │ │ │ │ +
27#include <dune/geometry/type.hh>
│ │ │ │ +
28
│ │ │ │ +
29namespace Dune
│ │ │ │ +
30{
│ │ │ │ +
31
│ │ │ │ +
32 namespace Geo
│ │ │ │ +
33 {
│ │ │ │
34
│ │ │ │ -
35#ifdef DOXYGEN
│ │ │ │ -
36 // This is just for Doxygen
│ │ │ │ -
67 template<unsigned topologyId, class CoordType,
│ │ │ │ -
68 unsigned coerceToId, int dimension, class Dummy = void>
│ │ │ │ -
│ │ │ │ -
69 struct Traits
│ │ │ │ -
70 {
│ │ │ │ -
72 typedef SquaringTheCircle::Refinement Imp;
│ │ │ │ -
73 };
│ │ │ │ -
│ │ │ │ +
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;
│ │ │ │ +
60
│ │ │ │ +
62 unsigned int size ( unsigned int topologyId, int dim, int codim );
│ │ │ │ +
63
│ │ │ │ +
64
│ │ │ │ +
65
│ │ │ │ +
73 unsigned int subTopologyId ( unsigned int topologyId, int dim, int codim, unsigned int i );
│ │ │ │
74
│ │ │ │ -
75#else // !DOXYGEN
│ │ │ │ +
75
│ │ │ │
76
│ │ │ │ -
77 // Doxygen won't see this
│ │ │ │ -
78
│ │ │ │ -
79 template<unsigned topologyId, class CoordType,
│ │ │ │ -
80 unsigned coerceToId, int dimension, class = void>
│ │ │ │ -
81 struct Traits;
│ │ │ │ +
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 );
│ │ │ │
82
│ │ │ │ -
83#endif // !DOXYGEN
│ │ │ │ -
84 } // namespace RefinementImp
│ │ │ │ -
│ │ │ │ +
83
│ │ │ │ +
84
│ │ │ │
85
│ │ │ │ -
86
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
95 int intervals_=1;
│ │ │ │ -
96
│ │ │ │ -
97 public:
│ │ │ │ -
98 explicit RefinementIntervals(int i) : intervals_(i) {}
│ │ │ │ -
99
│ │ │ │ -
100 int intervals() const { return intervals_; }
│ │ │ │ -
101 };
│ │ │ │ -
│ │ │ │ -
102
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
109 {
│ │ │ │ -
110 return RefinementIntervals{intervals};
│ │ │ │ -
111 }
│ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
118 {
│ │ │ │ -
119 return RefinementIntervals{1<<levels};
│ │ │ │ -
120 }
│ │ │ │ -
│ │ │ │ -
121
│ │ │ │ -
122 // ///////////////
│ │ │ │ -
123 //
│ │ │ │ -
124 // Static Refinement
│ │ │ │ -
125 //
│ │ │ │ -
126
│ │ │ │ -
136 template<unsigned topologyId, class CoordType,
│ │ │ │ -
137 unsigned coerceToId, int dimension_>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
139 : public RefinementImp::Traits<topologyId, CoordType,
│ │ │ │ -
140 coerceToId, dimension_ >::Imp
│ │ │ │ -
141 {
│ │ │ │ -
142 public:
│ │ │ │ -
143#ifdef DOXYGEN
│ │ │ │ -
149 template<int codimension>
│ │ │ │ -
│ │ │ │ -
150 struct Codim
│ │ │ │ -
151 {
│ │ │ │ - │ │ │ │ -
158 };
│ │ │ │ -
│ │ │ │ +
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 }
│ │ │ │ +
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
│ │ │ │
159
│ │ │ │ - │ │ │ │ - │ │ │ │ -
164
│ │ │ │ -
170 typedef CoordVector;
│ │ │ │ +
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
│ │ │ │ -
177 typedef IndexVector;
│ │ │ │ -
178#endif
│ │ │ │ -
179
│ │ │ │ -
180 typedef typename RefinementImp::Traits< topologyId, CoordType, coerceToId, dimension_>::Imp RefinementImp;
│ │ │ │ -
181
│ │ │ │ -
182 using RefinementImp::dimension;
│ │ │ │ -
183
│ │ │ │ -
184 using RefinementImp::Codim;
│ │ │ │ -
185
│ │ │ │ -
186 using typename RefinementImp::VertexIterator;
│ │ │ │ -
187 using typename RefinementImp::CoordVector;
│ │ │ │ -
188
│ │ │ │ -
189 using typename RefinementImp::ElementIterator;
│ │ │ │ -
190 using typename RefinementImp::IndexVector;
│ │ │ │ -
191
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
198 {
│ │ │ │ -
199 return RefinementImp::nVertices(tag.intervals());
│ │ │ │ -
200 }
│ │ │ │ -
│ │ │ │ -
201
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
208 {
│ │ │ │ -
209 return RefinementImp::vBegin(tag.intervals());
│ │ │ │ -
210 }
│ │ │ │ -
│ │ │ │ -
211
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
218 {
│ │ │ │ -
219 return RefinementImp::vEnd(tag.intervals());
│ │ │ │ -
220 }
│ │ │ │ -
│ │ │ │ -
221
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
228 {
│ │ │ │ -
229 return RefinementImp::nElements(tag.intervals());
│ │ │ │ -
230 }
│ │ │ │ -
│ │ │ │ -
231
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
238 {
│ │ │ │ -
239 return RefinementImp::eBegin(tag.intervals());
│ │ │ │ -
240 }
│ │ │ │ -
│ │ │ │ -
241
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
248 {
│ │ │ │ -
249 return RefinementImp::eEnd(tag.intervals());
│ │ │ │ -
250 }
│ │ │ │ -
│ │ │ │ -
251 };
│ │ │ │ -
│ │ │ │ -
252
│ │ │ │ -
254} // namespace Dune
│ │ │ │ -
255
│ │ │ │ -
256#endif // DUNE_GEOMETRY_REFINEMENT_BASE_CC
│ │ │ │ -
A unique label for each type of element that can occur in a grid.
│ │ │ │ -
RefinementIntervals refinementIntervals(int intervals)
Creates a RefinementIntervals object.
Definition base.cc:108
│ │ │ │ -
RefinementIntervals refinementLevels(int levels)
Creates a RefinementIntervals object.
Definition base.cc:117
│ │ │ │ +
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
│ │ │ │ +
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( (0 < codim) && (codim <= dim) )
│ │ │ │ +
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 // !isPrism
│ │ │ │ +
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 if( codim < dim )
│ │ │ │ +
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 if( codim == 0 )
│ │ │ │ +
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
│ │ │ │ +
270 // this point should not be reached since all cases are handled before.
│ │ │ │ +
271 std::abort();
│ │ │ │ +
272 return 0;
│ │ │ │ +
273 }
│ │ │ │ +
274
│ │ │ │ +
275
│ │ │ │ +
276
│ │ │ │ +
277 // referenceIntegrationOuterNormals
│ │ │ │ +
278 // --------------------------------
│ │ │ │ +
279
│ │ │ │ +
280 template< class ct, int cdim >
│ │ │ │ +
281 inline unsigned int
│ │ │ │ +
282 referenceIntegrationOuterNormals ( unsigned int topologyId, int dim,
│ │ │ │ +
283 const FieldVector< ct, cdim > *origins,
│ │ │ │ +
284 FieldVector< ct, cdim > *normals )
│ │ │ │ +
285 {
│ │ │ │ +
286 assert( (dim > 0) && (dim <= cdim) );
│ │ │ │ +
287 assert( topologyId < numTopologies( dim ) );
│ │ │ │ +
288
│ │ │ │ +
289 if( dim > 1 )
│ │ │ │ +
290 {
│ │ │ │ +
291 const unsigned int baseId = baseTopologyId( topologyId, dim );
│ │ │ │ +
292 if( isPrism( topologyId, dim ) )
│ │ │ │ +
293 {
│ │ │ │ +
294 const unsigned int numBaseFaces
│ │ │ │ +
295 = referenceIntegrationOuterNormals( baseId, dim-1, origins, normals );
│ │ │ │ +
296
│ │ │ │ +
297 for( unsigned int i = 0; i < 2; ++i )
│ │ │ │ +
298 {
│ │ │ │ +
299 normals[ numBaseFaces+i ] = FieldVector< ct, cdim >( ct( 0 ) );
│ │ │ │ +
300 normals[ numBaseFaces+i ][ dim-1 ] = ct( 2*int( i )-1 );
│ │ │ │ +
301 }
│ │ │ │ +
302
│ │ │ │ +
303 return numBaseFaces+2;
│ │ │ │ +
304 }
│ │ │ │ +
305 else
│ │ │ │ +
306 {
│ │ │ │ +
307 normals[ 0 ] = FieldVector< ct, cdim >( ct( 0 ) );
│ │ │ │ +
308 normals[ 0 ][ dim-1 ] = ct( -1 );
│ │ │ │ +
309
│ │ │ │ +
310 const unsigned int numBaseFaces
│ │ │ │ +
311 = referenceIntegrationOuterNormals( baseId, dim-1, origins+1, normals+1 );
│ │ │ │ +
312 for( unsigned int i = 1; i <= numBaseFaces; ++i )
│ │ │ │ +
313 normals[ i ][ dim-1 ] = normals[ i ]*origins[ i ];
│ │ │ │ +
314
│ │ │ │ +
315 return numBaseFaces+1;
│ │ │ │ +
316 }
│ │ │ │ +
317 }
│ │ │ │ +
318 else
│ │ │ │ +
319 {
│ │ │ │ +
320 for( unsigned int i = 0; i < 2; ++i )
│ │ │ │ +
321 {
│ │ │ │ +
322 normals[ i ] = FieldVector< ct, cdim >( ct( 0 ) );
│ │ │ │ +
323 normals[ i ][ 0 ] = ct( 2*int( i )-1 );
│ │ │ │ +
324 }
│ │ │ │ +
325
│ │ │ │ +
326 return 2;
│ │ │ │ +
327 }
│ │ │ │ +
328 }
│ │ │ │ +
329
│ │ │ │ +
330 template< class ct, int cdim >
│ │ │ │ +
331 inline unsigned int
│ │ │ │ +
332 referenceIntegrationOuterNormals ( unsigned int topologyId, int dim,
│ │ │ │ +
333 FieldVector< ct, cdim > *normals )
│ │ │ │ +
334 {
│ │ │ │ +
335 assert( (dim > 0) && (dim <= cdim) );
│ │ │ │ +
336
│ │ │ │ +
337 FieldVector< ct, cdim > *origins
│ │ │ │ +
338 = new FieldVector< ct, cdim >[ size( topologyId, dim, 1 ) ];
│ │ │ │ +
339 referenceOrigins( topologyId, dim, 1, origins );
│ │ │ │ +
340
│ │ │ │ +
341 const unsigned int numFaces
│ │ │ │ +
342 = referenceIntegrationOuterNormals( topologyId, dim, origins, normals );
│ │ │ │ +
343 assert( numFaces == size( topologyId, dim, 1 ) );
│ │ │ │ +
344
│ │ │ │ +
345 delete[] origins;
│ │ │ │ +
346
│ │ │ │ +
347 return numFaces;
│ │ │ │ +
348 }
│ │ │ │ +
349
│ │ │ │ +
350 } // namespace Impl
│ │ │ │ +
351
│ │ │ │ +
352
│ │ │ │ +
353
│ │ │ │ +
354 // ReferenceElement
│ │ │ │ +
355 // ----------------
│ │ │ │ +
356
│ │ │ │ +
375 template< class ctype_, int dim >
│ │ │ │ +
376 class ReferenceElementImplementation
│ │ │ │ +
377 {
│ │ │ │ +
378
│ │ │ │ +
379 public:
│ │ │ │ +
380
│ │ │ │ +
382 using ctype = ctype_;
│ │ │ │ +
383
│ │ │ │ +
385 using CoordinateField = ctype;
│ │ │ │ +
386
│ │ │ │ +
388 using Coordinate = Dune::FieldVector<ctype,dim>;
│ │ │ │ +
389
│ │ │ │ +
391 static constexpr int dimension = dim;
│ │ │ │ +
392
│ │ │ │ +
394 typedef ctype Volume;
│ │ │ │ +
395
│ │ │ │ +
396 private:
│ │ │ │ +
397
│ │ │ │ +
398 friend class Impl::ReferenceElementContainer< ctype, dim >;
│ │ │ │ +
399
│ │ │ │ +
400 struct SubEntityInfo;
│ │ │ │ +
401
│ │ │ │ +
402 template< int codim > struct CreateGeometries;
│ │ │ │ +
403
│ │ │ │ +
404 public:
│ │ │ │ +
406 template< int codim >
│ │ │ │ +
407 struct Codim
│ │ │ │ +
408 {
│ │ │ │ +
410 typedef AffineGeometry< ctype, dim-codim, dim > Geometry;
│ │ │ │ +
411 };
│ │ │ │ +
412
│ │ │ │ +
413 // ReferenceElement cannot be copied.
│ │ │ │ +
414 ReferenceElementImplementation ( const ReferenceElementImplementation& ) = delete;
│ │ │ │ +
415
│ │ │ │ +
416 // ReferenceElementImplementation cannot be copied.
│ │ │ │ +
417 ReferenceElementImplementation& operator= ( const ReferenceElementImplementation& ) = delete;
│ │ │ │ +
418
│ │ │ │ +
419 // ReferenceElementImplementation is default-constructible (required for storage in std::array)
│ │ │ │ +
420 ReferenceElementImplementation () = default;
│ │ │ │ +
421
│ │ │ │ +
426 int size ( int c ) const
│ │ │ │ +
427 {
│ │ │ │ +
428 assert( (c >= 0) && (c <= dim) );
│ │ │ │ +
429 return info_[ c ].size();
│ │ │ │ +
430 }
│ │ │ │ +
431
│ │ │ │ +
443 int size ( int i, int c, int cc ) const
│ │ │ │ +
444 {
│ │ │ │ +
445 assert( (i >= 0) && (i < size( c )) );
│ │ │ │ +
446 return info_[ c ][ i ].size( cc );
│ │ │ │ +
447 }
│ │ │ │ +
448
│ │ │ │ +
462 int subEntity ( int i, int c, int ii, int cc ) const
│ │ │ │ +
463 {
│ │ │ │ +
464 assert( (i >= 0) && (i < size( c )) );
│ │ │ │ +
465 return info_[ c ][ i ].number( ii, cc );
│ │ │ │ +
466 }
│ │ │ │ +
467
│ │ │ │ +
483 auto subEntities ( int i, int c, int cc ) const
│ │ │ │ +
484 {
│ │ │ │ +
485 assert( (i >= 0) && (i < size( c )) );
│ │ │ │ +
486 return info_[ c ][ i ].numbers( cc );
│ │ │ │ +
487 }
│ │ │ │ +
488
│ │ │ │ +
497 const GeometryType &type ( int i, int c ) const
│ │ │ │ +
498 {
│ │ │ │ +
499 assert( (i >= 0) && (i < size( c )) );
│ │ │ │ +
500 return info_[ c ][ i ].type();
│ │ │ │ +
501 }
│ │ │ │ +
502
│ │ │ │ +
504 const GeometryType &type () const { return type( 0, 0 ); }
│ │ │ │ +
505
│ │ │ │ +
515 const Coordinate &position( int i, int c ) const
│ │ │ │ +
516 {
│ │ │ │ +
517 assert( (c >= 0) && (c <= dim) );
│ │ │ │ +
518 return baryCenters_[ c ][ i ];
│ │ │ │ +
519 }
│ │ │ │ +
520
│ │ │ │ +
528 bool checkInside ( const Coordinate &local ) const
│ │ │ │ +
529 {
│ │ │ │ +
530 const ctype tolerance = ctype( 64 ) * std::numeric_limits< ctype >::epsilon();
│ │ │ │ +
531 return Impl::template checkInside< ctype, dim >( type().id(), dim, local, tolerance );
│ │ │ │ +
532 }
│ │ │ │ +
533
│ │ │ │ +
545 template< int codim >
│ │ │ │ +
546 typename Codim< codim >::Geometry geometry ( int i ) const
│ │ │ │ +
547 {
│ │ │ │ +
548 return std::get< codim >( geometries_ )[ i ];
│ │ │ │ +
549 }
│ │ │ │ +
550
│ │ │ │ +
552 Volume volume () const
│ │ │ │ +
553 {
│ │ │ │ +
554 return volume_;
│ │ │ │ +
555 }
│ │ │ │ +
556
│ │ │ │ +
564 const Coordinate &integrationOuterNormal ( int face ) const
│ │ │ │ +
565 {
│ │ │ │ +
566 assert( (face >= 0) && (face < int( integrationNormals_.size() )) );
│ │ │ │ +
567 return integrationNormals_[ face ];
│ │ │ │ +
568 }
│ │ │ │ +
569
│ │ │ │ +
570 private:
│ │ │ │ +
571 void initialize ( unsigned int topologyId )
│ │ │ │ +
572 {
│ │ │ │ +
573 assert( topologyId < Impl::numTopologies( dim ) );
│ │ │ │ +
574
│ │ │ │ +
575 // set up subentities
│ │ │ │ +
576 for( int codim = 0; codim <= dim; ++codim )
│ │ │ │ +
577 {
│ │ │ │ +
578 const unsigned int size = Impl::size( topologyId, dim, codim );
│ │ │ │ +
579 info_[ codim ].resize( size );
│ │ │ │ +
580 for( unsigned int i = 0; i < size; ++i )
│ │ │ │ +
581 info_[ codim ][ i ].initialize( topologyId, codim, i );
│ │ │ │ +
582 }
│ │ │ │ +
583
│ │ │ │ +
584 // compute corners
│ │ │ │ +
585 const unsigned int numVertices = size( dim );
│ │ │ │ +
586 baryCenters_[ dim ].resize( numVertices );
│ │ │ │ +
587 Impl::referenceCorners( topologyId, dim, &(baryCenters_[ dim ][ 0 ]) );
│ │ │ │ +
588
│ │ │ │ +
589 // compute barycenters
│ │ │ │ +
590 for( int codim = 0; codim < dim; ++codim )
│ │ │ │ +
591 {
│ │ │ │ +
592 baryCenters_[ codim ].resize( size(codim) );
│ │ │ │ +
593 for( int i = 0; i < size( codim ); ++i )
│ │ │ │ +
594 {
│ │ │ │ +
595 baryCenters_[ codim ][ i ] = Coordinate( ctype( 0 ) );
│ │ │ │ +
596 const unsigned int numCorners = size( i, codim, dim );
│ │ │ │ +
597 for( unsigned int j = 0; j < numCorners; ++j )
│ │ │ │ +
598 baryCenters_[ codim ][ i ] += baryCenters_[ dim ][ subEntity( i, codim, j, dim ) ];
│ │ │ │ +
599 baryCenters_[ codim ][ i ] *= ctype( 1 ) / ctype( numCorners );
│ │ │ │ +
600 }
│ │ │ │ +
601 }
│ │ │ │ +
602
│ │ │ │ +
603 // compute reference element volume
│ │ │ │ +
604 volume_ = Impl::template referenceVolume< ctype >( topologyId, dim );
│ │ │ │ +
605
│ │ │ │ +
606 // compute integration outer normals
│ │ │ │ +
607 if( dim > 0 )
│ │ │ │ +
608 {
│ │ │ │ +
609 integrationNormals_.resize( size( 1 ) );
│ │ │ │ +
610 Impl::referenceIntegrationOuterNormals( topologyId, dim, &(integrationNormals_[ 0 ]) );
│ │ │ │ +
611 }
│ │ │ │ +
612
│ │ │ │ +
613 // set up geometries
│ │ │ │ +
614 Hybrid::forEach( std::make_index_sequence< dim+1 >{}, [ & ]( auto i ){ CreateGeometries< i >::apply( *this, geometries_ ); } );
│ │ │ │ +
615 }
│ │ │ │ +
616
│ │ │ │ +
617 template< int... codim >
│ │ │ │ +
618 static std::tuple< std::vector< typename Codim< codim >::Geometry >... >
│ │ │ │ +
619 makeGeometryTable ( std::integer_sequence< int, codim... > );
│ │ │ │ +
620
│ │ │ │ +
622 typedef decltype( makeGeometryTable( std::make_integer_sequence< int, dim+1 >() ) ) GeometryTable;
│ │ │ │ +
623
│ │ │ │ +
625 ctype volume_;
│ │ │ │ +
626
│ │ │ │ +
627 std::vector< Coordinate > baryCenters_[ dim+1 ];
│ │ │ │ +
628 std::vector< Coordinate > integrationNormals_;
│ │ │ │ +
629
│ │ │ │ +
631 GeometryTable geometries_;
│ │ │ │ +
632
│ │ │ │ +
633 std::vector< SubEntityInfo > info_[ dim+1 ];
│ │ │ │ +
634 };
│ │ │ │ +
635
│ │ │ │ +
637 template< class ctype, int dim >
│ │ │ │ +
638 struct ReferenceElementImplementation< ctype, dim >::SubEntityInfo
│ │ │ │ +
639 {
│ │ │ │ +
640 // Compute upper bound for the number of subsentities.
│ │ │ │ +
641 // If someone knows an explicit formal feel free to
│ │ │ │ +
642 // implement it here.
│ │ │ │ +
643 static constexpr std::size_t maxSubEntityCount()
│ │ │ │ +
644 {
│ │ │ │ +
645 std::size_t maxCount=0;
│ │ │ │ +
646 for(std::size_t codim=0; codim<=dim; ++codim)
│ │ │ │ +
647 maxCount = std::max(maxCount, binomial(std::size_t(dim),codim)*(1 << codim));
│ │ │ │ +
648 return maxCount;
│ │ │ │ +
649 }
│ │ │ │ +
650
│ │ │ │ +
651 using SubEntityFlags = std::bitset<maxSubEntityCount()>;
│ │ │ │ +
652
│ │ │ │ +
653 class SubEntityRange
│ │ │ │ +
654 : public Dune::IteratorRange<const unsigned int*>
│ │ │ │ +
655 {
│ │ │ │ +
656 using Base = typename Dune::IteratorRange<const unsigned int*>;
│ │ │ │ +
657
│ │ │ │ +
658 public:
│ │ │ │ +
659
│ │ │ │ +
660 using iterator = Base::iterator;
│ │ │ │ +
661 using const_iterator = Base::const_iterator;
│ │ │ │ +
662
│ │ │ │ +
663 SubEntityRange(const iterator& begin, const iterator& end, const SubEntityFlags& contains) :
│ │ │ │ +
664 Base(begin, end),
│ │ │ │ +
665 containsPtr_(&contains),
│ │ │ │ +
666 size_(end-begin)
│ │ │ │ +
667 {}
│ │ │ │ +
668
│ │ │ │ +
669 SubEntityRange() :
│ │ │ │ +
670 Base(),
│ │ │ │ +
671 containsPtr_(nullptr),
│ │ │ │ +
672 size_(0)
│ │ │ │ +
673 {}
│ │ │ │ +
674
│ │ │ │ +
675 std::size_t size() const
│ │ │ │ +
676 {
│ │ │ │ +
677 return size_;
│ │ │ │ +
678 }
│ │ │ │ +
679
│ │ │ │ +
680 bool contains(std::size_t i) const
│ │ │ │ +
681 {
│ │ │ │ +
682 return (*containsPtr_)[i];
│ │ │ │ +
683 }
│ │ │ │ +
684
│ │ │ │ +
685 private:
│ │ │ │ +
686 const SubEntityFlags* containsPtr_;
│ │ │ │ +
687 std::size_t size_;
│ │ │ │ +
688 std::size_t offset_;
│ │ │ │ +
689 };
│ │ │ │ +
690
│ │ │ │ +
691 using NumberRange = typename Dune::IteratorRange<const unsigned int*>;
│ │ │ │ +
692
│ │ │ │ +
693 SubEntityInfo ()
│ │ │ │ +
694 : numbering_( nullptr )
│ │ │ │ +
695 {
│ │ │ │ +
696 std::fill( offset_.begin(), offset_.end(), 0 );
│ │ │ │ +
697 }
│ │ │ │ +
698
│ │ │ │ +
699 SubEntityInfo ( const SubEntityInfo &other )
│ │ │ │ +
700 : offset_( other.offset_ ),
│ │ │ │ +
701 type_( other.type_ ),
│ │ │ │ +
702 containsSubentity_( other.containsSubentity_ )
│ │ │ │ +
703 {
│ │ │ │ +
704 numbering_ = allocate();
│ │ │ │ +
705 std::copy( other.numbering_, other.numbering_ + capacity(), numbering_ );
│ │ │ │ +
706 }
│ │ │ │ +
707
│ │ │ │ +
708 ~SubEntityInfo () { deallocate( numbering_ ); }
│ │ │ │ +
709
│ │ │ │ +
710 const SubEntityInfo &operator= ( const SubEntityInfo &other )
│ │ │ │ +
711 {
│ │ │ │ +
712 type_ = other.type_;
│ │ │ │ +
713 offset_ = other.offset_;
│ │ │ │ +
714
│ │ │ │ +
715 deallocate( numbering_ );
│ │ │ │ +
716 numbering_ = allocate();
│ │ │ │ +
717 std::copy( other.numbering_, other.numbering_ + capacity(), numbering_ );
│ │ │ │ +
718
│ │ │ │ +
719 containsSubentity_ = other.containsSubentity_;
│ │ │ │ +
720
│ │ │ │ +
721 return *this;
│ │ │ │ +
722 }
│ │ │ │ +
723
│ │ │ │ +
724 int size ( int cc ) const
│ │ │ │ +
725 {
│ │ │ │ +
726 assert( (cc >= 0) && (cc <= dim) );
│ │ │ │ +
727 return (offset_[ cc+1 ] - offset_[ cc ]);
│ │ │ │ +
728 }
│ │ │ │ +
729
│ │ │ │ +
730 int number ( int ii, int cc ) const
│ │ │ │ +
731 {
│ │ │ │ +
732 assert( (ii >= 0) && (ii < size( cc )) );
│ │ │ │ +
733 return numbering_[ offset_[ cc ] + ii ];
│ │ │ │ +
734 }
│ │ │ │ +
735
│ │ │ │ +
736 auto numbers ( int cc ) const
│ │ │ │ +
737 {
│ │ │ │ +
738 return SubEntityRange( numbering_ + offset_[ cc ], numbering_ + offset_[ cc+1 ], containsSubentity_[cc]);
│ │ │ │ +
739 }
│ │ │ │ +
740
│ │ │ │ +
741 const GeometryType &type () const { return type_; }
│ │ │ │ +
742
│ │ │ │ +
743 void initialize ( unsigned int topologyId, int codim, unsigned int i )
│ │ │ │ +
744 {
│ │ │ │ +
745 const unsigned int subId = Impl::subTopologyId( topologyId, dim, codim, i );
│ │ │ │ +
746 type_ = GeometryType( subId, dim-codim );
│ │ │ │ +
747
│ │ │ │ +
748 // compute offsets
│ │ │ │ +
749 for( int cc = 0; cc <= codim; ++cc )
│ │ │ │ +
750 offset_[ cc ] = 0;
│ │ │ │ +
751 for( int cc = codim; cc <= dim; ++cc )
│ │ │ │ +
752 offset_[ cc+1 ] = offset_[ cc ] + Impl::size( subId, dim-codim, cc-codim );
│ │ │ │ +
753
│ │ │ │ +
754 // compute subnumbering
│ │ │ │ +
755 deallocate( numbering_ );
│ │ │ │ +
756 numbering_ = allocate();
│ │ │ │ +
757 for( int cc = codim; cc <= dim; ++cc )
│ │ │ │ +
758 Impl::subTopologyNumbering( topologyId, dim, codim, i, cc-codim, numbering_+offset_[ cc ], numbering_+offset_[ cc+1 ] );
│ │ │ │ +
759
│ │ │ │ +
760 // initialize containsSubentity lookup-table
│ │ │ │ +
761 for(std::size_t cc=0; cc<= dim; ++cc)
│ │ │ │ +
762 {
│ │ │ │ +
763 containsSubentity_[cc].reset();
│ │ │ │ +
764 for(std::size_t idx=0; idx<std::size_t(size(cc)); ++idx)
│ │ │ │ +
765 containsSubentity_[cc][number(idx,cc)] = true;
│ │ │ │ +
766 }
│ │ │ │ +
767 }
│ │ │ │ +
768
│ │ │ │ +
769 protected:
│ │ │ │ +
770 int codim () const { return dim - type().dim(); }
│ │ │ │ +
771
│ │ │ │ +
772 unsigned int *allocate () { return (capacity() != 0 ? new unsigned int[ capacity() ] : nullptr); }
│ │ │ │ +
773 void deallocate ( unsigned int *ptr ) { delete[] ptr; }
│ │ │ │ +
774 unsigned int capacity () const { return offset_[ dim+1 ]; }
│ │ │ │ +
775
│ │ │ │ +
776 private:
│ │ │ │ +
777 unsigned int *numbering_;
│ │ │ │ +
778 std::array< unsigned int, dim+2 > offset_;
│ │ │ │ +
779 GeometryType type_;
│ │ │ │ +
780 std::array< SubEntityFlags, dim+1> containsSubentity_;
│ │ │ │ +
781 };
│ │ │ │ +
782
│ │ │ │ +
783
│ │ │ │ +
784 template< class ctype, int dim >
│ │ │ │ +
785 template< int codim >
│ │ │ │ +
786 struct ReferenceElementImplementation< ctype, dim >::CreateGeometries
│ │ │ │ +
787 {
│ │ │ │ +
788 template< int cc >
│ │ │ │ +
789 static typename ReferenceElements< ctype, dim-cc >::ReferenceElement
│ │ │ │ +
790 subRefElement( const ReferenceElementImplementation< ctype, dim > &refElement, int i, std::integral_constant< int, cc > )
│ │ │ │ +
791 {
│ │ │ │ +
792 return ReferenceElements< ctype, dim-cc >::general( refElement.type( i, cc ) );
│ │ │ │ +
793 }
│ │ │ │ +
794
│ │ │ │ + │ │ │ │ +
796 subRefElement(const ReferenceElementImplementation< ctype, dim > &refElement,
│ │ │ │ +
797 [[maybe_unused]] int i, std::integral_constant<int, 0>)
│ │ │ │ +
798 {
│ │ │ │ +
799 return refElement;
│ │ │ │ +
800 }
│ │ │ │ +
801
│ │ │ │ +
802 static void apply ( const ReferenceElementImplementation< ctype, dim > &refElement, GeometryTable &geometries )
│ │ │ │ +
803 {
│ │ │ │ +
804 const int size = refElement.size( codim );
│ │ │ │ +
805 std::vector< FieldVector< ctype, dim > > origins( size );
│ │ │ │ +
806 std::vector< FieldMatrix< ctype, dim - codim, dim > > jacobianTransposeds( size );
│ │ │ │ +
807 Impl::referenceEmbeddings( refElement.type().id(), dim, codim, &(origins[ 0 ]), &(jacobianTransposeds[ 0 ]) );
│ │ │ │ +
808
│ │ │ │ +
809 std::get< codim >( geometries ).reserve( size );
│ │ │ │ +
810 for( int i = 0; i < size; ++i )
│ │ │ │ +
811 {
│ │ │ │ +
812 typename Codim< codim >::Geometry geometry( subRefElement( refElement, i, std::integral_constant< int, codim >() ), origins[ i ], jacobianTransposeds[ i ] );
│ │ │ │ +
813 std::get< codim >( geometries ).push_back( geometry );
│ │ │ │ +
814 }
│ │ │ │ +
815 }
│ │ │ │ +
816 };
│ │ │ │ +
817
│ │ │ │ +
818#endif // DOXYGEN
│ │ │ │ +
819
│ │ │ │ +
820 } // namespace Geo
│ │ │ │ +
821
│ │ │ │ +
822} // namespace Dune
│ │ │ │ +
823
│ │ │ │ +
824#endif // #ifndef DUNE_GEOMETRY_REFERENCEELEMENTIMPLEMENTATION_HH
│ │ │ │ + │ │ │ │ +
A unique label for each type of element that can occur in a grid.
│ │ │ │ +
An implementation of the Geometry interface for affine geometries.
│ │ │ │
Definition affinegeometry.hh:21
│ │ │ │ -
Mapping from geometryType, CoordType and coerceTo to a particular Refinement implementation.
Definition base.cc:70
│ │ │ │ -
Holds the number of refined intervals per axis needed for virtual and static refinement.
Definition base.cc:94
│ │ │ │ -
RefinementIntervals(int i)
Definition base.cc:98
│ │ │ │ -
int intervals() const
Definition base.cc:100
│ │ │ │ -
Wrap each Refinement implementation to get a consistent interface.
Definition base.cc:141
│ │ │ │ -
static ElementIterator eEnd(Dune::RefinementIntervals tag)
Get an ElementIterator.
Definition base.cc:247
│ │ │ │ -
static ElementIterator eBegin(Dune::RefinementIntervals tag)
Get an ElementIterator.
Definition base.cc:237
│ │ │ │ -
static int nElements(Dune::RefinementIntervals tag)
Get the number of Elements.
Definition base.cc:227
│ │ │ │ -
Codim< 0 >::SubEntityIterator ElementIterator
The ElementIterator of the Refinement.
Definition base.cc:163
│ │ │ │ -
static int nVertices(Dune::RefinementIntervals tag)
Get the number of Vertices.
Definition base.cc:197
│ │ │ │ -
static VertexIterator vBegin(Dune::RefinementIntervals tag)
Get a VertexIterator.
Definition base.cc:207
│ │ │ │ -
Codim< dimension >::SubEntityIterator VertexIterator
The VertexIterator of the Refinement.
Definition base.cc:161
│ │ │ │ -
typedef CoordVector
The CoordVector of the Refinement.
Definition base.cc:170
│ │ │ │ -
typedef IndexVector
The IndexVector of the Refinement.
Definition base.cc:177
│ │ │ │ -
RefinementImp::Traits< topologyId, CoordType, coerceToId, dimension_ >::Imp RefinementImp
Definition base.cc:180
│ │ │ │ -
static VertexIterator vEnd(Dune::RefinementIntervals tag)
Get a VertexIterator.
Definition base.cc:217
│ │ │ │ -
The Codim struct inherited from the Refinement implementation.
Definition base.cc:151
│ │ │ │ -
typedef SubEntityIterator
The SubEntityIterator for each codim.
Definition base.cc:157
│ │ │ │ +
@ size
Definition quadraturerules.hh:194
│ │ │ │ +
typename Container::ReferenceElement ReferenceElement
The reference element type.
Definition referenceelements.hh:146
│ │ │ │ +
static const ReferenceElement & general(const GeometryType &type)
get general reference elements
Definition referenceelements.hh:156
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,223 +1,767 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ - * _r_e_f_i_n_e_m_e_n_t │ │ │ │ │ -base.cc │ │ │ │ │ +referenceelementimplementation.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 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 © 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_BASE_CC │ │ │ │ │ -_6#define DUNE_GEOMETRY_REFINEMENT_BASE_CC │ │ │ │ │ +5#ifndef DUNE_GEOMETRY_REFERENCEELEMENTIMPLEMENTATION_HH │ │ │ │ │ +6#define DUNE_GEOMETRY_REFERENCEELEMENTIMPLEMENTATION_HH │ │ │ │ │ 7 │ │ │ │ │ -15#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ -16 │ │ │ │ │ -17namespace _D_u_n_e │ │ │ │ │ -18{ │ │ │ │ │ -_2_8 namespace RefinementImp │ │ │ │ │ -29 { │ │ │ │ │ -30 // ///////////////////////////////// │ │ │ │ │ -31 // │ │ │ │ │ -32 // Declaration of RefinementImp::Traits │ │ │ │ │ -33 // │ │ │ │ │ +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 │ │ │ │ │ +24 │ │ │ │ │ +25#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_._h_h> │ │ │ │ │ +26#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_a_f_f_i_n_e_g_e_o_m_e_t_r_y_._h_h> │ │ │ │ │ +27#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ +28 │ │ │ │ │ +29namespace _D_u_n_e │ │ │ │ │ +30{ │ │ │ │ │ +31 │ │ │ │ │ +32 namespace Geo │ │ │ │ │ +33 { │ │ │ │ │ 34 │ │ │ │ │ -35#ifdef DOXYGEN │ │ │ │ │ -36 // This is just for Doxygen │ │ │ │ │ -67 template │ │ │ │ │ -_6_9 struct _T_r_a_i_t_s │ │ │ │ │ -70 { │ │ │ │ │ -72 typedef SquaringTheCircle::Refinement Imp; │ │ │ │ │ -73 }; │ │ │ │ │ +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; │ │ │ │ │ +60 │ │ │ │ │ +62 unsigned int _s_i_z_e ( unsigned int topologyId, int dim, int codim ); │ │ │ │ │ +63 │ │ │ │ │ +64 │ │ │ │ │ +65 │ │ │ │ │ +73 unsigned int subTopologyId ( unsigned int topologyId, int dim, int codim, │ │ │ │ │ +unsigned int i ); │ │ │ │ │ 74 │ │ │ │ │ -75#else // !DOXYGEN │ │ │ │ │ +75 │ │ │ │ │ 76 │ │ │ │ │ -77 // Doxygen won't see this │ │ │ │ │ -78 │ │ │ │ │ -79 template │ │ │ │ │ -81 struct _T_r_a_i_t_s; │ │ │ │ │ +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 ); │ │ │ │ │ 82 │ │ │ │ │ -83#endif // !DOXYGEN │ │ │ │ │ -84 } // namespace RefinementImp │ │ │ │ │ +83 │ │ │ │ │ +84 │ │ │ │ │ 85 │ │ │ │ │ -86 │ │ │ │ │ -_9_4 class _R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s{ │ │ │ │ │ -95 int intervals_=1; │ │ │ │ │ -96 │ │ │ │ │ -97 public: │ │ │ │ │ -_9_8 explicit _R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s(int i) : intervals_(i) {} │ │ │ │ │ -99 │ │ │ │ │ -_1_0_0 int _i_n_t_e_r_v_a_l_s() const { return intervals_; } │ │ │ │ │ -101 }; │ │ │ │ │ -102 │ │ │ │ │ -_1_0_8 inline _R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s _r_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s(int intervals) │ │ │ │ │ -109 { │ │ │ │ │ -110 return _R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s{intervals}; │ │ │ │ │ -111 } │ │ │ │ │ -_1_1_7 inline _R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s _r_e_f_i_n_e_m_e_n_t_L_e_v_e_l_s(int levels) │ │ │ │ │ -118 { │ │ │ │ │ -119 return _R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s{1< │ │ │ │ │ -_1_3_8 class _S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -139 : public _R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_T_r_a_i_t_s::Imp │ │ │ │ │ -141 { │ │ │ │ │ -142 public: │ │ │ │ │ -143#ifdef DOXYGEN │ │ │ │ │ -149 template │ │ │ │ │ -_1_5_0 struct _C_o_d_i_m │ │ │ │ │ -151 { │ │ │ │ │ -_1_5_7 typedef _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r; │ │ │ │ │ -158 }; │ │ │ │ │ +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 == _s_i_z_e( 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 } │ │ │ │ │ +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 │ │ │ │ │ 159 │ │ │ │ │ -_1_6_1 typedef _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _V_e_r_t_e_x_I_t_e_r_a_t_o_r; │ │ │ │ │ -_1_6_3 typedef _C_o_d_i_m_<_0_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r; │ │ │ │ │ -164 │ │ │ │ │ -_1_7_0 typedef _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ +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 │ │ │ │ │ -_1_7_7 typedef _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ -178#endif │ │ │ │ │ -179 │ │ │ │ │ -_1_8_0 typedef typename RefinementImp::Traits< topologyId, CoordType, coerceToId, │ │ │ │ │ -dimension_>::Imp _R_e_f_i_n_e_m_e_n_t_I_m_p; │ │ │ │ │ -181 │ │ │ │ │ -182 using RefinementImp::dimension; │ │ │ │ │ -183 │ │ │ │ │ -184 using RefinementImp::Codim; │ │ │ │ │ -185 │ │ │ │ │ -186 using typename RefinementImp::VertexIterator; │ │ │ │ │ -187 using typename RefinementImp::CoordVector; │ │ │ │ │ -188 │ │ │ │ │ -189 using typename RefinementImp::ElementIterator; │ │ │ │ │ -190 using typename RefinementImp::IndexVector; │ │ │ │ │ -191 │ │ │ │ │ -_1_9_7 static int _n_V_e_r_t_i_c_e_s(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) │ │ │ │ │ -198 { │ │ │ │ │ -199 return RefinementImp::nVertices(tag._i_n_t_e_r_v_a_l_s()); │ │ │ │ │ -200 } │ │ │ │ │ -201 │ │ │ │ │ -_2_0_7 static _V_e_r_t_e_x_I_t_e_r_a_t_o_r _v_B_e_g_i_n(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) │ │ │ │ │ -208 { │ │ │ │ │ -209 return RefinementImp::vBegin(tag._i_n_t_e_r_v_a_l_s()); │ │ │ │ │ -210 } │ │ │ │ │ -211 │ │ │ │ │ -_2_1_7 static _V_e_r_t_e_x_I_t_e_r_a_t_o_r _v_E_n_d(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) │ │ │ │ │ -218 { │ │ │ │ │ -219 return RefinementImp::vEnd(tag._i_n_t_e_r_v_a_l_s()); │ │ │ │ │ -220 } │ │ │ │ │ -221 │ │ │ │ │ -_2_2_7 static int _n_E_l_e_m_e_n_t_s(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) │ │ │ │ │ -228 { │ │ │ │ │ -229 return RefinementImp::nElements(tag._i_n_t_e_r_v_a_l_s()); │ │ │ │ │ -230 } │ │ │ │ │ -231 │ │ │ │ │ -_2_3_7 static _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r _e_B_e_g_i_n(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) │ │ │ │ │ -238 { │ │ │ │ │ -239 return RefinementImp::eBegin(tag._i_n_t_e_r_v_a_l_s()); │ │ │ │ │ -240 } │ │ │ │ │ -241 │ │ │ │ │ -_2_4_7 static _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r _e_E_n_d(_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s tag) │ │ │ │ │ -248 { │ │ │ │ │ -249 return RefinementImp::eEnd(tag._i_n_t_e_r_v_a_l_s()); │ │ │ │ │ -250 } │ │ │ │ │ -251 }; │ │ │ │ │ -252 │ │ │ │ │ -254} // namespace Dune │ │ │ │ │ -255 │ │ │ │ │ -256#endif // DUNE_GEOMETRY_REFINEMENT_BASE_CC │ │ │ │ │ +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 │ │ │ │ │ +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( (0 < codim) && (codim <= dim) ) │ │ │ │ │ +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 // !isPrism │ │ │ │ │ +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 if( codim < dim ) │ │ │ │ │ +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 if( codim == 0 ) │ │ │ │ │ +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 │ │ │ │ │ +270 // this point should not be reached since all cases are handled before. │ │ │ │ │ +271 std::abort(); │ │ │ │ │ +272 return 0; │ │ │ │ │ +273 } │ │ │ │ │ +274 │ │ │ │ │ +275 │ │ │ │ │ +276 │ │ │ │ │ +277 // referenceIntegrationOuterNormals │ │ │ │ │ +278 // -------------------------------- │ │ │ │ │ +279 │ │ │ │ │ +280 template< class ct, int cdim > │ │ │ │ │ +281 inline unsigned int │ │ │ │ │ +282 referenceIntegrationOuterNormals ( unsigned int topologyId, int dim, │ │ │ │ │ +283 const FieldVector< ct, cdim > *origins, │ │ │ │ │ +284 FieldVector< ct, cdim > *normals ) │ │ │ │ │ +285 { │ │ │ │ │ +286 assert( (dim > 0) && (dim <= cdim) ); │ │ │ │ │ +287 assert( topologyId < numTopologies( dim ) ); │ │ │ │ │ +288 │ │ │ │ │ +289 if( dim > 1 ) │ │ │ │ │ +290 { │ │ │ │ │ +291 const unsigned int baseId = baseTopologyId( topologyId, dim ); │ │ │ │ │ +292 if( isPrism( topologyId, dim ) ) │ │ │ │ │ +293 { │ │ │ │ │ +294 const unsigned int numBaseFaces │ │ │ │ │ +295 = referenceIntegrationOuterNormals( baseId, dim-1, origins, normals ); │ │ │ │ │ +296 │ │ │ │ │ +297 for( unsigned int i = 0; i < 2; ++i ) │ │ │ │ │ +298 { │ │ │ │ │ +299 normals[ numBaseFaces+i ] = FieldVector< ct, cdim >( ct( 0 ) ); │ │ │ │ │ +300 normals[ numBaseFaces+i ][ dim-1 ] = ct( 2*int( i )-1 ); │ │ │ │ │ +301 } │ │ │ │ │ +302 │ │ │ │ │ +303 return numBaseFaces+2; │ │ │ │ │ +304 } │ │ │ │ │ +305 else │ │ │ │ │ +306 { │ │ │ │ │ +307 normals[ 0 ] = FieldVector< ct, cdim >( ct( 0 ) ); │ │ │ │ │ +308 normals[ 0 ][ dim-1 ] = ct( -1 ); │ │ │ │ │ +309 │ │ │ │ │ +310 const unsigned int numBaseFaces │ │ │ │ │ +311 = referenceIntegrationOuterNormals( baseId, dim-1, origins+1, normals+1 ); │ │ │ │ │ +312 for( unsigned int i = 1; i <= numBaseFaces; ++i ) │ │ │ │ │ +313 normals[ i ][ dim-1 ] = normals[ i ]*origins[ i ]; │ │ │ │ │ +314 │ │ │ │ │ +315 return numBaseFaces+1; │ │ │ │ │ +316 } │ │ │ │ │ +317 } │ │ │ │ │ +318 else │ │ │ │ │ +319 { │ │ │ │ │ +320 for( unsigned int i = 0; i < 2; ++i ) │ │ │ │ │ +321 { │ │ │ │ │ +322 normals[ i ] = FieldVector< ct, cdim >( ct( 0 ) ); │ │ │ │ │ +323 normals[ i ][ 0 ] = ct( 2*int( i )-1 ); │ │ │ │ │ +324 } │ │ │ │ │ +325 │ │ │ │ │ +326 return 2; │ │ │ │ │ +327 } │ │ │ │ │ +328 } │ │ │ │ │ +329 │ │ │ │ │ +330 template< class ct, int cdim > │ │ │ │ │ +331 inline unsigned int │ │ │ │ │ +332 referenceIntegrationOuterNormals ( unsigned int topologyId, int dim, │ │ │ │ │ +333 FieldVector< ct, cdim > *normals ) │ │ │ │ │ +334 { │ │ │ │ │ +335 assert( (dim > 0) && (dim <= cdim) ); │ │ │ │ │ +336 │ │ │ │ │ +337 FieldVector< ct, cdim > *origins │ │ │ │ │ +338 = new FieldVector< ct, cdim >[ _s_i_z_e( topologyId, dim, 1 ) ]; │ │ │ │ │ +339 referenceOrigins( topologyId, dim, 1, origins ); │ │ │ │ │ +340 │ │ │ │ │ +341 const unsigned int numFaces │ │ │ │ │ +342 = referenceIntegrationOuterNormals( topologyId, dim, origins, normals ); │ │ │ │ │ +343 assert( numFaces == _s_i_z_e( topologyId, dim, 1 ) ); │ │ │ │ │ +344 │ │ │ │ │ +345 delete[] origins; │ │ │ │ │ +346 │ │ │ │ │ +347 return numFaces; │ │ │ │ │ +348 } │ │ │ │ │ +349 │ │ │ │ │ +350 } // namespace Impl │ │ │ │ │ +351 │ │ │ │ │ +352 │ │ │ │ │ +353 │ │ │ │ │ +354 // ReferenceElement │ │ │ │ │ +355 // ---------------- │ │ │ │ │ +356 │ │ │ │ │ +375 template< class ctype_, int dim > │ │ │ │ │ +376 class ReferenceElementImplementation │ │ │ │ │ +377 { │ │ │ │ │ +378 │ │ │ │ │ +379 public: │ │ │ │ │ +380 │ │ │ │ │ +382 using ctype = ctype_; │ │ │ │ │ +383 │ │ │ │ │ +385 using CoordinateField = ctype; │ │ │ │ │ +386 │ │ │ │ │ +388 using Coordinate = Dune::FieldVector; │ │ │ │ │ +389 │ │ │ │ │ +391 static constexpr int dimension = dim; │ │ │ │ │ +392 │ │ │ │ │ +394 typedef ctype Volume; │ │ │ │ │ +395 │ │ │ │ │ +396 private: │ │ │ │ │ +397 │ │ │ │ │ +398 friend class Impl::ReferenceElementContainer< ctype, dim >; │ │ │ │ │ +399 │ │ │ │ │ +400 struct SubEntityInfo; │ │ │ │ │ +401 │ │ │ │ │ +402 template< int codim > struct CreateGeometries; │ │ │ │ │ +403 │ │ │ │ │ +404 public: │ │ │ │ │ +406 template< int codim > │ │ │ │ │ +407 struct Codim │ │ │ │ │ +408 { │ │ │ │ │ +410 typedef AffineGeometry< ctype, dim-codim, dim > Geometry; │ │ │ │ │ +411 }; │ │ │ │ │ +412 │ │ │ │ │ +413 // ReferenceElement cannot be copied. │ │ │ │ │ +414 ReferenceElementImplementation ( const ReferenceElementImplementation& ) = │ │ │ │ │ +delete; │ │ │ │ │ +415 │ │ │ │ │ +416 // ReferenceElementImplementation cannot be copied. │ │ │ │ │ +417 ReferenceElementImplementation& operator= ( const │ │ │ │ │ +ReferenceElementImplementation& ) = delete; │ │ │ │ │ +418 │ │ │ │ │ +419 // ReferenceElementImplementation is default-constructible (required for │ │ │ │ │ +storage in std::array) │ │ │ │ │ +420 ReferenceElementImplementation () = default; │ │ │ │ │ +421 │ │ │ │ │ +426 int _s_i_z_e ( int c ) const │ │ │ │ │ +427 { │ │ │ │ │ +428 assert( (c >= 0) && (c <= dim) ); │ │ │ │ │ +429 return info_[ c ].size(); │ │ │ │ │ +430 } │ │ │ │ │ +431 │ │ │ │ │ +443 int _s_i_z_e ( int i, int c, int cc ) const │ │ │ │ │ +444 { │ │ │ │ │ +445 assert( (i >= 0) && (i < _s_i_z_e( c )) ); │ │ │ │ │ +446 return info_[ c ][ i ].size( cc ); │ │ │ │ │ +447 } │ │ │ │ │ +448 │ │ │ │ │ +462 int subEntity ( int i, int c, int ii, int cc ) const │ │ │ │ │ +463 { │ │ │ │ │ +464 assert( (i >= 0) && (i < _s_i_z_e( c )) ); │ │ │ │ │ +465 return info_[ c ][ i ].number( ii, cc ); │ │ │ │ │ +466 } │ │ │ │ │ +467 │ │ │ │ │ +483 auto subEntities ( int i, int c, int cc ) const │ │ │ │ │ +484 { │ │ │ │ │ +485 assert( (i >= 0) && (i < _s_i_z_e( c )) ); │ │ │ │ │ +486 return info_[ c ][ i ].numbers( cc ); │ │ │ │ │ +487 } │ │ │ │ │ +488 │ │ │ │ │ +497 const GeometryType &type ( int i, int c ) const │ │ │ │ │ +498 { │ │ │ │ │ +499 assert( (i >= 0) && (i < _s_i_z_e( c )) ); │ │ │ │ │ +500 return info_[ c ][ i ].type(); │ │ │ │ │ +501 } │ │ │ │ │ +502 │ │ │ │ │ +504 const GeometryType &type () const { return type( 0, 0 ); } │ │ │ │ │ +505 │ │ │ │ │ +515 const Coordinate &position( int i, int c ) const │ │ │ │ │ +516 { │ │ │ │ │ +517 assert( (c >= 0) && (c <= dim) ); │ │ │ │ │ +518 return baryCenters_[ c ][ i ]; │ │ │ │ │ +519 } │ │ │ │ │ +520 │ │ │ │ │ +528 bool checkInside ( const Coordinate &local ) const │ │ │ │ │ +529 { │ │ │ │ │ +530 const ctype tolerance = ctype( 64 ) * std::numeric_limits< ctype >::epsilon │ │ │ │ │ +(); │ │ │ │ │ +531 return Impl::template checkInside< ctype, dim >( type().id(), dim, local, │ │ │ │ │ +tolerance ); │ │ │ │ │ +532 } │ │ │ │ │ +533 │ │ │ │ │ +545 template< int codim > │ │ │ │ │ +546 typename Codim< codim >::Geometry geometry ( int i ) const │ │ │ │ │ +547 { │ │ │ │ │ +548 return std::get< codim >( geometries_ )[ i ]; │ │ │ │ │ +549 } │ │ │ │ │ +550 │ │ │ │ │ +552 Volume volume () const │ │ │ │ │ +553 { │ │ │ │ │ +554 return volume_; │ │ │ │ │ +555 } │ │ │ │ │ +556 │ │ │ │ │ +564 const Coordinate &integrationOuterNormal ( int face ) const │ │ │ │ │ +565 { │ │ │ │ │ +566 assert( (face >= 0) && (face < int( integrationNormals_.size() )) ); │ │ │ │ │ +567 return integrationNormals_[ face ]; │ │ │ │ │ +568 } │ │ │ │ │ +569 │ │ │ │ │ +570 private: │ │ │ │ │ +571 void initialize ( unsigned int topologyId ) │ │ │ │ │ +572 { │ │ │ │ │ +573 assert( topologyId < Impl::numTopologies( dim ) ); │ │ │ │ │ +574 │ │ │ │ │ +575 // set up subentities │ │ │ │ │ +576 for( int codim = 0; codim <= dim; ++codim ) │ │ │ │ │ +577 { │ │ │ │ │ +578 const unsigned int _s_i_z_e = Impl::size( topologyId, dim, codim ); │ │ │ │ │ +579 info_[ codim ].resize( size ); │ │ │ │ │ +580 for( unsigned int i = 0; i < _s_i_z_e; ++i ) │ │ │ │ │ +581 info_[ codim ][ i ].initialize( topologyId, codim, i ); │ │ │ │ │ +582 } │ │ │ │ │ +583 │ │ │ │ │ +584 // compute corners │ │ │ │ │ +585 const unsigned int numVertices = _s_i_z_e( dim ); │ │ │ │ │ +586 baryCenters_[ dim ].resize( numVertices ); │ │ │ │ │ +587 Impl::referenceCorners( topologyId, dim, &(baryCenters_[ dim ][ 0 ]) ); │ │ │ │ │ +588 │ │ │ │ │ +589 // compute barycenters │ │ │ │ │ +590 for( int codim = 0; codim < dim; ++codim ) │ │ │ │ │ +591 { │ │ │ │ │ +592 baryCenters_[ codim ].resize( _s_i_z_e(codim) ); │ │ │ │ │ +593 for( int i = 0; i < _s_i_z_e( codim ); ++i ) │ │ │ │ │ +594 { │ │ │ │ │ +595 baryCenters_[ codim ][ i ] = Coordinate( ctype( 0 ) ); │ │ │ │ │ +596 const unsigned int numCorners = _s_i_z_e( i, codim, dim ); │ │ │ │ │ +597 for( unsigned int j = 0; j < numCorners; ++j ) │ │ │ │ │ +598 baryCenters_[ codim ][ i ] += baryCenters_[ dim ][ subEntity( i, codim, j, │ │ │ │ │ +dim ) ]; │ │ │ │ │ +599 baryCenters_[ codim ][ i ] *= ctype( 1 ) / ctype( numCorners ); │ │ │ │ │ +600 } │ │ │ │ │ +601 } │ │ │ │ │ +602 │ │ │ │ │ +603 // compute reference element volume │ │ │ │ │ +604 volume_ = Impl::template referenceVolume< ctype >( topologyId, dim ); │ │ │ │ │ +605 │ │ │ │ │ +606 // compute integration outer normals │ │ │ │ │ +607 if( dim > 0 ) │ │ │ │ │ +608 { │ │ │ │ │ +609 integrationNormals_.resize( _s_i_z_e( 1 ) ); │ │ │ │ │ +610 Impl::referenceIntegrationOuterNormals( topologyId, dim, & │ │ │ │ │ +(integrationNormals_[ 0 ]) ); │ │ │ │ │ +611 } │ │ │ │ │ +612 │ │ │ │ │ +613 // set up geometries │ │ │ │ │ +614 Hybrid::forEach( std::make_index_sequence< dim+1 >{}, [ & ]( auto i ) │ │ │ │ │ +{ CreateGeometries< i >::apply( *this, geometries_ ); } ); │ │ │ │ │ +615 } │ │ │ │ │ +616 │ │ │ │ │ +617 template< int... codim > │ │ │ │ │ +618 static std::tuple< std::vector< typename Codim< codim >::Geometry >... > │ │ │ │ │ +619 makeGeometryTable ( std::integer_sequence< int, codim... > ); │ │ │ │ │ +620 │ │ │ │ │ +622 typedef decltype( makeGeometryTable( std::make_integer_sequence< int, dim+1 │ │ │ │ │ +>() ) ) GeometryTable; │ │ │ │ │ +623 │ │ │ │ │ +625 ctype volume_; │ │ │ │ │ +626 │ │ │ │ │ +627 std::vector< Coordinate > baryCenters_[ dim+1 ]; │ │ │ │ │ +628 std::vector< Coordinate > integrationNormals_; │ │ │ │ │ +629 │ │ │ │ │ +631 GeometryTable geometries_; │ │ │ │ │ +632 │ │ │ │ │ +633 std::vector< SubEntityInfo > info_[ dim+1 ]; │ │ │ │ │ +634 }; │ │ │ │ │ +635 │ │ │ │ │ +637 template< class ctype, int dim > │ │ │ │ │ +638 struct ReferenceElementImplementation< ctype, dim >::SubEntityInfo │ │ │ │ │ +639 { │ │ │ │ │ +640 // Compute upper bound for the number of subsentities. │ │ │ │ │ +641 // If someone knows an explicit formal feel free to │ │ │ │ │ +642 // implement it here. │ │ │ │ │ +643 static constexpr std::size_t maxSubEntityCount() │ │ │ │ │ +644 { │ │ │ │ │ +645 std::size_t maxCount=0; │ │ │ │ │ +646 for(std::size_t codim=0; codim<=dim; ++codim) │ │ │ │ │ +647 maxCount = std::max(maxCount, binomial(std::size_t(dim),codim)*(1 << │ │ │ │ │ +codim)); │ │ │ │ │ +648 return maxCount; │ │ │ │ │ +649 } │ │ │ │ │ +650 │ │ │ │ │ +651 using SubEntityFlags = std::bitset; │ │ │ │ │ +652 │ │ │ │ │ +653 class SubEntityRange │ │ │ │ │ +654 : public Dune::IteratorRange │ │ │ │ │ +655 { │ │ │ │ │ +656 using Base = typename Dune::IteratorRange; │ │ │ │ │ +657 │ │ │ │ │ +658 public: │ │ │ │ │ +659 │ │ │ │ │ +660 using iterator = Base::iterator; │ │ │ │ │ +661 using const_iterator = Base::const_iterator; │ │ │ │ │ +662 │ │ │ │ │ +663 SubEntityRange(const iterator& begin, const iterator& end, const │ │ │ │ │ +SubEntityFlags& contains) : │ │ │ │ │ +664 Base(begin, end), │ │ │ │ │ +665 containsPtr_(&contains), │ │ │ │ │ +666 size_(end-begin) │ │ │ │ │ +667 {} │ │ │ │ │ +668 │ │ │ │ │ +669 SubEntityRange() : │ │ │ │ │ +670 Base(), │ │ │ │ │ +671 containsPtr_(nullptr), │ │ │ │ │ +672 size_(0) │ │ │ │ │ +673 {} │ │ │ │ │ +674 │ │ │ │ │ +675 std::size_t _s_i_z_e() const │ │ │ │ │ +676 { │ │ │ │ │ +677 return size_; │ │ │ │ │ +678 } │ │ │ │ │ +679 │ │ │ │ │ +680 bool contains(std::size_t i) const │ │ │ │ │ +681 { │ │ │ │ │ +682 return (*containsPtr_)[i]; │ │ │ │ │ +683 } │ │ │ │ │ +684 │ │ │ │ │ +685 private: │ │ │ │ │ +686 const SubEntityFlags* containsPtr_; │ │ │ │ │ +687 std::size_t size_; │ │ │ │ │ +688 std::size_t offset_; │ │ │ │ │ +689 }; │ │ │ │ │ +690 │ │ │ │ │ +691 using NumberRange = typename Dune::IteratorRange; │ │ │ │ │ +692 │ │ │ │ │ +693 SubEntityInfo () │ │ │ │ │ +694 : numbering_( nullptr ) │ │ │ │ │ +695 { │ │ │ │ │ +696 std::fill( offset_.begin(), offset_.end(), 0 ); │ │ │ │ │ +697 } │ │ │ │ │ +698 │ │ │ │ │ +699 SubEntityInfo ( const SubEntityInfo &other ) │ │ │ │ │ +700 : offset_( other.offset_ ), │ │ │ │ │ +701 type_( other.type_ ), │ │ │ │ │ +702 containsSubentity_( other.containsSubentity_ ) │ │ │ │ │ +703 { │ │ │ │ │ +704 numbering_ = allocate(); │ │ │ │ │ +705 std::copy( other.numbering_, other.numbering_ + capacity(), numbering_ ); │ │ │ │ │ +706 } │ │ │ │ │ +707 │ │ │ │ │ +708 ~SubEntityInfo () { deallocate( numbering_ ); } │ │ │ │ │ +709 │ │ │ │ │ +710 const SubEntityInfo &operator= ( const SubEntityInfo &other ) │ │ │ │ │ +711 { │ │ │ │ │ +712 type_ = other.type_; │ │ │ │ │ +713 offset_ = other.offset_; │ │ │ │ │ +714 │ │ │ │ │ +715 deallocate( numbering_ ); │ │ │ │ │ +716 numbering_ = allocate(); │ │ │ │ │ +717 std::copy( other.numbering_, other.numbering_ + capacity(), numbering_ ); │ │ │ │ │ +718 │ │ │ │ │ +719 containsSubentity_ = other.containsSubentity_; │ │ │ │ │ +720 │ │ │ │ │ +721 return *this; │ │ │ │ │ +722 } │ │ │ │ │ +723 │ │ │ │ │ +724 int _s_i_z_e ( int cc ) const │ │ │ │ │ +725 { │ │ │ │ │ +726 assert( (cc >= 0) && (cc <= dim) ); │ │ │ │ │ +727 return (offset_[ cc+1 ] - offset_[ cc ]); │ │ │ │ │ +728 } │ │ │ │ │ +729 │ │ │ │ │ +730 int number ( int ii, int cc ) const │ │ │ │ │ +731 { │ │ │ │ │ +732 assert( (ii >= 0) && (ii < _s_i_z_e( cc )) ); │ │ │ │ │ +733 return numbering_[ offset_[ cc ] + ii ]; │ │ │ │ │ +734 } │ │ │ │ │ +735 │ │ │ │ │ +736 auto numbers ( int cc ) const │ │ │ │ │ +737 { │ │ │ │ │ +738 return SubEntityRange( numbering_ + offset_[ cc ], numbering_ + offset_ │ │ │ │ │ +[ cc+1 ], containsSubentity_[cc]); │ │ │ │ │ +739 } │ │ │ │ │ +740 │ │ │ │ │ +741 const GeometryType &type () const { return type_; } │ │ │ │ │ +742 │ │ │ │ │ +743 void initialize ( unsigned int topologyId, int codim, unsigned int i ) │ │ │ │ │ +744 { │ │ │ │ │ +745 const unsigned int subId = Impl::subTopologyId( topologyId, dim, codim, i │ │ │ │ │ +); │ │ │ │ │ +746 type_ = GeometryType( subId, dim-codim ); │ │ │ │ │ +747 │ │ │ │ │ +748 // compute offsets │ │ │ │ │ +749 for( int cc = 0; cc <= codim; ++cc ) │ │ │ │ │ +750 offset_[ cc ] = 0; │ │ │ │ │ +751 for( int cc = codim; cc <= dim; ++cc ) │ │ │ │ │ +752 offset_[ cc+1 ] = offset_[ cc ] + Impl::size( subId, dim-codim, cc-codim ); │ │ │ │ │ +753 │ │ │ │ │ +754 // compute subnumbering │ │ │ │ │ +755 deallocate( numbering_ ); │ │ │ │ │ +756 numbering_ = allocate(); │ │ │ │ │ +757 for( int cc = codim; cc <= dim; ++cc ) │ │ │ │ │ +758 Impl::subTopologyNumbering( topologyId, dim, codim, i, cc-codim, │ │ │ │ │ +numbering_+offset_[ cc ], numbering_+offset_[ cc+1 ] ); │ │ │ │ │ +759 │ │ │ │ │ +760 // initialize containsSubentity lookup-table │ │ │ │ │ +761 for(std::size_t cc=0; cc<= dim; ++cc) │ │ │ │ │ +762 { │ │ │ │ │ +763 containsSubentity_[cc].reset(); │ │ │ │ │ +764 for(std::size_t idx=0; idx offset_; │ │ │ │ │ +779 GeometryType type_; │ │ │ │ │ +780 std::array< SubEntityFlags, dim+1> containsSubentity_; │ │ │ │ │ +781 }; │ │ │ │ │ +782 │ │ │ │ │ +783 │ │ │ │ │ +784 template< class ctype, int dim > │ │ │ │ │ +785 template< int codim > │ │ │ │ │ +786 struct ReferenceElementImplementation< ctype, dim >::CreateGeometries │ │ │ │ │ +787 { │ │ │ │ │ +788 template< int cc > │ │ │ │ │ +789 static typename ReferenceElements< ctype, dim-cc >::ReferenceElement │ │ │ │ │ +790 subRefElement( const ReferenceElementImplementation< ctype, dim > │ │ │ │ │ +&refElement, int i, std::integral_constant< int, cc > ) │ │ │ │ │ +791 { │ │ │ │ │ +792 return _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_<_ _c_t_y_p_e_,_ _d_i_m_-_c_c_ _>_:_:_g_e_n_e_r_a_l( refElement.type( i, cc │ │ │ │ │ +) ); │ │ │ │ │ +793 } │ │ │ │ │ +794 │ │ │ │ │ +795 static typename _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_<_ _c_t_y_p_e_,_ _d_i_m_ _>_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ +796 subRefElement(const ReferenceElementImplementation< ctype, dim > │ │ │ │ │ +&refElement, │ │ │ │ │ +797 [[maybe_unused]] int i, std::integral_constant) │ │ │ │ │ +798 { │ │ │ │ │ +799 return refElement; │ │ │ │ │ +800 } │ │ │ │ │ +801 │ │ │ │ │ +802 static void apply ( const ReferenceElementImplementation< ctype, dim > │ │ │ │ │ +&refElement, GeometryTable &geometries ) │ │ │ │ │ +803 { │ │ │ │ │ +804 const int _s_i_z_e = refElement.size( codim ); │ │ │ │ │ +805 std::vector< FieldVector< ctype, dim > > origins( size ); │ │ │ │ │ +806 std::vector< FieldMatrix< ctype, dim - codim, dim > > jacobianTransposeds │ │ │ │ │ +( size ); │ │ │ │ │ +807 Impl::referenceEmbeddings( refElement.type().id(), dim, codim, &(origins[ 0 │ │ │ │ │ +]), &(jacobianTransposeds[ 0 ]) ); │ │ │ │ │ +808 │ │ │ │ │ +809 std::get< codim >( geometries ).reserve( size ); │ │ │ │ │ +810 for( int i = 0; i < _s_i_z_e; ++i ) │ │ │ │ │ +811 { │ │ │ │ │ +812 typename Codim< codim >::Geometry geometry( subRefElement( refElement, i, │ │ │ │ │ +std::integral_constant< int, codim >() ), origins[ i ], jacobianTransposeds[ i │ │ │ │ │ +] ); │ │ │ │ │ +813 std::get< codim >( geometries ).push_back( geometry ); │ │ │ │ │ +814 } │ │ │ │ │ +815 } │ │ │ │ │ +816 }; │ │ │ │ │ +817 │ │ │ │ │ +818#endif // DOXYGEN │ │ │ │ │ +819 │ │ │ │ │ +820 } // namespace Geo │ │ │ │ │ +821 │ │ │ │ │ +822} // namespace Dune │ │ │ │ │ +823 │ │ │ │ │ +824#endif // #ifndef DUNE_GEOMETRY_REFERENCEELEMENTIMPLEMENTATION_HH │ │ │ │ │ +_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_._h_h │ │ │ │ │ _t_y_p_e_._h_h │ │ │ │ │ A unique label for each type of element that can occur in a grid. │ │ │ │ │ -_D_u_n_e_:_:_r_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s │ │ │ │ │ -RefinementIntervals refinementIntervals(int intervals) │ │ │ │ │ -Creates a RefinementIntervals object. │ │ │ │ │ -DDeeffiinniittiioonn base.cc:108 │ │ │ │ │ -_D_u_n_e_:_:_r_e_f_i_n_e_m_e_n_t_L_e_v_e_l_s │ │ │ │ │ -RefinementIntervals refinementLevels(int levels) │ │ │ │ │ -Creates a RefinementIntervals object. │ │ │ │ │ -DDeeffiinniittiioonn base.cc:117 │ │ │ │ │ +_a_f_f_i_n_e_g_e_o_m_e_t_r_y_._h_h │ │ │ │ │ +An implementation of the Geometry interface for affine geometries. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn affinegeometry.hh:21 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_T_r_a_i_t_s │ │ │ │ │ -Mapping from geometryType, CoordType and coerceTo to a particular Refinement │ │ │ │ │ -implementation. │ │ │ │ │ -DDeeffiinniittiioonn base.cc:70 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s │ │ │ │ │ -Holds the number of refined intervals per axis needed for virtual and static │ │ │ │ │ -refinement. │ │ │ │ │ -DDeeffiinniittiioonn base.cc:94 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s │ │ │ │ │ -RefinementIntervals(int i) │ │ │ │ │ -DDeeffiinniittiioonn base.cc:98 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_n_t_e_r_v_a_l_s_:_:_i_n_t_e_r_v_a_l_s │ │ │ │ │ -int intervals() const │ │ │ │ │ -DDeeffiinniittiioonn base.cc:100 │ │ │ │ │ -_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -Wrap each Refinement implementation to get a consistent interface. │ │ │ │ │ -DDeeffiinniittiioonn base.cc:141 │ │ │ │ │ -_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_e_E_n_d │ │ │ │ │ -static ElementIterator eEnd(Dune::RefinementIntervals tag) │ │ │ │ │ -Get an ElementIterator. │ │ │ │ │ -DDeeffiinniittiioonn base.cc:247 │ │ │ │ │ -_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_e_B_e_g_i_n │ │ │ │ │ -static ElementIterator eBegin(Dune::RefinementIntervals tag) │ │ │ │ │ -Get an ElementIterator. │ │ │ │ │ -DDeeffiinniittiioonn base.cc:237 │ │ │ │ │ -_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_n_E_l_e_m_e_n_t_s │ │ │ │ │ -static int nElements(Dune::RefinementIntervals tag) │ │ │ │ │ -Get the number of Elements. │ │ │ │ │ -DDeeffiinniittiioonn base.cc:227 │ │ │ │ │ -_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ -Codim< 0 >::SubEntityIterator ElementIterator │ │ │ │ │ -The ElementIterator of the Refinement. │ │ │ │ │ -DDeeffiinniittiioonn base.cc:163 │ │ │ │ │ -_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_n_V_e_r_t_i_c_e_s │ │ │ │ │ -static int nVertices(Dune::RefinementIntervals tag) │ │ │ │ │ -Get the number of Vertices. │ │ │ │ │ -DDeeffiinniittiioonn base.cc:197 │ │ │ │ │ -_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_v_B_e_g_i_n │ │ │ │ │ -static VertexIterator vBegin(Dune::RefinementIntervals tag) │ │ │ │ │ -Get a VertexIterator. │ │ │ │ │ -DDeeffiinniittiioonn base.cc:207 │ │ │ │ │ -_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ -Codim< dimension >::SubEntityIterator VertexIterator │ │ │ │ │ -The VertexIterator of the Refinement. │ │ │ │ │ -DDeeffiinniittiioonn base.cc:161 │ │ │ │ │ -_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -typedef CoordVector │ │ │ │ │ -The CoordVector of the Refinement. │ │ │ │ │ -DDeeffiinniittiioonn base.cc:170 │ │ │ │ │ -_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ -typedef IndexVector │ │ │ │ │ -The IndexVector of the Refinement. │ │ │ │ │ -DDeeffiinniittiioonn base.cc:177 │ │ │ │ │ -_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ -RefinementImp::Traits< topologyId, CoordType, coerceToId, dimension_ >::Imp │ │ │ │ │ -RefinementImp │ │ │ │ │ -DDeeffiinniittiioonn base.cc:180 │ │ │ │ │ -_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_v_E_n_d │ │ │ │ │ -static VertexIterator vEnd(Dune::RefinementIntervals tag) │ │ │ │ │ -Get a VertexIterator. │ │ │ │ │ -DDeeffiinniittiioonn base.cc:217 │ │ │ │ │ -_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m │ │ │ │ │ -The Codim struct inherited from the Refinement implementation. │ │ │ │ │ -DDeeffiinniittiioonn base.cc:151 │ │ │ │ │ -_D_u_n_e_:_:_S_t_a_t_i_c_R_e_f_i_n_e_m_e_n_t_:_:_C_o_d_i_m_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ -typedef SubEntityIterator │ │ │ │ │ -The SubEntityIterator for each codim. │ │ │ │ │ -DDeeffiinniittiioonn base.cc:157 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_s_i_z_e │ │ │ │ │ +@ size │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:194 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ +typename Container::ReferenceElement ReferenceElement │ │ │ │ │ +The reference element type. │ │ │ │ │ +DDeeffiinniittiioonn referenceelements.hh:146 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_g_e_n_e_r_a_l │ │ │ │ │ +static const ReferenceElement & general(const GeometryType &type) │ │ │ │ │ +get general reference elements │ │ │ │ │ +DDeeffiinniittiioonn referenceelements.hh:156 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00221.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: prismtriangulation.cc File Reference │ │ │ │ +dune-geometry: dimension.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,86 +65,42 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Macros | │ │ │ │ -Functions
│ │ │ │ -
prismtriangulation.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::PrismTriangulation::RefinementImp< dimension_, CoordType >
 Implementation of the refinement of a prism into simplices. More...
struct  Dune::Dim< dim >
 Static tag representing a dimension. 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 >
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::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 {} │ │ │ │ │ @@ -1,57 +1,22 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ - * _r_e_f_i_n_e_m_e_n_t │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -prismtriangulation.cc File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ -#include "_b_a_s_e_._c_c" │ │ │ │ │ -#include "_s_i_m_p_l_e_x_._c_c" │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +dimension.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ - class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___, │ │ │ │ │ - _C_o_o_r_d_T_y_p_e_ _> │ │ │ │ │ -  Implementation of the refinement of a prism into simplices. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_D_i_m_<_ _d_i_m_ _> │ │ │ │ │ +  Static tag representing a dimension. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___, │ │ │ │ │ - _C_o_o_r_d_T_y_p_e_ _>_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ - _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_< │ │ │ │ │ - _d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_ _d_i_m_e_n_s_i_o_n___, │ │ │ │ │ - _C_o_o_r_d_T_y_p_e_ _>_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _> │ │ │ │ │ +struct   _D_u_n_e_:_:_C_o_d_i_m_<_ _c_o_d_i_m_ _> │ │ │ │ │ +  Static tag representing a codimension. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ -  This namespace contains the implementation of _R_e_f_i_n_e_m_e_n_t. │ │ │ │ │ -  │ │ │ │ │ -namespace   _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n │ │ │ │ │ -  This namespace contains the _R_e_f_i_n_e_m_e_n_t implementation for │ │ │ │ │ - triangulating prisms (_G_e_o_m_e_t_r_y_T_y_p_e_:_:_p_r_i_s_m -> _G_e_o_m_e_t_r_y_T_y_p_e_:_:_s_i_m_p_l_e_x) │ │ │ │ │ -  │ │ │ │ │ -MMaaccrrooss │ │ │ │ │ -#define  _D_U_N_E___G_E_O_M_E_T_R_Y___R_E_F_I_N_E_M_E_N_T___P_R_I_S_M_T_R_I_A_N_G_U_L_A_T_I_O_N___C_C │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -template │ │ │ │ │ -FieldVector< CoordType, dimension >  _D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_: │ │ │ │ │ - _t_r_a_n_s_f_o_r_m_C_o_o_r_d_i_n_a_t_e (FieldVector< │ │ │ │ │ - CoordType, dimension > point) │ │ │ │ │ -  │ │ │ │ │ -********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ -********** _?◆_? DDUUNNEE__GGEEOOMMEETTRRYY__RREEFFIINNEEMMEENNTT__PPRRIISSMMTTRRIIAANNGGUULLAATTIIOONN__CCCC ********** │ │ │ │ │ -#define DUNE_GEOMETRY_REFINEMENT_PRISMTRIANGULATION_CC │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00221_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: prismtriangulation.cc Source File │ │ │ │ +dune-geometry: dimension.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,521 +70,58 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
prismtriangulation.cc
│ │ │ │ +
dimension.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 © 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_PRISMTRIANGULATION_CC
│ │ │ │ -
6#define DUNE_GEOMETRY_REFINEMENT_PRISMTRIANGULATION_CC
│ │ │ │ +
5#ifndef DUNE_GEOMETRY_DIMENSION_HH
│ │ │ │ +
6#define DUNE_GEOMETRY_DIMENSION_HH
│ │ │ │
7
│ │ │ │ -
8#include <dune/common/fvector.hh>
│ │ │ │ -
9#include <dune/common/typetraits.hh>
│ │ │ │ -
10
│ │ │ │ - │ │ │ │ -
12#include <dune/geometry/type.hh>
│ │ │ │ -
13
│ │ │ │ -
14#include "base.cc"
│ │ │ │ -
15#include "simplex.cc"
│ │ │ │ -
16
│ │ │ │ -
17namespace Dune
│ │ │ │ -
18{
│ │ │ │ -
19 namespace RefinementImp
│ │ │ │ -
20 {
│ │ │ │ -
│ │ │ │ -
26 namespace PrismTriangulation
│ │ │ │ -
27 {
│ │ │ │ -
28 // ////////////
│ │ │ │ -
29 //
│ │ │ │ -
30 // Utilities
│ │ │ │ -
31 //
│ │ │ │ -
32
│ │ │ │ - │ │ │ │ - │ │ │ │ -
35
│ │ │ │ -
36 // ////////////////////////////////////
│ │ │ │ -
37 //
│ │ │ │ -
38 // Refine a prism with simplices
│ │ │ │ -
39 //
│ │ │ │ -
40
│ │ │ │ -
41 // forward declaration of the iterator base
│ │ │ │ -
42 template<int dimension, class CoordType, int codimension>
│ │ │ │ - │ │ │ │ -
44 /*
│ │ │ │ -
45 * The permutations 0,2 and 3 of the Kuhn-decomposition of a cube into simplices form a prism.
│ │ │ │ -
46 * The resulting prism is not oriented the same as the reference prism and so the Kuhn-coordinates
│ │ │ │ -
47 * have to be transformed using the method below.
│ │ │ │ -
48 */
│ │ │ │ -
49 template<int dimension, class CoordType> FieldVector<CoordType, dimension>
│ │ │ │ -
│ │ │ │ -
50 transformCoordinate(FieldVector<CoordType, dimension> point)
│ │ │ │ -
51 {
│ │ │ │ -
52 FieldVector<CoordType, dimension> transform;
│ │ │ │ -
53 transform[0] = point[1];
│ │ │ │ -
54 transform[1] = 1 - point[0];
│ │ │ │ -
55 transform[2] = point[2];
│ │ │ │ -
56 return transform;
│ │ │ │ -
57 }
│ │ │ │ -
│ │ │ │ -
58
│ │ │ │ -
65 template<int dimension_, class CoordType>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
67 {
│ │ │ │ -
68 public:
│ │ │ │ -
69 constexpr static int dimension = dimension_;
│ │ │ │ -
70
│ │ │ │ -
71 typedef CoordType ctype;
│ │ │ │ -
72
│ │ │ │ -
73 template<int codimension>
│ │ │ │ -
74 struct Codim;
│ │ │ │ - │ │ │ │ -
76 typedef FieldVector<CoordType, dimension> CoordVector;
│ │ │ │ - │ │ │ │ -
78 typedef FieldVector<int, dimension+1> IndexVector;
│ │ │ │ -
79
│ │ │ │ -
80 static int nVertices(int nIntervals);
│ │ │ │ -
81 static VertexIterator vBegin(int nIntervals);
│ │ │ │ -
82 static VertexIterator vEnd(int nIntervals);
│ │ │ │ -
83
│ │ │ │ -
84 static int nElements(int nIntervals);
│ │ │ │ -
85 static ElementIterator eBegin(int nIntervals);
│ │ │ │ -
86 static ElementIterator eEnd(int nIntervals);
│ │ │ │ -
87
│ │ │ │ -
88 private:
│ │ │ │ -
89 friend class RefinementIteratorSpecial<dimension, CoordType, 0>;
│ │ │ │ -
90 friend class RefinementIteratorSpecial<dimension, CoordType, dimension>;
│ │ │ │ -
91
│ │ │ │ - │ │ │ │ -
93 };
│ │ │ │ -
│ │ │ │ -
94
│ │ │ │ -
95 template<int dimension, class CoordType>
│ │ │ │ -
96 template<int codimension>
│ │ │ │ -
│ │ │ │ -
97 struct RefinementImp<dimension, CoordType>::Codim
│ │ │ │ -
98 {
│ │ │ │ -
99 class SubEntityIterator;
│ │ │ │ - │ │ │ │ -
101 };
│ │ │ │ -
│ │ │ │ -
102
│ │ │ │ -
103 template<int dimension, class CoordType>
│ │ │ │ -
104 int
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
106 nVertices(int nIntervals)
│ │ │ │ -
107 {
│ │ │ │ -
108 return BackendRefinement::nVertices(nIntervals) * 3;
│ │ │ │ -
109 }
│ │ │ │ -
│ │ │ │ -
110
│ │ │ │ -
111 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
114 vBegin(int nIntervals)
│ │ │ │ -
115 {
│ │ │ │ -
116 return VertexIterator(nIntervals);
│ │ │ │ -
117 }
│ │ │ │ -
│ │ │ │ -
118
│ │ │ │ -
119 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
122 vEnd(int nIntervals)
│ │ │ │ -
123 {
│ │ │ │ -
124 return VertexIterator(nIntervals, true);
│ │ │ │ -
125 }
│ │ │ │ -
│ │ │ │ -
126
│ │ │ │ -
127 template<int dimension, class CoordType>
│ │ │ │ -
128 int
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
130 nElements(int nIntervals)
│ │ │ │ -
131 {
│ │ │ │ -
132 return BackendRefinement::nElements(nIntervals) * 3;
│ │ │ │ -
133 }
│ │ │ │ -
│ │ │ │ -
134
│ │ │ │ -
135 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
138 eBegin(int nIntervals)
│ │ │ │ -
139 {
│ │ │ │ -
140 return ElementIterator(nIntervals);
│ │ │ │ -
141 }
│ │ │ │ -
│ │ │ │ -
142
│ │ │ │ -
143 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
146 eEnd(int nIntervals)
│ │ │ │ -
147 {
│ │ │ │ -
148 return ElementIterator(nIntervals, true);
│ │ │ │ -
149 }
│ │ │ │ -
│ │ │ │ -
150
│ │ │ │ -
151 // //////////////
│ │ │ │ -
152 //
│ │ │ │ -
153 // The iterator
│ │ │ │ -
154 //
│ │ │ │ -
155
│ │ │ │ -
156 // vertices
│ │ │ │ -
157 template<int dimension, class CoordType>
│ │ │ │ -
│ │ │ │ -
158 class RefinementIteratorSpecial<dimension, CoordType, dimension>
│ │ │ │ -
159 {
│ │ │ │ -
160 public:
│ │ │ │ - │ │ │ │ -
162 typedef typename Refinement::CoordVector CoordVector;
│ │ │ │ -
163 typedef typename Refinement::template Codim<dimension>::Geometry Geometry;
│ │ │ │ -
164
│ │ │ │ -
165 RefinementIteratorSpecial(int nIntervals, bool end = false);
│ │ │ │ -
166
│ │ │ │ -
167 void increment();
│ │ │ │ -
168
│ │ │ │ -
169 CoordVector coords() const;
│ │ │ │ -
170 Geometry geometry () const;
│ │ │ │ -
171
│ │ │ │ -
172 int index() const;
│ │ │ │ -
173 protected:
│ │ │ │ -
174 typedef typename Refinement::BackendRefinement BackendRefinement;
│ │ │ │ -
175 typedef typename BackendRefinement::template Codim<dimension>::SubEntityIterator BackendIterator;
│ │ │ │ -
176 constexpr static int nKuhnSimplices = 3;
│ │ │ │ -
177
│ │ │ │ - │ │ │ │ -
179
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
183 };
│ │ │ │ -
│ │ │ │ -
184
│ │ │ │ -
185 template<int dimension, class CoordType>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
187 RefinementIteratorSpecial(int nIntervals, bool end)
│ │ │ │ -
188 : nIntervals_(nIntervals), kuhnIndex(0),
│ │ │ │ -
189 backend(BackendRefinement::vBegin(nIntervals_)),
│ │ │ │ -
190 backendEnd(BackendRefinement::vEnd(nIntervals_))
│ │ │ │ -
191 {
│ │ │ │ -
192 if (end)
│ │ │ │ -
193 kuhnIndex = nKuhnSimplices;
│ │ │ │ -
194 }
│ │ │ │ -
│ │ │ │ -
195
│ │ │ │ -
196 template<int dimension, class CoordType>
│ │ │ │ -
197 void
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
200 {
│ │ │ │ -
201 ++backend;
│ │ │ │ -
202 if (backend == backendEnd)
│ │ │ │ -
203 {
│ │ │ │ -
204 backend = BackendRefinement::vBegin(nIntervals_);
│ │ │ │ -
205 ++kuhnIndex;
│ │ │ │ -
206 }
│ │ │ │ -
207 }
│ │ │ │ -
│ │ │ │ -
208
│ │ │ │ -
209 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
212 coords() const
│ │ │ │ -
213 {
│ │ │ │ -
214 // while the kuhnIndex runs from 0,1,2 the actual permutations we need are 0,2,3
│ │ │ │ -
215 return transformCoordinate(referenceToKuhn(backend.coords(),
│ │ │ │ -
216 getPermutation<dimension>((kuhnIndex + 2) % 4)));
│ │ │ │ -
217 }
│ │ │ │ -
│ │ │ │ -
218
│ │ │ │ -
219 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
222 {
│ │ │ │ -
223 std::vector<CoordVector> corners(1);
│ │ │ │ -
224 corners[0] = transformCoordinate(referenceToKuhn(backend.coords(),
│ │ │ │ -
225 getPermutation<dimension>((kuhnIndex + 2) % 4)));
│ │ │ │ -
226 return Geometry(GeometryTypes::vertex, corners);
│ │ │ │ -
227 }
│ │ │ │ -
│ │ │ │ -
228
│ │ │ │ -
229 template<int dimension, class CoordType>
│ │ │ │ -
230 int
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
232 index() const
│ │ │ │ -
233 {
│ │ │ │ -
234 return kuhnIndex*BackendRefinement::nVertices(nIntervals_) + backend.index();
│ │ │ │ -
235 }
│ │ │ │ -
│ │ │ │ -
236
│ │ │ │ -
237 // elements
│ │ │ │ -
238 template<int dimension, class CoordType>
│ │ │ │ -
│ │ │ │ -
239 class RefinementIteratorSpecial<dimension, CoordType, 0>
│ │ │ │ -
240 {
│ │ │ │ -
241 public:
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
245 typedef typename Refinement::template Codim<0>::Geometry Geometry;
│ │ │ │ -
246
│ │ │ │ -
247 RefinementIteratorSpecial(int nIntervals, bool end = false);
│ │ │ │ -
248
│ │ │ │ -
249 void increment();
│ │ │ │ -
250
│ │ │ │ -
251 IndexVector vertexIndices() const;
│ │ │ │ -
252 int index() const;
│ │ │ │ -
253 CoordVector coords() const;
│ │ │ │ -
254
│ │ │ │ -
255 Geometry geometry () const;
│ │ │ │ -
256
│ │ │ │ -
257 private:
│ │ │ │ -
258 CoordVector global(const CoordVector &local) const;
│ │ │ │ -
259
│ │ │ │ -
260 protected:
│ │ │ │ - │ │ │ │ -
262 typedef typename BackendRefinement::template Codim<0>::SubEntityIterator BackendIterator;
│ │ │ │ -
263 constexpr static int nKuhnSimplices = 3;
│ │ │ │ -
264
│ │ │ │ - │ │ │ │ -
266
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
270 };
│ │ │ │ -
│ │ │ │ -
271
│ │ │ │ -
272 template<int dimension, class CoordType>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
274 RefinementIteratorSpecial(int nIntervals, bool end)
│ │ │ │ -
275 : nIntervals_(nIntervals), kuhnIndex(0),
│ │ │ │ -
276 backend(BackendRefinement::eBegin(nIntervals_)),
│ │ │ │ -
277 backendEnd(BackendRefinement::eEnd(nIntervals_))
│ │ │ │ -
278 {
│ │ │ │ -
279 if (end)
│ │ │ │ -
280 kuhnIndex = nKuhnSimplices;
│ │ │ │ -
281 }
│ │ │ │ -
│ │ │ │ -
282
│ │ │ │ -
283 template<int dimension, class CoordType>
│ │ │ │ -
284 void
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ -
287 {
│ │ │ │ -
288 ++backend;
│ │ │ │ -
289 if (backend == backendEnd)
│ │ │ │ -
290 {
│ │ │ │ -
291 backend = BackendRefinement::eBegin(nIntervals_);
│ │ │ │ -
292 ++kuhnIndex;
│ │ │ │ -
293 }
│ │ │ │ -
294 }
│ │ │ │ -
│ │ │ │ -
295
│ │ │ │ -
296 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
299 vertexIndices() const
│ │ │ │ -
300 {
│ │ │ │ -
301 IndexVector indices = backend.vertexIndices();
│ │ │ │ -
302
│ │ │ │ -
303 int base = kuhnIndex * BackendRefinement::nVertices(nIntervals_);
│ │ │ │ -
304 indices += base;
│ │ │ │ -
305
│ │ │ │ -
306 return indices;
│ │ │ │ -
307 }
│ │ │ │ -
│ │ │ │ -
308
│ │ │ │ -
309 template<int dimension, class CoordType>
│ │ │ │ -
310 int
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
312 index() const
│ │ │ │ -
313 {
│ │ │ │ -
314 return kuhnIndex*BackendRefinement::nElements(nIntervals_) + backend.index();
│ │ │ │ -
315 }
│ │ │ │ -
│ │ │ │ -
316
│ │ │ │ -
317 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
320 coords() const
│ │ │ │ -
321 {
│ │ │ │ -
322 return global(backend.coords());
│ │ │ │ -
323 }
│ │ │ │ -
│ │ │ │ -
324
│ │ │ │ -
325 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ -
│ │ │ │ - │ │ │ │ -
328 {
│ │ │ │ -
329 const typename BackendIterator::Geometry &bgeo =
│ │ │ │ -
330 backend.geometry();
│ │ │ │ -
331 std::vector<CoordVector> corners(dimension+1);
│ │ │ │ -
332 for(int i = 0; i <= dimension; ++i)
│ │ │ │ -
333 corners[i] = global(bgeo.corner(i));
│ │ │ │ -
334
│ │ │ │ -
335 return Geometry(bgeo.type(), corners);
│ │ │ │ -
336 }
│ │ │ │ -
│ │ │ │ -
337
│ │ │ │ -
338 template<int dimension, class CoordType>
│ │ │ │ - │ │ │ │ - │ │ │ │ -
341 global(const CoordVector &local) const
│ │ │ │ -
342 {
│ │ │ │ -
343 // while the kuhnIndex runs from 0,1,2 the actual permutations we need are 0,2,3
│ │ │ │ -
344 return transformCoordinate(referenceToKuhn(local, getPermutation<dimension>((kuhnIndex+2)%4)));
│ │ │ │ -
345 }
│ │ │ │ -
346
│ │ │ │ -
347 // common
│ │ │ │ -
348 template<int dimension, class CoordType>
│ │ │ │ -
349 template<int codimension>
│ │ │ │ -
│ │ │ │ -
350 class RefinementImp<dimension, CoordType>::Codim<codimension>::SubEntityIterator
│ │ │ │ -
351 : public ForwardIteratorFacade<typename RefinementImp<dimension, CoordType>::template Codim<codimension>::SubEntityIterator, int>,
│ │ │ │ -
352 public RefinementIteratorSpecial<dimension, CoordType, codimension>
│ │ │ │ -
353 {
│ │ │ │ -
354 public:
│ │ │ │ - │ │ │ │ -
356 typedef SubEntityIterator This;
│ │ │ │ -
357
│ │ │ │ -
358 SubEntityIterator(int nIntervals, bool end = false);
│ │ │ │ -
359
│ │ │ │ -
360 bool equals(const This &other) const;
│ │ │ │ -
361 protected:
│ │ │ │ -
362 using RefinementIteratorSpecial<dimension, CoordType, codimension>::kuhnIndex;
│ │ │ │ -
363 using RefinementIteratorSpecial<dimension, CoordType, codimension>::backend;
│ │ │ │ -
364 };
│ │ │ │ -
│ │ │ │ -
365
│ │ │ │ -
366#ifndef DOXYGEN
│ │ │ │ -
367 template<int dimension, class CoordType>
│ │ │ │ -
368 template<int codimension>
│ │ │ │ - │ │ │ │ -
370 SubEntityIterator(int nIntervals, bool end)
│ │ │ │ -
371 : RefinementIteratorSpecial<dimension, CoordType, codimension>(nIntervals, end)
│ │ │ │ -
372 {}
│ │ │ │ -
373
│ │ │ │ -
374 template<int dimension, class CoordType>
│ │ │ │ -
375 template<int codimension>
│ │ │ │ -
376 bool
│ │ │ │ - │ │ │ │ -
378 equals(const This &other) const
│ │ │ │ -
379 {
│ │ │ │ -
380 return ((kuhnIndex == other.kuhnIndex) && (backend == other.backend));
│ │ │ │ -
381 }
│ │ │ │ -
382#endif
│ │ │ │ -
383
│ │ │ │ -
384 } // namespace PrismTriangulation
│ │ │ │ -
│ │ │ │ -
385 } // namespace RefinementImp
│ │ │ │ -
386
│ │ │ │ -
387 namespace RefinementImp
│ │ │ │ -
388 {
│ │ │ │ -
389 // ///////////////////////
│ │ │ │ -
390 //
│ │ │ │ -
391 // The refinement traits
│ │ │ │ -
392 //
│ │ │ │ -
393
│ │ │ │ -
394#ifndef DOXYGEN
│ │ │ │ -
395 template<unsigned topologyId, class CoordType, unsigned coerceToId>
│ │ │ │ -
396 struct Traits<
│ │ │ │ -
397 topologyId, CoordType, coerceToId, 3,
│ │ │ │ -
398 typename std::enable_if<
│ │ │ │ -
399 (GeometryTypes::prism.id() >> 1) ==
│ │ │ │ -
400 (topologyId >> 1) &&
│ │ │ │ -
401 (GeometryTypes::simplex(3).id() >> 1) ==
│ │ │ │ -
402 (coerceToId >> 1)
│ │ │ │ -
403 >::type>
│ │ │ │ -
404 {
│ │ │ │ -
405 typedef PrismTriangulation::RefinementImp<3, CoordType> Imp;
│ │ │ │ -
406 };
│ │ │ │ -
407#endif
│ │ │ │ -
408
│ │ │ │ -
409 } // namespace RefinementImp
│ │ │ │ -
410} // namespace Dune
│ │ │ │ -
411
│ │ │ │ -
412#endif // DUNE_GEOMETRY_REFINEMENT_PRISMTRIANGULATION_CC
│ │ │ │ - │ │ │ │ -
This file contains the Refinement implementation for simplices (triangles, tetrahedrons....
│ │ │ │ -
This file contains the parts independent of a particular Refinement implementation.
│ │ │ │ -
A unique label for each type of element that can occur in a grid.
│ │ │ │ -
STL namespace.
│ │ │ │ +
8#include <type_traits>
│ │ │ │ +
9
│ │ │ │ +
10namespace Dune {
│ │ │ │ +
11
│ │ │ │ +
13 template<int dim>
│ │ │ │ +
│ │ │ │ +
14 struct Dim
│ │ │ │ +
15 : public std::integral_constant<int,dim>
│ │ │ │ +
16 {
│ │ │ │ +
17 typedef Dim type;
│ │ │ │ +
18 };
│ │ │ │ +
│ │ │ │ +
19
│ │ │ │ +
21 template<int codim>
│ │ │ │ +
│ │ │ │ +
22 struct Codim
│ │ │ │ +
23 : public std::integral_constant<int,codim>
│ │ │ │ +
24 {
│ │ │ │ +
25 typedef Codim type;
│ │ │ │ +
26 };
│ │ │ │ +
│ │ │ │ +
27
│ │ │ │ +
28}
│ │ │ │ +
29
│ │ │ │ +
30#endif // DUNE_GEOMETRY_DIMENSION_HH
│ │ │ │
Definition affinegeometry.hh:21
│ │ │ │ -
FieldVector< CoordType, dimension > transformCoordinate(FieldVector< CoordType, dimension > point)
Definition prismtriangulation.cc:50
│ │ │ │ -
FieldVector< int, n > getPermutation(int m)
Calculate permutation from it's index.
Definition simplex.cc:293
│ │ │ │ -
FieldVector< CoordType, dimension > referenceToKuhn(FieldVector< CoordType, dimension > point, const FieldVector< int, dimension > &kuhn)
Map from the reference simplex to some Kuhn simplex.
Definition simplex.cc:322
│ │ │ │ +
Static tag representing a dimension.
Definition dimension.hh:16
│ │ │ │ +
Dim type
Definition dimension.hh:17
│ │ │ │
Static tag representing a codimension.
Definition dimension.hh:24
│ │ │ │ -
generic geometry implementation based on corner coordinates
Definition multilineargeometry.hh:181
│ │ │ │ - │ │ │ │ -
Implementation of the refinement of a prism into simplices.
Definition prismtriangulation.cc:67
│ │ │ │ -
static constexpr int dimension
Definition prismtriangulation.cc:69
│ │ │ │ -
CoordType ctype
Definition prismtriangulation.cc:71
│ │ │ │ -
static VertexIterator vEnd(int nIntervals)
Definition prismtriangulation.cc:122
│ │ │ │ -
FieldVector< int, dimension+1 > IndexVector
Definition prismtriangulation.cc:78
│ │ │ │ -
static ElementIterator eEnd(int nIntervals)
Definition prismtriangulation.cc:146
│ │ │ │ -
static int nVertices(int nIntervals)
Definition prismtriangulation.cc:106
│ │ │ │ -
FieldVector< CoordType, dimension > CoordVector
Definition prismtriangulation.cc:76
│ │ │ │ -
static int nElements(int nIntervals)
Definition prismtriangulation.cc:130
│ │ │ │ -
Codim< 0 >::SubEntityIterator ElementIterator
Definition prismtriangulation.cc:77
│ │ │ │ -
Codim< dimension >::SubEntityIterator VertexIterator
Definition prismtriangulation.cc:75
│ │ │ │ -
static ElementIterator eBegin(int nIntervals)
Definition prismtriangulation.cc:138
│ │ │ │ -
static VertexIterator vBegin(int nIntervals)
Definition prismtriangulation.cc:114
│ │ │ │ - │ │ │ │ -
Dune::MultiLinearGeometry< CoordType, dimension-codimension, dimension > Geometry
Definition prismtriangulation.cc:100
│ │ │ │ - │ │ │ │ -
Refinement::template Codim< dimension >::Geometry Geometry
Definition prismtriangulation.cc:163
│ │ │ │ -
Refinement::BackendRefinement BackendRefinement
Definition prismtriangulation.cc:174
│ │ │ │ -
BackendRefinement::template Codim< dimension >::SubEntityIterator BackendIterator
Definition prismtriangulation.cc:175
│ │ │ │ - │ │ │ │ - │ │ │ │ -
RefinementImp< dimension, CoordType > Refinement
Definition prismtriangulation.cc:161
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
Refinement::template Codim< 0 >::Geometry Geometry
Definition prismtriangulation.cc:245
│ │ │ │ - │ │ │ │ -
Refinement::IndexVector IndexVector
Definition prismtriangulation.cc:243
│ │ │ │ -
BackendRefinement::template Codim< 0 >::SubEntityIterator BackendIterator
Definition prismtriangulation.cc:262
│ │ │ │ - │ │ │ │ -
Refinement::CoordVector CoordVector
Definition prismtriangulation.cc:244
│ │ │ │ -
RefinementImp< dimension, CoordType > Refinement
Definition prismtriangulation.cc:242
│ │ │ │ - │ │ │ │ -
Refinement::BackendRefinement BackendRefinement
Definition prismtriangulation.cc:261
│ │ │ │ -
SubEntityIterator This
Definition prismtriangulation.cc:356
│ │ │ │ - │ │ │ │ -
RefinementImp< dimension, CoordType > Refinement
Definition prismtriangulation.cc:355
│ │ │ │ - │ │ │ │ - │ │ │ │ +
Codim type
Definition dimension.hh:25
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,605 +1,53 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ - * _r_e_f_i_n_e_m_e_n_t │ │ │ │ │ -prismtriangulation.cc │ │ │ │ │ +dimension.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 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 © 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_PRISMTRIANGULATION_CC │ │ │ │ │ -_6#define DUNE_GEOMETRY_REFINEMENT_PRISMTRIANGULATION_CC │ │ │ │ │ +5#ifndef DUNE_GEOMETRY_DIMENSION_HH │ │ │ │ │ +6#define DUNE_GEOMETRY_DIMENSION_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9#include │ │ │ │ │ -10 │ │ │ │ │ -11#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ -12#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ -13 │ │ │ │ │ -14#include "_b_a_s_e_._c_c" │ │ │ │ │ -15#include "_s_i_m_p_l_e_x_._c_c" │ │ │ │ │ -16 │ │ │ │ │ -17namespace _D_u_n_e │ │ │ │ │ -18{ │ │ │ │ │ -19 namespace RefinementImp │ │ │ │ │ -20 { │ │ │ │ │ -_2_6 namespace PrismTriangulation │ │ │ │ │ -27 { │ │ │ │ │ -28 // //////////// │ │ │ │ │ -29 // │ │ │ │ │ -30 // Utilities │ │ │ │ │ -31 // │ │ │ │ │ -32 │ │ │ │ │ -33 using _S_i_m_p_l_e_x_:_:_g_e_t_P_e_r_m_u_t_a_t_i_o_n; │ │ │ │ │ -34 using _S_i_m_p_l_e_x_:_:_r_e_f_e_r_e_n_c_e_T_o_K_u_h_n; │ │ │ │ │ -35 │ │ │ │ │ -36 // //////////////////////////////////// │ │ │ │ │ -37 // │ │ │ │ │ -38 // Refine a prism with simplices │ │ │ │ │ -39 // │ │ │ │ │ -40 │ │ │ │ │ -41 // forward declaration of the iterator base │ │ │ │ │ -42 template │ │ │ │ │ -_4_3 class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l; │ │ │ │ │ -44 /* │ │ │ │ │ -45 * The permutations 0,2 and 3 of the Kuhn-decomposition of a cube into │ │ │ │ │ -simplices form a prism. │ │ │ │ │ -46 * The resulting prism is not oriented the same as the reference prism and so │ │ │ │ │ -the Kuhn-coordinates │ │ │ │ │ -47 * have to be transformed using the method below. │ │ │ │ │ -48 */ │ │ │ │ │ -49 template FieldVector │ │ │ │ │ -_5_0 _t_r_a_n_s_f_o_r_m_C_o_o_r_d_i_n_a_t_e(FieldVector point) │ │ │ │ │ -51 { │ │ │ │ │ -52 FieldVector transform; │ │ │ │ │ -53 transform[0] = point[1]; │ │ │ │ │ -54 transform[1] = 1 - point[0]; │ │ │ │ │ -55 transform[2] = point[2]; │ │ │ │ │ -56 return transform; │ │ │ │ │ -57 } │ │ │ │ │ -58 │ │ │ │ │ -65 template │ │ │ │ │ -_6_6 class _R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ -67 { │ │ │ │ │ -68 public: │ │ │ │ │ -_6_9 constexpr static int _d_i_m_e_n_s_i_o_n = dimension_; │ │ │ │ │ -70 │ │ │ │ │ -_7_1 typedef CoordType _c_t_y_p_e; │ │ │ │ │ -72 │ │ │ │ │ -73 template │ │ │ │ │ -74 struct _C_o_d_i_m; │ │ │ │ │ -_7_5 typedef typename _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _V_e_r_t_e_x_I_t_e_r_a_t_o_r; │ │ │ │ │ -_7_6 typedef FieldVector _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ -_7_7 typedef typename _C_o_d_i_m_<_0_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r; │ │ │ │ │ -_7_8 typedef FieldVector _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ -79 │ │ │ │ │ -80 static int _n_V_e_r_t_i_c_e_s(int nIntervals); │ │ │ │ │ -81 static _V_e_r_t_e_x_I_t_e_r_a_t_o_r _v_B_e_g_i_n(int nIntervals); │ │ │ │ │ -82 static _V_e_r_t_e_x_I_t_e_r_a_t_o_r _v_E_n_d(int nIntervals); │ │ │ │ │ -83 │ │ │ │ │ -84 static int _n_E_l_e_m_e_n_t_s(int nIntervals); │ │ │ │ │ -85 static _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r _e_B_e_g_i_n(int nIntervals); │ │ │ │ │ -_8_6 static _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r _e_E_n_d(int nIntervals); │ │ │ │ │ -87 │ │ │ │ │ -88 private: │ │ │ │ │ -89 friend class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l<_d_i_m_e_n_s_i_o_n, CoordType, 0>; │ │ │ │ │ -90 friend class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l<_d_i_m_e_n_s_i_o_n, CoordType, _d_i_m_e_n_s_i_o_n>; │ │ │ │ │ -91 │ │ │ │ │ -92 typedef _S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -93 }; │ │ │ │ │ -94 │ │ │ │ │ -95 template │ │ │ │ │ -96 template │ │ │ │ │ -_9_7 struct _R_e_f_i_n_e_m_e_n_t_I_m_p::_C_o_d_i_m │ │ │ │ │ -98 { │ │ │ │ │ -99 class SubEntityIterator; │ │ │ │ │ -_1_0_0 typedef _D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y _G_e_o_m_e_t_r_y; │ │ │ │ │ -101 }; │ │ │ │ │ -102 │ │ │ │ │ -103 template │ │ │ │ │ -104 int │ │ │ │ │ -_1_0_5 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -106_ _n_V_e_r_t_i_c_e_s(int nIntervals) │ │ │ │ │ -107 { │ │ │ │ │ -108 return BackendRefinement::nVertices(nIntervals) * 3; │ │ │ │ │ -109 } │ │ │ │ │ -110 │ │ │ │ │ -111 template │ │ │ │ │ -112 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ -_1_1_3 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -114_ _v_B_e_g_i_n(int nIntervals) │ │ │ │ │ -115 { │ │ │ │ │ -116 return _V_e_r_t_e_x_I_t_e_r_a_t_o_r(nIntervals); │ │ │ │ │ -117 } │ │ │ │ │ -118 │ │ │ │ │ -119 template │ │ │ │ │ -120 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ -_1_2_1 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -122_ _v_E_n_d(int nIntervals) │ │ │ │ │ -123 { │ │ │ │ │ -124 return _V_e_r_t_e_x_I_t_e_r_a_t_o_r(nIntervals, true); │ │ │ │ │ -125 } │ │ │ │ │ -126 │ │ │ │ │ -127 template │ │ │ │ │ -128 int │ │ │ │ │ -_1_2_9 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -130_ _n_E_l_e_m_e_n_t_s(int nIntervals) │ │ │ │ │ -131 { │ │ │ │ │ -132 return BackendRefinement::nElements(nIntervals) * 3; │ │ │ │ │ -133 } │ │ │ │ │ -134 │ │ │ │ │ -135 template │ │ │ │ │ -136 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ -_1_3_7 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -138_ _e_B_e_g_i_n(int nIntervals) │ │ │ │ │ -139 { │ │ │ │ │ -140 return _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r(nIntervals); │ │ │ │ │ -141 } │ │ │ │ │ -142 │ │ │ │ │ -143 template │ │ │ │ │ -144 typename _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ -_1_4_5 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_: │ │ │ │ │ -146_ _e_E_n_d(int nIntervals) │ │ │ │ │ -147 { │ │ │ │ │ -148 return _E_l_e_m_e_n_t_I_t_e_r_a_t_o_r(nIntervals, true); │ │ │ │ │ -149 } │ │ │ │ │ -150 │ │ │ │ │ -151 // ////////////// │ │ │ │ │ -152 // │ │ │ │ │ -153 // The iterator │ │ │ │ │ -154 // │ │ │ │ │ -155 │ │ │ │ │ -156 // vertices │ │ │ │ │ -157 template │ │ │ │ │ -_1_5_8 class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ -159 { │ │ │ │ │ -160 public: │ │ │ │ │ -_1_6_1 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -_1_6_2 typedef typename Refinement::CoordVector _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ -_1_6_3 typedef typename Refinement::template _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_:_G_e_o_m_e_t_r_y _G_e_o_m_e_t_r_y; │ │ │ │ │ -164 │ │ │ │ │ -165 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end = false); │ │ │ │ │ -166 │ │ │ │ │ -167 void increment(); │ │ │ │ │ -168 │ │ │ │ │ -169 _C_o_o_r_d_V_e_c_t_o_r coords() const; │ │ │ │ │ -170 _G_e_o_m_e_t_r_y geometry () const; │ │ │ │ │ -171 │ │ │ │ │ -172 int index() const; │ │ │ │ │ -173 protected: │ │ │ │ │ -_1_7_4 typedef typename Refinement::BackendRefinement _B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -_1_7_5 typedef typename BackendRefinement::template _C_o_d_i_m_<_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r; │ │ │ │ │ -_1_7_6 constexpr static int nKuhnSimplices = 3; │ │ │ │ │ -177 │ │ │ │ │ -_1_7_8 int _n_I_n_t_e_r_v_a_l_s__; │ │ │ │ │ -179 │ │ │ │ │ -_1_8_0 int _k_u_h_n_I_n_d_e_x; │ │ │ │ │ -_1_8_1 _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r _b_a_c_k_e_n_d; │ │ │ │ │ -_1_8_2 const _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r _b_a_c_k_e_n_d_E_n_d; │ │ │ │ │ -183 }; │ │ │ │ │ -184 │ │ │ │ │ -185 template │ │ │ │ │ -_1_8_6 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -187_ _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end) │ │ │ │ │ -188 : nIntervals_(nIntervals), kuhnIndex(0), │ │ │ │ │ -189 backend(_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t::vBegin(nIntervals_)), │ │ │ │ │ -190 backendEnd(_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t::vEnd(nIntervals_)) │ │ │ │ │ -191 { │ │ │ │ │ -192 if (end) │ │ │ │ │ -193 kuhnIndex = nKuhnSimplices; │ │ │ │ │ -194 } │ │ │ │ │ -195 │ │ │ │ │ -196 template │ │ │ │ │ -197 void │ │ │ │ │ -_1_9_8 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -199_ _i_n_c_r_e_m_e_n_t() │ │ │ │ │ -200 { │ │ │ │ │ -201 ++backend; │ │ │ │ │ -202 if (backend == backendEnd) │ │ │ │ │ -203 { │ │ │ │ │ -204 backend = BackendRefinement::vBegin(nIntervals_); │ │ │ │ │ -205 ++kuhnIndex; │ │ │ │ │ -206 } │ │ │ │ │ -207 } │ │ │ │ │ -208 │ │ │ │ │ -209 template │ │ │ │ │ -210 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -_2_1_1 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -212_ _c_o_o_r_d_s() const │ │ │ │ │ -213 { │ │ │ │ │ -214 // while the kuhnIndex runs from 0,1,2 the actual permutations we need are │ │ │ │ │ -0,2,3 │ │ │ │ │ -215 return _t_r_a_n_s_f_o_r_m_C_o_o_r_d_i_n_a_t_e(referenceToKuhn(backend.coords(), │ │ │ │ │ -216 getPermutation((kuhnIndex + 2) % 4))); │ │ │ │ │ -217 } │ │ │ │ │ -218 │ │ │ │ │ -219 template │ │ │ │ │ -220 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_G_e_o_m_e_t_r_y │ │ │ │ │ -_2_2_1 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_:_g_e_o_m_e_t_r_y () │ │ │ │ │ -const │ │ │ │ │ -222 { │ │ │ │ │ -223 std::vector corners(1); │ │ │ │ │ -224 corners[0] = _t_r_a_n_s_f_o_r_m_C_o_o_r_d_i_n_a_t_e(referenceToKuhn(backend.coords(), │ │ │ │ │ -225 getPermutation((kuhnIndex + 2) % 4))); │ │ │ │ │ -226 return _G_e_o_m_e_t_r_y(GeometryTypes::vertex, corners); │ │ │ │ │ -227 } │ │ │ │ │ -228 │ │ │ │ │ -229 template │ │ │ │ │ -230 int │ │ │ │ │ -_2_3_1 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -232_ _i_n_d_e_x() const │ │ │ │ │ -233 { │ │ │ │ │ -234 return kuhnIndex*BackendRefinement::nVertices(nIntervals_) + backend.index │ │ │ │ │ -(); │ │ │ │ │ -235 } │ │ │ │ │ -236 │ │ │ │ │ -237 // elements │ │ │ │ │ -238 template │ │ │ │ │ -_2_3_9 class _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ -240 { │ │ │ │ │ -241 public: │ │ │ │ │ -_2_4_2 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -_2_4_3 typedef typename _R_e_f_i_n_e_m_e_n_t_:_:_I_n_d_e_x_V_e_c_t_o_r _I_n_d_e_x_V_e_c_t_o_r; │ │ │ │ │ -_2_4_4 typedef typename _R_e_f_i_n_e_m_e_n_t_:_:_C_o_o_r_d_V_e_c_t_o_r _C_o_o_r_d_V_e_c_t_o_r; │ │ │ │ │ -_2_4_5 typedef typename Refinement::template _C_o_d_i_m_<_0_>_:_:_G_e_o_m_e_t_r_y _G_e_o_m_e_t_r_y; │ │ │ │ │ -246 │ │ │ │ │ -247 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end = false); │ │ │ │ │ -248 │ │ │ │ │ -249 void increment(); │ │ │ │ │ -250 │ │ │ │ │ -251 _I_n_d_e_x_V_e_c_t_o_r vertexIndices() const; │ │ │ │ │ -252 int index() const; │ │ │ │ │ -253 _C_o_o_r_d_V_e_c_t_o_r coords() const; │ │ │ │ │ -254 │ │ │ │ │ -255 _G_e_o_m_e_t_r_y geometry () const; │ │ │ │ │ -256 │ │ │ │ │ -257 private: │ │ │ │ │ -258 _C_o_o_r_d_V_e_c_t_o_r global(const _C_o_o_r_d_V_e_c_t_o_r &local) const; │ │ │ │ │ -259 │ │ │ │ │ -260 protected: │ │ │ │ │ -_2_6_1 typedef typename _R_e_f_i_n_e_m_e_n_t_:_:_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t _B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -_2_6_2 typedef typename BackendRefinement::template _C_o_d_i_m_<_0_>_:_:_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ -_B_a_c_k_e_n_d_I_t_e_r_a_t_o_r; │ │ │ │ │ -_2_6_3 constexpr static int nKuhnSimplices = 3; │ │ │ │ │ -264 │ │ │ │ │ -_2_6_5 int _n_I_n_t_e_r_v_a_l_s__; │ │ │ │ │ -266 │ │ │ │ │ -_2_6_7 int _k_u_h_n_I_n_d_e_x; │ │ │ │ │ -_2_6_8 _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r _b_a_c_k_e_n_d; │ │ │ │ │ -_2_6_9 const _B_a_c_k_e_n_d_I_t_e_r_a_t_o_r _b_a_c_k_e_n_d_E_n_d; │ │ │ │ │ -270 }; │ │ │ │ │ -271 │ │ │ │ │ -272 template │ │ │ │ │ -_2_7_3 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -274_ _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(int nIntervals, bool end) │ │ │ │ │ -275 : nIntervals_(nIntervals), kuhnIndex(0), │ │ │ │ │ -276 backend(_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t::eBegin(nIntervals_)), │ │ │ │ │ -277 backendEnd(_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t::eEnd(nIntervals_)) │ │ │ │ │ -278 { │ │ │ │ │ -279 if (end) │ │ │ │ │ -280 kuhnIndex = nKuhnSimplices; │ │ │ │ │ -281 } │ │ │ │ │ -282 │ │ │ │ │ -283 template │ │ │ │ │ -284 void │ │ │ │ │ -_2_8_5 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -286_ _i_n_c_r_e_m_e_n_t() │ │ │ │ │ -287 { │ │ │ │ │ -288 ++backend; │ │ │ │ │ -289 if (backend == backendEnd) │ │ │ │ │ -290 { │ │ │ │ │ -291 backend = BackendRefinement::eBegin(nIntervals_); │ │ │ │ │ -292 ++kuhnIndex; │ │ │ │ │ -293 } │ │ │ │ │ -294 } │ │ │ │ │ -295 │ │ │ │ │ -296 template │ │ │ │ │ -297 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ -_2_9_8 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -299_ _v_e_r_t_e_x_I_n_d_i_c_e_s() const │ │ │ │ │ -300 { │ │ │ │ │ -301 _I_n_d_e_x_V_e_c_t_o_r indices = backend.vertexIndices(); │ │ │ │ │ -302 │ │ │ │ │ -303 int base = kuhnIndex * BackendRefinement::nVertices(nIntervals_); │ │ │ │ │ -304 indices += base; │ │ │ │ │ -305 │ │ │ │ │ -306 return indices; │ │ │ │ │ -307 } │ │ │ │ │ -308 │ │ │ │ │ -309 template │ │ │ │ │ -310 int │ │ │ │ │ -_3_1_1 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -312_ _i_n_d_e_x() const │ │ │ │ │ -313 { │ │ │ │ │ -314 return kuhnIndex*BackendRefinement::nElements(nIntervals_) + backend.index │ │ │ │ │ -(); │ │ │ │ │ -315 } │ │ │ │ │ -316 │ │ │ │ │ -317 template │ │ │ │ │ -318 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -_3_1_9 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -320_ _c_o_o_r_d_s() const │ │ │ │ │ -321 { │ │ │ │ │ -322 return global(backend.coords()); │ │ │ │ │ -323 } │ │ │ │ │ -324 │ │ │ │ │ -325 template │ │ │ │ │ -326 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ -_3_2_7 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_g_e_o_m_e_t_r_y () const │ │ │ │ │ -328 { │ │ │ │ │ -329 const typename BackendIterator::Geometry &bgeo = │ │ │ │ │ -330 backend.geometry(); │ │ │ │ │ -331 std::vector corners(dimension+1); │ │ │ │ │ -332 for(int i = 0; i <= dimension; ++i) │ │ │ │ │ -333 corners[i] = global(bgeo.corner(i)); │ │ │ │ │ -334 │ │ │ │ │ -335 return _G_e_o_m_e_t_r_y(bgeo.type(), corners); │ │ │ │ │ -336 } │ │ │ │ │ -337 │ │ │ │ │ -338 template │ │ │ │ │ -339 typename _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -340 _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_,_ _0_>_:_: │ │ │ │ │ -341_ _g_l_o_b_a_l(const CoordVector &local) const │ │ │ │ │ -342 { │ │ │ │ │ -343 // while the kuhnIndex runs from 0,1,2 the actual permutations we need are │ │ │ │ │ -0,2,3 │ │ │ │ │ -344 return _t_r_a_n_s_f_o_r_m_C_o_o_r_d_i_n_a_t_e(referenceToKuhn(local, getPermutation │ │ │ │ │ -((kuhnIndex+2)%4))); │ │ │ │ │ -345 } │ │ │ │ │ -346 │ │ │ │ │ -347 // common │ │ │ │ │ -348 template │ │ │ │ │ -349 template │ │ │ │ │ -_3_5_0 class _R_e_f_i_n_e_m_e_n_t_I_m_p::_C_o_d_i_m:: │ │ │ │ │ -SubEntityIterator │ │ │ │ │ -351 : public ForwardIteratorFacade::template Codim::SubEntityIterator, int>, │ │ │ │ │ -352 public _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ -353 { │ │ │ │ │ -354 public: │ │ │ │ │ -_3_5_5 typedef _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_> _R_e_f_i_n_e_m_e_n_t; │ │ │ │ │ -_3_5_6 typedef SubEntityIterator _T_h_i_s; │ │ │ │ │ -357 │ │ │ │ │ -_3_5_8 _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r(int nIntervals, bool end = false); │ │ │ │ │ -359 │ │ │ │ │ -_3_6_0 bool _e_q_u_a_l_s(const _T_h_i_s &other) const; │ │ │ │ │ -361 protected: │ │ │ │ │ -362 using _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l<_d_i_m_e_n_s_i_o_n, CoordType, codimension>:: │ │ │ │ │ -kuhnIndex; │ │ │ │ │ -363 using _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l<_d_i_m_e_n_s_i_o_n, CoordType, codimension>:: │ │ │ │ │ -backend; │ │ │ │ │ -364 }; │ │ │ │ │ -365 │ │ │ │ │ -366#ifndef DOXYGEN │ │ │ │ │ -367 template │ │ │ │ │ -368 template │ │ │ │ │ -369 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_:_: │ │ │ │ │ -370_ _S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r(int nIntervals, bool end) │ │ │ │ │ -371 : _R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l(nIntervals, │ │ │ │ │ -end) │ │ │ │ │ -372 {} │ │ │ │ │ -373 │ │ │ │ │ -374 template │ │ │ │ │ -375 template │ │ │ │ │ -376 bool │ │ │ │ │ -377 _R_e_f_i_n_e_m_e_n_t_I_m_p_<_d_i_m_e_n_s_i_o_n_,_ _C_o_o_r_d_T_y_p_e_>_:_:_C_o_d_i_m_<_c_o_d_i_m_e_n_s_i_o_n_>_:_: │ │ │ │ │ -_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r_:_: │ │ │ │ │ -378_ _e_q_u_a_l_s(const This &other) const │ │ │ │ │ -379 { │ │ │ │ │ -380 return ((kuhnIndex == other.kuhnIndex) && (backend == other.backend)); │ │ │ │ │ -381 } │ │ │ │ │ -382#endif │ │ │ │ │ -383 │ │ │ │ │ -384 } // namespace PrismTriangulation │ │ │ │ │ -385 } // namespace RefinementImp │ │ │ │ │ -386 │ │ │ │ │ -387 namespace RefinementImp │ │ │ │ │ -388 { │ │ │ │ │ -389 // /////////////////////// │ │ │ │ │ -390 // │ │ │ │ │ -391 // The refinement traits │ │ │ │ │ -392 // │ │ │ │ │ -393 │ │ │ │ │ -394#ifndef DOXYGEN │ │ │ │ │ -395 template │ │ │ │ │ -396 struct Traits< │ │ │ │ │ -397 topologyId, CoordType, coerceToId, 3, │ │ │ │ │ -398 typename _s_t_d::enable_if< │ │ │ │ │ -399 (GeometryTypes::prism.id() >> 1) == │ │ │ │ │ -400 (topologyId >> 1) && │ │ │ │ │ -401 (GeometryTypes::simplex(3).id() >> 1) == │ │ │ │ │ -402 (coerceToId >> 1) │ │ │ │ │ -403 >::type> │ │ │ │ │ -404 { │ │ │ │ │ -405 typedef PrismTriangulation::RefinementImp<3, CoordType> Imp; │ │ │ │ │ -406 }; │ │ │ │ │ -407#endif │ │ │ │ │ -408 │ │ │ │ │ -409 } // namespace RefinementImp │ │ │ │ │ -410} // namespace Dune │ │ │ │ │ -411 │ │ │ │ │ -412#endif // DUNE_GEOMETRY_REFINEMENT_PRISMTRIANGULATION_CC │ │ │ │ │ -_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h │ │ │ │ │ -_s_i_m_p_l_e_x_._c_c │ │ │ │ │ -This file contains the Refinement implementation for simplices (triangles, │ │ │ │ │ -tetrahedrons.... │ │ │ │ │ -_b_a_s_e_._c_c │ │ │ │ │ -This file contains the parts independent of a particular Refinement │ │ │ │ │ -implementation. │ │ │ │ │ -_t_y_p_e_._h_h │ │ │ │ │ -A unique label for each type of element that can occur in a grid. │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ +8#include │ │ │ │ │ +9 │ │ │ │ │ +10namespace _D_u_n_e { │ │ │ │ │ +11 │ │ │ │ │ +13 template │ │ │ │ │ +_1_4 struct _D_i_m │ │ │ │ │ +15 : public std::integral_constant │ │ │ │ │ +16 { │ │ │ │ │ +_1_7 typedef _D_i_m _t_y_p_e; │ │ │ │ │ +18 }; │ │ │ │ │ +19 │ │ │ │ │ +21 template │ │ │ │ │ +_2_2 struct _C_o_d_i_m │ │ │ │ │ +23 : public std::integral_constant │ │ │ │ │ +24 { │ │ │ │ │ +_2_5 typedef _C_o_d_i_m _t_y_p_e; │ │ │ │ │ +26 }; │ │ │ │ │ +27 │ │ │ │ │ +28} │ │ │ │ │ +29 │ │ │ │ │ +30#endif // DUNE_GEOMETRY_DIMENSION_HH │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn affinegeometry.hh:21 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_t_r_a_n_s_f_o_r_m_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ -FieldVector< CoordType, dimension > transformCoordinate(FieldVector< CoordType, │ │ │ │ │ -dimension > point) │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:50 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_g_e_t_P_e_r_m_u_t_a_t_i_o_n │ │ │ │ │ -FieldVector< int, n > getPermutation(int m) │ │ │ │ │ -Calculate permutation from it's index. │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:293 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_r_e_f_e_r_e_n_c_e_T_o_K_u_h_n │ │ │ │ │ -FieldVector< CoordType, dimension > referenceToKuhn(FieldVector< CoordType, │ │ │ │ │ -dimension > point, const FieldVector< int, dimension > &kuhn) │ │ │ │ │ -Map from the reference simplex to some Kuhn simplex. │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:322 │ │ │ │ │ +_D_u_n_e_:_:_D_i_m │ │ │ │ │ +Static tag representing a dimension. │ │ │ │ │ +DDeeffiinniittiioonn dimension.hh:16 │ │ │ │ │ +_D_u_n_e_:_:_D_i_m_:_:_t_y_p_e │ │ │ │ │ +Dim type │ │ │ │ │ +DDeeffiinniittiioonn dimension.hh:17 │ │ │ │ │ _D_u_n_e_:_:_C_o_d_i_m │ │ │ │ │ Static tag representing a codimension. │ │ │ │ │ DDeeffiinniittiioonn dimension.hh:24 │ │ │ │ │ -_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y │ │ │ │ │ -generic geometry implementation based on corner coordinates │ │ │ │ │ -DDeeffiinniittiioonn multilineargeometry.hh:181 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:43 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ -Implementation of the refinement of a prism into simplices. │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:67 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ -static constexpr int dimension │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:69 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_c_t_y_p_e │ │ │ │ │ -CoordType ctype │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:71 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_v_E_n_d │ │ │ │ │ -static VertexIterator vEnd(int nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:122 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ -FieldVector< int, dimension+1 > IndexVector │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:78 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_e_E_n_d │ │ │ │ │ -static ElementIterator eEnd(int nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:146 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_n_V_e_r_t_i_c_e_s │ │ │ │ │ -static int nVertices(int nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:106 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -FieldVector< CoordType, dimension > CoordVector │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:76 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_n_E_l_e_m_e_n_t_s │ │ │ │ │ -static int nElements(int nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:130 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_E_l_e_m_e_n_t_I_t_e_r_a_t_o_r │ │ │ │ │ -Codim< 0 >::SubEntityIterator ElementIterator │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:77 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_V_e_r_t_e_x_I_t_e_r_a_t_o_r │ │ │ │ │ -Codim< dimension >::SubEntityIterator VertexIterator │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:75 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_e_B_e_g_i_n │ │ │ │ │ -static ElementIterator eBegin(int nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:138 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_v_B_e_g_i_n │ │ │ │ │ -static VertexIterator vBegin(int nIntervals) │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:114 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:98 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ -Dune::MultiLinearGeometry< CoordType, dimension-codimension, dimension > │ │ │ │ │ -Geometry │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:100 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_n_I_n_t_e_r_v_a_l_s__ │ │ │ │ │ -int nIntervals_ │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:178 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ -Refinement::template Codim< dimension >::Geometry Geometry │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:163 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -Refinement::BackendRefinement BackendRefinement │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:174 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_B_a_c_k_e_n_d_I_t_e_r_a_t_o_r │ │ │ │ │ -BackendRefinement::template Codim< dimension >::SubEntityIterator │ │ │ │ │ -BackendIterator │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:175 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -Refinement::CoordVector CoordVector │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:162 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_b_a_c_k_e_n_d_E_n_d │ │ │ │ │ -const BackendIterator backendEnd │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:182 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:161 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_b_a_c_k_e_n_d │ │ │ │ │ -BackendIterator backend │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:181 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _d_i_m_e_n_s_i_o_n_ _>_:_:_k_u_h_n_I_n_d_e_x │ │ │ │ │ -int kuhnIndex │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:180 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_n_I_n_t_e_r_v_a_l_s__ │ │ │ │ │ -int nIntervals_ │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:265 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ -Refinement::template Codim< 0 >::Geometry Geometry │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:245 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_b_a_c_k_e_n_d │ │ │ │ │ -BackendIterator backend │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:268 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_I_n_d_e_x_V_e_c_t_o_r │ │ │ │ │ -Refinement::IndexVector IndexVector │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:243 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_B_a_c_k_e_n_d_I_t_e_r_a_t_o_r │ │ │ │ │ -BackendRefinement::template Codim< 0 >::SubEntityIterator BackendIterator │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:262 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_k_u_h_n_I_n_d_e_x │ │ │ │ │ -int kuhnIndex │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:267 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_C_o_o_r_d_V_e_c_t_o_r │ │ │ │ │ -Refinement::CoordVector CoordVector │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:244 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:242 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_b_a_c_k_e_n_d_E_n_d │ │ │ │ │ -const BackendIterator backendEnd │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:269 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_t_e_r_a_t_o_r_S_p_e_c_i_a_l_<_ _d_i_m_e_n_s_i_o_n_, │ │ │ │ │ -_C_o_o_r_d_T_y_p_e_,_ _0_ _>_:_:_B_a_c_k_e_n_d_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -Refinement::BackendRefinement BackendRefinement │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:261 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_: │ │ │ │ │ -_T_h_i_s │ │ │ │ │ -SubEntityIterator This │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:356 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_: │ │ │ │ │ -_e_q_u_a_l_s │ │ │ │ │ -bool equals(const This &other) const │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_: │ │ │ │ │ -_R_e_f_i_n_e_m_e_n_t │ │ │ │ │ -RefinementImp< dimension, CoordType > Refinement │ │ │ │ │ -DDeeffiinniittiioonn prismtriangulation.cc:355 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_P_r_i_s_m_T_r_i_a_n_g_u_l_a_t_i_o_n_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_C_o_d_i_m_<_ _c_o_d_i_m_e_n_s_i_o_n_ _>_:_: │ │ │ │ │ -_S_u_b_E_n_t_i_t_y_I_t_e_r_a_t_o_r │ │ │ │ │ -SubEntityIterator(int nIntervals, bool end=false) │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p_:_:_S_i_m_p_l_e_x_:_:_R_e_f_i_n_e_m_e_n_t_I_m_p │ │ │ │ │ -DDeeffiinniittiioonn simplex.cc:361 │ │ │ │ │ +_D_u_n_e_:_:_C_o_d_i_m_:_:_t_y_p_e │ │ │ │ │ +Codim type │ │ │ │ │ +DDeeffiinniittiioonn dimension.hh:25 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00224.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: axisalignedcubegeometry.hh File Reference │ │ │ │ +dune-geometry: quadraturerules.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,43 +71,128 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
axisalignedcubegeometry.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Macros | │ │ │ │ +Enumerations
│ │ │ │ +
quadraturerules.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ -

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

│ │ │ │ -
#include <bitset>
│ │ │ │ +
#include <algorithm>
│ │ │ │ +#include <iostream>
│ │ │ │ +#include <limits>
│ │ │ │ +#include <mutex>
│ │ │ │ +#include <utility>
│ │ │ │ +#include <vector>
│ │ │ │ #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/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"
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::AxisAlignedCubeGeometry< CoordType, dim, coorddim >
 A geometry implementation for axis-aligned hypercubes. More...
struct  std::tuple_size< Dune::QuadraturePoint< ct, dim > >
 
struct  std::tuple_element< 0, Dune::QuadraturePoint< ct, dim > >
 
struct  std::tuple_element< 1, Dune::QuadraturePoint< ct, dim > >
 
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  std
 STL namespace.
 
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

│ │ │ │ -

A geometry implementation for axis-aligned hypercubes.

│ │ │ │ -
│ │ │ │ +

Interface for quadrature points and rules

│ │ │ │ +

Macro Definition Documentation

│ │ │ │ + │ │ │ │ +

◆ DUNE_INCLUDING_IMPLEMENTATION

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_INCLUDING_IMPLEMENTATION
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,27 +1,94 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -axisalignedcubegeometry.hh File Reference │ │ │ │ │ -A geometry implementation for axis-aligned hypercubes. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s | _E_n_u_m_e_r_a_t_i_o_n_s │ │ │ │ │ +quadraturerules.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_i_n_d_e_x_._h_h> │ │ │ │ │ +#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" │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_<_ _C_o_o_r_d_T_y_p_e_,_ _d_i_m_,_ _c_o_o_r_d_d_i_m_ _> │ │ │ │ │ -  A geometry implementation for axis-aligned hypercubes. _M_o_r_e_._._. │ │ │ │ │ +struct   _s_t_d_:_:_t_u_p_l_e___s_i_z_e_<_ _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t_<_ _c_t_,_ _d_i_m_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _s_t_d_:_:_t_u_p_l_e___e_l_e_m_e_n_t_<_ _0_,_ _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t_<_ _c_t_,_ _d_i_m_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ +struct   _s_t_d_:_:_t_u_p_l_e___e_l_e_m_e_n_t_<_ _1_,_ _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t_<_ _c_t_,_ _d_i_m_ _>_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_O_r_d_e_r_O_u_t_O_f_R_a_n_g_e │ │ │ │ │ +  Exception thrown if a desired _Q_u_a_d_r_a_t_u_r_e_R_u_l_e is not available, because │ │ │ │ │ + the requested order is to high. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t_<_ _c_t_,_ _d_i_m_ _> │ │ │ │ │ +  Single evaluation point in a quadrature rule. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_<_ _c_t_,_ _d_i_m_ _> │ │ │ │ │ +  Abstract base class for quadrature rules. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s_<_ _c_t_y_p_e_,_ _d_i_m_ _> │ │ │ │ │ +  A container for all quadrature rules of dimension dim _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y_<_ _c_t_y_p_e_,_ _d_i_m_ _> │ │ │ │ │ +  Factory class for creation of quadrature rules, depending on │ │ │ │ │ + _G_e_o_m_e_t_r_y_T_y_p_e, order and _Q_u_a_d_r_a_t_u_r_e_T_y_p_e. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y_<_ _c_t_y_p_e_,_ _0_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y_<_ _c_t_y_p_e_,_ _1_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y_<_ _c_t_y_p_e_,_ _2_ _> │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y_<_ _c_t_y_p_e_,_ _3_ _> │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ +namespace   _s_t_d │ │ │ │ │ +  STL namespace. │ │ │ │ │ +  │ │ │ │ │ +namespace   _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e │ │ │ │ │ +  Defines an enum for currently available quadrature rules. │ │ │ │ │ +  │ │ │ │ │ +MMaaccrrooss │ │ │ │ │ +#define  _D_U_N_E___I_N_C_L_U_D_I_N_G___I_M_P_L_E_M_E_N_T_A_T_I_O_N │ │ │ │ │ +  │ │ │ │ │ +EEnnuummeerraattiioonnss │ │ │ │ │ +enum   _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m { │ │ │ │ │ +   _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_L_e_g_e_n_d_r_e = 0 , _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_: │ │ │ │ │ + _G_a_u_s_s_J_a_c_o_b_i___1___0 = 1 , _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_J_a_c_o_b_i___2___0 = 2 , _D_u_n_e_:_: │ │ │ │ │ + _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_J_a_c_o_b_i___n___0 = 3 , │ │ │ │ │ +   _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_L_o_b_a_t_t_o = 4 , _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_: │ │ │ │ │ + _G_a_u_s_s_R_a_d_a_u_L_e_f_t = 5 , _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_R_a_d_a_u_R_i_g_h_t = 6 , _D_u_n_e_:_: │ │ │ │ │ + _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_s_i_z_e │ │ │ │ │ + } │ │ │ │ │ +  │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -A geometry implementation for axis-aligned hypercubes. │ │ │ │ │ +Interface for quadrature points and rules │ │ │ │ │ +********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ +********** _?◆_? DDUUNNEE__IINNCCLLUUDDIINNGG__IIMMPPLLEEMMEENNTTAATTIIOONN ********** │ │ │ │ │ +#define DUNE_INCLUDING_IMPLEMENTATION │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00224_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: axisalignedcubegeometry.hh Source File │ │ │ │ +dune-geometry: quadraturerules.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,360 +74,502 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
axisalignedcubegeometry.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 © 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
│ │ │ │ +
6#ifndef DUNE_GEOMETRY_QUADRATURERULES_HH
│ │ │ │ +
7#define DUNE_GEOMETRY_QUADRATURERULES_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>
│ │ │ │ +
9#include <algorithm>
│ │ │ │ +
10#include <iostream>
│ │ │ │ +
11#include <limits>
│ │ │ │ +
12#include <mutex>
│ │ │ │ +
13#include <utility>
│ │ │ │ +
14#include <vector>
│ │ │ │ +
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
│ │ │ │ -
23namespace Dune {
│ │ │ │ +
22#include <dune/geometry/type.hh>
│ │ │ │ + │ │ │ │
24
│ │ │ │ -
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 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
│ │ │ │ - │ │ │ │ -
119
│ │ │ │ -
│ │ │ │ -
124 AxisAlignedCubeGeometry(const Dune::FieldVector<ctype,coorddim> lower,
│ │ │ │ -
125 const Dune::FieldVector<ctype,coorddim> upper)
│ │ │ │ -
126 : lower_(lower),
│ │ │ │ -
127 upper_(upper),
│ │ │ │ -
128 axes_()
│ │ │ │ -
129 {
│ │ │ │ -
130 static_assert(dim==coorddim, "Use this constructor only if dim==coorddim!");
│ │ │ │ -
131 // all 'true', but is never actually used
│ │ │ │ -
132 axes_ = (1<<coorddim)-1;
│ │ │ │ -
133 }
│ │ │ │ -
│ │ │ │ -
134
│ │ │ │ -
│ │ │ │ -
142 AxisAlignedCubeGeometry(const Dune::FieldVector<ctype,coorddim> lower,
│ │ │ │ -
143 const Dune::FieldVector<ctype,coorddim> upper,
│ │ │ │ -
144 const std::bitset<coorddim>& axes)
│ │ │ │ -
145 : lower_(lower),
│ │ │ │ -
146 upper_(upper),
│ │ │ │ -
147 axes_(axes)
│ │ │ │ -
148 {
│ │ │ │ -
149 assert(axes.count()==dim);
│ │ │ │ -
150 for (size_t i=0; i<coorddim; i++)
│ │ │ │ -
151 if (not axes_[i])
│ │ │ │ -
152 upper_[i] = lower_[i];
│ │ │ │ -
153 }
│ │ │ │ -
│ │ │ │ -
154
│ │ │ │ -
│ │ │ │ -
159 AxisAlignedCubeGeometry(const Dune::FieldVector<ctype,coorddim> lower)
│ │ │ │ -
160 : lower_(lower)
│ │ │ │ -
161 {}
│ │ │ │ -
│ │ │ │ -
162
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
165 {
│ │ │ │ -
166 return GeometryTypes::cube(dim);
│ │ │ │ -
167 }
│ │ │ │ -
│ │ │ │ -
168
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
171 {
│ │ │ │ -
172 GlobalCoordinate result;
│ │ │ │ -
173 if (dim == coorddim) { // fast case
│ │ │ │ -
174 for (size_t i=0; i<coorddim; i++)
│ │ │ │ -
175 result[i] = lower_[i] + local[i]*(upper_[i] - lower_[i]);
│ │ │ │ -
176 } else if (dim == 0) { // a vertex -- the other fast case
│ │ │ │ -
177 result = lower_; // hope for named-return-type-optimization
│ │ │ │ -
178 } else { // slow case
│ │ │ │ -
179 size_t lc=0;
│ │ │ │ -
180 for (size_t i=0; i<coorddim; i++)
│ │ │ │ -
181 result[i] = (axes_[i])
│ │ │ │ -
182 ? lower_[i] + local[lc++]*(upper_[i] - lower_[i])
│ │ │ │ -
183 : lower_[i];
│ │ │ │ -
184 }
│ │ │ │ -
185 return result;
│ │ │ │ -
186 }
│ │ │ │ -
│ │ │ │ -
187
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
190 {
│ │ │ │ -
191 LocalCoordinate result;
│ │ │ │ -
192 if (dim == coorddim) { // fast case
│ │ │ │ -
193 for (size_t i=0; i<dim; i++)
│ │ │ │ -
194 result[i] = (global[i] - lower_[i]) / (upper_[i] - lower_[i]);
│ │ │ │ -
195 } else if (dim != 0) { // slow case
│ │ │ │ -
196 size_t lc=0;
│ │ │ │ -
197 for (size_t i=0; i<coorddim; i++)
│ │ │ │ -
198 if (axes_[i])
│ │ │ │ -
199 result[lc++] = (global[i] - lower_[i]) / (upper_[i] - lower_[i]);
│ │ │ │ -
200 }
│ │ │ │ -
201 return result;
│ │ │ │ -
202 }
│ │ │ │ -
│ │ │ │ -
203
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
206 {
│ │ │ │ -
207 JacobianTransposed result;
│ │ │ │ -
208
│ │ │ │ -
209 // Actually compute the result. Uses different methods depending
│ │ │ │ -
210 // on what kind of matrix JacobianTransposed is.
│ │ │ │ -
211 jacobianTransposed(result);
│ │ │ │ -
212
│ │ │ │ -
213 return result;
│ │ │ │ -
214 }
│ │ │ │ -
│ │ │ │ -
215
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
218 {
│ │ │ │ - │ │ │ │ -
220
│ │ │ │ -
221 // Actually compute the result. Uses different methods depending
│ │ │ │ -
222 // on what kind of matrix JacobianTransposed is.
│ │ │ │ - │ │ │ │ -
224
│ │ │ │ -
225 return result;
│ │ │ │ -
226 }
│ │ │ │ -
│ │ │ │ -
227
│ │ │ │ -
│ │ │ │ -
229 Jacobian jacobian([[maybe_unused]] const LocalCoordinate& local) const
│ │ │ │ -
230 {
│ │ │ │ -
231 return jacobianTransposed(local).transposed();
│ │ │ │ -
232 }
│ │ │ │ -
│ │ │ │ -
233
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
236 {
│ │ │ │ -
237 return jacobianInverseTransposed(local).transposed();
│ │ │ │ -
238 }
│ │ │ │ -
│ │ │ │ -
239
│ │ │ │ -
│ │ │ │ -
243 Volume integrationElement([[maybe_unused]] const LocalCoordinate& local) const
│ │ │ │ -
244 {
│ │ │ │ -
245 return volume();
│ │ │ │ -
246 }
│ │ │ │ -
│ │ │ │ -
247
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
250 {
│ │ │ │ -
251 GlobalCoordinate result;
│ │ │ │ -
252 if (dim==0)
│ │ │ │ -
253 result = lower_;
│ │ │ │ -
254 else {
│ │ │ │ -
255 // Since lower_==upper_ for unused coordinates, this always does the right thing
│ │ │ │ -
256 for (size_t i=0; i<coorddim; i++)
│ │ │ │ -
257 result[i] = CoordType(0.5) * (lower_[i] + upper_[i]);
│ │ │ │ -
258 }
│ │ │ │ -
259 return result;
│ │ │ │ -
260 }
│ │ │ │ +
31namespace Dune {
│ │ │ │ +
32 // forward declaration
│ │ │ │ +
33 template<typename ct, int dim>
│ │ │ │ +
34 class QuadraturePoint;
│ │ │ │ +
35}
│ │ │ │ +
36
│ │ │ │ +
37// class specialization of standard classes that allow to use structured bindings on QuadraturePoint
│ │ │ │ +
38namespace std {
│ │ │ │ +
39 template<typename ct, int dim>
│ │ │ │ +
40 struct tuple_size<Dune::QuadraturePoint<ct,dim>> : public std::integral_constant<std::size_t,2> {};
│ │ │ │ +
41
│ │ │ │ +
42 template<typename ct, int dim>
│ │ │ │ +
43 struct tuple_element<0, Dune::QuadraturePoint<ct,dim>> { using type = Dune::FieldVector<ct, dim>; };
│ │ │ │ +
44
│ │ │ │ +
45 template<typename ct, int dim>
│ │ │ │ +
46 struct tuple_element<1, Dune::QuadraturePoint<ct,dim>> { using type = ct; };
│ │ │ │ +
47}
│ │ │ │ +
48
│ │ │ │ +
49namespace Dune {
│ │ │ │ +
50
│ │ │ │ +
55 class QuadratureOrderOutOfRange : public NotImplemented {};
│ │ │ │ +
56
│ │ │ │ +
65 template<typename ct, int dim>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
67 public:
│ │ │ │ +
69 constexpr static int dimension = dim;
│ │ │ │ +
70
│ │ │ │ +
72 typedef ct Field;
│ │ │ │ +
73
│ │ │ │ +
75 typedef Dune::FieldVector<ct,dim> Vector;
│ │ │ │ +
76
│ │ │ │ +
│ │ │ │ +
78 QuadraturePoint (const Vector& x, ct w) : local(x), weight_(w)
│ │ │ │ +
79 {}
│ │ │ │ +
│ │ │ │ +
80
│ │ │ │ +
│ │ │ │ +
82 const Vector& position () const
│ │ │ │ +
83 {
│ │ │ │ +
84 return local;
│ │ │ │ +
85 }
│ │ │ │ +
│ │ │ │ +
86
│ │ │ │ +
│ │ │ │ +
88 const ct &weight () const
│ │ │ │ +
89 {
│ │ │ │ +
90 return weight_;
│ │ │ │ +
91 }
│ │ │ │
│ │ │ │ +
92
│ │ │ │ +
111 template<std::size_t index, std::enable_if_t<(index<=1), int> = 0>
│ │ │ │ +
│ │ │ │ +
112 std::tuple_element_t<index, QuadraturePoint<ct, dim>> get() const
│ │ │ │ +
113 {
│ │ │ │ +
114 if constexpr (index == 0) {
│ │ │ │ +
115 return local;
│ │ │ │ +
116 }
│ │ │ │ +
117 else {
│ │ │ │ +
118 return weight_;
│ │ │ │ +
119 }
│ │ │ │ +
120 }
│ │ │ │ +
│ │ │ │ +
121
│ │ │ │ +
122 protected:
│ │ │ │ +
123 FieldVector<ct, dim> local;
│ │ │ │ +
124 ct weight_;
│ │ │ │ +
125 };
│ │ │ │ +
│ │ │ │ +
126
│ │ │ │ +
│ │ │ │ +
130 namespace QuadratureType {
│ │ │ │ +
│ │ │ │ +
131 enum Enum {
│ │ │ │ +
141 GaussLegendre = 0,
│ │ │ │ +
142
│ │ │ │ +
148 GaussJacobi_1_0 = 1,
│ │ │ │ +
149
│ │ │ │ +
155 GaussJacobi_2_0 = 2,
│ │ │ │ +
156
│ │ │ │ +
168 GaussJacobi_n_0 = 3,
│ │ │ │ +
169
│ │ │ │ +
176 GaussLobatto = 4,
│ │ │ │ +
177
│ │ │ │ +
184 GaussRadauLeft = 5,
│ │ │ │ +
185
│ │ │ │ +
193 GaussRadauRight = 6,
│ │ │ │ +
194 size
│ │ │ │ +
195 };
│ │ │ │ +
│ │ │ │ +
196 }
│ │ │ │ +
│ │ │ │ +
197
│ │ │ │ +
212 template<typename ct, int dim>
│ │ │ │ +
│ │ │ │ +
213 class QuadratureRule : public std::vector<QuadraturePoint<ct,dim> >
│ │ │ │ +
214 {
│ │ │ │ +
215 public:
│ │ │ │ +
221 QuadratureRule() : delivered_order(-1) {}
│ │ │ │ +
222
│ │ │ │ +
223 protected:
│ │ │ │ +
225 QuadratureRule(GeometryType t) : geometry_type(t), delivered_order(-1) {}
│ │ │ │ +
226
│ │ │ │ +
228 QuadratureRule(GeometryType t, int order) : geometry_type(t), delivered_order(order) {}
│ │ │ │ +
229 public:
│ │ │ │ +
231 constexpr static int d = dim;
│ │ │ │ +
232
│ │ │ │ +
234 typedef ct CoordType;
│ │ │ │ +
235
│ │ │ │ +
237 virtual int order () const { return delivered_order; }
│ │ │ │ +
238
│ │ │ │ +
240 virtual GeometryType type () const { return geometry_type; }
│ │ │ │ +
241 virtual ~QuadratureRule(){}
│ │ │ │ +
242
│ │ │ │ +
245 typedef typename std::vector<QuadraturePoint<ct,dim> >::const_iterator iterator;
│ │ │ │ +
246
│ │ │ │ +
247 protected:
│ │ │ │ + │ │ │ │ + │ │ │ │ +
250 };
│ │ │ │ +
│ │ │ │ +
251
│ │ │ │ +
252 // Forward declaration of the factory class,
│ │ │ │ +
253 // needed internally by the QuadratureRules container class.
│ │ │ │ +
254 template<typename ctype, int dim> class QuadratureRuleFactory;
│ │ │ │ +
255
│ │ │ │ +
259 template<typename ctype, int dim>
│ │ │ │ +
│ │ │ │ + │ │ │ │
261
│ │ │ │ -
│ │ │ │ -
263 int corners() const
│ │ │ │ -
264 {
│ │ │ │ -
265 return 1<<dim;
│ │ │ │ -
266 }
│ │ │ │ -
│ │ │ │ + │ │ │ │ +
264
│ │ │ │ +
265 // indexed by quadrature order
│ │ │ │ +
266 using QuadratureOrderVector = std::vector<std::pair<std::once_flag, QuadratureRule> >;
│ │ │ │
267
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
270 {
│ │ │ │ -
271 GlobalCoordinate result;
│ │ │ │ -
272 if (dim == coorddim) { // fast case
│ │ │ │ -
273 for (size_t i=0; i<coorddim; i++)
│ │ │ │ -
274 result[i] = (k & (1<<i)) ? upper_[i] : lower_[i];
│ │ │ │ -
275 } else if (dim == 0) { // vertex
│ │ │ │ -
276 result = lower_; // rely on named return-type optimization
│ │ │ │ -
277 } else { // slow case
│ │ │ │ -
278 unsigned int mask = 1;
│ │ │ │ -
279
│ │ │ │ -
280 for (size_t i=0; i<coorddim; i++) {
│ │ │ │ -
281 if (not axes_[i])
│ │ │ │ -
282 result[i] = lower_[i];
│ │ │ │ -
283 else {
│ │ │ │ -
284 result[i] = (k & mask) ? upper_[i] : lower_[i];
│ │ │ │ -
285 mask = (mask<<1);
│ │ │ │ -
286 }
│ │ │ │ -
287 }
│ │ │ │ -
288 }
│ │ │ │ -
289
│ │ │ │ -
290
│ │ │ │ -
291 return result;
│ │ │ │ -
292 }
│ │ │ │ -
│ │ │ │ -
293
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
296 {
│ │ │ │ -
297 ctype vol = 1;
│ │ │ │ -
298 if (dim == coorddim) { // fast case
│ │ │ │ -
299 for (size_t i=0; i<dim; i++)
│ │ │ │ -
300 vol *= upper_[i] - lower_[i];
│ │ │ │ -
301 // do nothing if dim == 0
│ │ │ │ -
302 } else if (dim != 0) { // slow case
│ │ │ │ -
303 for (size_t i=0; i<coorddim; i++)
│ │ │ │ -
304 if (axes_[i])
│ │ │ │ -
305 vol *= upper_[i] - lower_[i];
│ │ │ │ -
306 }
│ │ │ │ -
307 return vol;
│ │ │ │ -
308 }
│ │ │ │ -
│ │ │ │ -
309
│ │ │ │ -
│ │ │ │ -
311 bool affine() const
│ │ │ │ -
312 {
│ │ │ │ -
313 return true;
│ │ │ │ -
314 }
│ │ │ │ -
│ │ │ │ -
315
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
317 {
│ │ │ │ - │ │ │ │ -
319 }
│ │ │ │ -
│ │ │ │ -
320
│ │ │ │ -
321 private:
│ │ │ │ -
322 // jacobianTransposed: fast case --> diagonal matrix
│ │ │ │ -
323 void jacobianTransposed ( DiagonalMatrix<ctype,dim> &jacobianTransposed ) const
│ │ │ │ -
324 {
│ │ │ │ -
325 for (size_t i=0; i<dim; i++)
│ │ │ │ -
326 jacobianTransposed.diagonal()[i] = upper_[i] - lower_[i];
│ │ │ │ -
327 }
│ │ │ │ -
328
│ │ │ │ -
329 // jacobianTransposed: slow case --> dense matrix
│ │ │ │ -
330 void jacobianTransposed ( FieldMatrix<ctype,dim,coorddim> &jacobianTransposed ) const
│ │ │ │ -
331 {
│ │ │ │ -
332 if (dim==0)
│ │ │ │ -
333 return;
│ │ │ │ -
334
│ │ │ │ -
335 size_t lc = 0;
│ │ │ │ -
336 for (size_t i=0; i<coorddim; i++)
│ │ │ │ -
337 if (axes_[i])
│ │ │ │ -
338 jacobianTransposed[lc++][i] = upper_[i] - lower_[i];
│ │ │ │ -
339 }
│ │ │ │ +
268 // indexed by geometry type
│ │ │ │ +
269 using GeometryTypeVector = std::vector<std::pair<std::once_flag, QuadratureOrderVector> >;
│ │ │ │ +
270
│ │ │ │ +
271 // indexed by quadrature type enum
│ │ │ │ +
272 using QuadratureCacheVector = std::vector<std::pair<std::once_flag, GeometryTypeVector> >;
│ │ │ │ +
273
│ │ │ │ +
275 DUNE_EXPORT const QuadratureRule& _rule(const GeometryType& t, int p, QuadratureType::Enum qt=QuadratureType::GaussLegendre) const
│ │ │ │ +
276 {
│ │ │ │ +
277 assert(t.dim()==dim);
│ │ │ │ +
278
│ │ │ │ +
279 DUNE_ASSERT_CALL_ONCE();
│ │ │ │ +
280
│ │ │ │ +
281 static QuadratureCacheVector quadratureCache(QuadratureType::size);
│ │ │ │ +
282
│ │ │ │ +
283 auto& [ onceFlagQuadratureType, geometryTypes ] = quadratureCache[qt];
│ │ │ │ +
284 // initialize geometry types for this quadrature type once
│ │ │ │ +
285 std::call_once(onceFlagQuadratureType, [&types = geometryTypes]{
│ │ │ │ +
286 types = GeometryTypeVector(LocalGeometryTypeIndex::size(dim));
│ │ │ │ +
287 });
│ │ │ │ +
288
│ │ │ │ +
289 auto& [ onceFlagGeometryType, quadratureOrders ] = geometryTypes[LocalGeometryTypeIndex::index(t)];
│ │ │ │ +
290 // initialize quadrature orders for this geometry type and quadrature type once
│ │ │ │ +
291 std::call_once(onceFlagGeometryType, [&, &orders = quadratureOrders]{
│ │ │ │ +
292 // we only need one quadrature rule for points, not maxint
│ │ │ │ +
293 const auto numRules = dim == 0 ? 1 : QuadratureRuleFactory<ctype,dim>::maxOrder(t, qt)+1;
│ │ │ │ +
294 orders = QuadratureOrderVector(numRules);
│ │ │ │ +
295 });
│ │ │ │ +
296
│ │ │ │ +
297 // we only have one quadrature rule for points
│ │ │ │ +
298 auto& [ onceFlagQuadratureOrder, quadratureRule ] = quadratureOrders[dim == 0 ? 0 : p];
│ │ │ │ +
299 // initialize quadrature rule once
│ │ │ │ +
300 std::call_once(onceFlagQuadratureOrder, [&, &rule = quadratureRule]{
│ │ │ │ + │ │ │ │ +
302 });
│ │ │ │ +
303
│ │ │ │ +
304 return quadratureRule;
│ │ │ │ +
305 }
│ │ │ │ +
306
│ │ │ │ +
308 DUNE_EXPORT static QuadratureRules& instance()
│ │ │ │ +
309 {
│ │ │ │ +
310 static QuadratureRules instance;
│ │ │ │ +
311 return instance;
│ │ │ │ +
312 }
│ │ │ │ +
313
│ │ │ │ +
315 QuadratureRules () = default;
│ │ │ │ +
316 public:
│ │ │ │ +
318 static unsigned
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
320 QuadratureType::Enum qt=QuadratureType::GaussLegendre)
│ │ │ │ +
321 {
│ │ │ │ + │ │ │ │ +
323 }
│ │ │ │ +
│ │ │ │ +
324
│ │ │ │ +
│ │ │ │ +
326 static const QuadratureRule& rule(const GeometryType& t, int p, QuadratureType::Enum qt=QuadratureType::GaussLegendre)
│ │ │ │ +
327 {
│ │ │ │ +
328 return instance()._rule(t,p,qt);
│ │ │ │ +
329 }
│ │ │ │ +
│ │ │ │ +
330
│ │ │ │ +
│ │ │ │ +
332 static const QuadratureRule& rule(const GeometryType::BasicType t, int p, QuadratureType::Enum qt=QuadratureType::GaussLegendre)
│ │ │ │ +
333 {
│ │ │ │ +
334 GeometryType gt(t,dim);
│ │ │ │ +
335 return instance()._rule(gt,p,qt);
│ │ │ │ +
336 }
│ │ │ │ +
│ │ │ │ +
337 };
│ │ │ │ +
│ │ │ │ +
338
│ │ │ │ +
339} // end namespace Dune
│ │ │ │
340
│ │ │ │ -
341 // jacobianInverseTransposed: fast case --> diagonal matrix
│ │ │ │ -
342 void jacobianInverseTransposed ( DiagonalMatrix<ctype,dim> &jacobianInverseTransposed ) const
│ │ │ │ -
343 {
│ │ │ │ -
344 for (size_t i=0; i<dim; i++)
│ │ │ │ -
345 jacobianInverseTransposed.diagonal()[i] = CoordType(1.0) / (upper_[i] - lower_[i]);
│ │ │ │ -
346 }
│ │ │ │ -
347
│ │ │ │ -
348 // jacobianInverseTransposed: slow case --> dense matrix
│ │ │ │ -
349 void jacobianInverseTransposed ( FieldMatrix<ctype,coorddim,dim> &jacobianInverseTransposed ) const
│ │ │ │ -
350 {
│ │ │ │ -
351 if (dim==0)
│ │ │ │ -
352 return;
│ │ │ │ -
353
│ │ │ │ -
354 size_t lc = 0;
│ │ │ │ -
355 for (size_t i=0; i<coorddim; i++)
│ │ │ │ -
356 if (axes_[i])
│ │ │ │ -
357 jacobianInverseTransposed[i][lc++] = CoordType(1.0) / (upper_[i] - lower_[i]);
│ │ │ │ -
358 }
│ │ │ │ -
359
│ │ │ │ -
360 Dune::FieldVector<ctype,coorddim> lower_;
│ │ │ │ -
361
│ │ │ │ -
362 Dune::FieldVector<ctype,coorddim> upper_;
│ │ │ │ -
363
│ │ │ │ -
364 std::bitset<coorddim> axes_;
│ │ │ │ -
365 };
│ │ │ │ -
│ │ │ │ -
366
│ │ │ │ -
367} // namespace Dune
│ │ │ │ -
368#endif
│ │ │ │ - │ │ │ │ -
A unique label for each type of element that can occur in a grid.
│ │ │ │ +
341#define DUNE_INCLUDING_IMPLEMENTATION
│ │ │ │ +
342
│ │ │ │ +
343// 0d rules
│ │ │ │ +
344#include "quadraturerules/pointquadrature.hh"
│ │ │ │ +
345// 1d rules
│ │ │ │ +
346#include "quadraturerules/gausslobattoquadrature.hh"
│ │ │ │ +
347#include "quadraturerules/gaussquadrature.hh"
│ │ │ │ +
348#include "quadraturerules/gaussradauleftquadrature.hh"
│ │ │ │ +
349#include "quadraturerules/gaussradaurightquadrature.hh"
│ │ │ │ +
350#include "quadraturerules/jacobi1quadrature.hh"
│ │ │ │ +
351#include "quadraturerules/jacobi2quadrature.hh"
│ │ │ │ +
352#include "quadraturerules/jacobiNquadrature.hh"
│ │ │ │ +
353// 3d rules
│ │ │ │ +
354#include "quadraturerules/prismquadrature.hh"
│ │ │ │ +
355// general rules
│ │ │ │ +
356#include "quadraturerules/simplexquadrature.hh"
│ │ │ │ +
357#include "quadraturerules/tensorproductquadrature.hh"
│ │ │ │ +
358
│ │ │ │ +
359#undef DUNE_INCLUDING_IMPLEMENTATION
│ │ │ │ +
360
│ │ │ │ +
361namespace Dune {
│ │ │ │ +
362
│ │ │ │ +
369 template<typename ctype, int dim>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
371 private:
│ │ │ │ +
372 friend class QuadratureRules<ctype, dim>;
│ │ │ │ +
373 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt)
│ │ │ │ +
374 {
│ │ │ │ +
375 return TensorProductQuadratureRule<ctype,dim>::maxOrder(t.id(), qt);
│ │ │ │ +
376 }
│ │ │ │ +
377 static QuadratureRule<ctype, dim> rule(const GeometryType& t, int p, QuadratureType::Enum qt)
│ │ │ │ +
378 {
│ │ │ │ +
379 return TensorProductQuadratureRule<ctype,dim>(t.id(), p, qt);
│ │ │ │ +
380 }
│ │ │ │ +
381 };
│ │ │ │ +
│ │ │ │ +
382
│ │ │ │ +
383 template<typename ctype>
│ │ │ │ +
│ │ │ │ +
384 class QuadratureRuleFactory<ctype, 0> {
│ │ │ │ +
385 private:
│ │ │ │ +
386 constexpr static int dim = 0;
│ │ │ │ +
387 friend class QuadratureRules<ctype, dim>;
│ │ │ │ +
388 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum)
│ │ │ │ +
389 {
│ │ │ │ +
390 if (t.isVertex())
│ │ │ │ +
391 {
│ │ │ │ +
392 return std::numeric_limits<int>::max();
│ │ │ │ +
393 }
│ │ │ │ +
394 DUNE_THROW(Exception, "Unknown GeometryType");
│ │ │ │ +
395 }
│ │ │ │ +
396 static QuadratureRule<ctype, dim> rule(const GeometryType& t, int , QuadratureType::Enum)
│ │ │ │ +
397 {
│ │ │ │ +
398 if (t.isVertex())
│ │ │ │ +
399 {
│ │ │ │ +
400 return PointQuadratureRule<ctype>();
│ │ │ │ +
401 }
│ │ │ │ +
402 DUNE_THROW(Exception, "Unknown GeometryType");
│ │ │ │ +
403 }
│ │ │ │ +
404 };
│ │ │ │ +
│ │ │ │ +
405
│ │ │ │ +
406 template<typename ctype>
│ │ │ │ +
│ │ │ │ +
407 class QuadratureRuleFactory<ctype, 1> {
│ │ │ │ +
408 private:
│ │ │ │ +
409 constexpr static int dim = 1;
│ │ │ │ +
410 friend class QuadratureRules<ctype, dim>;
│ │ │ │ +
411 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt)
│ │ │ │ +
412 {
│ │ │ │ +
413 if (t.isLine())
│ │ │ │ +
414 {
│ │ │ │ +
415 switch (qt) {
│ │ │ │ + │ │ │ │ +
417 return GaussQuadratureRule1D<ctype>::highest_order;
│ │ │ │ + │ │ │ │ +
419 return Jacobi1QuadratureRule1D<ctype>::highest_order;
│ │ │ │ + │ │ │ │ +
421 return Jacobi2QuadratureRule1D<ctype>::highest_order;
│ │ │ │ + │ │ │ │ +
423 return GaussLobattoQuadratureRule1D<ctype>::highest_order;
│ │ │ │ + │ │ │ │ +
425 return JacobiNQuadratureRule1D<ctype>::maxOrder();
│ │ │ │ + │ │ │ │ +
427 return GaussRadauLeftQuadratureRule1D<ctype>::highest_order;
│ │ │ │ + │ │ │ │ +
429 return GaussRadauRightQuadratureRule1D<ctype>::highest_order;
│ │ │ │ +
430 default :
│ │ │ │ +
431 DUNE_THROW(Exception, "Unknown QuadratureType");
│ │ │ │ +
432 }
│ │ │ │ +
433 }
│ │ │ │ +
434 DUNE_THROW(Exception, "Unknown GeometryType");
│ │ │ │ +
435 }
│ │ │ │ +
436 static QuadratureRule<ctype, dim> rule(const GeometryType& t, int p, QuadratureType::Enum qt)
│ │ │ │ +
437 {
│ │ │ │ +
438 if (t.isLine())
│ │ │ │ +
439 {
│ │ │ │ +
440 switch (qt) {
│ │ │ │ + │ │ │ │ +
442 return GaussQuadratureRule1D<ctype>(p);
│ │ │ │ + │ │ │ │ +
444 return Jacobi1QuadratureRule1D<ctype>(p);
│ │ │ │ + │ │ │ │ +
446 return Jacobi2QuadratureRule1D<ctype>(p);
│ │ │ │ + │ │ │ │ +
448 return GaussLobattoQuadratureRule1D<ctype>(p);
│ │ │ │ + │ │ │ │ +
450 return JacobiNQuadratureRule1D<ctype>(p);
│ │ │ │ + │ │ │ │ +
452 return GaussRadauLeftQuadratureRule1D<ctype>(p);
│ │ │ │ + │ │ │ │ +
454 return GaussRadauRightQuadratureRule1D<ctype>(p);
│ │ │ │ +
455 default :
│ │ │ │ +
456 DUNE_THROW(Exception, "Unknown QuadratureType");
│ │ │ │ +
457 }
│ │ │ │ +
458 }
│ │ │ │ +
459 DUNE_THROW(Exception, "Unknown GeometryType");
│ │ │ │ +
460 }
│ │ │ │ +
461 };
│ │ │ │ +
│ │ │ │ +
462
│ │ │ │ +
463 template<typename ctype>
│ │ │ │ +
│ │ │ │ +
464 class QuadratureRuleFactory<ctype, 2> {
│ │ │ │ +
465 private:
│ │ │ │ +
466 constexpr static int dim = 2;
│ │ │ │ +
467 friend class QuadratureRules<ctype, dim>;
│ │ │ │ +
468 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt)
│ │ │ │ +
469 {
│ │ │ │ +
470 unsigned order =
│ │ │ │ +
471 TensorProductQuadratureRule<ctype,dim>::maxOrder(t.id(), qt);
│ │ │ │ +
472 if (t.isSimplex())
│ │ │ │ +
473 order = std::max
│ │ │ │ +
474 (order, static_cast<unsigned>(SimplexQuadratureRule<ctype,dim>::highest_order));
│ │ │ │ +
475 return order;
│ │ │ │ +
476 }
│ │ │ │ +
477 static QuadratureRule<ctype, dim> rule(const GeometryType& t, int p, QuadratureType::Enum qt)
│ │ │ │ +
478 {
│ │ │ │ +
479 if (t.isSimplex()
│ │ │ │ + │ │ │ │ +
481 && p <= SimplexQuadratureRule<ctype,dim>::highest_order)
│ │ │ │ +
482 {
│ │ │ │ +
483 return SimplexQuadratureRule<ctype,dim>(p);
│ │ │ │ +
484 }
│ │ │ │ +
485 return TensorProductQuadratureRule<ctype,dim>(t.id(), p, qt);
│ │ │ │ +
486 }
│ │ │ │ +
487 };
│ │ │ │ +
│ │ │ │ +
488
│ │ │ │ +
489 template<typename ctype>
│ │ │ │ +
│ │ │ │ +
490 class QuadratureRuleFactory<ctype, 3> {
│ │ │ │ +
491 private:
│ │ │ │ +
492 constexpr static int dim = 3;
│ │ │ │ +
493 friend class QuadratureRules<ctype, dim>;
│ │ │ │ +
494 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt)
│ │ │ │ +
495 {
│ │ │ │ +
496 unsigned order =
│ │ │ │ +
497 TensorProductQuadratureRule<ctype,dim>::maxOrder(t.id(), qt);
│ │ │ │ +
498 if (t.isSimplex())
│ │ │ │ +
499 order = std::max
│ │ │ │ +
500 (order, static_cast<unsigned>(SimplexQuadratureRule<ctype,dim>::highest_order));
│ │ │ │ +
501 if (t.isPrism())
│ │ │ │ +
502 order = std::max
│ │ │ │ +
503 (order, static_cast<unsigned>(PrismQuadratureRule<ctype,dim>::highest_order));
│ │ │ │ +
504 return order;
│ │ │ │ +
505 }
│ │ │ │ +
506 static QuadratureRule<ctype, dim> rule(const GeometryType& t, int p, QuadratureType::Enum qt)
│ │ │ │ +
507 {
│ │ │ │ +
508
│ │ │ │ +
509 if (t.isSimplex()
│ │ │ │ + │ │ │ │ +
511 && p <= SimplexQuadratureRule<ctype,dim>::highest_order)
│ │ │ │ +
512 {
│ │ │ │ +
513 return SimplexQuadratureRule<ctype,dim>(p);
│ │ │ │ +
514 }
│ │ │ │ +
515 if (t.isPrism()
│ │ │ │ + │ │ │ │ +
517 && p <= PrismQuadratureRule<ctype,dim>::highest_order)
│ │ │ │ +
518 {
│ │ │ │ +
519 return PrismQuadratureRule<ctype,dim>(p);
│ │ │ │ +
520 }
│ │ │ │ +
521 return TensorProductQuadratureRule<ctype,dim>(t.id(), p, qt);
│ │ │ │ +
522 }
│ │ │ │ +
523 };
│ │ │ │ +
│ │ │ │ +
524
│ │ │ │ +
525#ifndef DUNE_NO_EXTERN_QUADRATURERULES
│ │ │ │ +
526 extern template class GaussLobattoQuadratureRule<double, 1>;
│ │ │ │ +
527 extern template class GaussQuadratureRule<double, 1>;
│ │ │ │ +
528 extern template class GaussRadauLeftQuadratureRule<double, 1>;
│ │ │ │ +
529 extern template class GaussRadauRightQuadratureRule<double, 1>;
│ │ │ │ +
530 extern template class Jacobi1QuadratureRule<double, 1>;
│ │ │ │ +
531 extern template class Jacobi2QuadratureRule<double, 1>;
│ │ │ │ +
532 extern template class JacobiNQuadratureRule<double, 1>;
│ │ │ │ +
533 extern template class PrismQuadratureRule<double, 3>;
│ │ │ │ +
534 extern template class SimplexQuadratureRule<double, 2>;
│ │ │ │ +
535 extern template class SimplexQuadratureRule<double, 3>;
│ │ │ │ +
536#endif // !DUNE_NO_EXTERN_QUADRATURERULES
│ │ │ │ +
537
│ │ │ │ +
538} // end namespace
│ │ │ │ +
539
│ │ │ │ +
540#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.
│ │ │ │ +
STL namespace.
│ │ │ │
Definition affinegeometry.hh:21
│ │ │ │ -
typename Container::ReferenceElement ReferenceElement
The reference element type.
Definition referenceelements.hh:146
│ │ │ │ -
static const ReferenceElement & cube()
get hypercube reference elements
Definition referenceelements.hh:168
│ │ │ │ -
A geometry implementation for axis-aligned hypercubes.
Definition axisalignedcubegeometry.hh:50
│ │ │ │ -
Volume volume() const
Return the element volume.
Definition axisalignedcubegeometry.hh:295
│ │ │ │ -
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:142
│ │ │ │ -
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:124
│ │ │ │ -
JacobianInverse jacobianInverse(const LocalCoordinate &local) const
Inverse Jacobian of the transformation from local to global coordinates.
Definition axisalignedcubegeometry.hh:235
│ │ │ │ -
JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate &local) const
Inverse Jacobian transposed of the transformation from local to global coordinates.
Definition axisalignedcubegeometry.hh:217
│ │ │ │ -
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:159
│ │ │ │ -
static constexpr int mydimension
Dimension of the cube element.
Definition axisalignedcubegeometry.hh:56
│ │ │ │ -
friend Dune::ReferenceElements< ctype, dim >::ReferenceElement referenceElement(const AxisAlignedCubeGeometry &)
Definition axisalignedcubegeometry.hh:316
│ │ │ │ -
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:269
│ │ │ │ -
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
│ │ │ │ -
JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const
Jacobian transposed of the transformation from local to global coordinates.
Definition axisalignedcubegeometry.hh:205
│ │ │ │ -
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:189
│ │ │ │ -
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:164
│ │ │ │ -
int corners() const
Return the number of corners of the element.
Definition axisalignedcubegeometry.hh:263
│ │ │ │ -
Jacobian jacobian(const LocalCoordinate &local) const
Jacobian of the transformation from local to global coordinates.
Definition axisalignedcubegeometry.hh:229
│ │ │ │ -
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:243
│ │ │ │ -
GlobalCoordinate center() const
Return center of mass of the element.
Definition axisalignedcubegeometry.hh:249
│ │ │ │ -
AxisAlignedCubeGeometry()=default
Constructs an empty geometry.
│ │ │ │ -
bool affine() const
Return if the element is affine. Here: yes.
Definition axisalignedcubegeometry.hh:311
│ │ │ │ -
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:170
│ │ │ │ +
Enum
Definition quadraturerules.hh:131
│ │ │ │ +
@ GaussJacobi_n_0
Gauss-Legendre rules with .
Definition quadraturerules.hh:168
│ │ │ │ +
@ GaussJacobi_2_0
Gauss-Legendre rules with .
Definition quadraturerules.hh:155
│ │ │ │ +
@ GaussRadauRight
Gauss-Radau rules including the right endpoint.
Definition quadraturerules.hh:193
│ │ │ │ +
@ GaussJacobi_1_0
Gauss-Jacobi rules with .
Definition quadraturerules.hh:148
│ │ │ │ +
@ GaussLobatto
Gauss-Lobatto rules.
Definition quadraturerules.hh:176
│ │ │ │ +
@ GaussRadauLeft
Gauss-Radau rules including the left endpoint.
Definition quadraturerules.hh:184
│ │ │ │ +
@ GaussLegendre
Gauss-Legendre rules (default)
Definition quadraturerules.hh:141
│ │ │ │ +
Single evaluation point in a quadrature rule.
Definition quadraturerules.hh:66
│ │ │ │ +
const Vector & position() const
return local coordinates of integration point i
Definition quadraturerules.hh:82
│ │ │ │ +
Dune::FieldVector< ct, dim > Vector
Type used for the position of a quadrature point.
Definition quadraturerules.hh:75
│ │ │ │ +
ct Field
Number type used for coordinates and quadrature weights.
Definition quadraturerules.hh:72
│ │ │ │ +
const ct & weight() const
return weight associated with integration point i
Definition quadraturerules.hh:88
│ │ │ │ +
ct weight_
Definition quadraturerules.hh:124
│ │ │ │ +
static constexpr int dimension
Dimension of the integration domain.
Definition quadraturerules.hh:69
│ │ │ │ +
QuadraturePoint(const Vector &x, ct w)
set up quadrature of given order in d dimensions
Definition quadraturerules.hh:78
│ │ │ │ +
FieldVector< ct, dim > local
Definition quadraturerules.hh:123
│ │ │ │ +
Dune::FieldVector< ct, dim > type
Definition quadraturerules.hh:43
│ │ │ │ + │ │ │ │ +
Exception thrown if a desired QuadratureRule is not available, because the requested order is to high...
Definition quadraturerules.hh:55
│ │ │ │ +
Abstract base class for quadrature rules.
Definition quadraturerules.hh:214
│ │ │ │ +
virtual ~QuadratureRule()
Definition quadraturerules.hh:241
│ │ │ │ +
virtual GeometryType type() const
return type of element
Definition quadraturerules.hh:240
│ │ │ │ +
int delivered_order
Definition quadraturerules.hh:249
│ │ │ │ +
QuadratureRule(GeometryType t, int order)
Constructor for a given geometry type and a given quadrature order.
Definition quadraturerules.hh:228
│ │ │ │ +
GeometryType geometry_type
Definition quadraturerules.hh:248
│ │ │ │ +
ct CoordType
The type used for coordinates.
Definition quadraturerules.hh:234
│ │ │ │ +
QuadratureRule()
Default constructor.
Definition quadraturerules.hh:221
│ │ │ │ +
virtual int order() const
return order
Definition quadraturerules.hh:237
│ │ │ │ +
QuadratureRule(GeometryType t)
Constructor for a given geometry type. Leaves the quadrature order invalid
Definition quadraturerules.hh:225
│ │ │ │ +
std::vector< QuadraturePoint< ct, dim > >::const_iterator iterator
Definition quadraturerules.hh:245
│ │ │ │ +
Factory class for creation of quadrature rules, depending on GeometryType, order and QuadratureType.
Definition quadraturerules.hh:370
│ │ │ │ +
A container for all quadrature rules of dimension dim
Definition quadraturerules.hh:260
│ │ │ │ +
static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt=QuadratureType::GaussLegendre)
maximum quadrature order for given geometry type and quadrature type
Definition quadraturerules.hh:319
│ │ │ │ +
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:332
│ │ │ │ +
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:326
│ │ │ │
Unique label for each type of entities that can occur in DUNE grids.
Definition type.hh:114
│ │ │ │ +
constexpr bool isPrism() const
Return true if entity is a prism.
Definition type.hh:309
│ │ │ │ +
constexpr bool isVertex() const
Return true if entity is a vertex.
Definition type.hh:279
│ │ │ │ +
constexpr unsigned int dim() const
Return dimension of the type.
Definition type.hh:360
│ │ │ │ +
BasicType
Each entity can be tagged by one of these basic types plus its space dimension.
Definition type.hh:120
│ │ │ │ +
constexpr bool isLine() const
Return true if entity is a line segment.
Definition type.hh:284
│ │ │ │ +
constexpr unsigned int id() const
Return the topology id of the type.
Definition type.hh:365
│ │ │ │ +
constexpr bool isSimplex() const
Return true if entity is a simplex of any dimension.
Definition type.hh:319
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,438 +1,613 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -axisalignedcubegeometry.hh │ │ │ │ │ +quadraturerules.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 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 © 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 │ │ │ │ │ +6#ifndef DUNE_GEOMETRY_QUADRATURERULES_HH │ │ │ │ │ +7#define DUNE_GEOMETRY_QUADRATURERULES_HH │ │ │ │ │ 8 │ │ │ │ │ -13#include │ │ │ │ │ -14 │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ -17#include │ │ │ │ │ -18 │ │ │ │ │ -19#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ -20#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15 │ │ │ │ │ +16#include │ │ │ │ │ +17#include │ │ │ │ │ +18#include │ │ │ │ │ +19#include │ │ │ │ │ +20#include │ │ │ │ │ 21 │ │ │ │ │ -22 │ │ │ │ │ -23namespace _D_u_n_e { │ │ │ │ │ +22#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ +23#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_i_n_d_e_x_._h_h> │ │ │ │ │ 24 │ │ │ │ │ -48 template │ │ │ │ │ -_4_9 class _A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y │ │ │ │ │ -50 { │ │ │ │ │ -51 │ │ │ │ │ -52 │ │ │ │ │ -53 public: │ │ │ │ │ -54 │ │ │ │ │ -_5_6 constexpr static int _m_y_d_i_m_e_n_s_i_o_n = dim; │ │ │ │ │ -57 │ │ │ │ │ -_5_9 constexpr static int _c_o_o_r_d_d_i_m_e_n_s_i_o_n = coorddim; │ │ │ │ │ -60 │ │ │ │ │ -_6_2 typedef CoordType _c_t_y_p_e; │ │ │ │ │ -63 │ │ │ │ │ -_6_5 typedef FieldVector _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ -66 │ │ │ │ │ -_6_8 typedef FieldVector _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ -69 │ │ │ │ │ -_7_1 typedef _c_t_y_p_e _V_o_l_u_m_e; │ │ │ │ │ -72 │ │ │ │ │ -79 typedef typename std::conditional, │ │ │ │ │ -_8_1 FieldMatrix >_:_:_t_y_p_e _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d; │ │ │ │ │ -82 │ │ │ │ │ -89 typedef typename std::conditional, │ │ │ │ │ -_9_1 FieldMatrix >_:_:_t_y_p_e _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d; │ │ │ │ │ +31namespace _D_u_n_e { │ │ │ │ │ +32 // forward declaration │ │ │ │ │ +33 template │ │ │ │ │ +34 class QuadraturePoint; │ │ │ │ │ +35} │ │ │ │ │ +36 │ │ │ │ │ +37// class specialization of standard classes that allow to use structured │ │ │ │ │ +bindings on QuadraturePoint │ │ │ │ │ +38namespace _s_t_d { │ │ │ │ │ +39 template │ │ │ │ │ +_4_0 struct tuple_size<_D_u_n_e::QuadraturePoint> : public std:: │ │ │ │ │ +integral_constant {}; │ │ │ │ │ +41 │ │ │ │ │ +42 template │ │ │ │ │ +_4_3 struct tuple_element<0, _D_u_n_e::QuadraturePoint> { using _t_y_p_e = Dune:: │ │ │ │ │ +FieldVector; }; │ │ │ │ │ +44 │ │ │ │ │ +45 template │ │ │ │ │ +_4_6 struct tuple_element<1, _D_u_n_e::QuadraturePoint> { using _t_y_p_e = ct; }; │ │ │ │ │ +47} │ │ │ │ │ +48 │ │ │ │ │ +49namespace _D_u_n_e { │ │ │ │ │ +50 │ │ │ │ │ +_5_5 class _Q_u_a_d_r_a_t_u_r_e_O_r_d_e_r_O_u_t_O_f_R_a_n_g_e : public NotImplemented {}; │ │ │ │ │ +56 │ │ │ │ │ +65 template │ │ │ │ │ +_6_6 class _Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t { │ │ │ │ │ +67 public: │ │ │ │ │ +_6_9 constexpr static int _d_i_m_e_n_s_i_o_n = dim; │ │ │ │ │ +70 │ │ │ │ │ +_7_2 typedef ct _F_i_e_l_d; │ │ │ │ │ +73 │ │ │ │ │ +_7_5 typedef Dune::FieldVector _V_e_c_t_o_r; │ │ │ │ │ +76 │ │ │ │ │ +_7_8 _Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t (const _V_e_c_t_o_r& x, ct w) : _l_o_c_a_l(x), _w_e_i_g_h_t__(w) │ │ │ │ │ +79 {} │ │ │ │ │ +80 │ │ │ │ │ +_8_2 const _V_e_c_t_o_r& _p_o_s_i_t_i_o_n () const │ │ │ │ │ +83 { │ │ │ │ │ +84 return _l_o_c_a_l; │ │ │ │ │ +85 } │ │ │ │ │ +86 │ │ │ │ │ +_8_8 const ct &_w_e_i_g_h_t () const │ │ │ │ │ +89 { │ │ │ │ │ +90 return _w_e_i_g_h_t__; │ │ │ │ │ +91 } │ │ │ │ │ 92 │ │ │ │ │ -_1_0_0 using _J_a_c_o_b_i_a_n = std::conditional_t, FieldMatrix >; │ │ │ │ │ -101 │ │ │ │ │ -_1_0_9 using _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e = std::conditional_t, FieldMatrix >; │ │ │ │ │ -110 │ │ │ │ │ -_1_1_8 _A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y () = default; │ │ │ │ │ -119 │ │ │ │ │ -_1_2_4 _A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y(const Dune::FieldVector lower, │ │ │ │ │ -125 const Dune::FieldVector upper) │ │ │ │ │ -126 : lower_(lower), │ │ │ │ │ -127 upper_(upper), │ │ │ │ │ -128 axes_() │ │ │ │ │ -129 { │ │ │ │ │ -130 static_assert(dim==coorddim, "Use this constructor only if │ │ │ │ │ -dim==coorddim!"); │ │ │ │ │ -131 // all 'true', but is never actually used │ │ │ │ │ -132 axes_ = (1< lower, │ │ │ │ │ -143 const Dune::FieldVector upper, │ │ │ │ │ -144 const std::bitset& axes) │ │ │ │ │ -145 : lower_(lower), │ │ │ │ │ -146 upper_(upper), │ │ │ │ │ -147 axes_(axes) │ │ │ │ │ -148 { │ │ │ │ │ -149 assert(axes.count()==dim); │ │ │ │ │ -150 for (size_t i=0; i lower) │ │ │ │ │ -160 : lower_(lower) │ │ │ │ │ -161 {} │ │ │ │ │ -162 │ │ │ │ │ -_1_6_4 _G_e_o_m_e_t_r_y_T_y_p_e _t_y_p_e() const │ │ │ │ │ -165 { │ │ │ │ │ -166 return GeometryTypes::cube(dim); │ │ │ │ │ -167 } │ │ │ │ │ -168 │ │ │ │ │ -_1_7_0 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _g_l_o_b_a_l(const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e& _l_o_c_a_l) const │ │ │ │ │ -171 { │ │ │ │ │ -172 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e result; │ │ │ │ │ -173 if (dim == coorddim) { // fast case │ │ │ │ │ -174 for (size_t i=0; i = 0> │ │ │ │ │ +_1_1_2 std::tuple_element_t> get() const │ │ │ │ │ +113 { │ │ │ │ │ +114 if constexpr (index == 0) { │ │ │ │ │ +115 return local; │ │ │ │ │ +116 } │ │ │ │ │ +117 else { │ │ │ │ │ +118 return weight_; │ │ │ │ │ +119 } │ │ │ │ │ +120 } │ │ │ │ │ +121 │ │ │ │ │ +122 protected: │ │ │ │ │ +_1_2_3 FieldVector local; │ │ │ │ │ +_1_2_4 ct weight_; │ │ │ │ │ +125 }; │ │ │ │ │ +126 │ │ │ │ │ +_1_3_0 namespace QuadratureType { │ │ │ │ │ +_1_3_1 enum Enum { │ │ │ │ │ +_1_4_1 GaussLegendre = 0, │ │ │ │ │ +142 │ │ │ │ │ +_1_4_8 GaussJacobi_1_0 = 1, │ │ │ │ │ +149 │ │ │ │ │ +_1_5_5 GaussJacobi_2_0 = 2, │ │ │ │ │ +156 │ │ │ │ │ +_1_6_8 GaussJacobi_n_0 = 3, │ │ │ │ │ +169 │ │ │ │ │ +_1_7_6 GaussLobatto = 4, │ │ │ │ │ +177 │ │ │ │ │ +_1_8_4 GaussRadauLeft = 5, │ │ │ │ │ +185 │ │ │ │ │ +_1_9_3 GaussRadauRight = 6, │ │ │ │ │ +194 size │ │ │ │ │ +_1_9_5 }; │ │ │ │ │ +196 } │ │ │ │ │ +197 │ │ │ │ │ +212 template │ │ │ │ │ +_2_1_3 class _Q_u_a_d_r_a_t_u_r_e_R_u_l_e : public std::vector > │ │ │ │ │ +214 { │ │ │ │ │ +215 public: │ │ │ │ │ +_2_2_1 _Q_u_a_d_r_a_t_u_r_e_R_u_l_e() : delivered_order(-1) {} │ │ │ │ │ +222 │ │ │ │ │ +223 protected: │ │ │ │ │ +_2_2_5 _Q_u_a_d_r_a_t_u_r_e_R_u_l_e(_G_e_o_m_e_t_r_y_T_y_p_e t) : geometry_type(t), delivered_order(-1) {} │ │ │ │ │ +226 │ │ │ │ │ +_2_2_8 _Q_u_a_d_r_a_t_u_r_e_R_u_l_e(_G_e_o_m_e_t_r_y_T_y_p_e t, int order) : geometry_type(t), │ │ │ │ │ +delivered_order(order) {} │ │ │ │ │ +229 public: │ │ │ │ │ +_2_3_1 constexpr static int d = dim; │ │ │ │ │ +232 │ │ │ │ │ +_2_3_4 typedef ct _C_o_o_r_d_T_y_p_e; │ │ │ │ │ +235 │ │ │ │ │ +_2_3_7 virtual int _o_r_d_e_r () const { return delivered_order; } │ │ │ │ │ +238 │ │ │ │ │ +_2_4_0 virtual _G_e_o_m_e_t_r_y_T_y_p_e _t_y_p_e () const { return geometry_type; } │ │ │ │ │ +_2_4_1 virtual _~_Q_u_a_d_r_a_t_u_r_e_R_u_l_e(){} │ │ │ │ │ +242 │ │ │ │ │ +_2_4_5 typedef typename std::vector >::const_iterator │ │ │ │ │ +_i_t_e_r_a_t_o_r; │ │ │ │ │ +246 │ │ │ │ │ +247 protected: │ │ │ │ │ +_2_4_8 _G_e_o_m_e_t_r_y_T_y_p_e _g_e_o_m_e_t_r_y___t_y_p_e; │ │ │ │ │ +_2_4_9 int _d_e_l_i_v_e_r_e_d___o_r_d_e_r; │ │ │ │ │ +250 }; │ │ │ │ │ +251 │ │ │ │ │ +252 // Forward declaration of the factory class, │ │ │ │ │ +253 // needed internally by the QuadratureRules container class. │ │ │ │ │ +254 template class _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y; │ │ │ │ │ +255 │ │ │ │ │ +259 template │ │ │ │ │ +_2_6_0 class _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s { │ │ │ │ │ 261 │ │ │ │ │ -_2_6_3 int _c_o_r_n_e_r_s() const │ │ │ │ │ -264 { │ │ │ │ │ -265 return 1<; │ │ │ │ │ +264 │ │ │ │ │ +265 // indexed by quadrature order │ │ │ │ │ +266 using QuadratureOrderVector = std::vector >; │ │ │ │ │ 267 │ │ │ │ │ -_2_6_9 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _c_o_r_n_e_r(int k) const │ │ │ │ │ -270 { │ │ │ │ │ -271 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e result; │ │ │ │ │ -272 if (dim == coorddim) { // fast case │ │ │ │ │ -273 for (size_t i=0; i_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ -_r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t ( const _A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y & /* geometry */ ) │ │ │ │ │ -317 { │ │ │ │ │ -318 return _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_<_ _c_t_y_p_e_,_ _d_i_m_ _>_:_:_c_u_b_e(); │ │ │ │ │ -319 } │ │ │ │ │ -320 │ │ │ │ │ -321 private: │ │ │ │ │ -322 // jacobianTransposed: fast case --> diagonal matrix │ │ │ │ │ -323 void _j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d ( DiagonalMatrix &_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d ) │ │ │ │ │ -const │ │ │ │ │ -324 { │ │ │ │ │ -325 for (size_t i=0; i dense matrix │ │ │ │ │ -330 void _j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d ( FieldMatrix │ │ │ │ │ -&_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d ) const │ │ │ │ │ -331 { │ │ │ │ │ -332 if (dim==0) │ │ │ │ │ -333 return; │ │ │ │ │ -334 │ │ │ │ │ -335 size_t lc = 0; │ │ │ │ │ -336 for (size_t i=0; i >; │ │ │ │ │ +270 │ │ │ │ │ +271 // indexed by quadrature type enum │ │ │ │ │ +272 using QuadratureCacheVector = std::vector >; │ │ │ │ │ +273 │ │ │ │ │ +275 DUNE_EXPORT const _Q_u_a_d_r_a_t_u_r_e_R_u_l_e& _rule(const _G_e_o_m_e_t_r_y_T_y_p_e& t, int p, │ │ │ │ │ +_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m qt=QuadratureType::GaussLegendre) const │ │ │ │ │ +276 { │ │ │ │ │ +277 assert(t._d_i_m()==dim); │ │ │ │ │ +278 │ │ │ │ │ +279 DUNE_ASSERT_CALL_ONCE(); │ │ │ │ │ +280 │ │ │ │ │ +281 static QuadratureCacheVector quadratureCache(QuadratureType::size); │ │ │ │ │ +282 │ │ │ │ │ +283 auto& [ onceFlagQuadratureType, geometryTypes ] = quadratureCache[qt]; │ │ │ │ │ +284 // initialize geometry types for this quadrature type once │ │ │ │ │ +285 std::call_once(onceFlagQuadratureType, [&types = geometryTypes]{ │ │ │ │ │ +286 types = GeometryTypeVector(LocalGeometryTypeIndex::size(dim)); │ │ │ │ │ +287 }); │ │ │ │ │ +288 │ │ │ │ │ +289 auto& [ onceFlagGeometryType, quadratureOrders ] = geometryTypes │ │ │ │ │ +[LocalGeometryTypeIndex::index(t)]; │ │ │ │ │ +290 // initialize quadrature orders for this geometry type and quadrature type │ │ │ │ │ +once │ │ │ │ │ +291 std::call_once(onceFlagGeometryType, [&, &orders = quadratureOrders]{ │ │ │ │ │ +292 // we only need one quadrature rule for points, not maxint │ │ │ │ │ +293 const auto numRules = dim == 0 ? 1 : _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y_<_c_t_y_p_e_,_d_i_m_>_:_: │ │ │ │ │ +_m_a_x_O_r_d_e_r(t, qt)+1; │ │ │ │ │ +294 orders = QuadratureOrderVector(numRules); │ │ │ │ │ +295 }); │ │ │ │ │ +296 │ │ │ │ │ +297 // we only have one quadrature rule for points │ │ │ │ │ +298 auto& [ onceFlagQuadratureOrder, quadratureRule ] = quadratureOrders[dim == │ │ │ │ │ +0 ? 0 : p]; │ │ │ │ │ +299 // initialize quadrature rule once │ │ │ │ │ +300 std::call_once(onceFlagQuadratureOrder, [&, &rule = quadratureRule]{ │ │ │ │ │ +301 rule = _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y_<_c_t_y_p_e_,_d_i_m_>_:_:_r_u_l_e(t, p, qt); │ │ │ │ │ +302 }); │ │ │ │ │ +303 │ │ │ │ │ +304 return quadratureRule; │ │ │ │ │ +305 } │ │ │ │ │ +306 │ │ │ │ │ +308 DUNE_EXPORT static _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s& instance() │ │ │ │ │ +309 { │ │ │ │ │ +310 static _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s instance; │ │ │ │ │ +311 return instance; │ │ │ │ │ +312 } │ │ │ │ │ +313 │ │ │ │ │ +315 _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s () = default; │ │ │ │ │ +316 public: │ │ │ │ │ +318 static unsigned │ │ │ │ │ +_3_1_9 _m_a_x_O_r_d_e_r(const _G_e_o_m_e_t_r_y_T_y_p_e& t, │ │ │ │ │ +320 _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m qt=QuadratureType::GaussLegendre) │ │ │ │ │ +321 { │ │ │ │ │ +322 return _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y_<_c_t_y_p_e_,_d_i_m_>_:_:_m_a_x_O_r_d_e_r(t,qt); │ │ │ │ │ +323 } │ │ │ │ │ +324 │ │ │ │ │ +_3_2_6 static const _Q_u_a_d_r_a_t_u_r_e_R_u_l_e& _r_u_l_e(const _G_e_o_m_e_t_r_y_T_y_p_e& t, int p, │ │ │ │ │ +_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m qt=QuadratureType::GaussLegendre) │ │ │ │ │ +327 { │ │ │ │ │ +328 return instance()._rule(t,p,qt); │ │ │ │ │ +329 } │ │ │ │ │ +330 │ │ │ │ │ +_3_3_2 static const _Q_u_a_d_r_a_t_u_r_e_R_u_l_e& _r_u_l_e(const _G_e_o_m_e_t_r_y_T_y_p_e_:_:_B_a_s_i_c_T_y_p_e t, int p, │ │ │ │ │ +_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m qt=QuadratureType::GaussLegendre) │ │ │ │ │ +333 { │ │ │ │ │ +334 _G_e_o_m_e_t_r_y_T_y_p_e gt(t,dim); │ │ │ │ │ +335 return instance()._rule(gt,p,qt); │ │ │ │ │ +336 } │ │ │ │ │ +337 }; │ │ │ │ │ +338 │ │ │ │ │ +339} // end namespace Dune │ │ │ │ │ 340 │ │ │ │ │ -341 // jacobianInverseTransposed: fast case --> diagonal matrix │ │ │ │ │ -342 void _j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d ( DiagonalMatrix │ │ │ │ │ -&_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d ) const │ │ │ │ │ -343 { │ │ │ │ │ -344 for (size_t i=0; i dense matrix │ │ │ │ │ -349 void _j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d ( FieldMatrix │ │ │ │ │ -&_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d ) const │ │ │ │ │ -350 { │ │ │ │ │ -351 if (dim==0) │ │ │ │ │ -352 return; │ │ │ │ │ -353 │ │ │ │ │ -354 size_t lc = 0; │ │ │ │ │ -355 for (size_t i=0; i lower_; │ │ │ │ │ -361 │ │ │ │ │ -362 Dune::FieldVector upper_; │ │ │ │ │ -363 │ │ │ │ │ -364 std::bitset axes_; │ │ │ │ │ -365 }; │ │ │ │ │ -366 │ │ │ │ │ -367} // namespace Dune │ │ │ │ │ -368#endif │ │ │ │ │ -_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h │ │ │ │ │ +_3_4_1#define DUNE_INCLUDING_IMPLEMENTATION │ │ │ │ │ +342 │ │ │ │ │ +343// 0d rules │ │ │ │ │ +344#include "quadraturerules/pointquadrature.hh" │ │ │ │ │ +345// 1d rules │ │ │ │ │ +346#include "quadraturerules/gausslobattoquadrature.hh" │ │ │ │ │ +347#include "quadraturerules/gaussquadrature.hh" │ │ │ │ │ +348#include "quadraturerules/gaussradauleftquadrature.hh" │ │ │ │ │ +349#include "quadraturerules/gaussradaurightquadrature.hh" │ │ │ │ │ +350#include "quadraturerules/jacobi1quadrature.hh" │ │ │ │ │ +351#include "quadraturerules/jacobi2quadrature.hh" │ │ │ │ │ +352#include "quadraturerules/jacobiNquadrature.hh" │ │ │ │ │ +353// 3d rules │ │ │ │ │ +354#include "quadraturerules/prismquadrature.hh" │ │ │ │ │ +355// general rules │ │ │ │ │ +356#include "quadraturerules/simplexquadrature.hh" │ │ │ │ │ +357#include "quadraturerules/tensorproductquadrature.hh" │ │ │ │ │ +358 │ │ │ │ │ +359#undef DUNE_INCLUDING_IMPLEMENTATION │ │ │ │ │ +360 │ │ │ │ │ +361namespace _D_u_n_e { │ │ │ │ │ +362 │ │ │ │ │ +369 template │ │ │ │ │ +_3_7_0 class _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y { │ │ │ │ │ +371 private: │ │ │ │ │ +372 friend class _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s; │ │ │ │ │ +373 static unsigned maxOrder(const _G_e_o_m_e_t_r_y_T_y_p_e &t, _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m qt) │ │ │ │ │ +374 { │ │ │ │ │ +375 return TensorProductQuadratureRule::maxOrder(t._i_d(), qt); │ │ │ │ │ +376 } │ │ │ │ │ +377 static _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_<_c_t_y_p_e_,_ _d_i_m_> rule(const _G_e_o_m_e_t_r_y_T_y_p_e& t, int p, │ │ │ │ │ +_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m qt) │ │ │ │ │ +378 { │ │ │ │ │ +379 return TensorProductQuadratureRule(t._i_d(), p, qt); │ │ │ │ │ +380 } │ │ │ │ │ +381 }; │ │ │ │ │ +382 │ │ │ │ │ +383 template │ │ │ │ │ +_3_8_4 class _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y { │ │ │ │ │ +385 private: │ │ │ │ │ +_3_8_6 constexpr static int dim = 0; │ │ │ │ │ +387 friend class _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s; │ │ │ │ │ +388 static unsigned maxOrder(const _G_e_o_m_e_t_r_y_T_y_p_e &t, _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m) │ │ │ │ │ +389 { │ │ │ │ │ +390 if (t._i_s_V_e_r_t_e_x()) │ │ │ │ │ +391 { │ │ │ │ │ +392 return std::numeric_limits::max(); │ │ │ │ │ +393 } │ │ │ │ │ +394 DUNE_THROW(Exception, "Unknown GeometryType"); │ │ │ │ │ +395 } │ │ │ │ │ +396 static QuadratureRule rule(const GeometryType& t, int , │ │ │ │ │ +_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m) │ │ │ │ │ +397 { │ │ │ │ │ +398 if (t.isVertex()) │ │ │ │ │ +399 { │ │ │ │ │ +400 return PointQuadratureRule(); │ │ │ │ │ +401 } │ │ │ │ │ +402 DUNE_THROW(Exception, "Unknown GeometryType"); │ │ │ │ │ +403 } │ │ │ │ │ +404 }; │ │ │ │ │ +405 │ │ │ │ │ +406 template │ │ │ │ │ +_4_0_7 class _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y { │ │ │ │ │ +408 private: │ │ │ │ │ +_4_0_9 constexpr static int dim = 1; │ │ │ │ │ +410 friend class _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s; │ │ │ │ │ +411 static unsigned maxOrder(const _G_e_o_m_e_t_r_y_T_y_p_e &t, _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m qt) │ │ │ │ │ +412 { │ │ │ │ │ +413 if (t._i_s_L_i_n_e()) │ │ │ │ │ +414 { │ │ │ │ │ +415 switch (qt) { │ │ │ │ │ +416 case _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_L_e_g_e_n_d_r_e : │ │ │ │ │ +417 return GaussQuadratureRule1D::highest_order; │ │ │ │ │ +418 case _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_J_a_c_o_b_i___1___0 : │ │ │ │ │ +419 return Jacobi1QuadratureRule1D::highest_order; │ │ │ │ │ +420 case _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_J_a_c_o_b_i___2___0 : │ │ │ │ │ +421 return Jacobi2QuadratureRule1D::highest_order; │ │ │ │ │ +422 case _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_L_o_b_a_t_t_o : │ │ │ │ │ +423 return GaussLobattoQuadratureRule1D::highest_order; │ │ │ │ │ +424 case _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_J_a_c_o_b_i___n___0 : │ │ │ │ │ +425 return JacobiNQuadratureRule1D::maxOrder(); │ │ │ │ │ +426 case _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_R_a_d_a_u_L_e_f_t : │ │ │ │ │ +427 return GaussRadauLeftQuadratureRule1D::highest_order; │ │ │ │ │ +428 case _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_R_a_d_a_u_R_i_g_h_t : │ │ │ │ │ +429 return GaussRadauRightQuadratureRule1D::highest_order; │ │ │ │ │ +430 default : │ │ │ │ │ +431 DUNE_THROW(Exception, "Unknown QuadratureType"); │ │ │ │ │ +432 } │ │ │ │ │ +433 } │ │ │ │ │ +434 DUNE_THROW(Exception, "Unknown GeometryType"); │ │ │ │ │ +435 } │ │ │ │ │ +436 static QuadratureRule rule(const GeometryType& t, int p, │ │ │ │ │ +_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m qt) │ │ │ │ │ +437 { │ │ │ │ │ +438 if (t.isLine()) │ │ │ │ │ +439 { │ │ │ │ │ +440 switch (qt) { │ │ │ │ │ +441 case _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_L_e_g_e_n_d_r_e : │ │ │ │ │ +442 return GaussQuadratureRule1D(p); │ │ │ │ │ +443 case _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_J_a_c_o_b_i___1___0 : │ │ │ │ │ +444 return Jacobi1QuadratureRule1D(p); │ │ │ │ │ +445 case _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_J_a_c_o_b_i___2___0 : │ │ │ │ │ +446 return Jacobi2QuadratureRule1D(p); │ │ │ │ │ +447 case _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_L_o_b_a_t_t_o : │ │ │ │ │ +448 return GaussLobattoQuadratureRule1D(p); │ │ │ │ │ +449 case _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_J_a_c_o_b_i___n___0 : │ │ │ │ │ +450 return JacobiNQuadratureRule1D(p); │ │ │ │ │ +451 case _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_R_a_d_a_u_L_e_f_t : │ │ │ │ │ +452 return GaussRadauLeftQuadratureRule1D(p); │ │ │ │ │ +453 case _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_R_a_d_a_u_R_i_g_h_t : │ │ │ │ │ +454 return GaussRadauRightQuadratureRule1D(p); │ │ │ │ │ +455 default : │ │ │ │ │ +456 DUNE_THROW(Exception, "Unknown QuadratureType"); │ │ │ │ │ +457 } │ │ │ │ │ +458 } │ │ │ │ │ +459 DUNE_THROW(Exception, "Unknown GeometryType"); │ │ │ │ │ +460 } │ │ │ │ │ +461 }; │ │ │ │ │ +462 │ │ │ │ │ +463 template │ │ │ │ │ +_4_6_4 class _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y { │ │ │ │ │ +465 private: │ │ │ │ │ +_4_6_6 constexpr static int dim = 2; │ │ │ │ │ +467 friend class _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s; │ │ │ │ │ +468 static unsigned maxOrder(const _G_e_o_m_e_t_r_y_T_y_p_e &t, _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m qt) │ │ │ │ │ +469 { │ │ │ │ │ +470 unsigned order = │ │ │ │ │ +471 TensorProductQuadratureRule::maxOrder(t._i_d(), qt); │ │ │ │ │ +472 if (t._i_s_S_i_m_p_l_e_x()) │ │ │ │ │ +473 order = std::max │ │ │ │ │ +474 (order, static_cast(SimplexQuadratureRule:: │ │ │ │ │ +highest_order)); │ │ │ │ │ +475 return order; │ │ │ │ │ +476 } │ │ │ │ │ +477 static _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_<_c_t_y_p_e_,_ _d_i_m_> rule(const _G_e_o_m_e_t_r_y_T_y_p_e& t, int p, │ │ │ │ │ +_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m qt) │ │ │ │ │ +478 { │ │ │ │ │ +479 if (t._i_s_S_i_m_p_l_e_x() │ │ │ │ │ +480 && ( qt == _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_L_e_g_e_n_d_r_e || qt == _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_: │ │ │ │ │ +_G_a_u_s_s_J_a_c_o_b_i___n___0 ) │ │ │ │ │ +481 && p <= SimplexQuadratureRule::highest_order) │ │ │ │ │ +482 { │ │ │ │ │ +483 return SimplexQuadratureRule(p); │ │ │ │ │ +484 } │ │ │ │ │ +485 return TensorProductQuadratureRule(t._i_d(), p, qt); │ │ │ │ │ +486 } │ │ │ │ │ +487 }; │ │ │ │ │ +488 │ │ │ │ │ +489 template │ │ │ │ │ +_4_9_0 class _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y { │ │ │ │ │ +491 private: │ │ │ │ │ +_4_9_2 constexpr static int dim = 3; │ │ │ │ │ +493 friend class _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s; │ │ │ │ │ +494 static unsigned maxOrder(const _G_e_o_m_e_t_r_y_T_y_p_e &t, _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m qt) │ │ │ │ │ +495 { │ │ │ │ │ +496 unsigned order = │ │ │ │ │ +497 TensorProductQuadratureRule::maxOrder(t._i_d(), qt); │ │ │ │ │ +498 if (t._i_s_S_i_m_p_l_e_x()) │ │ │ │ │ +499 order = std::max │ │ │ │ │ +500 (order, static_cast(SimplexQuadratureRule:: │ │ │ │ │ +highest_order)); │ │ │ │ │ +501 if (t._i_s_P_r_i_s_m()) │ │ │ │ │ +502 order = std::max │ │ │ │ │ +503 (order, static_cast(PrismQuadratureRule:: │ │ │ │ │ +highest_order)); │ │ │ │ │ +504 return order; │ │ │ │ │ +505 } │ │ │ │ │ +506 static _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_<_c_t_y_p_e_,_ _d_i_m_> rule(const _G_e_o_m_e_t_r_y_T_y_p_e& t, int p, │ │ │ │ │ +_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m qt) │ │ │ │ │ +507 { │ │ │ │ │ +508 │ │ │ │ │ +509 if (t._i_s_S_i_m_p_l_e_x() │ │ │ │ │ +510 && ( qt == _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_L_e_g_e_n_d_r_e || qt == _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_: │ │ │ │ │ +_G_a_u_s_s_J_a_c_o_b_i___n___0 ) │ │ │ │ │ +511 && p <= SimplexQuadratureRule::highest_order) │ │ │ │ │ +512 { │ │ │ │ │ +513 return SimplexQuadratureRule(p); │ │ │ │ │ +514 } │ │ │ │ │ +515 if (t._i_s_P_r_i_s_m() │ │ │ │ │ +516 && qt == _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_L_e_g_e_n_d_r_e │ │ │ │ │ +517 && p <= PrismQuadratureRule::highest_order) │ │ │ │ │ +518 { │ │ │ │ │ +519 return PrismQuadratureRule(p); │ │ │ │ │ +520 } │ │ │ │ │ +521 return TensorProductQuadratureRule(t._i_d(), p, qt); │ │ │ │ │ +522 } │ │ │ │ │ +523 }; │ │ │ │ │ +524 │ │ │ │ │ +525#ifndef DUNE_NO_EXTERN_QUADRATURERULES │ │ │ │ │ +526 extern template class GaussLobattoQuadratureRule; │ │ │ │ │ +527 extern template class GaussQuadratureRule; │ │ │ │ │ +528 extern template class GaussRadauLeftQuadratureRule; │ │ │ │ │ +529 extern template class GaussRadauRightQuadratureRule; │ │ │ │ │ +530 extern template class Jacobi1QuadratureRule; │ │ │ │ │ +531 extern template class Jacobi2QuadratureRule; │ │ │ │ │ +532 extern template class JacobiNQuadratureRule; │ │ │ │ │ +533 extern template class PrismQuadratureRule; │ │ │ │ │ +534 extern template class SimplexQuadratureRule; │ │ │ │ │ +_5_3_5 extern template class SimplexQuadratureRule; │ │ │ │ │ +536#endif // !DUNE_NO_EXTERN_QUADRATURERULES │ │ │ │ │ +537 │ │ │ │ │ +538} // end namespace │ │ │ │ │ +539 │ │ │ │ │ +540#endif // DUNE_GEOMETRY_QUADRATURERULES_HH │ │ │ │ │ _t_y_p_e_._h_h │ │ │ │ │ A unique label for each type of element that can occur in a grid. │ │ │ │ │ +_t_y_p_e_i_n_d_e_x_._h_h │ │ │ │ │ +Helper classes to provide indices for geometrytypes for use in a vector. │ │ │ │ │ +_s_t_d │ │ │ │ │ +STL namespace. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn affinegeometry.hh:21 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ -typename Container::ReferenceElement ReferenceElement │ │ │ │ │ -The reference element type. │ │ │ │ │ -DDeeffiinniittiioonn referenceelements.hh:146 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_c_u_b_e │ │ │ │ │ -static const ReferenceElement & cube() │ │ │ │ │ -get hypercube reference elements │ │ │ │ │ -DDeeffiinniittiioonn referenceelements.hh:168 │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y │ │ │ │ │ -A geometry implementation for axis-aligned hypercubes. │ │ │ │ │ -DDeeffiinniittiioonn axisalignedcubegeometry.hh:50 │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_v_o_l_u_m_e │ │ │ │ │ -Volume volume() const │ │ │ │ │ -Return the element volume. │ │ │ │ │ -DDeeffiinniittiioonn axisalignedcubegeometry.hh:295 │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y │ │ │ │ │ -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. │ │ │ │ │ -DDeeffiinniittiioonn axisalignedcubegeometry.hh:142 │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y │ │ │ │ │ -AxisAlignedCubeGeometry(const Dune::FieldVector< ctype, coorddim > lower, const │ │ │ │ │ -Dune::FieldVector< ctype, coorddim > upper) │ │ │ │ │ -Constructor from a lower left and an upper right corner. │ │ │ │ │ -DDeeffiinniittiioonn axisalignedcubegeometry.hh:124 │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e │ │ │ │ │ -JacobianInverse jacobianInverse(const LocalCoordinate &local) const │ │ │ │ │ -Inverse Jacobian of the transformation from local to global coordinates. │ │ │ │ │ -DDeeffiinniittiioonn axisalignedcubegeometry.hh:235 │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate │ │ │ │ │ -&local) const │ │ │ │ │ -Inverse Jacobian transposed of the transformation from local to global │ │ │ │ │ -coordinates. │ │ │ │ │ -DDeeffiinniittiioonn axisalignedcubegeometry.hh:217 │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -std::conditional< dim==coorddim, DiagonalMatrix< ctype, dim >, FieldMatrix< │ │ │ │ │ -ctype, dim, coorddim > >::type JacobianTransposed │ │ │ │ │ -Return type of jacobianTransposed. │ │ │ │ │ -DDeeffiinniittiioonn axisalignedcubegeometry.hh:81 │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y │ │ │ │ │ -AxisAlignedCubeGeometry(const Dune::FieldVector< ctype, coorddim > lower) │ │ │ │ │ -Constructor from a single point only. │ │ │ │ │ -DDeeffiinniittiioonn axisalignedcubegeometry.hh:159 │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_m_y_d_i_m_e_n_s_i_o_n │ │ │ │ │ -static constexpr int mydimension │ │ │ │ │ -Dimension of the cube element. │ │ │ │ │ -DDeeffiinniittiioonn axisalignedcubegeometry.hh:56 │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ -friend Dune::ReferenceElements< ctype, dim >::ReferenceElement referenceElement │ │ │ │ │ -(const AxisAlignedCubeGeometry &) │ │ │ │ │ -DDeeffiinniittiioonn axisalignedcubegeometry.hh:316 │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_c_o_o_r_d_d_i_m_e_n_s_i_o_n │ │ │ │ │ -static constexpr int coorddimension │ │ │ │ │ -Dimension of the world space that the cube element is embedded in. │ │ │ │ │ -DDeeffiinniittiioonn axisalignedcubegeometry.hh:59 │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_c_o_r_n_e_r │ │ │ │ │ -GlobalCoordinate corner(int k) const │ │ │ │ │ -Return world coordinates of the k-th corner of the element. │ │ │ │ │ -DDeeffiinniittiioonn axisalignedcubegeometry.hh:269 │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_V_o_l_u_m_e │ │ │ │ │ -ctype Volume │ │ │ │ │ -Type used for volume. │ │ │ │ │ -DDeeffiinniittiioonn axisalignedcubegeometry.hh:71 │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ -FieldVector< ctype, dim > LocalCoordinate │ │ │ │ │ -Type used for a vector of element coordinates. │ │ │ │ │ -DDeeffiinniittiioonn axisalignedcubegeometry.hh:65 │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const │ │ │ │ │ -Jacobian transposed of the transformation from local to global coordinates. │ │ │ │ │ -DDeeffiinniittiioonn axisalignedcubegeometry.hh:205 │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ -FieldVector< ctype, coorddim > GlobalCoordinate │ │ │ │ │ -Type used for a vector of world coordinates. │ │ │ │ │ -DDeeffiinniittiioonn axisalignedcubegeometry.hh:68 │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_l_o_c_a_l │ │ │ │ │ -LocalCoordinate local(const GlobalCoordinate &global) const │ │ │ │ │ -Map a point in global (world) coordinates to element coordinates. │ │ │ │ │ -DDeeffiinniittiioonn axisalignedcubegeometry.hh:189 │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_c_t_y_p_e │ │ │ │ │ -CoordType ctype │ │ │ │ │ -Type used for single coordinate coefficients. │ │ │ │ │ -DDeeffiinniittiioonn axisalignedcubegeometry.hh:62 │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n │ │ │ │ │ -std::conditional_t< dim==coorddim, DiagonalMatrix< ctype, dim >, FieldMatrix< │ │ │ │ │ -ctype, coorddim, dim > > Jacobian │ │ │ │ │ -Return type of jacobian. │ │ │ │ │ -DDeeffiinniittiioonn axisalignedcubegeometry.hh:100 │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_t_y_p_e │ │ │ │ │ -GeometryType type() const │ │ │ │ │ -Type of the cube. Here: a hypercube of the correct dimension. │ │ │ │ │ -DDeeffiinniittiioonn axisalignedcubegeometry.hh:164 │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_c_o_r_n_e_r_s │ │ │ │ │ -int corners() const │ │ │ │ │ -Return the number of corners of the element. │ │ │ │ │ -DDeeffiinniittiioonn axisalignedcubegeometry.hh:263 │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n │ │ │ │ │ -Jacobian jacobian(const LocalCoordinate &local) const │ │ │ │ │ -Jacobian of the transformation from local to global coordinates. │ │ │ │ │ -DDeeffiinniittiioonn axisalignedcubegeometry.hh:229 │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -std::conditional< dim==coorddim, DiagonalMatrix< ctype, dim >, FieldMatrix< │ │ │ │ │ -ctype, coorddim, dim > >::type JacobianInverseTransposed │ │ │ │ │ -Return type of jacobianInverseTransposed. │ │ │ │ │ -DDeeffiinniittiioonn axisalignedcubegeometry.hh:91 │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t │ │ │ │ │ -Volume integrationElement(const LocalCoordinate &local) const │ │ │ │ │ -Return the integration element, i.e., the determinant term in the integral │ │ │ │ │ -transformation formula. │ │ │ │ │ -DDeeffiinniittiioonn axisalignedcubegeometry.hh:243 │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_c_e_n_t_e_r │ │ │ │ │ -GlobalCoordinate center() const │ │ │ │ │ -Return center of mass of the element. │ │ │ │ │ -DDeeffiinniittiioonn axisalignedcubegeometry.hh:249 │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y │ │ │ │ │ -AxisAlignedCubeGeometry()=default │ │ │ │ │ -Constructs an empty geometry. │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_a_f_f_i_n_e │ │ │ │ │ -bool affine() const │ │ │ │ │ -Return if the element is affine. Here: yes. │ │ │ │ │ -DDeeffiinniittiioonn axisalignedcubegeometry.hh:311 │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e │ │ │ │ │ -std::conditional_t< dim==coorddim, DiagonalMatrix< ctype, dim >, FieldMatrix< │ │ │ │ │ -ctype, dim, coorddim > > JacobianInverse │ │ │ │ │ -Return type of jacobianInverse. │ │ │ │ │ -DDeeffiinniittiioonn axisalignedcubegeometry.hh:109 │ │ │ │ │ -_D_u_n_e_:_:_A_x_i_s_A_l_i_g_n_e_d_C_u_b_e_G_e_o_m_e_t_r_y_:_:_g_l_o_b_a_l │ │ │ │ │ -GlobalCoordinate global(const LocalCoordinate &local) const │ │ │ │ │ -Map a point in local (element) coordinates to world coordinates. │ │ │ │ │ -DDeeffiinniittiioonn axisalignedcubegeometry.hh:170 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m │ │ │ │ │ +Enum │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:131 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_J_a_c_o_b_i___n___0 │ │ │ │ │ +@ GaussJacobi_n_0 │ │ │ │ │ +Gauss-Legendre rules with . │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:168 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_J_a_c_o_b_i___2___0 │ │ │ │ │ +@ GaussJacobi_2_0 │ │ │ │ │ +Gauss-Legendre rules with . │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:155 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_R_a_d_a_u_R_i_g_h_t │ │ │ │ │ +@ GaussRadauRight │ │ │ │ │ +Gauss-Radau rules including the right endpoint. │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:193 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_J_a_c_o_b_i___1___0 │ │ │ │ │ +@ GaussJacobi_1_0 │ │ │ │ │ +Gauss-Jacobi rules with . │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:148 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_L_o_b_a_t_t_o │ │ │ │ │ +@ GaussLobatto │ │ │ │ │ +Gauss-Lobatto rules. │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:176 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_R_a_d_a_u_L_e_f_t │ │ │ │ │ +@ GaussRadauLeft │ │ │ │ │ +Gauss-Radau rules including the left endpoint. │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:184 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_L_e_g_e_n_d_r_e │ │ │ │ │ +@ GaussLegendre │ │ │ │ │ +Gauss-Legendre rules (default) │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:141 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t │ │ │ │ │ +Single evaluation point in a quadrature rule. │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:66 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t_:_:_p_o_s_i_t_i_o_n │ │ │ │ │ +const Vector & position() const │ │ │ │ │ +return local coordinates of integration point i │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:82 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t_:_:_V_e_c_t_o_r │ │ │ │ │ +Dune::FieldVector< ct, dim > Vector │ │ │ │ │ +Type used for the position of a quadrature point. │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:75 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t_:_:_F_i_e_l_d │ │ │ │ │ +ct Field │ │ │ │ │ +Number type used for coordinates and quadrature weights. │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:72 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t_:_:_w_e_i_g_h_t │ │ │ │ │ +const ct & weight() const │ │ │ │ │ +return weight associated with integration point i │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:88 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t_:_:_w_e_i_g_h_t__ │ │ │ │ │ +ct weight_ │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:124 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ +static constexpr int dimension │ │ │ │ │ +Dimension of the integration domain. │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:69 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t │ │ │ │ │ +QuadraturePoint(const Vector &x, ct w) │ │ │ │ │ +set up quadrature of given order in d dimensions │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:78 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t_:_:_l_o_c_a_l │ │ │ │ │ +FieldVector< ct, dim > local │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:123 │ │ │ │ │ +_s_t_d_:_:_t_u_p_l_e___e_l_e_m_e_n_t_<_ _0_,_ _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t_<_ _c_t_,_ _d_i_m_ _>_ _>_:_:_t_y_p_e │ │ │ │ │ +Dune::FieldVector< ct, dim > type │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:43 │ │ │ │ │ +_s_t_d_:_:_t_u_p_l_e___e_l_e_m_e_n_t_<_ _1_,_ _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t_<_ _c_t_,_ _d_i_m_ _>_ _>_:_:_t_y_p_e │ │ │ │ │ +ct type │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:46 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_O_r_d_e_r_O_u_t_O_f_R_a_n_g_e │ │ │ │ │ +Exception thrown if a desired QuadratureRule is not available, because the │ │ │ │ │ +requested order is to high... │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:55 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e │ │ │ │ │ +Abstract base class for quadrature rules. │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:214 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_:_:_~_Q_u_a_d_r_a_t_u_r_e_R_u_l_e │ │ │ │ │ +virtual ~QuadratureRule() │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:241 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_:_:_t_y_p_e │ │ │ │ │ +virtual GeometryType type() const │ │ │ │ │ +return type of element │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:240 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_:_:_d_e_l_i_v_e_r_e_d___o_r_d_e_r │ │ │ │ │ +int delivered_order │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:249 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e │ │ │ │ │ +QuadratureRule(GeometryType t, int order) │ │ │ │ │ +Constructor for a given geometry type and a given quadrature order. │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:228 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_:_:_g_e_o_m_e_t_r_y___t_y_p_e │ │ │ │ │ +GeometryType geometry_type │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:248 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_:_:_C_o_o_r_d_T_y_p_e │ │ │ │ │ +ct CoordType │ │ │ │ │ +The type used for coordinates. │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:234 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e │ │ │ │ │ +QuadratureRule() │ │ │ │ │ +Default constructor. │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:221 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_:_:_o_r_d_e_r │ │ │ │ │ +virtual int order() const │ │ │ │ │ +return order │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:237 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e │ │ │ │ │ +QuadratureRule(GeometryType t) │ │ │ │ │ +Constructor for a given geometry type. Leaves the quadrature order invalid │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:225 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ +std::vector< QuadraturePoint< ct, dim > >::const_iterator iterator │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:245 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y │ │ │ │ │ +Factory class for creation of quadrature rules, depending on GeometryType, │ │ │ │ │ +order and QuadratureType. │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:370 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s │ │ │ │ │ +A container for all quadrature rules of dimension dim │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:260 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s_:_:_m_a_x_O_r_d_e_r │ │ │ │ │ +static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum │ │ │ │ │ +qt=QuadratureType::GaussLegendre) │ │ │ │ │ +maximum quadrature order for given geometry type and quadrature type │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:319 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s_:_:_r_u_l_e │ │ │ │ │ +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 │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:332 │ │ │ │ │ +_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s_:_:_r_u_l_e │ │ │ │ │ +static const QuadratureRule & rule(const GeometryType &t, int p, │ │ │ │ │ +QuadratureType::Enum qt=QuadratureType::GaussLegendre) │ │ │ │ │ +select the appropriate QuadratureRule for GeometryType t and order p │ │ │ │ │ +DDeeffiinniittiioonn quadraturerules.hh:326 │ │ │ │ │ _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ DDeeffiinniittiioonn type.hh:114 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_P_r_i_s_m │ │ │ │ │ +constexpr bool isPrism() const │ │ │ │ │ +Return true if entity is a prism. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:309 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_V_e_r_t_e_x │ │ │ │ │ +constexpr bool isVertex() const │ │ │ │ │ +Return true if entity is a vertex. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:279 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_d_i_m │ │ │ │ │ +constexpr unsigned int dim() const │ │ │ │ │ +Return dimension of the type. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:360 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_B_a_s_i_c_T_y_p_e │ │ │ │ │ +BasicType │ │ │ │ │ +Each entity can be tagged by one of these basic types plus its space dimension. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:120 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_L_i_n_e │ │ │ │ │ +constexpr bool isLine() const │ │ │ │ │ +Return true if entity is a line segment. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:284 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_d │ │ │ │ │ +constexpr unsigned int id() const │ │ │ │ │ +Return the topology id of the type. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:365 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_S_i_m_p_l_e_x │ │ │ │ │ +constexpr bool isSimplex() const │ │ │ │ │ +Return true if entity is a simplex of any dimension. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:319 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00227.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: quadraturerules.hh File Reference │ │ │ │ +dune-geometry: algorithms.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,134 +65,41 @@ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces | │ │ │ │ -Macros | │ │ │ │ -Enumerations
│ │ │ │ -
quadraturerules.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
algorithms.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │
#include <algorithm>
│ │ │ │ -#include <iostream>
│ │ │ │ +#include <cmath>
│ │ │ │ #include <limits>
│ │ │ │ -#include <mutex>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <vector>
│ │ │ │ +#include <optional>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <dune/common/debugstream.hh>
│ │ │ │ +#include <dune/common/fmatrix.hh>
│ │ │ │ +#include <dune/common/ftraits.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/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"
│ │ │ │ +#include <dune/geometry/affinegeometry.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

struct  std::tuple_size< Dune::QuadraturePoint< ct, dim > >
 
struct  std::tuple_element< 0, Dune::QuadraturePoint< ct, dim > >
 
struct  std::tuple_element< 1, Dune::QuadraturePoint< ct, dim > >
 
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  std
 STL namespace.
 
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
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,94 +1,25 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _M_a_c_r_o_s | _E_n_u_m_e_r_a_t_i_o_n_s │ │ │ │ │ -quadraturerules.hh File Reference │ │ │ │ │ + * _u_t_i_l_i_t_y │ │ │ │ │ +_N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +algorithms.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_i_n_d_e_x_._h_h> │ │ │ │ │ -#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" │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_a_f_f_i_n_e_g_e_o_m_e_t_r_y_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -CCllaasssseess │ │ │ │ │ -struct   _s_t_d_:_:_t_u_p_l_e___s_i_z_e_<_ _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t_<_ _c_t_,_ _d_i_m_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _s_t_d_:_:_t_u_p_l_e___e_l_e_m_e_n_t_<_ _0_,_ _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t_<_ _c_t_,_ _d_i_m_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ -struct   _s_t_d_:_:_t_u_p_l_e___e_l_e_m_e_n_t_<_ _1_,_ _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t_<_ _c_t_,_ _d_i_m_ _>_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_O_r_d_e_r_O_u_t_O_f_R_a_n_g_e │ │ │ │ │ -  Exception thrown if a desired _Q_u_a_d_r_a_t_u_r_e_R_u_l_e is not available, because │ │ │ │ │ - the requested order is to high. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t_<_ _c_t_,_ _d_i_m_ _> │ │ │ │ │ -  Single evaluation point in a quadrature rule. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_<_ _c_t_,_ _d_i_m_ _> │ │ │ │ │ -  Abstract base class for quadrature rules. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s_<_ _c_t_y_p_e_,_ _d_i_m_ _> │ │ │ │ │ -  A container for all quadrature rules of dimension dim _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y_<_ _c_t_y_p_e_,_ _d_i_m_ _> │ │ │ │ │ -  Factory class for creation of quadrature rules, depending on │ │ │ │ │ - _G_e_o_m_e_t_r_y_T_y_p_e, order and _Q_u_a_d_r_a_t_u_r_e_T_y_p_e. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y_<_ _c_t_y_p_e_,_ _0_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y_<_ _c_t_y_p_e_,_ _1_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y_<_ _c_t_y_p_e_,_ _2_ _> │ │ │ │ │ -  │ │ │ │ │ - class   _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y_<_ _c_t_y_p_e_,_ _3_ _> │ │ │ │ │ -  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -namespace   _s_t_d │ │ │ │ │ -  STL namespace. │ │ │ │ │ -  │ │ │ │ │ -namespace   _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e │ │ │ │ │ -  Defines an enum for currently available quadrature rules. │ │ │ │ │ -  │ │ │ │ │ -MMaaccrrooss │ │ │ │ │ -#define  _D_U_N_E___I_N_C_L_U_D_I_N_G___I_M_P_L_E_M_E_N_T_A_T_I_O_N │ │ │ │ │ -  │ │ │ │ │ -EEnnuummeerraattiioonnss │ │ │ │ │ -enum   _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m { │ │ │ │ │ -   _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_L_e_g_e_n_d_r_e = 0 , _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_: │ │ │ │ │ - _G_a_u_s_s_J_a_c_o_b_i___1___0 = 1 , _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_J_a_c_o_b_i___2___0 = 2 , _D_u_n_e_:_: │ │ │ │ │ - _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_J_a_c_o_b_i___n___0 = 3 , │ │ │ │ │ -   _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_L_o_b_a_t_t_o = 4 , _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_: │ │ │ │ │ - _G_a_u_s_s_R_a_d_a_u_L_e_f_t = 5 , _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_R_a_d_a_u_R_i_g_h_t = 6 , _D_u_n_e_:_: │ │ │ │ │ - _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_s_i_z_e │ │ │ │ │ - } │ │ │ │ │ -  │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Interface for quadrature points and rules │ │ │ │ │ -********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ │ -********** _?◆_? DDUUNNEE__IINNCCLLUUDDIINNGG__IIMMPPLLEEMMEENNTTAATTIIOONN ********** │ │ │ │ │ -#define DUNE_INCLUDING_IMPLEMENTATION │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00227_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: quadraturerules.hh Source File │ │ │ │ +dune-geometry: algorithms.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,506 +70,124 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
quadraturerules.hh
│ │ │ │ +
algorithms.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 © 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>
│ │ │ │ -
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
│ │ │ │ -
31namespace Dune {
│ │ │ │ -
32 // forward declaration
│ │ │ │ -
33 template<typename ct, int dim>
│ │ │ │ -
34 class QuadraturePoint;
│ │ │ │ -
35}
│ │ │ │ -
36
│ │ │ │ -
37// class specialization of standard classes that allow to use structured bindings on QuadraturePoint
│ │ │ │ -
38namespace std {
│ │ │ │ -
39 template<typename ct, int dim>
│ │ │ │ -
40 struct tuple_size<Dune::QuadraturePoint<ct,dim>> : public std::integral_constant<std::size_t,2> {};
│ │ │ │ -
41
│ │ │ │ -
42 template<typename ct, int dim>
│ │ │ │ -
43 struct tuple_element<0, Dune::QuadraturePoint<ct,dim>> { using type = Dune::FieldVector<ct, dim>; };
│ │ │ │ -
44
│ │ │ │ -
45 template<typename ct, int dim>
│ │ │ │ -
46 struct tuple_element<1, Dune::QuadraturePoint<ct,dim>> { using type = ct; };
│ │ │ │ -
47}
│ │ │ │ +
5#ifndef DUNE_GEOMETRY_UTILITY_ALGORITHMS_HH
│ │ │ │ +
6#define DUNE_GEOMETRY_UTILITY_ALGORITHMS_HH
│ │ │ │ +
7
│ │ │ │ +
8#include <algorithm>
│ │ │ │ +
9#include <cmath>
│ │ │ │ +
10#include <limits>
│ │ │ │ +
11#include <optional>
│ │ │ │ +
12#include <type_traits>
│ │ │ │ +
13
│ │ │ │ +
14#include <dune/common/debugstream.hh>
│ │ │ │ +
15#include <dune/common/fmatrix.hh>
│ │ │ │ +
16#include <dune/common/ftraits.hh>
│ │ │ │ +
17#include <dune/common/fvector.hh>
│ │ │ │ +
18#include <dune/geometry/affinegeometry.hh> // for FieldMatrixHelper
│ │ │ │ +
19
│ │ │ │ +
20namespace Dune {
│ │ │ │ +
21namespace Impl {
│ │ │ │ +
22
│ │ │ │ +
23template <class R = double>
│ │ │ │ +
24struct GaussNewtonOptions
│ │ │ │ +
25{
│ │ │ │ +
27 int maxIt = 100;
│ │ │ │ +
28
│ │ │ │ +
30 R absTol = []{ using std::sqrt; return sqrt(std::numeric_limits<R>::epsilon()); }();
│ │ │ │ +
31
│ │ │ │ +
33 int maxInnerIt = 10;
│ │ │ │ +
34
│ │ │ │ +
36 R theta = 0.5;
│ │ │ │ +
37};
│ │ │ │ +
38
│ │ │ │ +
39
│ │ │ │ +
41enum class GaussNewtonErrorCode
│ │ │ │ +
42{
│ │ │ │ +
43 OK = 0, //< A solution is found
│ │ │ │ +
44 JACOBIAN_NOT_INVERTIBLE, //< The Jacobian is not invertible at the current point
│ │ │ │ +
45 STAGNATION, //< No reduction of the residul norm possible
│ │ │ │ +
46 TOLERANCE_NOT_REACHED //< The break tolerance for the resodual norm is not reached
│ │ │ │ +
47};
│ │ │ │
48
│ │ │ │ -
49namespace Dune {
│ │ │ │ -
50
│ │ │ │ -
55 class QuadratureOrderOutOfRange : public NotImplemented {};
│ │ │ │ -
56
│ │ │ │ -
65 template<typename ct, int dim>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
67 public:
│ │ │ │ -
69 constexpr static int dimension = dim;
│ │ │ │ -
70
│ │ │ │ -
72 typedef ct Field;
│ │ │ │ +
49
│ │ │ │ +
62template <class F, class DF, class Domain,
│ │ │ │ +
63 class Range = std::invoke_result_t<F, Domain>,
│ │ │ │ +
64 class R = typename Dune::FieldTraits<Domain>::real_type>
│ │ │ │ +
65GaussNewtonErrorCode gaussNewton (const F& f, const DF& df, Range y, Domain& x0,
│ │ │ │ +
66 GaussNewtonOptions<R> opts = {})
│ │ │ │ +
67{
│ │ │ │ +
68 Domain x = x0;
│ │ │ │ +
69 Domain dx{};
│ │ │ │ +
70 Range dy = f(x0) - y;
│ │ │ │ +
71 R resNorm0 = dy.two_norm();
│ │ │ │ +
72 R resNorm = 0;
│ │ │ │
73
│ │ │ │ -
75 typedef Dune::FieldVector<ct,dim> Vector;
│ │ │ │ -
76
│ │ │ │ -
│ │ │ │ -
78 QuadraturePoint (const Vector& x, ct w) : local(x), weight_(w)
│ │ │ │ -
79 {}
│ │ │ │ -
│ │ │ │ -
80
│ │ │ │ -
│ │ │ │ -
82 const Vector& position () const
│ │ │ │ -
83 {
│ │ │ │ -
84 return local;
│ │ │ │ -
85 }
│ │ │ │ -
│ │ │ │ -
86
│ │ │ │ -
│ │ │ │ -
88 const ct &weight () const
│ │ │ │ -
89 {
│ │ │ │ -
90 return weight_;
│ │ │ │ -
91 }
│ │ │ │ -
│ │ │ │ +
74 for (int i = 0; i < opts.maxIt; ++i)
│ │ │ │ +
75 {
│ │ │ │ +
76 // Get descent direction dx: (J^T*J)dx = J^T*dy
│ │ │ │ +
77 const bool invertible = FieldMatrixHelper<R>::xTRightInvA(df(x), dy, dx);
│ │ │ │ +
78
│ │ │ │ +
79 // break if jacobian is not invertible
│ │ │ │ +
80 if (!invertible)
│ │ │ │ +
81 return GaussNewtonErrorCode::JACOBIAN_NOT_INVERTIBLE;
│ │ │ │ +
82
│ │ │ │ +
83 // line-search procedure to update x with correction dx
│ │ │ │ +
84 R alpha = 1;
│ │ │ │ +
85 for (int j = 0; j < opts.maxInnerIt; ++j) {
│ │ │ │ +
86 x = x0 - alpha * dx;
│ │ │ │ +
87 dy = f(x) - y;
│ │ │ │ +
88 resNorm = dy.two_norm();
│ │ │ │ +
89
│ │ │ │ +
90 if (resNorm < resNorm0)
│ │ │ │ +
91 break;
│ │ │ │
92
│ │ │ │ -
111 template<std::size_t index, std::enable_if_t<(index<=1), int> = 0>
│ │ │ │ -
│ │ │ │ -
112 std::tuple_element_t<index, QuadraturePoint<ct, dim>> get() const
│ │ │ │ -
113 {
│ │ │ │ -
114 if constexpr (index == 0) {
│ │ │ │ -
115 return local;
│ │ │ │ -
116 }
│ │ │ │ -
117 else {
│ │ │ │ -
118 return weight_;
│ │ │ │ -
119 }
│ │ │ │ -
120 }
│ │ │ │ -
│ │ │ │ -
121
│ │ │ │ -
122 protected:
│ │ │ │ -
123 FieldVector<ct, dim> local;
│ │ │ │ -
124 ct weight_;
│ │ │ │ -
125 };
│ │ │ │ -
│ │ │ │ -
126
│ │ │ │ -
│ │ │ │ -
130 namespace QuadratureType {
│ │ │ │ -
│ │ │ │ -
131 enum Enum {
│ │ │ │ -
141 GaussLegendre = 0,
│ │ │ │ -
142
│ │ │ │ -
148 GaussJacobi_1_0 = 1,
│ │ │ │ -
149
│ │ │ │ -
155 GaussJacobi_2_0 = 2,
│ │ │ │ -
156
│ │ │ │ -
168 GaussJacobi_n_0 = 3,
│ │ │ │ -
169
│ │ │ │ -
176 GaussLobatto = 4,
│ │ │ │ -
177
│ │ │ │ -
184 GaussRadauLeft = 5,
│ │ │ │ -
185
│ │ │ │ -
193 GaussRadauRight = 6,
│ │ │ │ -
194 size
│ │ │ │ -
195 };
│ │ │ │ -
│ │ │ │ -
196 }
│ │ │ │ -
│ │ │ │ -
197
│ │ │ │ -
212 template<typename ct, int dim>
│ │ │ │ -
│ │ │ │ -
213 class QuadratureRule : public std::vector<QuadraturePoint<ct,dim> >
│ │ │ │ -
214 {
│ │ │ │ -
215 public:
│ │ │ │ -
221 QuadratureRule() : delivered_order(-1) {}
│ │ │ │ -
222
│ │ │ │ -
223 protected:
│ │ │ │ -
225 QuadratureRule(GeometryType t) : geometry_type(t), delivered_order(-1) {}
│ │ │ │ -
226
│ │ │ │ -
228 QuadratureRule(GeometryType t, int order) : geometry_type(t), delivered_order(order) {}
│ │ │ │ -
229 public:
│ │ │ │ -
231 constexpr static int d = dim;
│ │ │ │ -
232
│ │ │ │ -
234 typedef ct CoordType;
│ │ │ │ -
235
│ │ │ │ -
237 virtual int order () const { return delivered_order; }
│ │ │ │ -
238
│ │ │ │ -
240 virtual GeometryType type () const { return geometry_type; }
│ │ │ │ -
241 virtual ~QuadratureRule(){}
│ │ │ │ -
242
│ │ │ │ -
245 typedef typename std::vector<QuadraturePoint<ct,dim> >::const_iterator iterator;
│ │ │ │ -
246
│ │ │ │ -
247 protected:
│ │ │ │ - │ │ │ │ - │ │ │ │ -
250 };
│ │ │ │ -
│ │ │ │ -
251
│ │ │ │ -
252 // Forward declaration of the factory class,
│ │ │ │ -
253 // needed internally by the QuadratureRules container class.
│ │ │ │ -
254 template<typename ctype, int dim> class QuadratureRuleFactory;
│ │ │ │ -
255
│ │ │ │ -
259 template<typename ctype, int dim>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
261
│ │ │ │ - │ │ │ │ -
264
│ │ │ │ -
265 // indexed by quadrature order
│ │ │ │ -
266 using QuadratureOrderVector = std::vector<std::pair<std::once_flag, QuadratureRule> >;
│ │ │ │ -
267
│ │ │ │ -
268 // indexed by geometry type
│ │ │ │ -
269 using GeometryTypeVector = std::vector<std::pair<std::once_flag, QuadratureOrderVector> >;
│ │ │ │ -
270
│ │ │ │ -
271 // indexed by quadrature type enum
│ │ │ │ -
272 using QuadratureCacheVector = std::vector<std::pair<std::once_flag, GeometryTypeVector> >;
│ │ │ │ -
273
│ │ │ │ -
275 DUNE_EXPORT const QuadratureRule& _rule(const GeometryType& t, int p, QuadratureType::Enum qt=QuadratureType::GaussLegendre) const
│ │ │ │ -
276 {
│ │ │ │ -
277 assert(t.dim()==dim);
│ │ │ │ -
278
│ │ │ │ -
279 DUNE_ASSERT_CALL_ONCE();
│ │ │ │ -
280
│ │ │ │ -
281 static QuadratureCacheVector quadratureCache(QuadratureType::size);
│ │ │ │ -
282
│ │ │ │ -
283 auto& [ onceFlagQuadratureType, geometryTypes ] = quadratureCache[qt];
│ │ │ │ -
284 // initialize geometry types for this quadrature type once
│ │ │ │ -
285 std::call_once(onceFlagQuadratureType, [&types = geometryTypes]{
│ │ │ │ -
286 types = GeometryTypeVector(LocalGeometryTypeIndex::size(dim));
│ │ │ │ -
287 });
│ │ │ │ -
288
│ │ │ │ -
289 auto& [ onceFlagGeometryType, quadratureOrders ] = geometryTypes[LocalGeometryTypeIndex::index(t)];
│ │ │ │ -
290 // initialize quadrature orders for this geometry type and quadrature type once
│ │ │ │ -
291 std::call_once(onceFlagGeometryType, [&, &orders = quadratureOrders]{
│ │ │ │ -
292 // we only need one quadrature rule for points, not maxint
│ │ │ │ -
293 const auto numRules = dim == 0 ? 1 : QuadratureRuleFactory<ctype,dim>::maxOrder(t, qt)+1;
│ │ │ │ -
294 orders = QuadratureOrderVector(numRules);
│ │ │ │ -
295 });
│ │ │ │ -
296
│ │ │ │ -
297 // we only have one quadrature rule for points
│ │ │ │ -
298 auto& [ onceFlagQuadratureOrder, quadratureRule ] = quadratureOrders[dim == 0 ? 0 : p];
│ │ │ │ -
299 // initialize quadrature rule once
│ │ │ │ -
300 std::call_once(onceFlagQuadratureOrder, [&, &rule = quadratureRule]{
│ │ │ │ - │ │ │ │ -
302 });
│ │ │ │ -
303
│ │ │ │ -
304 return quadratureRule;
│ │ │ │ -
305 }
│ │ │ │ -
306
│ │ │ │ -
308 DUNE_EXPORT static QuadratureRules& instance()
│ │ │ │ -
309 {
│ │ │ │ -
310 static QuadratureRules instance;
│ │ │ │ -
311 return instance;
│ │ │ │ -
312 }
│ │ │ │ -
313
│ │ │ │ -
315 QuadratureRules () = default;
│ │ │ │ -
316 public:
│ │ │ │ -
318 static unsigned
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
320 QuadratureType::Enum qt=QuadratureType::GaussLegendre)
│ │ │ │ -
321 {
│ │ │ │ - │ │ │ │ -
323 }
│ │ │ │ -
│ │ │ │ -
324
│ │ │ │ -
│ │ │ │ -
326 static const QuadratureRule& rule(const GeometryType& t, int p, QuadratureType::Enum qt=QuadratureType::GaussLegendre)
│ │ │ │ -
327 {
│ │ │ │ -
328 return instance()._rule(t,p,qt);
│ │ │ │ -
329 }
│ │ │ │ -
│ │ │ │ -
330
│ │ │ │ -
│ │ │ │ -
332 static const QuadratureRule& rule(const GeometryType::BasicType t, int p, QuadratureType::Enum qt=QuadratureType::GaussLegendre)
│ │ │ │ -
333 {
│ │ │ │ -
334 GeometryType gt(t,dim);
│ │ │ │ -
335 return instance()._rule(gt,p,qt);
│ │ │ │ -
336 }
│ │ │ │ -
│ │ │ │ -
337 };
│ │ │ │ -
│ │ │ │ -
338
│ │ │ │ -
339} // end namespace Dune
│ │ │ │ -
340
│ │ │ │ -
341#define DUNE_INCLUDING_IMPLEMENTATION
│ │ │ │ -
342
│ │ │ │ -
343// 0d rules
│ │ │ │ -
344#include "quadraturerules/pointquadrature.hh"
│ │ │ │ -
345// 1d rules
│ │ │ │ -
346#include "quadraturerules/gausslobattoquadrature.hh"
│ │ │ │ -
347#include "quadraturerules/gaussquadrature.hh"
│ │ │ │ -
348#include "quadraturerules/gaussradauleftquadrature.hh"
│ │ │ │ -
349#include "quadraturerules/gaussradaurightquadrature.hh"
│ │ │ │ -
350#include "quadraturerules/jacobi1quadrature.hh"
│ │ │ │ -
351#include "quadraturerules/jacobi2quadrature.hh"
│ │ │ │ -
352#include "quadraturerules/jacobiNquadrature.hh"
│ │ │ │ -
353// 3d rules
│ │ │ │ -
354#include "quadraturerules/prismquadrature.hh"
│ │ │ │ -
355// general rules
│ │ │ │ -
356#include "quadraturerules/simplexquadrature.hh"
│ │ │ │ -
357#include "quadraturerules/tensorproductquadrature.hh"
│ │ │ │ -
358
│ │ │ │ -
359#undef DUNE_INCLUDING_IMPLEMENTATION
│ │ │ │ -
360
│ │ │ │ -
361namespace Dune {
│ │ │ │ -
362
│ │ │ │ -
369 template<typename ctype, int dim>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
371 private:
│ │ │ │ -
372 friend class QuadratureRules<ctype, dim>;
│ │ │ │ -
373 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt)
│ │ │ │ -
374 {
│ │ │ │ -
375 return TensorProductQuadratureRule<ctype,dim>::maxOrder(t.id(), qt);
│ │ │ │ -
376 }
│ │ │ │ -
377 static QuadratureRule<ctype, dim> rule(const GeometryType& t, int p, QuadratureType::Enum qt)
│ │ │ │ -
378 {
│ │ │ │ -
379 return TensorProductQuadratureRule<ctype,dim>(t.id(), p, qt);
│ │ │ │ -
380 }
│ │ │ │ -
381 };
│ │ │ │ -
│ │ │ │ -
382
│ │ │ │ -
383 template<typename ctype>
│ │ │ │ -
│ │ │ │ -
384 class QuadratureRuleFactory<ctype, 0> {
│ │ │ │ -
385 private:
│ │ │ │ -
386 constexpr static int dim = 0;
│ │ │ │ -
387 friend class QuadratureRules<ctype, dim>;
│ │ │ │ -
388 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum)
│ │ │ │ -
389 {
│ │ │ │ -
390 if (t.isVertex())
│ │ │ │ -
391 {
│ │ │ │ -
392 return std::numeric_limits<int>::max();
│ │ │ │ -
393 }
│ │ │ │ -
394 DUNE_THROW(Exception, "Unknown GeometryType");
│ │ │ │ -
395 }
│ │ │ │ -
396 static QuadratureRule<ctype, dim> rule(const GeometryType& t, int , QuadratureType::Enum)
│ │ │ │ -
397 {
│ │ │ │ -
398 if (t.isVertex())
│ │ │ │ -
399 {
│ │ │ │ -
400 return PointQuadratureRule<ctype>();
│ │ │ │ -
401 }
│ │ │ │ -
402 DUNE_THROW(Exception, "Unknown GeometryType");
│ │ │ │ -
403 }
│ │ │ │ -
404 };
│ │ │ │ -
│ │ │ │ -
405
│ │ │ │ -
406 template<typename ctype>
│ │ │ │ -
│ │ │ │ -
407 class QuadratureRuleFactory<ctype, 1> {
│ │ │ │ -
408 private:
│ │ │ │ -
409 constexpr static int dim = 1;
│ │ │ │ -
410 friend class QuadratureRules<ctype, dim>;
│ │ │ │ -
411 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt)
│ │ │ │ -
412 {
│ │ │ │ -
413 if (t.isLine())
│ │ │ │ -
414 {
│ │ │ │ -
415 switch (qt) {
│ │ │ │ - │ │ │ │ -
417 return GaussQuadratureRule1D<ctype>::highest_order;
│ │ │ │ - │ │ │ │ -
419 return Jacobi1QuadratureRule1D<ctype>::highest_order;
│ │ │ │ - │ │ │ │ -
421 return Jacobi2QuadratureRule1D<ctype>::highest_order;
│ │ │ │ - │ │ │ │ -
423 return GaussLobattoQuadratureRule1D<ctype>::highest_order;
│ │ │ │ - │ │ │ │ -
425 return JacobiNQuadratureRule1D<ctype>::maxOrder();
│ │ │ │ - │ │ │ │ -
427 return GaussRadauLeftQuadratureRule1D<ctype>::highest_order;
│ │ │ │ - │ │ │ │ -
429 return GaussRadauRightQuadratureRule1D<ctype>::highest_order;
│ │ │ │ -
430 default :
│ │ │ │ -
431 DUNE_THROW(Exception, "Unknown QuadratureType");
│ │ │ │ -
432 }
│ │ │ │ -
433 }
│ │ │ │ -
434 DUNE_THROW(Exception, "Unknown GeometryType");
│ │ │ │ -
435 }
│ │ │ │ -
436 static QuadratureRule<ctype, dim> rule(const GeometryType& t, int p, QuadratureType::Enum qt)
│ │ │ │ -
437 {
│ │ │ │ -
438 if (t.isLine())
│ │ │ │ -
439 {
│ │ │ │ -
440 switch (qt) {
│ │ │ │ - │ │ │ │ -
442 return GaussQuadratureRule1D<ctype>(p);
│ │ │ │ - │ │ │ │ -
444 return Jacobi1QuadratureRule1D<ctype>(p);
│ │ │ │ - │ │ │ │ -
446 return Jacobi2QuadratureRule1D<ctype>(p);
│ │ │ │ - │ │ │ │ -
448 return GaussLobattoQuadratureRule1D<ctype>(p);
│ │ │ │ - │ │ │ │ -
450 return JacobiNQuadratureRule1D<ctype>(p);
│ │ │ │ - │ │ │ │ -
452 return GaussRadauLeftQuadratureRule1D<ctype>(p);
│ │ │ │ - │ │ │ │ -
454 return GaussRadauRightQuadratureRule1D<ctype>(p);
│ │ │ │ -
455 default :
│ │ │ │ -
456 DUNE_THROW(Exception, "Unknown QuadratureType");
│ │ │ │ -
457 }
│ │ │ │ -
458 }
│ │ │ │ -
459 DUNE_THROW(Exception, "Unknown GeometryType");
│ │ │ │ -
460 }
│ │ │ │ -
461 };
│ │ │ │ -
│ │ │ │ -
462
│ │ │ │ -
463 template<typename ctype>
│ │ │ │ -
│ │ │ │ -
464 class QuadratureRuleFactory<ctype, 2> {
│ │ │ │ -
465 private:
│ │ │ │ -
466 constexpr static int dim = 2;
│ │ │ │ -
467 friend class QuadratureRules<ctype, dim>;
│ │ │ │ -
468 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt)
│ │ │ │ -
469 {
│ │ │ │ -
470 unsigned order =
│ │ │ │ -
471 TensorProductQuadratureRule<ctype,dim>::maxOrder(t.id(), qt);
│ │ │ │ -
472 if (t.isSimplex())
│ │ │ │ -
473 order = std::max
│ │ │ │ -
474 (order, static_cast<unsigned>(SimplexQuadratureRule<ctype,dim>::highest_order));
│ │ │ │ -
475 return order;
│ │ │ │ -
476 }
│ │ │ │ -
477 static QuadratureRule<ctype, dim> rule(const GeometryType& t, int p, QuadratureType::Enum qt)
│ │ │ │ -
478 {
│ │ │ │ -
479 if (t.isSimplex()
│ │ │ │ - │ │ │ │ -
481 && p <= SimplexQuadratureRule<ctype,dim>::highest_order)
│ │ │ │ -
482 {
│ │ │ │ -
483 return SimplexQuadratureRule<ctype,dim>(p);
│ │ │ │ -
484 }
│ │ │ │ -
485 return TensorProductQuadratureRule<ctype,dim>(t.id(), p, qt);
│ │ │ │ -
486 }
│ │ │ │ -
487 };
│ │ │ │ -
│ │ │ │ -
488
│ │ │ │ -
489 template<typename ctype>
│ │ │ │ -
│ │ │ │ -
490 class QuadratureRuleFactory<ctype, 3> {
│ │ │ │ -
491 private:
│ │ │ │ -
492 constexpr static int dim = 3;
│ │ │ │ -
493 friend class QuadratureRules<ctype, dim>;
│ │ │ │ -
494 static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt)
│ │ │ │ -
495 {
│ │ │ │ -
496 unsigned order =
│ │ │ │ -
497 TensorProductQuadratureRule<ctype,dim>::maxOrder(t.id(), qt);
│ │ │ │ -
498 if (t.isSimplex())
│ │ │ │ -
499 order = std::max
│ │ │ │ -
500 (order, static_cast<unsigned>(SimplexQuadratureRule<ctype,dim>::highest_order));
│ │ │ │ -
501 if (t.isPrism())
│ │ │ │ -
502 order = std::max
│ │ │ │ -
503 (order, static_cast<unsigned>(PrismQuadratureRule<ctype,dim>::highest_order));
│ │ │ │ -
504 return order;
│ │ │ │ -
505 }
│ │ │ │ -
506 static QuadratureRule<ctype, dim> rule(const GeometryType& t, int p, QuadratureType::Enum qt)
│ │ │ │ -
507 {
│ │ │ │ -
508
│ │ │ │ -
509 if (t.isSimplex()
│ │ │ │ - │ │ │ │ -
511 && p <= SimplexQuadratureRule<ctype,dim>::highest_order)
│ │ │ │ -
512 {
│ │ │ │ -
513 return SimplexQuadratureRule<ctype,dim>(p);
│ │ │ │ -
514 }
│ │ │ │ -
515 if (t.isPrism()
│ │ │ │ - │ │ │ │ -
517 && p <= PrismQuadratureRule<ctype,dim>::highest_order)
│ │ │ │ -
518 {
│ │ │ │ -
519 return PrismQuadratureRule<ctype,dim>(p);
│ │ │ │ -
520 }
│ │ │ │ -
521 return TensorProductQuadratureRule<ctype,dim>(t.id(), p, qt);
│ │ │ │ -
522 }
│ │ │ │ -
523 };
│ │ │ │ -
│ │ │ │ -
524
│ │ │ │ -
525#ifndef DUNE_NO_EXTERN_QUADRATURERULES
│ │ │ │ -
526 extern template class GaussLobattoQuadratureRule<double, 1>;
│ │ │ │ -
527 extern template class GaussQuadratureRule<double, 1>;
│ │ │ │ -
528 extern template class GaussRadauLeftQuadratureRule<double, 1>;
│ │ │ │ -
529 extern template class GaussRadauRightQuadratureRule<double, 1>;
│ │ │ │ -
530 extern template class Jacobi1QuadratureRule<double, 1>;
│ │ │ │ -
531 extern template class Jacobi2QuadratureRule<double, 1>;
│ │ │ │ -
532 extern template class JacobiNQuadratureRule<double, 1>;
│ │ │ │ -
533 extern template class PrismQuadratureRule<double, 3>;
│ │ │ │ -
534 extern template class SimplexQuadratureRule<double, 2>;
│ │ │ │ -
535 extern template class SimplexQuadratureRule<double, 3>;
│ │ │ │ -
536#endif // !DUNE_NO_EXTERN_QUADRATURERULES
│ │ │ │ -
537
│ │ │ │ -
538} // end namespace
│ │ │ │ -
539
│ │ │ │ -
540#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.
│ │ │ │ -
STL namespace.
│ │ │ │ +
93 alpha *= opts.theta;
│ │ │ │ +
94 }
│ │ │ │ +
95
│ │ │ │ +
96 // cannot reduce the residual
│ │ │ │ +
97 if (!(resNorm < resNorm0))
│ │ │ │ +
98 return GaussNewtonErrorCode::STAGNATION;
│ │ │ │ +
99
│ │ │ │ +
100 x0 = x;
│ │ │ │ +
101 resNorm0 = resNorm;
│ │ │ │ +
102
│ │ │ │ +
103 // break if tolerance is reached.
│ │ │ │ +
104 if (resNorm < opts.absTol)
│ │ │ │ +
105 return GaussNewtonErrorCode::OK;
│ │ │ │ +
106 }
│ │ │ │ +
107
│ │ │ │ +
108 // tolerance could not be reached
│ │ │ │ +
109 if (!(resNorm < opts.absTol))
│ │ │ │ +
110 return GaussNewtonErrorCode::TOLERANCE_NOT_REACHED;
│ │ │ │ +
111
│ │ │ │ +
112 return GaussNewtonErrorCode::OK;
│ │ │ │ +
113}
│ │ │ │ +
114
│ │ │ │ +
115} // end namespace Impl
│ │ │ │ +
116} // end namespace Dune
│ │ │ │ +
117
│ │ │ │ +
118#endif // DUNE_GEOMETRY_UTILITY_ALGORITHMS_HH
│ │ │ │ +
An implementation of the Geometry interface for affine geometries.
│ │ │ │
Definition affinegeometry.hh:21
│ │ │ │ -
Enum
Definition quadraturerules.hh:131
│ │ │ │ -
@ GaussJacobi_n_0
Gauss-Legendre rules with .
Definition quadraturerules.hh:168
│ │ │ │ -
@ GaussJacobi_2_0
Gauss-Legendre rules with .
Definition quadraturerules.hh:155
│ │ │ │ -
@ GaussRadauRight
Gauss-Radau rules including the right endpoint.
Definition quadraturerules.hh:193
│ │ │ │ -
@ GaussJacobi_1_0
Gauss-Jacobi rules with .
Definition quadraturerules.hh:148
│ │ │ │ -
@ GaussLobatto
Gauss-Lobatto rules.
Definition quadraturerules.hh:176
│ │ │ │ -
@ GaussRadauLeft
Gauss-Radau rules including the left endpoint.
Definition quadraturerules.hh:184
│ │ │ │ -
@ GaussLegendre
Gauss-Legendre rules (default)
Definition quadraturerules.hh:141
│ │ │ │ -
Single evaluation point in a quadrature rule.
Definition quadraturerules.hh:66
│ │ │ │ -
const Vector & position() const
return local coordinates of integration point i
Definition quadraturerules.hh:82
│ │ │ │ -
Dune::FieldVector< ct, dim > Vector
Type used for the position of a quadrature point.
Definition quadraturerules.hh:75
│ │ │ │ -
ct Field
Number type used for coordinates and quadrature weights.
Definition quadraturerules.hh:72
│ │ │ │ -
const ct & weight() const
return weight associated with integration point i
Definition quadraturerules.hh:88
│ │ │ │ -
ct weight_
Definition quadraturerules.hh:124
│ │ │ │ -
static constexpr int dimension
Dimension of the integration domain.
Definition quadraturerules.hh:69
│ │ │ │ -
QuadraturePoint(const Vector &x, ct w)
set up quadrature of given order in d dimensions
Definition quadraturerules.hh:78
│ │ │ │ -
FieldVector< ct, dim > local
Definition quadraturerules.hh:123
│ │ │ │ -
Dune::FieldVector< ct, dim > type
Definition quadraturerules.hh:43
│ │ │ │ - │ │ │ │ -
Exception thrown if a desired QuadratureRule is not available, because the requested order is to high...
Definition quadraturerules.hh:55
│ │ │ │ -
Abstract base class for quadrature rules.
Definition quadraturerules.hh:214
│ │ │ │ -
virtual ~QuadratureRule()
Definition quadraturerules.hh:241
│ │ │ │ -
virtual GeometryType type() const
return type of element
Definition quadraturerules.hh:240
│ │ │ │ -
int delivered_order
Definition quadraturerules.hh:249
│ │ │ │ -
QuadratureRule(GeometryType t, int order)
Constructor for a given geometry type and a given quadrature order.
Definition quadraturerules.hh:228
│ │ │ │ -
GeometryType geometry_type
Definition quadraturerules.hh:248
│ │ │ │ -
ct CoordType
The type used for coordinates.
Definition quadraturerules.hh:234
│ │ │ │ -
QuadratureRule()
Default constructor.
Definition quadraturerules.hh:221
│ │ │ │ -
virtual int order() const
return order
Definition quadraturerules.hh:237
│ │ │ │ -
QuadratureRule(GeometryType t)
Constructor for a given geometry type. Leaves the quadrature order invalid
Definition quadraturerules.hh:225
│ │ │ │ -
std::vector< QuadraturePoint< ct, dim > >::const_iterator iterator
Definition quadraturerules.hh:245
│ │ │ │ -
Factory class for creation of quadrature rules, depending on GeometryType, order and QuadratureType.
Definition quadraturerules.hh:370
│ │ │ │ -
A container for all quadrature rules of dimension dim
Definition quadraturerules.hh:260
│ │ │ │ -
static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum qt=QuadratureType::GaussLegendre)
maximum quadrature order for given geometry type and quadrature type
Definition quadraturerules.hh:319
│ │ │ │ -
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:332
│ │ │ │ -
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:326
│ │ │ │ -
Unique label for each type of entities that can occur in DUNE grids.
Definition type.hh:114
│ │ │ │ -
constexpr bool isPrism() const
Return true if entity is a prism.
Definition type.hh:309
│ │ │ │ -
constexpr bool isVertex() const
Return true if entity is a vertex.
Definition type.hh:279
│ │ │ │ -
constexpr unsigned int dim() const
Return dimension of the type.
Definition type.hh:360
│ │ │ │ -
BasicType
Each entity can be tagged by one of these basic types plus its space dimension.
Definition type.hh:120
│ │ │ │ -
constexpr bool isLine() const
Return true if entity is a line segment.
Definition type.hh:284
│ │ │ │ -
constexpr unsigned int id() const
Return the topology id of the type.
Definition type.hh:365
│ │ │ │ -
constexpr bool isSimplex() const
Return true if entity is a simplex of any dimension.
Definition type.hh:319
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,613 +1,121 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -quadraturerules.hh │ │ │ │ │ + * _u_t_i_l_i_t_y │ │ │ │ │ +algorithms.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 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 © 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 │ │ │ │ │ -15 │ │ │ │ │ -16#include │ │ │ │ │ -17#include │ │ │ │ │ -18#include │ │ │ │ │ -19#include │ │ │ │ │ -20#include │ │ │ │ │ -21 │ │ │ │ │ -22#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ -23#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_i_n_d_e_x_._h_h> │ │ │ │ │ -24 │ │ │ │ │ -31namespace _D_u_n_e { │ │ │ │ │ -32 // forward declaration │ │ │ │ │ -33 template │ │ │ │ │ -34 class QuadraturePoint; │ │ │ │ │ -35} │ │ │ │ │ -36 │ │ │ │ │ -37// class specialization of standard classes that allow to use structured │ │ │ │ │ -bindings on QuadraturePoint │ │ │ │ │ -38namespace _s_t_d { │ │ │ │ │ -39 template │ │ │ │ │ -_4_0 struct tuple_size<_D_u_n_e::QuadraturePoint> : public std:: │ │ │ │ │ -integral_constant {}; │ │ │ │ │ -41 │ │ │ │ │ -42 template │ │ │ │ │ -_4_3 struct tuple_element<0, _D_u_n_e::QuadraturePoint> { using _t_y_p_e = Dune:: │ │ │ │ │ -FieldVector; }; │ │ │ │ │ -44 │ │ │ │ │ -45 template │ │ │ │ │ -_4_6 struct tuple_element<1, _D_u_n_e::QuadraturePoint> { using _t_y_p_e = ct; }; │ │ │ │ │ -47} │ │ │ │ │ +5#ifndef DUNE_GEOMETRY_UTILITY_ALGORITHMS_HH │ │ │ │ │ +6#define DUNE_GEOMETRY_UTILITY_ALGORITHMS_HH │ │ │ │ │ +7 │ │ │ │ │ +8#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13 │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ +17#include │ │ │ │ │ +18#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_a_f_f_i_n_e_g_e_o_m_e_t_r_y_._h_h> // for FieldMatrixHelper │ │ │ │ │ +19 │ │ │ │ │ +20namespace _D_u_n_e { │ │ │ │ │ +21namespace Impl { │ │ │ │ │ +22 │ │ │ │ │ +23template │ │ │ │ │ +24struct GaussNewtonOptions │ │ │ │ │ +25{ │ │ │ │ │ +27 int maxIt = 100; │ │ │ │ │ +28 │ │ │ │ │ +30 R absTol = []{ using std::sqrt; return sqrt(std::numeric_limits::epsilon │ │ │ │ │ +()); }(); │ │ │ │ │ +31 │ │ │ │ │ +33 int maxInnerIt = 10; │ │ │ │ │ +34 │ │ │ │ │ +36 R theta = 0.5; │ │ │ │ │ +37}; │ │ │ │ │ +38 │ │ │ │ │ +39 │ │ │ │ │ +41enum class GaussNewtonErrorCode │ │ │ │ │ +42{ │ │ │ │ │ +43 OK = 0, //< A solution is found │ │ │ │ │ +44 JACOBIAN_NOT_INVERTIBLE, //< The Jacobian is not invertible at the current │ │ │ │ │ +point │ │ │ │ │ +45 STAGNATION, //< No reduction of the residul norm possible │ │ │ │ │ +46 TOLERANCE_NOT_REACHED //< The break tolerance for the resodual norm is not │ │ │ │ │ +reached │ │ │ │ │ +47}; │ │ │ │ │ 48 │ │ │ │ │ -49namespace _D_u_n_e { │ │ │ │ │ -50 │ │ │ │ │ -_5_5 class _Q_u_a_d_r_a_t_u_r_e_O_r_d_e_r_O_u_t_O_f_R_a_n_g_e : public NotImplemented {}; │ │ │ │ │ -56 │ │ │ │ │ -65 template │ │ │ │ │ -_6_6 class _Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t { │ │ │ │ │ -67 public: │ │ │ │ │ -_6_9 constexpr static int _d_i_m_e_n_s_i_o_n = dim; │ │ │ │ │ -70 │ │ │ │ │ -_7_2 typedef ct _F_i_e_l_d; │ │ │ │ │ +49 │ │ │ │ │ +62template , │ │ │ │ │ +64 class R = typename Dune::FieldTraits::real_type> │ │ │ │ │ +65GaussNewtonErrorCode gaussNewton (const F& f, const DF& df, Range y, Domain& │ │ │ │ │ +x0, │ │ │ │ │ +66 GaussNewtonOptions opts = {}) │ │ │ │ │ +67{ │ │ │ │ │ +68 Domain x = x0; │ │ │ │ │ +69 Domain dx{}; │ │ │ │ │ +70 Range dy = f(x0) - y; │ │ │ │ │ +71 R resNorm0 = dy.two_norm(); │ │ │ │ │ +72 R resNorm = 0; │ │ │ │ │ 73 │ │ │ │ │ -_7_5 typedef Dune::FieldVector _V_e_c_t_o_r; │ │ │ │ │ -76 │ │ │ │ │ -_7_8 _Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t (const _V_e_c_t_o_r& x, ct w) : _l_o_c_a_l(x), _w_e_i_g_h_t__(w) │ │ │ │ │ -79 {} │ │ │ │ │ -80 │ │ │ │ │ -_8_2 const _V_e_c_t_o_r& _p_o_s_i_t_i_o_n () const │ │ │ │ │ -83 { │ │ │ │ │ -84 return _l_o_c_a_l; │ │ │ │ │ -85 } │ │ │ │ │ -86 │ │ │ │ │ -_8_8 const ct &_w_e_i_g_h_t () const │ │ │ │ │ -89 { │ │ │ │ │ -90 return _w_e_i_g_h_t__; │ │ │ │ │ -91 } │ │ │ │ │ +74 for (int i = 0; i < opts.maxIt; ++i) │ │ │ │ │ +75 { │ │ │ │ │ +76 // Get descent direction dx: (J^T*J)dx = J^T*dy │ │ │ │ │ +77 const bool invertible = FieldMatrixHelper::xTRightInvA(df(x), dy, dx); │ │ │ │ │ +78 │ │ │ │ │ +79 // break if jacobian is not invertible │ │ │ │ │ +80 if (!invertible) │ │ │ │ │ +81 return GaussNewtonErrorCode::JACOBIAN_NOT_INVERTIBLE; │ │ │ │ │ +82 │ │ │ │ │ +83 // line-search procedure to update x with correction dx │ │ │ │ │ +84 R alpha = 1; │ │ │ │ │ +85 for (int j = 0; j < opts.maxInnerIt; ++j) { │ │ │ │ │ +86 x = x0 - alpha * dx; │ │ │ │ │ +87 dy = f(x) - y; │ │ │ │ │ +88 resNorm = dy.two_norm(); │ │ │ │ │ +89 │ │ │ │ │ +90 if (resNorm < resNorm0) │ │ │ │ │ +91 break; │ │ │ │ │ 92 │ │ │ │ │ -111 template = 0> │ │ │ │ │ -_1_1_2 std::tuple_element_t> get() const │ │ │ │ │ -113 { │ │ │ │ │ -114 if constexpr (index == 0) { │ │ │ │ │ -115 return local; │ │ │ │ │ -116 } │ │ │ │ │ -117 else { │ │ │ │ │ -118 return weight_; │ │ │ │ │ -119 } │ │ │ │ │ -120 } │ │ │ │ │ -121 │ │ │ │ │ -122 protected: │ │ │ │ │ -_1_2_3 FieldVector local; │ │ │ │ │ -_1_2_4 ct weight_; │ │ │ │ │ -125 }; │ │ │ │ │ -126 │ │ │ │ │ -_1_3_0 namespace QuadratureType { │ │ │ │ │ -_1_3_1 enum Enum { │ │ │ │ │ -_1_4_1 GaussLegendre = 0, │ │ │ │ │ -142 │ │ │ │ │ -_1_4_8 GaussJacobi_1_0 = 1, │ │ │ │ │ -149 │ │ │ │ │ -_1_5_5 GaussJacobi_2_0 = 2, │ │ │ │ │ -156 │ │ │ │ │ -_1_6_8 GaussJacobi_n_0 = 3, │ │ │ │ │ -169 │ │ │ │ │ -_1_7_6 GaussLobatto = 4, │ │ │ │ │ -177 │ │ │ │ │ -_1_8_4 GaussRadauLeft = 5, │ │ │ │ │ -185 │ │ │ │ │ -_1_9_3 GaussRadauRight = 6, │ │ │ │ │ -194 size │ │ │ │ │ -_1_9_5 }; │ │ │ │ │ -196 } │ │ │ │ │ -197 │ │ │ │ │ -212 template │ │ │ │ │ -_2_1_3 class _Q_u_a_d_r_a_t_u_r_e_R_u_l_e : public std::vector > │ │ │ │ │ -214 { │ │ │ │ │ -215 public: │ │ │ │ │ -_2_2_1 _Q_u_a_d_r_a_t_u_r_e_R_u_l_e() : delivered_order(-1) {} │ │ │ │ │ -222 │ │ │ │ │ -223 protected: │ │ │ │ │ -_2_2_5 _Q_u_a_d_r_a_t_u_r_e_R_u_l_e(_G_e_o_m_e_t_r_y_T_y_p_e t) : geometry_type(t), delivered_order(-1) {} │ │ │ │ │ -226 │ │ │ │ │ -_2_2_8 _Q_u_a_d_r_a_t_u_r_e_R_u_l_e(_G_e_o_m_e_t_r_y_T_y_p_e t, int order) : geometry_type(t), │ │ │ │ │ -delivered_order(order) {} │ │ │ │ │ -229 public: │ │ │ │ │ -_2_3_1 constexpr static int d = dim; │ │ │ │ │ -232 │ │ │ │ │ -_2_3_4 typedef ct _C_o_o_r_d_T_y_p_e; │ │ │ │ │ -235 │ │ │ │ │ -_2_3_7 virtual int _o_r_d_e_r () const { return delivered_order; } │ │ │ │ │ -238 │ │ │ │ │ -_2_4_0 virtual _G_e_o_m_e_t_r_y_T_y_p_e _t_y_p_e () const { return geometry_type; } │ │ │ │ │ -_2_4_1 virtual _~_Q_u_a_d_r_a_t_u_r_e_R_u_l_e(){} │ │ │ │ │ -242 │ │ │ │ │ -_2_4_5 typedef typename std::vector >::const_iterator │ │ │ │ │ -_i_t_e_r_a_t_o_r; │ │ │ │ │ -246 │ │ │ │ │ -247 protected: │ │ │ │ │ -_2_4_8 _G_e_o_m_e_t_r_y_T_y_p_e _g_e_o_m_e_t_r_y___t_y_p_e; │ │ │ │ │ -_2_4_9 int _d_e_l_i_v_e_r_e_d___o_r_d_e_r; │ │ │ │ │ -250 }; │ │ │ │ │ -251 │ │ │ │ │ -252 // Forward declaration of the factory class, │ │ │ │ │ -253 // needed internally by the QuadratureRules container class. │ │ │ │ │ -254 template class _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y; │ │ │ │ │ -255 │ │ │ │ │ -259 template │ │ │ │ │ -_2_6_0 class _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s { │ │ │ │ │ -261 │ │ │ │ │ -263 using _Q_u_a_d_r_a_t_u_r_e_R_u_l_e = _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_<_c_t_y_p_e_,_ _d_i_m_>; │ │ │ │ │ -264 │ │ │ │ │ -265 // indexed by quadrature order │ │ │ │ │ -266 using QuadratureOrderVector = std::vector >; │ │ │ │ │ -267 │ │ │ │ │ -268 // indexed by geometry type │ │ │ │ │ -269 using GeometryTypeVector = std::vector >; │ │ │ │ │ -270 │ │ │ │ │ -271 // indexed by quadrature type enum │ │ │ │ │ -272 using QuadratureCacheVector = std::vector >; │ │ │ │ │ -273 │ │ │ │ │ -275 DUNE_EXPORT const _Q_u_a_d_r_a_t_u_r_e_R_u_l_e& _rule(const _G_e_o_m_e_t_r_y_T_y_p_e& t, int p, │ │ │ │ │ -_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m qt=QuadratureType::GaussLegendre) const │ │ │ │ │ -276 { │ │ │ │ │ -277 assert(t._d_i_m()==dim); │ │ │ │ │ -278 │ │ │ │ │ -279 DUNE_ASSERT_CALL_ONCE(); │ │ │ │ │ -280 │ │ │ │ │ -281 static QuadratureCacheVector quadratureCache(QuadratureType::size); │ │ │ │ │ -282 │ │ │ │ │ -283 auto& [ onceFlagQuadratureType, geometryTypes ] = quadratureCache[qt]; │ │ │ │ │ -284 // initialize geometry types for this quadrature type once │ │ │ │ │ -285 std::call_once(onceFlagQuadratureType, [&types = geometryTypes]{ │ │ │ │ │ -286 types = GeometryTypeVector(LocalGeometryTypeIndex::size(dim)); │ │ │ │ │ -287 }); │ │ │ │ │ -288 │ │ │ │ │ -289 auto& [ onceFlagGeometryType, quadratureOrders ] = geometryTypes │ │ │ │ │ -[LocalGeometryTypeIndex::index(t)]; │ │ │ │ │ -290 // initialize quadrature orders for this geometry type and quadrature type │ │ │ │ │ -once │ │ │ │ │ -291 std::call_once(onceFlagGeometryType, [&, &orders = quadratureOrders]{ │ │ │ │ │ -292 // we only need one quadrature rule for points, not maxint │ │ │ │ │ -293 const auto numRules = dim == 0 ? 1 : _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y_<_c_t_y_p_e_,_d_i_m_>_:_: │ │ │ │ │ -_m_a_x_O_r_d_e_r(t, qt)+1; │ │ │ │ │ -294 orders = QuadratureOrderVector(numRules); │ │ │ │ │ -295 }); │ │ │ │ │ -296 │ │ │ │ │ -297 // we only have one quadrature rule for points │ │ │ │ │ -298 auto& [ onceFlagQuadratureOrder, quadratureRule ] = quadratureOrders[dim == │ │ │ │ │ -0 ? 0 : p]; │ │ │ │ │ -299 // initialize quadrature rule once │ │ │ │ │ -300 std::call_once(onceFlagQuadratureOrder, [&, &rule = quadratureRule]{ │ │ │ │ │ -301 rule = _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y_<_c_t_y_p_e_,_d_i_m_>_:_:_r_u_l_e(t, p, qt); │ │ │ │ │ -302 }); │ │ │ │ │ -303 │ │ │ │ │ -304 return quadratureRule; │ │ │ │ │ -305 } │ │ │ │ │ -306 │ │ │ │ │ -308 DUNE_EXPORT static _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s& instance() │ │ │ │ │ -309 { │ │ │ │ │ -310 static _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s instance; │ │ │ │ │ -311 return instance; │ │ │ │ │ -312 } │ │ │ │ │ -313 │ │ │ │ │ -315 _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s () = default; │ │ │ │ │ -316 public: │ │ │ │ │ -318 static unsigned │ │ │ │ │ -_3_1_9 _m_a_x_O_r_d_e_r(const _G_e_o_m_e_t_r_y_T_y_p_e& t, │ │ │ │ │ -320 _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m qt=QuadratureType::GaussLegendre) │ │ │ │ │ -321 { │ │ │ │ │ -322 return _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y_<_c_t_y_p_e_,_d_i_m_>_:_:_m_a_x_O_r_d_e_r(t,qt); │ │ │ │ │ -323 } │ │ │ │ │ -324 │ │ │ │ │ -_3_2_6 static const _Q_u_a_d_r_a_t_u_r_e_R_u_l_e& _r_u_l_e(const _G_e_o_m_e_t_r_y_T_y_p_e& t, int p, │ │ │ │ │ -_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m qt=QuadratureType::GaussLegendre) │ │ │ │ │ -327 { │ │ │ │ │ -328 return instance()._rule(t,p,qt); │ │ │ │ │ -329 } │ │ │ │ │ -330 │ │ │ │ │ -_3_3_2 static const _Q_u_a_d_r_a_t_u_r_e_R_u_l_e& _r_u_l_e(const _G_e_o_m_e_t_r_y_T_y_p_e_:_:_B_a_s_i_c_T_y_p_e t, int p, │ │ │ │ │ -_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m qt=QuadratureType::GaussLegendre) │ │ │ │ │ -333 { │ │ │ │ │ -334 _G_e_o_m_e_t_r_y_T_y_p_e gt(t,dim); │ │ │ │ │ -335 return instance()._rule(gt,p,qt); │ │ │ │ │ -336 } │ │ │ │ │ -337 }; │ │ │ │ │ -338 │ │ │ │ │ -339} // end namespace Dune │ │ │ │ │ -340 │ │ │ │ │ -_3_4_1#define DUNE_INCLUDING_IMPLEMENTATION │ │ │ │ │ -342 │ │ │ │ │ -343// 0d rules │ │ │ │ │ -344#include "quadraturerules/pointquadrature.hh" │ │ │ │ │ -345// 1d rules │ │ │ │ │ -346#include "quadraturerules/gausslobattoquadrature.hh" │ │ │ │ │ -347#include "quadraturerules/gaussquadrature.hh" │ │ │ │ │ -348#include "quadraturerules/gaussradauleftquadrature.hh" │ │ │ │ │ -349#include "quadraturerules/gaussradaurightquadrature.hh" │ │ │ │ │ -350#include "quadraturerules/jacobi1quadrature.hh" │ │ │ │ │ -351#include "quadraturerules/jacobi2quadrature.hh" │ │ │ │ │ -352#include "quadraturerules/jacobiNquadrature.hh" │ │ │ │ │ -353// 3d rules │ │ │ │ │ -354#include "quadraturerules/prismquadrature.hh" │ │ │ │ │ -355// general rules │ │ │ │ │ -356#include "quadraturerules/simplexquadrature.hh" │ │ │ │ │ -357#include "quadraturerules/tensorproductquadrature.hh" │ │ │ │ │ -358 │ │ │ │ │ -359#undef DUNE_INCLUDING_IMPLEMENTATION │ │ │ │ │ -360 │ │ │ │ │ -361namespace _D_u_n_e { │ │ │ │ │ -362 │ │ │ │ │ -369 template │ │ │ │ │ -_3_7_0 class _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y { │ │ │ │ │ -371 private: │ │ │ │ │ -372 friend class _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s; │ │ │ │ │ -373 static unsigned maxOrder(const _G_e_o_m_e_t_r_y_T_y_p_e &t, _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m qt) │ │ │ │ │ -374 { │ │ │ │ │ -375 return TensorProductQuadratureRule::maxOrder(t._i_d(), qt); │ │ │ │ │ -376 } │ │ │ │ │ -377 static _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_<_c_t_y_p_e_,_ _d_i_m_> rule(const _G_e_o_m_e_t_r_y_T_y_p_e& t, int p, │ │ │ │ │ -_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m qt) │ │ │ │ │ -378 { │ │ │ │ │ -379 return TensorProductQuadratureRule(t._i_d(), p, qt); │ │ │ │ │ -380 } │ │ │ │ │ -381 }; │ │ │ │ │ -382 │ │ │ │ │ -383 template │ │ │ │ │ -_3_8_4 class _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y { │ │ │ │ │ -385 private: │ │ │ │ │ -_3_8_6 constexpr static int dim = 0; │ │ │ │ │ -387 friend class _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s; │ │ │ │ │ -388 static unsigned maxOrder(const _G_e_o_m_e_t_r_y_T_y_p_e &t, _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m) │ │ │ │ │ -389 { │ │ │ │ │ -390 if (t._i_s_V_e_r_t_e_x()) │ │ │ │ │ -391 { │ │ │ │ │ -392 return std::numeric_limits::max(); │ │ │ │ │ -393 } │ │ │ │ │ -394 DUNE_THROW(Exception, "Unknown GeometryType"); │ │ │ │ │ -395 } │ │ │ │ │ -396 static QuadratureRule rule(const GeometryType& t, int , │ │ │ │ │ -_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m) │ │ │ │ │ -397 { │ │ │ │ │ -398 if (t.isVertex()) │ │ │ │ │ -399 { │ │ │ │ │ -400 return PointQuadratureRule(); │ │ │ │ │ -401 } │ │ │ │ │ -402 DUNE_THROW(Exception, "Unknown GeometryType"); │ │ │ │ │ -403 } │ │ │ │ │ -404 }; │ │ │ │ │ -405 │ │ │ │ │ -406 template │ │ │ │ │ -_4_0_7 class _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y { │ │ │ │ │ -408 private: │ │ │ │ │ -_4_0_9 constexpr static int dim = 1; │ │ │ │ │ -410 friend class _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s; │ │ │ │ │ -411 static unsigned maxOrder(const _G_e_o_m_e_t_r_y_T_y_p_e &t, _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m qt) │ │ │ │ │ -412 { │ │ │ │ │ -413 if (t._i_s_L_i_n_e()) │ │ │ │ │ -414 { │ │ │ │ │ -415 switch (qt) { │ │ │ │ │ -416 case _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_L_e_g_e_n_d_r_e : │ │ │ │ │ -417 return GaussQuadratureRule1D::highest_order; │ │ │ │ │ -418 case _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_J_a_c_o_b_i___1___0 : │ │ │ │ │ -419 return Jacobi1QuadratureRule1D::highest_order; │ │ │ │ │ -420 case _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_J_a_c_o_b_i___2___0 : │ │ │ │ │ -421 return Jacobi2QuadratureRule1D::highest_order; │ │ │ │ │ -422 case _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_L_o_b_a_t_t_o : │ │ │ │ │ -423 return GaussLobattoQuadratureRule1D::highest_order; │ │ │ │ │ -424 case _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_J_a_c_o_b_i___n___0 : │ │ │ │ │ -425 return JacobiNQuadratureRule1D::maxOrder(); │ │ │ │ │ -426 case _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_R_a_d_a_u_L_e_f_t : │ │ │ │ │ -427 return GaussRadauLeftQuadratureRule1D::highest_order; │ │ │ │ │ -428 case _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_R_a_d_a_u_R_i_g_h_t : │ │ │ │ │ -429 return GaussRadauRightQuadratureRule1D::highest_order; │ │ │ │ │ -430 default : │ │ │ │ │ -431 DUNE_THROW(Exception, "Unknown QuadratureType"); │ │ │ │ │ -432 } │ │ │ │ │ -433 } │ │ │ │ │ -434 DUNE_THROW(Exception, "Unknown GeometryType"); │ │ │ │ │ -435 } │ │ │ │ │ -436 static QuadratureRule rule(const GeometryType& t, int p, │ │ │ │ │ -_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m qt) │ │ │ │ │ -437 { │ │ │ │ │ -438 if (t.isLine()) │ │ │ │ │ -439 { │ │ │ │ │ -440 switch (qt) { │ │ │ │ │ -441 case _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_L_e_g_e_n_d_r_e : │ │ │ │ │ -442 return GaussQuadratureRule1D(p); │ │ │ │ │ -443 case _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_J_a_c_o_b_i___1___0 : │ │ │ │ │ -444 return Jacobi1QuadratureRule1D(p); │ │ │ │ │ -445 case _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_J_a_c_o_b_i___2___0 : │ │ │ │ │ -446 return Jacobi2QuadratureRule1D(p); │ │ │ │ │ -447 case _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_L_o_b_a_t_t_o : │ │ │ │ │ -448 return GaussLobattoQuadratureRule1D(p); │ │ │ │ │ -449 case _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_J_a_c_o_b_i___n___0 : │ │ │ │ │ -450 return JacobiNQuadratureRule1D(p); │ │ │ │ │ -451 case _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_R_a_d_a_u_L_e_f_t : │ │ │ │ │ -452 return GaussRadauLeftQuadratureRule1D(p); │ │ │ │ │ -453 case _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_R_a_d_a_u_R_i_g_h_t : │ │ │ │ │ -454 return GaussRadauRightQuadratureRule1D(p); │ │ │ │ │ -455 default : │ │ │ │ │ -456 DUNE_THROW(Exception, "Unknown QuadratureType"); │ │ │ │ │ -457 } │ │ │ │ │ -458 } │ │ │ │ │ -459 DUNE_THROW(Exception, "Unknown GeometryType"); │ │ │ │ │ -460 } │ │ │ │ │ -461 }; │ │ │ │ │ -462 │ │ │ │ │ -463 template │ │ │ │ │ -_4_6_4 class _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y { │ │ │ │ │ -465 private: │ │ │ │ │ -_4_6_6 constexpr static int dim = 2; │ │ │ │ │ -467 friend class _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s; │ │ │ │ │ -468 static unsigned maxOrder(const _G_e_o_m_e_t_r_y_T_y_p_e &t, _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m qt) │ │ │ │ │ -469 { │ │ │ │ │ -470 unsigned order = │ │ │ │ │ -471 TensorProductQuadratureRule::maxOrder(t._i_d(), qt); │ │ │ │ │ -472 if (t._i_s_S_i_m_p_l_e_x()) │ │ │ │ │ -473 order = std::max │ │ │ │ │ -474 (order, static_cast(SimplexQuadratureRule:: │ │ │ │ │ -highest_order)); │ │ │ │ │ -475 return order; │ │ │ │ │ -476 } │ │ │ │ │ -477 static _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_<_c_t_y_p_e_,_ _d_i_m_> rule(const _G_e_o_m_e_t_r_y_T_y_p_e& t, int p, │ │ │ │ │ -_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m qt) │ │ │ │ │ -478 { │ │ │ │ │ -479 if (t._i_s_S_i_m_p_l_e_x() │ │ │ │ │ -480 && ( qt == _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_L_e_g_e_n_d_r_e || qt == _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_: │ │ │ │ │ -_G_a_u_s_s_J_a_c_o_b_i___n___0 ) │ │ │ │ │ -481 && p <= SimplexQuadratureRule::highest_order) │ │ │ │ │ -482 { │ │ │ │ │ -483 return SimplexQuadratureRule(p); │ │ │ │ │ -484 } │ │ │ │ │ -485 return TensorProductQuadratureRule(t._i_d(), p, qt); │ │ │ │ │ -486 } │ │ │ │ │ -487 }; │ │ │ │ │ -488 │ │ │ │ │ -489 template │ │ │ │ │ -_4_9_0 class _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y { │ │ │ │ │ -491 private: │ │ │ │ │ -_4_9_2 constexpr static int dim = 3; │ │ │ │ │ -493 friend class _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s; │ │ │ │ │ -494 static unsigned maxOrder(const _G_e_o_m_e_t_r_y_T_y_p_e &t, _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m qt) │ │ │ │ │ -495 { │ │ │ │ │ -496 unsigned order = │ │ │ │ │ -497 TensorProductQuadratureRule::maxOrder(t._i_d(), qt); │ │ │ │ │ -498 if (t._i_s_S_i_m_p_l_e_x()) │ │ │ │ │ -499 order = std::max │ │ │ │ │ -500 (order, static_cast(SimplexQuadratureRule:: │ │ │ │ │ -highest_order)); │ │ │ │ │ -501 if (t._i_s_P_r_i_s_m()) │ │ │ │ │ -502 order = std::max │ │ │ │ │ -503 (order, static_cast(PrismQuadratureRule:: │ │ │ │ │ -highest_order)); │ │ │ │ │ -504 return order; │ │ │ │ │ -505 } │ │ │ │ │ -506 static _Q_u_a_d_r_a_t_u_r_e_R_u_l_e_<_c_t_y_p_e_,_ _d_i_m_> rule(const _G_e_o_m_e_t_r_y_T_y_p_e& t, int p, │ │ │ │ │ -_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m qt) │ │ │ │ │ -507 { │ │ │ │ │ -508 │ │ │ │ │ -509 if (t._i_s_S_i_m_p_l_e_x() │ │ │ │ │ -510 && ( qt == _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_L_e_g_e_n_d_r_e || qt == _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_: │ │ │ │ │ -_G_a_u_s_s_J_a_c_o_b_i___n___0 ) │ │ │ │ │ -511 && p <= SimplexQuadratureRule::highest_order) │ │ │ │ │ -512 { │ │ │ │ │ -513 return SimplexQuadratureRule(p); │ │ │ │ │ -514 } │ │ │ │ │ -515 if (t._i_s_P_r_i_s_m() │ │ │ │ │ -516 && qt == _Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_L_e_g_e_n_d_r_e │ │ │ │ │ -517 && p <= PrismQuadratureRule::highest_order) │ │ │ │ │ -518 { │ │ │ │ │ -519 return PrismQuadratureRule(p); │ │ │ │ │ -520 } │ │ │ │ │ -521 return TensorProductQuadratureRule(t._i_d(), p, qt); │ │ │ │ │ -522 } │ │ │ │ │ -523 }; │ │ │ │ │ -524 │ │ │ │ │ -525#ifndef DUNE_NO_EXTERN_QUADRATURERULES │ │ │ │ │ -526 extern template class GaussLobattoQuadratureRule; │ │ │ │ │ -527 extern template class GaussQuadratureRule; │ │ │ │ │ -528 extern template class GaussRadauLeftQuadratureRule; │ │ │ │ │ -529 extern template class GaussRadauRightQuadratureRule; │ │ │ │ │ -530 extern template class Jacobi1QuadratureRule; │ │ │ │ │ -531 extern template class Jacobi2QuadratureRule; │ │ │ │ │ -532 extern template class JacobiNQuadratureRule; │ │ │ │ │ -533 extern template class PrismQuadratureRule; │ │ │ │ │ -534 extern template class SimplexQuadratureRule; │ │ │ │ │ -_5_3_5 extern template class SimplexQuadratureRule; │ │ │ │ │ -536#endif // !DUNE_NO_EXTERN_QUADRATURERULES │ │ │ │ │ -537 │ │ │ │ │ -538} // end namespace │ │ │ │ │ -539 │ │ │ │ │ -540#endif // DUNE_GEOMETRY_QUADRATURERULES_HH │ │ │ │ │ -_t_y_p_e_._h_h │ │ │ │ │ -A unique label for each type of element that can occur in a grid. │ │ │ │ │ -_t_y_p_e_i_n_d_e_x_._h_h │ │ │ │ │ -Helper classes to provide indices for geometrytypes for use in a vector. │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ +93 alpha *= opts.theta; │ │ │ │ │ +94 } │ │ │ │ │ +95 │ │ │ │ │ +96 // cannot reduce the residual │ │ │ │ │ +97 if (!(resNorm < resNorm0)) │ │ │ │ │ +98 return GaussNewtonErrorCode::STAGNATION; │ │ │ │ │ +99 │ │ │ │ │ +100 x0 = x; │ │ │ │ │ +101 resNorm0 = resNorm; │ │ │ │ │ +102 │ │ │ │ │ +103 // break if tolerance is reached. │ │ │ │ │ +104 if (resNorm < opts.absTol) │ │ │ │ │ +105 return GaussNewtonErrorCode::OK; │ │ │ │ │ +106 } │ │ │ │ │ +107 │ │ │ │ │ +108 // tolerance could not be reached │ │ │ │ │ +109 if (!(resNorm < opts.absTol)) │ │ │ │ │ +110 return GaussNewtonErrorCode::TOLERANCE_NOT_REACHED; │ │ │ │ │ +111 │ │ │ │ │ +112 return GaussNewtonErrorCode::OK; │ │ │ │ │ +113} │ │ │ │ │ +114 │ │ │ │ │ +115} // end namespace Impl │ │ │ │ │ +116} // end namespace Dune │ │ │ │ │ +117 │ │ │ │ │ +118#endif // DUNE_GEOMETRY_UTILITY_ALGORITHMS_HH │ │ │ │ │ +_a_f_f_i_n_e_g_e_o_m_e_t_r_y_._h_h │ │ │ │ │ +An implementation of the Geometry interface for affine geometries. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn affinegeometry.hh:21 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_E_n_u_m │ │ │ │ │ -Enum │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:131 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_J_a_c_o_b_i___n___0 │ │ │ │ │ -@ GaussJacobi_n_0 │ │ │ │ │ -Gauss-Legendre rules with . │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:168 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_J_a_c_o_b_i___2___0 │ │ │ │ │ -@ GaussJacobi_2_0 │ │ │ │ │ -Gauss-Legendre rules with . │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:155 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_R_a_d_a_u_R_i_g_h_t │ │ │ │ │ -@ GaussRadauRight │ │ │ │ │ -Gauss-Radau rules including the right endpoint. │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:193 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_J_a_c_o_b_i___1___0 │ │ │ │ │ -@ GaussJacobi_1_0 │ │ │ │ │ -Gauss-Jacobi rules with . │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:148 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_L_o_b_a_t_t_o │ │ │ │ │ -@ GaussLobatto │ │ │ │ │ -Gauss-Lobatto rules. │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:176 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_R_a_d_a_u_L_e_f_t │ │ │ │ │ -@ GaussRadauLeft │ │ │ │ │ -Gauss-Radau rules including the left endpoint. │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:184 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_G_a_u_s_s_L_e_g_e_n_d_r_e │ │ │ │ │ -@ GaussLegendre │ │ │ │ │ -Gauss-Legendre rules (default) │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:141 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t │ │ │ │ │ -Single evaluation point in a quadrature rule. │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:66 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t_:_:_p_o_s_i_t_i_o_n │ │ │ │ │ -const Vector & position() const │ │ │ │ │ -return local coordinates of integration point i │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:82 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t_:_:_V_e_c_t_o_r │ │ │ │ │ -Dune::FieldVector< ct, dim > Vector │ │ │ │ │ -Type used for the position of a quadrature point. │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:75 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t_:_:_F_i_e_l_d │ │ │ │ │ -ct Field │ │ │ │ │ -Number type used for coordinates and quadrature weights. │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:72 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t_:_:_w_e_i_g_h_t │ │ │ │ │ -const ct & weight() const │ │ │ │ │ -return weight associated with integration point i │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:88 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t_:_:_w_e_i_g_h_t__ │ │ │ │ │ -ct weight_ │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:124 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ -static constexpr int dimension │ │ │ │ │ -Dimension of the integration domain. │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:69 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t │ │ │ │ │ -QuadraturePoint(const Vector &x, ct w) │ │ │ │ │ -set up quadrature of given order in d dimensions │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:78 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t_:_:_l_o_c_a_l │ │ │ │ │ -FieldVector< ct, dim > local │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:123 │ │ │ │ │ -_s_t_d_:_:_t_u_p_l_e___e_l_e_m_e_n_t_<_ _0_,_ _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t_<_ _c_t_,_ _d_i_m_ _>_ _>_:_:_t_y_p_e │ │ │ │ │ -Dune::FieldVector< ct, dim > type │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:43 │ │ │ │ │ -_s_t_d_:_:_t_u_p_l_e___e_l_e_m_e_n_t_<_ _1_,_ _D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_P_o_i_n_t_<_ _c_t_,_ _d_i_m_ _>_ _>_:_:_t_y_p_e │ │ │ │ │ -ct type │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:46 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_O_r_d_e_r_O_u_t_O_f_R_a_n_g_e │ │ │ │ │ -Exception thrown if a desired QuadratureRule is not available, because the │ │ │ │ │ -requested order is to high... │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:55 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e │ │ │ │ │ -Abstract base class for quadrature rules. │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:214 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_:_:_~_Q_u_a_d_r_a_t_u_r_e_R_u_l_e │ │ │ │ │ -virtual ~QuadratureRule() │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:241 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_:_:_t_y_p_e │ │ │ │ │ -virtual GeometryType type() const │ │ │ │ │ -return type of element │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:240 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_:_:_d_e_l_i_v_e_r_e_d___o_r_d_e_r │ │ │ │ │ -int delivered_order │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:249 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e │ │ │ │ │ -QuadratureRule(GeometryType t, int order) │ │ │ │ │ -Constructor for a given geometry type and a given quadrature order. │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:228 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_:_:_g_e_o_m_e_t_r_y___t_y_p_e │ │ │ │ │ -GeometryType geometry_type │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:248 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_:_:_C_o_o_r_d_T_y_p_e │ │ │ │ │ -ct CoordType │ │ │ │ │ -The type used for coordinates. │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:234 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e │ │ │ │ │ -QuadratureRule() │ │ │ │ │ -Default constructor. │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:221 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_:_:_o_r_d_e_r │ │ │ │ │ -virtual int order() const │ │ │ │ │ -return order │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:237 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e │ │ │ │ │ -QuadratureRule(GeometryType t) │ │ │ │ │ -Constructor for a given geometry type. Leaves the quadrature order invalid │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:225 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ -std::vector< QuadraturePoint< ct, dim > >::const_iterator iterator │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:245 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_F_a_c_t_o_r_y │ │ │ │ │ -Factory class for creation of quadrature rules, depending on GeometryType, │ │ │ │ │ -order and QuadratureType. │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:370 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s │ │ │ │ │ -A container for all quadrature rules of dimension dim │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:260 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s_:_:_m_a_x_O_r_d_e_r │ │ │ │ │ -static unsigned maxOrder(const GeometryType &t, QuadratureType::Enum │ │ │ │ │ -qt=QuadratureType::GaussLegendre) │ │ │ │ │ -maximum quadrature order for given geometry type and quadrature type │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:319 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s_:_:_r_u_l_e │ │ │ │ │ -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 │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:332 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_R_u_l_e_s_:_:_r_u_l_e │ │ │ │ │ -static const QuadratureRule & rule(const GeometryType &t, int p, │ │ │ │ │ -QuadratureType::Enum qt=QuadratureType::GaussLegendre) │ │ │ │ │ -select the appropriate QuadratureRule for GeometryType t and order p │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:326 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ -Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:114 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_P_r_i_s_m │ │ │ │ │ -constexpr bool isPrism() const │ │ │ │ │ -Return true if entity is a prism. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:309 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_V_e_r_t_e_x │ │ │ │ │ -constexpr bool isVertex() const │ │ │ │ │ -Return true if entity is a vertex. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:279 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_d_i_m │ │ │ │ │ -constexpr unsigned int dim() const │ │ │ │ │ -Return dimension of the type. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:360 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_B_a_s_i_c_T_y_p_e │ │ │ │ │ -BasicType │ │ │ │ │ -Each entity can be tagged by one of these basic types plus its space dimension. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:120 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_L_i_n_e │ │ │ │ │ -constexpr bool isLine() const │ │ │ │ │ -Return true if entity is a line segment. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:284 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_d │ │ │ │ │ -constexpr unsigned int id() const │ │ │ │ │ -Return the topology id of the type. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:365 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_S_i_m_p_l_e_x │ │ │ │ │ -constexpr bool isSimplex() const │ │ │ │ │ -Return true if entity is a simplex of any dimension. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:319 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00230.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: referenceelementimplementation.cc File Reference │ │ │ │ +dune-geometry: convergence.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,31 +65,32 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Namespaces
│ │ │ │ -
referenceelementimplementation.cc File Reference
│ │ │ │ +
convergence.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ - │ │ │ │ +
#include <cmath>
│ │ │ │ +#include <limits>
│ │ │ │ +
│ │ │ │ +

Go to the source code of this file.

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

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Geo
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,16 +1,17 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ + * _u_t_i_l_i_t_y │ │ │ │ │ _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -referenceelementimplementation.cc File Reference │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_i_m_p_l_e_m_e_n_t_a_t_i_o_n_._h_h> │ │ │ │ │ +convergence.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +_G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_G_e_o │ │ │ │ │ -  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00233.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: affinegeometry.hh File Reference │ │ │ │ +dune-geometry: typefromvertexcount.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,50 +65,39 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces
│ │ │ │ -
affinegeometry.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
typefromvertexcount.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ -

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>
│ │ │ │ +
#include <dune/geometry/type.hh>
│ │ │ │
│ │ │ │

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
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

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

Detailed Description

│ │ │ │ -

An implementation of the Geometry interface for affine geometries.

│ │ │ │ -
Author
Martin Nolte
│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,29 +1,22 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -affinegeometry.hh File Reference │ │ │ │ │ -An implementation of the Geometry interface for affine geometries. _M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * _u_t_i_l_i_t_y │ │ │ │ │ +_N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +typefromvertexcount.hh File Reference │ │ │ │ │ #include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ -CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_<_ _c_t_,_ _m_y_d_i_m_,_ _c_d_i_m_ _> │ │ │ │ │ -  Implementation of the Geometry interface for affine geometries. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_G_e_o │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +_G_e_o_m_e_t_r_y_T_y_p_e  _D_u_n_e_:_:_g_e_o_m_e_t_r_y_T_y_p_e_F_r_o_m_V_e_r_t_e_x_C_o_u_n_t (unsigned int dim, unsigned int │ │ │ │ │ + vertices) │ │ │ │ │ +  Utility function to construct the correct geometry type given the │ │ │ │ │ + dimension and the number of vertices. │ │ │ │ │   │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -An implementation of the Geometry interface for affine geometries. │ │ │ │ │ - Author │ │ │ │ │ - Martin Nolte │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00233_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: affinegeometry.hh Source File │ │ │ │ +dune-geometry: typefromvertexcount.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,709 +70,76 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
affinegeometry.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 © 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_TYPE_FROM_VERTEX_COUNT_HH
│ │ │ │ +
6#define DUNE_GEOMETRY_TYPE_FROM_VERTEX_COUNT_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 }
│ │ │ │ + │ │ │ │ +
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 }
│ │ │ │
│ │ │ │ -
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 );
│ │ │ │ -
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 using std::abs;
│ │ │ │ -
419 if constexpr( (n == 2) && (m == 2) )
│ │ │ │ -
420 {
│ │ │ │ -
421 const ctype det = (A[ 0 ][ 0 ]*A[ 1 ][ 1 ] - A[ 1 ][ 0 ]*A[ 0 ][ 1 ]);
│ │ │ │ -
422 const ctype detInv = ctype( 1 ) / det;
│ │ │ │ -
423 ret[ 0 ][ 0 ] = A[ 1 ][ 1 ] * detInv;
│ │ │ │ -
424 ret[ 1 ][ 1 ] = A[ 0 ][ 0 ] * detInv;
│ │ │ │ -
425 ret[ 1 ][ 0 ] = -A[ 1 ][ 0 ] * detInv;
│ │ │ │ -
426 ret[ 0 ][ 1 ] = -A[ 0 ][ 1 ] * detInv;
│ │ │ │ -
427 return abs( det );
│ │ │ │ -
428 }
│ │ │ │ -
429 else
│ │ │ │ -
430 {
│ │ │ │ -
431 FieldMatrix< ctype, n, n > ata;
│ │ │ │ -
432 ATA_L( A, ata );
│ │ │ │ -
433 const ctype det = spdInvA( ata );
│ │ │ │ -
434 ATBT( ata, A, ret );
│ │ │ │ -
435 return det;
│ │ │ │ -
436 }
│ │ │ │ -
437 }
│ │ │ │ -
438
│ │ │ │ -
439 template< int m, int n >
│ │ │ │ -
440 static bool leftInvAx ( const FieldMatrix< ctype, m, n > &A, const FieldVector< ctype, m > &x, FieldVector< ctype, n > &y )
│ │ │ │ -
441 {
│ │ │ │ -
442 static_assert((m >= n), "Matrix has no left inverse.");
│ │ │ │ -
443 FieldMatrix< ctype, n, n > ata;
│ │ │ │ -
444 ATx( A, x, y );
│ │ │ │ -
445 ATA_L( A, ata );
│ │ │ │ -
446 return spdInvAx( ata, y, true );
│ │ │ │ -
447 }
│ │ │ │ -
448
│ │ │ │ -
450 template< int m, int n >
│ │ │ │ -
451 static ctype rightInvA ( const FieldMatrix< ctype, m, n > &A, FieldMatrix< ctype, n, m > &ret )
│ │ │ │ -
452 {
│ │ │ │ -
453 static_assert((n >= m), "Matrix has no right inverse.");
│ │ │ │ -
454 using std::abs;
│ │ │ │ -
455 if constexpr( (n == 2) && (m == 2) )
│ │ │ │ -
456 {
│ │ │ │ -
457 const ctype det = (A[ 0 ][ 0 ]*A[ 1 ][ 1 ] - A[ 1 ][ 0 ]*A[ 0 ][ 1 ]);
│ │ │ │ -
458 const ctype detInv = ctype( 1 ) / det;
│ │ │ │ -
459 ret[ 0 ][ 0 ] = A[ 1 ][ 1 ] * detInv;
│ │ │ │ -
460 ret[ 1 ][ 1 ] = A[ 0 ][ 0 ] * detInv;
│ │ │ │ -
461 ret[ 1 ][ 0 ] = -A[ 1 ][ 0 ] * detInv;
│ │ │ │ -
462 ret[ 0 ][ 1 ] = -A[ 0 ][ 1 ] * detInv;
│ │ │ │ -
463 return abs( det );
│ │ │ │ -
464 }
│ │ │ │ -
465 else
│ │ │ │ -
466 {
│ │ │ │ -
467 FieldMatrix< ctype, m , m > aat;
│ │ │ │ -
468 AAT_L( A, aat );
│ │ │ │ -
469 const ctype det = spdInvA( aat );
│ │ │ │ -
470 ATBT( A , aat , ret );
│ │ │ │ -
471 return det;
│ │ │ │ -
472 }
│ │ │ │ -
473 }
│ │ │ │ -
474
│ │ │ │ -
475 template< int m, int n >
│ │ │ │ -
476 static bool xTRightInvA ( const FieldMatrix< ctype, m, n > &A, const FieldVector< ctype, n > &x, FieldVector< ctype, m > &y )
│ │ │ │ -
477 {
│ │ │ │ -
478 static_assert((n >= m), "Matrix has no right inverse.");
│ │ │ │ -
479 FieldMatrix< ctype, m, m > aat;
│ │ │ │ -
480 Ax( A, x, y );
│ │ │ │ -
481 AAT_L( A, aat );
│ │ │ │ -
482 // check whether aat is singular and return true if non-singular
│ │ │ │ -
483 return spdInvAx( aat, y, true );
│ │ │ │ -
484 }
│ │ │ │ -
485 };
│ │ │ │ -
486
│ │ │ │ -
487 } // namespace Impl
│ │ │ │ -
488
│ │ │ │ -
489
│ │ │ │ -
490
│ │ │ │ -
496 template< class ct, int mydim, int cdim>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
498 {
│ │ │ │ -
499 public:
│ │ │ │ -
500
│ │ │ │ -
502 typedef ct ctype;
│ │ │ │ -
503
│ │ │ │ -
505 static const int mydimension= mydim;
│ │ │ │ -
506
│ │ │ │ -
508 static const int coorddimension = cdim;
│ │ │ │ -
509
│ │ │ │ -
511 typedef FieldVector< ctype, mydimension > LocalCoordinate;
│ │ │ │ -
512
│ │ │ │ -
514 typedef FieldVector< ctype, coorddimension > GlobalCoordinate;
│ │ │ │ -
515
│ │ │ │ -
517 typedef ctype Volume;
│ │ │ │ -
518
│ │ │ │ -
520 typedef FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed;
│ │ │ │ -
521
│ │ │ │ -
523 typedef FieldMatrix< ctype, coorddimension, mydimension > JacobianInverseTransposed;
│ │ │ │ -
524
│ │ │ │ -
526 typedef FieldMatrix< ctype, coorddimension, mydimension > Jacobian;
│ │ │ │ -
527
│ │ │ │ -
529 typedef FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse;
│ │ │ │ -
530
│ │ │ │ -
531 private:
│ │ │ │ - │ │ │ │ -
534
│ │ │ │ - │ │ │ │ -
536
│ │ │ │ -
537 // Helper class to compute a matrix pseudo inverse
│ │ │ │ -
538 typedef Impl::FieldMatrixHelper< ct > MatrixHelper;
│ │ │ │ -
539
│ │ │ │ -
540 public:
│ │ │ │ -
547 AffineGeometry () = default;
│ │ │ │ -
548
│ │ │ │ -
│ │ │ │ -
550 AffineGeometry ( const ReferenceElement &refElement, const GlobalCoordinate &origin,
│ │ │ │ -
551 const JacobianTransposed &jt )
│ │ │ │ -
552 : refElement_(refElement), origin_(origin), jacobianTransposed_(jt)
│ │ │ │ -
553 {
│ │ │ │ -
554 integrationElement_ = MatrixHelper::template rightInvA< mydimension, coorddimension >( jacobianTransposed_, jacobianInverseTransposed_ );
│ │ │ │ -
555 }
│ │ │ │ -
│ │ │ │ -
556
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
559 const JacobianTransposed &jt )
│ │ │ │ -
560 : AffineGeometry(ReferenceElements::general( gt ), origin, jt)
│ │ │ │ -
561 { }
│ │ │ │ -
│ │ │ │ -
562
│ │ │ │ -
564 template< class CoordVector >
│ │ │ │ -
│ │ │ │ -
565 AffineGeometry ( const ReferenceElement &refElement, const CoordVector &coordVector )
│ │ │ │ -
566 : refElement_(refElement), origin_(coordVector[0])
│ │ │ │ -
567 {
│ │ │ │ -
568 for( int i = 0; i < mydimension; ++i )
│ │ │ │ -
569 jacobianTransposed_[ i ] = coordVector[ i+1 ] - origin_;
│ │ │ │ -
570 integrationElement_ = MatrixHelper::template rightInvA< mydimension, coorddimension >( jacobianTransposed_, jacobianInverseTransposed_ );
│ │ │ │ -
571 }
│ │ │ │ -
│ │ │ │ -
572
│ │ │ │ -
574 template< class CoordVector >
│ │ │ │ -
│ │ │ │ -
575 AffineGeometry ( Dune::GeometryType gt, const CoordVector &coordVector )
│ │ │ │ -
576 : AffineGeometry(ReferenceElements::general( gt ), coordVector)
│ │ │ │ -
577 { }
│ │ │ │ -
│ │ │ │ -
578
│ │ │ │ -
580 bool affine () const { return true; }
│ │ │ │ -
581
│ │ │ │ -
583 Dune::GeometryType type () const { return refElement_.type(); }
│ │ │ │ -
584
│ │ │ │ -
586 int corners () const { return refElement_.size( mydimension ); }
│ │ │ │ -
587
│ │ │ │ -
│ │ │ │ -
589 GlobalCoordinate corner ( int i ) const
│ │ │ │ -
590 {
│ │ │ │ -
591 return global( refElement_.position( i, mydimension ) );
│ │ │ │ -
592 }
│ │ │ │ -
│ │ │ │ -
593
│ │ │ │ -
595 GlobalCoordinate center () const { return global( refElement_.position( 0, 0 ) ); }
│ │ │ │ -
596
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
604 {
│ │ │ │ -
605 GlobalCoordinate global( origin_ );
│ │ │ │ -
606 jacobianTransposed_.umtv( local, global );
│ │ │ │ -
607 return global;
│ │ │ │ -
608 }
│ │ │ │ -
│ │ │ │ -
609
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
624 {
│ │ │ │ - │ │ │ │ -
626 jacobianInverseTransposed_.mtv( global - origin_, local );
│ │ │ │ -
627 return local;
│ │ │ │ -
628 }
│ │ │ │ -
│ │ │ │ -
629
│ │ │ │ -
│ │ │ │ -
640 ctype integrationElement ([[maybe_unused]] const LocalCoordinate &local) const
│ │ │ │ -
641 {
│ │ │ │ -
642 return integrationElement_;
│ │ │ │ -
643 }
│ │ │ │ -
│ │ │ │ -
644
│ │ │ │ -
│ │ │ │ -
646 Volume volume () const
│ │ │ │ -
647 {
│ │ │ │ -
648 return integrationElement_ * refElement_.volume();
│ │ │ │ -
649 }
│ │ │ │ -
│ │ │ │ -
650
│ │ │ │ -
│ │ │ │ -
657 const JacobianTransposed &jacobianTransposed ([[maybe_unused]] const LocalCoordinate &local) const
│ │ │ │ -
658 {
│ │ │ │ -
659 return jacobianTransposed_;
│ │ │ │ -
660 }
│ │ │ │ -
│ │ │ │ -
661
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
669 {
│ │ │ │ -
670 return jacobianInverseTransposed_;
│ │ │ │ -
671 }
│ │ │ │ -
│ │ │ │ -
672
│ │ │ │ -
│ │ │ │ -
679 Jacobian jacobian ([[maybe_unused]] const LocalCoordinate &local) const
│ │ │ │ -
680 {
│ │ │ │ -
681 return jacobianTransposed_.transposed();
│ │ │ │ -
682 }
│ │ │ │ -
│ │ │ │ -
683
│ │ │ │ -
│ │ │ │ -
690 JacobianInverse jacobianInverse ([[maybe_unused]] const LocalCoordinate &local) const
│ │ │ │ -
691 {
│ │ │ │ -
692 return jacobianInverseTransposed_.transposed();
│ │ │ │ -
693 }
│ │ │ │ -
│ │ │ │ -
694
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
696 {
│ │ │ │ -
697 return geometry.refElement_;
│ │ │ │ -
698 }
│ │ │ │ -
│ │ │ │ -
699
│ │ │ │ -
700 private:
│ │ │ │ -
701 ReferenceElement refElement_;
│ │ │ │ -
702 GlobalCoordinate origin_;
│ │ │ │ -
703 JacobianTransposed jacobianTransposed_;
│ │ │ │ -
704 JacobianInverseTransposed jacobianInverseTransposed_;
│ │ │ │ -
705 ctype integrationElement_;
│ │ │ │ -
706 };
│ │ │ │ -
│ │ │ │ -
707
│ │ │ │ -
708} // namespace Dune
│ │ │ │ -
│ │ │ │ -
709
│ │ │ │ -
710#endif // #ifndef DUNE_GEOMETRY_AFFINEGEOMETRY_HH
│ │ │ │ -
A unique label for each type of element that can occur in a grid.
│ │ │ │ +
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.
│ │ │ │
Definition affinegeometry.hh:21
│ │ │ │ -
decltype(referenceElement(std::declval< T >()...)) ReferenceElement
Definition referenceelements.hh:347
│ │ │ │ -
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:228
│ │ │ │ -
GeometryType type(int i, int c) const
obtain the type of subentity (i,c)
Definition referenceelement.hh:167
│ │ │ │ -
Coordinate position(int i, int c) const
position of the barycenter of entity (i,c)
Definition referenceelement.hh:190
│ │ │ │ -
int size(int c) const
number of subentities of codimension c
Definition referenceelement.hh:94
│ │ │ │ -
Definition affinegeometry.hh:33
│ │ │ │ -
Class providing access to the singletons of the reference elements.
Definition referenceelements.hh:128
│ │ │ │ -
Implementation of the Geometry interface for affine geometries.
Definition affinegeometry.hh:498
│ │ │ │ -
AffineGeometry(const ReferenceElement &refElement, const CoordVector &coordVector)
Create affine geometry from reference element and a vector of vertex coordinates.
Definition affinegeometry.hh:565
│ │ │ │ -
AffineGeometry()=default
Constructs an empty geometry.
│ │ │ │ -
AffineGeometry(Dune::GeometryType gt, const GlobalCoordinate &origin, const JacobianTransposed &jt)
Create affine geometry from GeometryType, one vertex, and the Jacobian matrix.
Definition affinegeometry.hh:558
│ │ │ │ -
FieldVector< ctype, mydimension > LocalCoordinate
Type for local coordinate vector.
Definition affinegeometry.hh:511
│ │ │ │ -
Dune::GeometryType type() const
Obtain the type of the reference element.
Definition affinegeometry.hh:583
│ │ │ │ -
static const int mydimension
Dimension of the geometry.
Definition affinegeometry.hh:505
│ │ │ │ -
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:550
│ │ │ │ -
ctype Volume
Type used for volume.
Definition affinegeometry.hh:517
│ │ │ │ -
JacobianInverse jacobianInverse(const LocalCoordinate &local) const
Obtain the Jacobian's inverse.
Definition affinegeometry.hh:690
│ │ │ │ -
friend ReferenceElement referenceElement(const AffineGeometry &geometry)
Definition affinegeometry.hh:695
│ │ │ │ -
AffineGeometry(Dune::GeometryType gt, const CoordVector &coordVector)
Create affine geometry from GeometryType and a vector of vertex coordinates.
Definition affinegeometry.hh:575
│ │ │ │ -
ctype integrationElement(const LocalCoordinate &local) const
Obtain the integration element.
Definition affinegeometry.hh:640
│ │ │ │ -
FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse
Type for the inverse Jacobian matrix.
Definition affinegeometry.hh:529
│ │ │ │ -
FieldMatrix< ctype, coorddimension, mydimension > Jacobian
Type for the Jacobian matrix.
Definition affinegeometry.hh:526
│ │ │ │ -
const JacobianInverseTransposed & jacobianInverseTransposed(const LocalCoordinate &local) const
Obtain the transposed of the Jacobian's inverse.
Definition affinegeometry.hh:668
│ │ │ │ -
FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed
Type for the transposed Jacobian matrix.
Definition affinegeometry.hh:520
│ │ │ │ -
GlobalCoordinate corner(int i) const
Obtain coordinates of the i-th corner.
Definition affinegeometry.hh:589
│ │ │ │ -
int corners() const
Obtain number of corners of the corresponding reference element.
Definition affinegeometry.hh:586
│ │ │ │ -
LocalCoordinate local(const GlobalCoordinate &global) const
Evaluate the inverse mapping.
Definition affinegeometry.hh:623
│ │ │ │ -
FieldMatrix< ctype, coorddimension, mydimension > JacobianInverseTransposed
Type for the transposed inverse Jacobian matrix.
Definition affinegeometry.hh:523
│ │ │ │ -
static const int coorddimension
Dimension of the world space.
Definition affinegeometry.hh:508
│ │ │ │ -
GlobalCoordinate global(const LocalCoordinate &local) const
Evaluate the mapping.
Definition affinegeometry.hh:603
│ │ │ │ -
GlobalCoordinate center() const
Obtain the centroid of the mapping's image.
Definition affinegeometry.hh:595
│ │ │ │ -
Jacobian jacobian(const LocalCoordinate &local) const
Obtain the Jacobian.
Definition affinegeometry.hh:679
│ │ │ │ -
ct ctype
Type used for coordinates.
Definition affinegeometry.hh:502
│ │ │ │ -
FieldVector< ctype, coorddimension > GlobalCoordinate
Type for coordinate vector in world space.
Definition affinegeometry.hh:514
│ │ │ │ -
bool affine() const
Always true: this is an affine geometry.
Definition affinegeometry.hh:580
│ │ │ │ -
const JacobianTransposed & jacobianTransposed(const LocalCoordinate &local) const
Obtain the transposed of the Jacobian.
Definition affinegeometry.hh:657
│ │ │ │ -
Volume volume() const
Obtain the volume of the element.
Definition affinegeometry.hh:646
│ │ │ │ +
GeometryType geometryTypeFromVertexCount(unsigned int dim, unsigned int vertices)
Utility function to construct the correct geometry type given the dimension and the number of vertice...
Definition typefromvertexcount.hh:17
│ │ │ │
Unique label for each type of entities that can occur in DUNE grids.
Definition type.hh:114
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,816 +1,79 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -affinegeometry.hh │ │ │ │ │ + * _u_t_i_l_i_t_y │ │ │ │ │ +typefromvertexcount.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 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 © 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_TYPE_FROM_VERTEX_COUNT_HH │ │ │ │ │ +6#define DUNE_GEOMETRY_TYPE_FROM_VERTEX_COUNT_HH │ │ │ │ │ 7 │ │ │ │ │ -13#include │ │ │ │ │ -14 │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ -17 │ │ │ │ │ -18#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ -19 │ │ │ │ │ -_2_0namespace _D_u_n_e │ │ │ │ │ -21{ │ │ │ │ │ -22 │ │ │ │ │ -23 // External Forward Declarations │ │ │ │ │ -24 // ----------------------------- │ │ │ │ │ -25 │ │ │ │ │ -_2_6 namespace Geo │ │ │ │ │ -27 { │ │ │ │ │ -28 │ │ │ │ │ -29 template< typename Implementation > │ │ │ │ │ -30 class _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t; │ │ │ │ │ -31 │ │ │ │ │ -32 template< class ctype, int dim > │ │ │ │ │ -_3_3 class _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_I_m_p_l_e_m_e_n_t_a_t_i_o_n; │ │ │ │ │ -34 │ │ │ │ │ -35 template< class ctype, int dim > │ │ │ │ │ -36 struct _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s; │ │ │ │ │ -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; │ │ │ │ │ +8#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ +9 │ │ │ │ │ +10namespace _D_u_n_e { │ │ │ │ │ +11 │ │ │ │ │ +16 inline │ │ │ │ │ +_1_7 _G_e_o_m_e_t_r_y_T_y_p_e _g_e_o_m_e_t_r_y_T_y_p_e_F_r_o_m_V_e_r_t_e_x_C_o_u_n_t(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 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 ); │ │ │ │ │ -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 using std::abs; │ │ │ │ │ -419 if constexpr( (n == 2) && (m == 2) ) │ │ │ │ │ -420 { │ │ │ │ │ -421 const ctype det = (A[ 0 ][ 0 ]*A[ 1 ][ 1 ] - A[ 1 ][ 0 ]*A[ 0 ][ 1 ]); │ │ │ │ │ -422 const ctype detInv = ctype( 1 ) / det; │ │ │ │ │ -423 ret[ 0 ][ 0 ] = A[ 1 ][ 1 ] * detInv; │ │ │ │ │ -424 ret[ 1 ][ 1 ] = A[ 0 ][ 0 ] * detInv; │ │ │ │ │ -425 ret[ 1 ][ 0 ] = -A[ 1 ][ 0 ] * detInv; │ │ │ │ │ -426 ret[ 0 ][ 1 ] = -A[ 0 ][ 1 ] * detInv; │ │ │ │ │ -427 return abs( det ); │ │ │ │ │ -428 } │ │ │ │ │ -429 else │ │ │ │ │ -430 { │ │ │ │ │ -431 FieldMatrix< ctype, n, n > ata; │ │ │ │ │ -432 ATA_L( A, ata ); │ │ │ │ │ -433 const ctype det = spdInvA( ata ); │ │ │ │ │ -434 ATBT( ata, A, ret ); │ │ │ │ │ -435 return det; │ │ │ │ │ -436 } │ │ │ │ │ -437 } │ │ │ │ │ -438 │ │ │ │ │ -439 template< int m, int n > │ │ │ │ │ -440 static bool leftInvAx ( const FieldMatrix< ctype, m, n > &A, const │ │ │ │ │ -FieldVector< ctype, m > &x, FieldVector< ctype, n > &y ) │ │ │ │ │ -441 { │ │ │ │ │ -442 static_assert((m >= n), "Matrix has no left inverse."); │ │ │ │ │ -443 FieldMatrix< ctype, n, n > ata; │ │ │ │ │ -444 ATx( A, x, y ); │ │ │ │ │ -445 ATA_L( A, ata ); │ │ │ │ │ -446 return spdInvAx( ata, y, true ); │ │ │ │ │ -447 } │ │ │ │ │ -448 │ │ │ │ │ -450 template< int m, int n > │ │ │ │ │ -451 static ctype rightInvA ( const FieldMatrix< ctype, m, n > &A, FieldMatrix< │ │ │ │ │ -ctype, n, m > &ret ) │ │ │ │ │ -452 { │ │ │ │ │ -453 static_assert((n >= m), "Matrix has no right inverse."); │ │ │ │ │ -454 using std::abs; │ │ │ │ │ -455 if constexpr( (n == 2) && (m == 2) ) │ │ │ │ │ -456 { │ │ │ │ │ -457 const ctype det = (A[ 0 ][ 0 ]*A[ 1 ][ 1 ] - A[ 1 ][ 0 ]*A[ 0 ][ 1 ]); │ │ │ │ │ -458 const ctype detInv = ctype( 1 ) / det; │ │ │ │ │ -459 ret[ 0 ][ 0 ] = A[ 1 ][ 1 ] * detInv; │ │ │ │ │ -460 ret[ 1 ][ 1 ] = A[ 0 ][ 0 ] * detInv; │ │ │ │ │ -461 ret[ 1 ][ 0 ] = -A[ 1 ][ 0 ] * detInv; │ │ │ │ │ -462 ret[ 0 ][ 1 ] = -A[ 0 ][ 1 ] * detInv; │ │ │ │ │ -463 return abs( det ); │ │ │ │ │ -464 } │ │ │ │ │ -465 else │ │ │ │ │ -466 { │ │ │ │ │ -467 FieldMatrix< ctype, m , m > aat; │ │ │ │ │ -468 AAT_L( A, aat ); │ │ │ │ │ -469 const ctype det = spdInvA( aat ); │ │ │ │ │ -470 ATBT( A , aat , ret ); │ │ │ │ │ -471 return det; │ │ │ │ │ -472 } │ │ │ │ │ -473 } │ │ │ │ │ -474 │ │ │ │ │ -475 template< int m, int n > │ │ │ │ │ -476 static bool xTRightInvA ( const FieldMatrix< ctype, m, n > &A, const │ │ │ │ │ -FieldVector< ctype, n > &x, FieldVector< ctype, m > &y ) │ │ │ │ │ -477 { │ │ │ │ │ -478 static_assert((n >= m), "Matrix has no right inverse."); │ │ │ │ │ -479 FieldMatrix< ctype, m, m > aat; │ │ │ │ │ -480 Ax( A, x, y ); │ │ │ │ │ -481 AAT_L( A, aat ); │ │ │ │ │ -482 // check whether aat is singular and return true if non-singular │ │ │ │ │ -483 return spdInvAx( aat, y, true ); │ │ │ │ │ -484 } │ │ │ │ │ -485 }; │ │ │ │ │ -486 │ │ │ │ │ -487 } // namespace Impl │ │ │ │ │ -488 │ │ │ │ │ -489 │ │ │ │ │ -490 │ │ │ │ │ -496 template< class ct, int mydim, int cdim> │ │ │ │ │ -_4_9_7 class _A_f_f_i_n_e_G_e_o_m_e_t_r_y │ │ │ │ │ -498 { │ │ │ │ │ -499 public: │ │ │ │ │ -500 │ │ │ │ │ -_5_0_2 typedef ct _c_t_y_p_e; │ │ │ │ │ -503 │ │ │ │ │ -_5_0_5 static const int _m_y_d_i_m_e_n_s_i_o_n= mydim; │ │ │ │ │ -506 │ │ │ │ │ -_5_0_8 static const int _c_o_o_r_d_d_i_m_e_n_s_i_o_n = cdim; │ │ │ │ │ -509 │ │ │ │ │ -_5_1_1 typedef FieldVector< ctype, mydimension > _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ -512 │ │ │ │ │ -_5_1_4 typedef FieldVector< ctype, coorddimension > _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ -515 │ │ │ │ │ -_5_1_7 typedef _c_t_y_p_e _V_o_l_u_m_e; │ │ │ │ │ -518 │ │ │ │ │ -_5_2_0 typedef FieldMatrix< ctype, mydimension, coorddimension > │ │ │ │ │ -_J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d; │ │ │ │ │ -521 │ │ │ │ │ -_5_2_3 typedef FieldMatrix< ctype, coorddimension, mydimension > │ │ │ │ │ -_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d; │ │ │ │ │ -524 │ │ │ │ │ -_5_2_6 typedef FieldMatrix< ctype, coorddimension, mydimension > _J_a_c_o_b_i_a_n; │ │ │ │ │ -527 │ │ │ │ │ -_5_2_9 typedef FieldMatrix< ctype, mydimension, coorddimension > _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e; │ │ │ │ │ -530 │ │ │ │ │ -531 private: │ │ │ │ │ -533 typedef _G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_<_ _G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_I_m_p_l_e_m_e_n_t_a_t_i_o_n_<_ _c_t_y_p_e_, │ │ │ │ │ -_m_y_d_i_m_e_n_s_i_o_n_ _> > _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t; │ │ │ │ │ -534 │ │ │ │ │ -535 typedef _G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_<_ _c_t_y_p_e_,_ _m_y_d_i_m_e_n_s_i_o_n_ _> _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s; │ │ │ │ │ -536 │ │ │ │ │ -537 // Helper class to compute a matrix pseudo inverse │ │ │ │ │ -538 typedef Impl::FieldMatrixHelper< ct > MatrixHelper; │ │ │ │ │ -539 │ │ │ │ │ -540 public: │ │ │ │ │ -_5_4_7 _A_f_f_i_n_e_G_e_o_m_e_t_r_y () = default; │ │ │ │ │ -548 │ │ │ │ │ -_5_5_0 _A_f_f_i_n_e_G_e_o_m_e_t_r_y ( const _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t &refElement, const _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ -&origin, │ │ │ │ │ -551 const _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d &jt ) │ │ │ │ │ -552 : refElement_(refElement), origin_(origin), jacobianTransposed_(jt) │ │ │ │ │ -553 { │ │ │ │ │ -554 integrationElement_ = MatrixHelper::template rightInvA< mydimension, │ │ │ │ │ -coorddimension >( jacobianTransposed_, jacobianInverseTransposed_ ); │ │ │ │ │ -555 } │ │ │ │ │ -556 │ │ │ │ │ -_5_5_8 _A_f_f_i_n_e_G_e_o_m_e_t_r_y ( _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e gt, const _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e &origin, │ │ │ │ │ -559 const _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d &jt ) │ │ │ │ │ -560 : _A_f_f_i_n_e_G_e_o_m_e_t_r_y(_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s::general( gt ), origin, jt) │ │ │ │ │ -561 { } │ │ │ │ │ -562 │ │ │ │ │ -564 template< class CoordVector > │ │ │ │ │ -_5_6_5 _A_f_f_i_n_e_G_e_o_m_e_t_r_y ( const _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t &refElement, const CoordVector │ │ │ │ │ -&coordVector ) │ │ │ │ │ -566 : refElement_(refElement), origin_(coordVector[0]) │ │ │ │ │ -567 { │ │ │ │ │ -568 for( int i = 0; i < _m_y_d_i_m_e_n_s_i_o_n; ++i ) │ │ │ │ │ -569 jacobianTransposed_[ i ] = coordVector[ i+1 ] - origin_; │ │ │ │ │ -570 integrationElement_ = MatrixHelper::template rightInvA< mydimension, │ │ │ │ │ -coorddimension >( jacobianTransposed_, jacobianInverseTransposed_ ); │ │ │ │ │ -571 } │ │ │ │ │ -572 │ │ │ │ │ -574 template< class CoordVector > │ │ │ │ │ -_5_7_5 _A_f_f_i_n_e_G_e_o_m_e_t_r_y ( _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e gt, const CoordVector &coordVector ) │ │ │ │ │ -576 : _A_f_f_i_n_e_G_e_o_m_e_t_r_y(_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s::general( gt ), coordVector) │ │ │ │ │ -577 { } │ │ │ │ │ -578 │ │ │ │ │ -_5_8_0 bool _a_f_f_i_n_e () const { return true; } │ │ │ │ │ -581 │ │ │ │ │ -_5_8_3 _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e _t_y_p_e () const { return refElement_._t_y_p_e(); } │ │ │ │ │ -584 │ │ │ │ │ -_5_8_6 int _c_o_r_n_e_r_s () const { return refElement_._s_i_z_e( _m_y_d_i_m_e_n_s_i_o_n ); } │ │ │ │ │ -587 │ │ │ │ │ -_5_8_9 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _c_o_r_n_e_r ( int i ) const │ │ │ │ │ -590 { │ │ │ │ │ -591 return _g_l_o_b_a_l( refElement_._p_o_s_i_t_i_o_n( i, _m_y_d_i_m_e_n_s_i_o_n ) ); │ │ │ │ │ -592 } │ │ │ │ │ -593 │ │ │ │ │ -_5_9_5 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _c_e_n_t_e_r () const { return _g_l_o_b_a_l( refElement_._p_o_s_i_t_i_o_n( 0, │ │ │ │ │ -0 ) ); } │ │ │ │ │ -596 │ │ │ │ │ -_6_0_3 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _g_l_o_b_a_l ( const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l ) const │ │ │ │ │ -604 { │ │ │ │ │ -605 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _g_l_o_b_a_l( origin_ ); │ │ │ │ │ -606 jacobianTransposed_.umtv( _l_o_c_a_l, _g_l_o_b_a_l ); │ │ │ │ │ -607 return _g_l_o_b_a_l; │ │ │ │ │ -608 } │ │ │ │ │ -609 │ │ │ │ │ -_6_2_3 _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e _l_o_c_a_l ( const _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e &_g_l_o_b_a_l ) const │ │ │ │ │ -624 { │ │ │ │ │ -625 _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e _l_o_c_a_l; │ │ │ │ │ -626 jacobianInverseTransposed_.mtv( _g_l_o_b_a_l - origin_, _l_o_c_a_l ); │ │ │ │ │ -627 return _l_o_c_a_l; │ │ │ │ │ -628 } │ │ │ │ │ -629 │ │ │ │ │ -_6_4_0 _c_t_y_p_e _i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t ([[maybe_unused]] const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l) │ │ │ │ │ -const │ │ │ │ │ -641 { │ │ │ │ │ -642 return integrationElement_; │ │ │ │ │ -643 } │ │ │ │ │ -644 │ │ │ │ │ -_6_4_6 _V_o_l_u_m_e _v_o_l_u_m_e () const │ │ │ │ │ -647 { │ │ │ │ │ -648 return integrationElement_ * refElement_._v_o_l_u_m_e(); │ │ │ │ │ -649 } │ │ │ │ │ -650 │ │ │ │ │ -_6_5_7 const _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d &_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d ([[maybe_unused]] const │ │ │ │ │ -_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l) const │ │ │ │ │ -658 { │ │ │ │ │ -659 return jacobianTransposed_; │ │ │ │ │ -660 } │ │ │ │ │ -661 │ │ │ │ │ -_6_6_8 const _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d &_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d ([ │ │ │ │ │ -[maybe_unused]] const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l) const │ │ │ │ │ -669 { │ │ │ │ │ -670 return jacobianInverseTransposed_; │ │ │ │ │ -671 } │ │ │ │ │ -672 │ │ │ │ │ -_6_7_9 _J_a_c_o_b_i_a_n _j_a_c_o_b_i_a_n ([[maybe_unused]] const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l) const │ │ │ │ │ -680 { │ │ │ │ │ -681 return jacobianTransposed_.transposed(); │ │ │ │ │ -682 } │ │ │ │ │ -683 │ │ │ │ │ -_6_9_0 _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e _j_a_c_o_b_i_a_n_I_n_v_e_r_s_e ([[maybe_unused]] const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ -&_l_o_c_a_l) const │ │ │ │ │ -691 { │ │ │ │ │ -692 return jacobianInverseTransposed_.transposed(); │ │ │ │ │ -693 } │ │ │ │ │ -694 │ │ │ │ │ -_6_9_5 friend _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t _r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t ( const _A_f_f_i_n_e_G_e_o_m_e_t_r_y &geometry ) │ │ │ │ │ -696 { │ │ │ │ │ -697 return geometry.refElement_; │ │ │ │ │ -698 } │ │ │ │ │ -699 │ │ │ │ │ -700 private: │ │ │ │ │ -701 _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t refElement_; │ │ │ │ │ -702 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e origin_; │ │ │ │ │ -703 _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d jacobianTransposed_; │ │ │ │ │ -704 _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d jacobianInverseTransposed_; │ │ │ │ │ -705 _c_t_y_p_e integrationElement_; │ │ │ │ │ -706 }; │ │ │ │ │ -707 │ │ │ │ │ -708} // namespace Dune │ │ │ │ │ -709 │ │ │ │ │ -710#endif // #ifndef DUNE_GEOMETRY_AFFINEGEOMETRY_HH │ │ │ │ │ +52} │ │ │ │ │ +53 │ │ │ │ │ +54#endif // DUNE_GEOMETRY_TYPE_FROM_VERTEX_COUNT_HH │ │ │ │ │ _t_y_p_e_._h_h │ │ │ │ │ A unique label for each type of element that can occur in a grid. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn affinegeometry.hh:21 │ │ │ │ │ -_D_u_n_e_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ -decltype(referenceElement(std::declval< T >()...)) ReferenceElement │ │ │ │ │ -DDeeffiinniittiioonn referenceelements.hh:347 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ -This class provides access to geometric and topological properties of a │ │ │ │ │ -reference element. │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_v_o_l_u_m_e │ │ │ │ │ -CoordinateField volume() const │ │ │ │ │ -obtain the volume of the reference element │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:228 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_t_y_p_e │ │ │ │ │ -GeometryType type(int i, int c) const │ │ │ │ │ -obtain the type of subentity (i,c) │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:167 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_p_o_s_i_t_i_o_n │ │ │ │ │ -Coordinate position(int i, int c) const │ │ │ │ │ -position of the barycenter of entity (i,c) │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:190 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_s_i_z_e │ │ │ │ │ -int size(int c) const │ │ │ │ │ -number of subentities of codimension c │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:94 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_I_m_p_l_e_m_e_n_t_a_t_i_o_n │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:33 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s │ │ │ │ │ -Class providing access to the singletons of the reference elements. │ │ │ │ │ -DDeeffiinniittiioonn referenceelements.hh:128 │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y │ │ │ │ │ -Implementation of the Geometry interface for affine geometries. │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:498 │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y │ │ │ │ │ -AffineGeometry(const ReferenceElement &refElement, const CoordVector │ │ │ │ │ -&coordVector) │ │ │ │ │ -Create affine geometry from reference element and a vector of vertex │ │ │ │ │ -coordinates. │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:565 │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y │ │ │ │ │ -AffineGeometry()=default │ │ │ │ │ -Constructs an empty geometry. │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y │ │ │ │ │ -AffineGeometry(Dune::GeometryType gt, const GlobalCoordinate &origin, const │ │ │ │ │ -JacobianTransposed &jt) │ │ │ │ │ -Create affine geometry from GeometryType, one vertex, and the Jacobian matrix. │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:558 │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ -FieldVector< ctype, mydimension > LocalCoordinate │ │ │ │ │ -Type for local coordinate vector. │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:511 │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_t_y_p_e │ │ │ │ │ -Dune::GeometryType type() const │ │ │ │ │ -Obtain the type of the reference element. │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:583 │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_m_y_d_i_m_e_n_s_i_o_n │ │ │ │ │ -static const int mydimension │ │ │ │ │ -Dimension of the geometry. │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:505 │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y │ │ │ │ │ -AffineGeometry(const ReferenceElement &refElement, const GlobalCoordinate │ │ │ │ │ -&origin, const JacobianTransposed &jt) │ │ │ │ │ -Create affine geometry from reference element, one vertex, and the Jacobian │ │ │ │ │ -matrix. │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:550 │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_V_o_l_u_m_e │ │ │ │ │ -ctype Volume │ │ │ │ │ -Type used for volume. │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:517 │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e │ │ │ │ │ -JacobianInverse jacobianInverse(const LocalCoordinate &local) const │ │ │ │ │ -Obtain the Jacobian's inverse. │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:690 │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ -friend ReferenceElement referenceElement(const AffineGeometry &geometry) │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:695 │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y │ │ │ │ │ -AffineGeometry(Dune::GeometryType gt, const CoordVector &coordVector) │ │ │ │ │ -Create affine geometry from GeometryType and a vector of vertex coordinates. │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:575 │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t │ │ │ │ │ -ctype integrationElement(const LocalCoordinate &local) const │ │ │ │ │ -Obtain the integration element. │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:640 │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e │ │ │ │ │ -FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse │ │ │ │ │ -Type for the inverse Jacobian matrix. │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:529 │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n │ │ │ │ │ -FieldMatrix< ctype, coorddimension, mydimension > Jacobian │ │ │ │ │ -Type for the Jacobian matrix. │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:526 │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -const JacobianInverseTransposed & jacobianInverseTransposed(const │ │ │ │ │ -LocalCoordinate &local) const │ │ │ │ │ -Obtain the transposed of the Jacobian's inverse. │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:668 │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed │ │ │ │ │ -Type for the transposed Jacobian matrix. │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:520 │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_c_o_r_n_e_r │ │ │ │ │ -GlobalCoordinate corner(int i) const │ │ │ │ │ -Obtain coordinates of the i-th corner. │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:589 │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_c_o_r_n_e_r_s │ │ │ │ │ -int corners() const │ │ │ │ │ -Obtain number of corners of the corresponding reference element. │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:586 │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_l_o_c_a_l │ │ │ │ │ -LocalCoordinate local(const GlobalCoordinate &global) const │ │ │ │ │ -Evaluate the inverse mapping. │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:623 │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -FieldMatrix< ctype, coorddimension, mydimension > JacobianInverseTransposed │ │ │ │ │ -Type for the transposed inverse Jacobian matrix. │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:523 │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_c_o_o_r_d_d_i_m_e_n_s_i_o_n │ │ │ │ │ -static const int coorddimension │ │ │ │ │ -Dimension of the world space. │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:508 │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_g_l_o_b_a_l │ │ │ │ │ -GlobalCoordinate global(const LocalCoordinate &local) const │ │ │ │ │ -Evaluate the mapping. │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:603 │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_c_e_n_t_e_r │ │ │ │ │ -GlobalCoordinate center() const │ │ │ │ │ -Obtain the centroid of the mapping's image. │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:595 │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n │ │ │ │ │ -Jacobian jacobian(const LocalCoordinate &local) const │ │ │ │ │ -Obtain the Jacobian. │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:679 │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_c_t_y_p_e │ │ │ │ │ -ct ctype │ │ │ │ │ -Type used for coordinates. │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:502 │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ -FieldVector< ctype, coorddimension > GlobalCoordinate │ │ │ │ │ -Type for coordinate vector in world space. │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:514 │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_a_f_f_i_n_e │ │ │ │ │ -bool affine() const │ │ │ │ │ -Always true: this is an affine geometry. │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:580 │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ -const JacobianTransposed & jacobianTransposed(const LocalCoordinate &local) │ │ │ │ │ -const │ │ │ │ │ -Obtain the transposed of the Jacobian. │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:657 │ │ │ │ │ -_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_v_o_l_u_m_e │ │ │ │ │ -Volume volume() const │ │ │ │ │ -Obtain the volume of the element. │ │ │ │ │ -DDeeffiinniittiioonn affinegeometry.hh:646 │ │ │ │ │ +_D_u_n_e_:_:_g_e_o_m_e_t_r_y_T_y_p_e_F_r_o_m_V_e_r_t_e_x_C_o_u_n_t │ │ │ │ │ +GeometryType geometryTypeFromVertexCount(unsigned int dim, unsigned int │ │ │ │ │ +vertices) │ │ │ │ │ +Utility function to construct the correct geometry type given the dimension and │ │ │ │ │ +the number of vertice... │ │ │ │ │ +DDeeffiinniittiioonn typefromvertexcount.hh:17 │ │ │ │ │ _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ DDeeffiinniittiioonn type.hh:114 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00236.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: type.hh File Reference │ │ │ │ +dune-geometry: topologyfactory.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,54 +71,43 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
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 <cstdint>
│ │ │ │ -#include <string>
│ │ │ │ +#include <array>
│ │ │ │ +#include <map>
│ │ │ │ +#include <memory>
│ │ │ │ #include <type_traits>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ -#include <dune/common/unused.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.
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

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

│ │ │ │ -
│ │ │ │ + │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,36 +1,31 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ -type.hh File Reference │ │ │ │ │ -A unique label for each type of element that can occur in a grid. _M_o_r_e_._._. │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +topologyfactory.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_i_n_d_e_x_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ -  Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ - _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_T_o_p_o_l_o_g_y_F_a_c_t_o_r_y_<_ _T_r_a_i_t_s_ _> │ │ │ │ │ +  Provide a factory over the generic topologies. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_T_o_p_o_l_o_g_y_S_i_n_g_l_e_t_o_n_F_a_c_t_o_r_y_<_ _F_a_c_t_o_r_y_ _> │ │ │ │ │ + A wrapper for a _T_o_p_o_l_o_g_y_F_a_c_t_o_r_y providing singleton storage. Same │ │ │ │ │ +  usage as _T_o_p_o_l_o_g_y_F_a_c_t_o_r_y but with empty release method an internal │ │ │ │ │ + storage. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_s │ │ │ │ │ -  Predefined _G_e_o_m_e_t_r_y_T_y_p_e_s for common geometries. │ │ │ │ │ -  │ │ │ │ │ -FFuunnccttiioonnss │ │ │ │ │ -std::ostream &  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream &s, const _G_e_o_m_e_t_r_y_T_y_p_e &a) │ │ │ │ │ -  Prints the type to an output stream. │ │ │ │ │ -  │ │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -A unique label for each type of element that can occur in a grid. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00236_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: type.hh Source File │ │ │ │ +dune-geometry: topologyfactory.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,477 +74,194 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
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 © 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#include <cstdint>
│ │ │ │ -
14
│ │ │ │ -
15#include <string>
│ │ │ │ -
16#include <type_traits>
│ │ │ │ -
17
│ │ │ │ -
18#include <dune/common/exceptions.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 // GeometryType
│ │ │ │ -
99 // -------------
│ │ │ │ -
100
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
114 {
│ │ │ │ -
115 public:
│ │ │ │ -
116
│ │ │ │ -
│ │ │ │ -
119 enum
│ │ │ │ -
120 BasicType {
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
126 none
│ │ │ │ -
127 };
│ │ │ │ +
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
│ │ │ │ +
│ │ │ │ +
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 private:
│ │ │ │ +
129 TopologySingletonFactory () = default;
│ │ │ │
130
│ │ │ │ -
132 unsigned char dim_;
│ │ │ │ -
133
│ │ │ │ -
135 bool none_;
│ │ │ │ -
136
│ │ │ │ -
138 unsigned int topologyId_;
│ │ │ │ -
139
│ │ │ │ -
140 // Internal type used for the Id. The exact nature of this type is kept
│ │ │ │ -
141 // as an implementation detail on purpose. We use a scoped enum here because scoped enums
│ │ │ │ -
142 // can be used as template parameters, but are not implicitly converted to other integral
│ │ │ │ -
143 // types by the compiler. That way, we avoid unfortunate implicit conversion chains, e.g.
│ │ │ │ -
144 // people trying to work with GlobalGeometryTypeIndex, but forgetting to actually call
│ │ │ │ -
145 // GlobalGeometryTypeIndex::index(gt) and just using gt directly.
│ │ │ │ -
146 enum class IdType : std::uint64_t
│ │ │ │ -
147 {};
│ │ │ │ -
148
│ │ │ │ -
149 public:
│ │ │ │ -
150
│ │ │ │ -
181 using Id = IdType;
│ │ │ │ -
182
│ │ │ │ -
│ │ │ │ -
190 constexpr operator Id() const
│ │ │ │ -
191 {
│ │ │ │ -
192 // recreate the exact storage layout that this class is using, making conversion
│ │ │ │ -
193 // extremely cheap
│ │ │ │ -
194 std::uint64_t id = dim_ | (std::uint64_t(none_) << 8) | (std::uint64_t(topologyId_) << 32);
│ │ │ │ -
195 return static_cast<Id>(id);
│ │ │ │ -
196 }
│ │ │ │ -
│ │ │ │ -
197
│ │ │ │ -
│ │ │ │ -
210 constexpr Id toId() const
│ │ │ │ -
211 {
│ │ │ │ -
212 return static_cast<Id>(*this);
│ │ │ │ -
213 }
│ │ │ │ -
│ │ │ │ -
214
│ │ │ │ -
│ │ │ │ -
222 constexpr GeometryType(Id id)
│ │ │ │ -
223 : dim_(static_cast<std::uint64_t>(id) & 0xFF)
│ │ │ │ -
224 , none_(static_cast<std::uint64_t>(id) & 0x100)
│ │ │ │ -
225 , topologyId_(static_cast<std::uint64_t>(id) >> 32)
│ │ │ │ -
226 {}
│ │ │ │ -
│ │ │ │ -
227
│ │ │ │ -
230
│ │ │ │ -
│ │ │ │ -
232 constexpr GeometryType ()
│ │ │ │ -
233 : dim_(0), none_(true), topologyId_(0)
│ │ │ │ -
234 {}
│ │ │ │ -
│ │ │ │ -
235
│ │ │ │ -
│ │ │ │ -
242 constexpr GeometryType(unsigned int topologyId, unsigned int dim, bool isNone)
│ │ │ │ -
243 : dim_(dim), none_(isNone), topologyId_(topologyId)
│ │ │ │ -
244 {}
│ │ │ │ -
│ │ │ │ -
245
│ │ │ │ -
│ │ │ │ -
251 constexpr GeometryType(unsigned int topologyId, unsigned int dim)
│ │ │ │ -
252 : dim_(dim), none_(false), topologyId_(topologyId)
│ │ │ │ -
253 {}
│ │ │ │ -
│ │ │ │ -
254
│ │ │ │ -
265 template<class TopologyType,
│ │ │ │ -
266 class = std::void_t<decltype(TopologyType::dimension), decltype(TopologyType::id)>>
│ │ │ │ -
│ │ │ │ -
267 explicit GeometryType(TopologyType t)
│ │ │ │ -
268 : dim_(TopologyType::dimension), none_(false), topologyId_(TopologyType::id)
│ │ │ │ -
269 {
│ │ │ │ -
270 DUNE_UNUSED_PARAMETER(t);
│ │ │ │ -
271 }
│ │ │ │ -
│ │ │ │ -
272
│ │ │ │ -
│ │ │ │ -
279 constexpr bool isVertex() const {
│ │ │ │ -
280 return dim_==0;
│ │ │ │ -
281 }
│ │ │ │ -
│ │ │ │ -
282
│ │ │ │ -
│ │ │ │ -
284 constexpr bool isLine() const {
│ │ │ │ -
285 return dim_==1;
│ │ │ │ -
286 }
│ │ │ │ -
│ │ │ │ -
287
│ │ │ │ -
│ │ │ │ -
289 constexpr bool isTriangle() const {
│ │ │ │ -
290 return ! none_ && dim_==2 && (topologyId_ | 1) == 0b0001;
│ │ │ │ -
291 }
│ │ │ │ -
│ │ │ │ -
292
│ │ │ │ -
│ │ │ │ -
294 constexpr bool isQuadrilateral() const {
│ │ │ │ -
295 return ! none_ && dim_==2 && (topologyId_ | 1) == 0b0011;
│ │ │ │ -
296 }
│ │ │ │ -
│ │ │ │ -
297
│ │ │ │ -
│ │ │ │ -
299 constexpr bool isTetrahedron() const {
│ │ │ │ -
300 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0001;
│ │ │ │ -
301 }
│ │ │ │ -
│ │ │ │ -
302
│ │ │ │ -
│ │ │ │ -
304 constexpr bool isPyramid() const {
│ │ │ │ -
305 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0011;
│ │ │ │ -
306 }
│ │ │ │ -
│ │ │ │ -
307
│ │ │ │ -
│ │ │ │ -
309 constexpr bool isPrism() const {
│ │ │ │ -
310 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0101;
│ │ │ │ -
311 }
│ │ │ │ -
│ │ │ │ -
312
│ │ │ │ -
│ │ │ │ -
314 constexpr bool isHexahedron() const {
│ │ │ │ -
315 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0111;
│ │ │ │ -
316 }
│ │ │ │ -
│ │ │ │ -
317
│ │ │ │ -
│ │ │ │ -
319 constexpr bool isSimplex() const {
│ │ │ │ -
320 return ! none_ && (topologyId_ | 1) == 1;
│ │ │ │ -
321 }
│ │ │ │ -
│ │ │ │ -
322
│ │ │ │ -
│ │ │ │ -
324 constexpr bool isCube() const {
│ │ │ │ -
325 return ! none_ && ((topologyId_ ^ ((1 << dim_)-1)) >> 1 == 0);
│ │ │ │ -
326 }
│ │ │ │ -
│ │ │ │ -
327
│ │ │ │ -
│ │ │ │ -
329 constexpr bool isConical() const {
│ │ │ │ -
330 return ! none_ && (((topologyId_ & ~1) & (1u << (dim_-1))) == 0);
│ │ │ │ -
331 }
│ │ │ │ -
│ │ │ │ -
332
│ │ │ │ -
│ │ │ │ -
337 constexpr bool isConical(const int& step) const {
│ │ │ │ -
338 return ! none_ && (((topologyId_ & ~1) & (1u << step)) == 0);
│ │ │ │ -
339 }
│ │ │ │ -
│ │ │ │ -
340
│ │ │ │ -
│ │ │ │ -
342 constexpr bool isPrismatic() const {
│ │ │ │ -
343 return ! none_ && (( (topologyId_ | 1) & (1u << (dim_-1))) != 0);
│ │ │ │ -
344 }
│ │ │ │ -
│ │ │ │ -
345
│ │ │ │ -
│ │ │ │ -
350 constexpr bool isPrismatic(const int& step) const {
│ │ │ │ -
351 return ! none_ && (( (topologyId_ | 1) & (1u << step)) != 0);
│ │ │ │ -
352 }
│ │ │ │ -
│ │ │ │ -
353
│ │ │ │ -
│ │ │ │ -
355 constexpr bool isNone() const {
│ │ │ │ -
356 return none_;
│ │ │ │ -
357 }
│ │ │ │ -
│ │ │ │ -
358
│ │ │ │ -
│ │ │ │ -
360 constexpr unsigned int dim() const {
│ │ │ │ -
361 return dim_;
│ │ │ │ -
362 }
│ │ │ │ -
│ │ │ │ -
363
│ │ │ │ -
│ │ │ │ -
365 constexpr unsigned int id() const {
│ │ │ │ -
366 return topologyId_;
│ │ │ │ -
367 }
│ │ │ │ -
│ │ │ │ -
368
│ │ │ │ -
373
│ │ │ │ -
│ │ │ │ -
377 constexpr bool operator==(const GeometryType& other) const {
│ │ │ │ -
378 return ( ( none_ == other.none_ )
│ │ │ │ -
379 && ( ( none_ == true )
│ │ │ │ -
380 || ( ( dim_ == other.dim_ )
│ │ │ │ -
381 && ( (topologyId_ >> 1) == (other.topologyId_ >> 1) )
│ │ │ │ -
382 )
│ │ │ │ -
383 )
│ │ │ │ -
384 );
│ │ │ │ -
385 }
│ │ │ │ -
│ │ │ │ -
386
│ │ │ │ -
│ │ │ │ -
388 constexpr bool operator!=(const GeometryType& other) const {
│ │ │ │ -
389 return ! ((*this)==other);
│ │ │ │ -
390 }
│ │ │ │ -
│ │ │ │ -
391
│ │ │ │ -
│ │ │ │ -
393 constexpr bool operator < (const GeometryType& other) const {
│ │ │ │ -
394 return ( ( none_ < other.none_ )
│ │ │ │ -
395 || ( !( other.none_ < none_ )
│ │ │ │ -
396 && ( ( dim_ < other.dim_ )
│ │ │ │ -
397 || ( (other.dim_ == dim_)
│ │ │ │ -
398 && ((topologyId_ >> 1) < (other.topologyId_ >> 1) )
│ │ │ │ -
399 )
│ │ │ │ -
400 )
│ │ │ │ -
401 )
│ │ │ │ -
402 );
│ │ │ │ -
403 }
│ │ │ │ -
│ │ │ │ -
404
│ │ │ │ -
407 };
│ │ │ │ -
│ │ │ │ -
408
│ │ │ │ -
│ │ │ │ -
410 inline std::ostream& operator<< (std::ostream& s, const GeometryType& a)
│ │ │ │ -
411 {
│ │ │ │ -
412 if (a.isSimplex())
│ │ │ │ -
413 {
│ │ │ │ -
414 s << "(simplex, " << a.dim() << ")";
│ │ │ │ -
415 return s;
│ │ │ │ -
416 }
│ │ │ │ -
417 if (a.isCube())
│ │ │ │ -
418 {
│ │ │ │ -
419 s << "(cube, " << a.dim() << ")";
│ │ │ │ -
420 return s;
│ │ │ │ -
421 }
│ │ │ │ -
422 if (a.isPyramid())
│ │ │ │ -
423 {
│ │ │ │ -
424 s << "(pyramid, 3)";
│ │ │ │ -
425 return s;
│ │ │ │ -
426 }
│ │ │ │ -
427 if (a.isPrism())
│ │ │ │ -
428 {
│ │ │ │ -
429 s << "(prism, 3)";
│ │ │ │ -
430 return s;
│ │ │ │ -
431 }
│ │ │ │ -
432 if (a.isNone())
│ │ │ │ -
433 {
│ │ │ │ -
434 s << "(none, " << a.dim() << ")";
│ │ │ │ -
435 return s;
│ │ │ │ -
436 }
│ │ │ │ -
437 s << "(other [" << a.id() << "], " << a.dim() << ")";
│ │ │ │ -
438 return s;
│ │ │ │ -
439 }
│ │ │ │ -
│ │ │ │ -
440
│ │ │ │ -
441
│ │ │ │ -
443
│ │ │ │ -
│ │ │ │ -
447 namespace GeometryTypes {
│ │ │ │ -
448
│ │ │ │ -
450
│ │ │ │ -
453 inline constexpr GeometryType simplex(unsigned int dim)
│ │ │ │ -
454 {
│ │ │ │ -
455 return GeometryType(0,dim,false);
│ │ │ │ -
456 }
│ │ │ │ -
457
│ │ │ │ -
459
│ │ │ │ -
462 inline constexpr GeometryType cube(unsigned int dim)
│ │ │ │ -
463 {
│ │ │ │ -
464 return GeometryType(((dim>1) ? ((1 << dim) - 1) : 0),dim,false);
│ │ │ │ -
465 }
│ │ │ │ -
466
│ │ │ │ -
468
│ │ │ │ -
471 inline constexpr GeometryType none(unsigned int dim)
│ │ │ │ -
472 {
│ │ │ │ -
473 return GeometryType(0,dim,true);
│ │ │ │ -
474 }
│ │ │ │ -
475
│ │ │ │ -
477 inline constexpr GeometryType conicalExtension(const GeometryType& gt)
│ │ │ │ -
478 {
│ │ │ │ -
479 return GeometryType(gt.id(), gt.dim()+1, gt.isNone());
│ │ │ │ -
480 }
│ │ │ │ -
481
│ │ │ │ -
483 inline constexpr GeometryType prismaticExtension(const GeometryType& gt)
│ │ │ │ -
484 {
│ │ │ │ -
485 return GeometryType(gt.id() | ((1 << gt.dim())), gt.dim()+1, gt.isNone());
│ │ │ │ -
486 }
│ │ │ │ -
487
│ │ │ │ -
489
│ │ │ │ -
492 inline constexpr GeometryType vertex = GeometryType(0,0,false);
│ │ │ │ -
493
│ │ │ │ -
495
│ │ │ │ -
498 inline constexpr GeometryType line = GeometryType(0,1,false);
│ │ │ │ -
499
│ │ │ │ -
501
│ │ │ │ -
504 inline constexpr GeometryType triangle = simplex(2);
│ │ │ │ -
505
│ │ │ │ -
507
│ │ │ │ -
510 inline constexpr GeometryType quadrilateral = cube(2);
│ │ │ │ -
511
│ │ │ │ -
513
│ │ │ │ -
516 inline constexpr GeometryType tetrahedron = simplex(3);
│ │ │ │ -
517
│ │ │ │ -
519
│ │ │ │ -
522 inline constexpr GeometryType pyramid = GeometryType(0b0011,3,false);
│ │ │ │ -
523
│ │ │ │ -
525
│ │ │ │ -
528 inline constexpr GeometryType prism = GeometryType(0b0101,3,false);
│ │ │ │ -
529
│ │ │ │ -
531
│ │ │ │ -
534 inline constexpr GeometryType hexahedron = cube(3);
│ │ │ │ -
535
│ │ │ │ -
536 }
│ │ │ │ -
│ │ │ │ -
537
│ │ │ │ -
538 namespace Impl
│ │ │ │ -
539 {
│ │ │ │ -
540
│ │ │ │ -
542 inline constexpr GeometryType getBase(const GeometryType& gt) {
│ │ │ │ -
543 return GeometryType(gt.id() & ((1 << (gt.dim()-1))-1), gt.dim()-1, gt.isNone());
│ │ │ │ -
544 }
│ │ │ │ -
545
│ │ │ │ -
546
│ │ │ │ -
547 // IfGeometryType
│ │ │ │ -
548 // ----------
│ │ │ │ -
549
│ │ │ │ -
550 template< template< GeometryType::Id > class Operation, int dim, GeometryType::Id geometryId = GeometryTypes::vertex >
│ │ │ │ -
551 struct IfGeometryType
│ │ │ │ -
552 {
│ │ │ │ -
553 static constexpr GeometryType geometry = geometryId;
│ │ │ │ -
554 template< class... Args >
│ │ │ │ -
555 static auto apply ( GeometryType gt, Args &&... args )
│ │ │ │ -
556 {
│ │ │ │ -
557 GeometryType lowerGeometry(gt.id() >>1 , gt.dim()-1, gt.isNone());
│ │ │ │ -
558
│ │ │ │ -
559 if( gt.id() & 1 )
│ │ │ │ -
560 return IfGeometryType< Operation, dim-1, GeometryTypes::prismaticExtension(geometry).toId() >::apply( lowerGeometry, std::forward< Args >( args )... );
│ │ │ │ -
561 else
│ │ │ │ -
562 return IfGeometryType< Operation, dim-1, GeometryTypes::conicalExtension(geometry).toId() >::apply( lowerGeometry, std::forward< Args >( args )... );
│ │ │ │ -
563 }
│ │ │ │ -
564 };
│ │ │ │ -
565
│ │ │ │ -
566 template< template< GeometryType::Id > class Operation, GeometryType::Id geometryId >
│ │ │ │ -
567 struct IfGeometryType< Operation, 0, geometryId>
│ │ │ │ -
568 {
│ │ │ │ -
569 template< class... Args >
│ │ │ │ -
570 static auto apply ([[maybe_unused]] GeometryType gt, Args &&... args )
│ │ │ │ -
571 {
│ │ │ │ -
572 return Operation< geometryId >::apply( std::forward< Args >( args )... );
│ │ │ │ -
573 }
│ │ │ │ -
574 };
│ │ │ │ -
575 } // namespace Impl
│ │ │ │ -
576} // namespace Dune
│ │ │ │ -
577
│ │ │ │ -
578#endif // DUNE_GEOMETRY_TYPE_HH
│ │ │ │ -
STL namespace.
│ │ │ │ +
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.
│ │ │ │
Definition affinegeometry.hh:21
│ │ │ │ -
std::ostream & operator<<(std::ostream &s, const GeometryType &a)
Prints the type to an output stream.
Definition type.hh:410
│ │ │ │ +
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 * >
Definition topologyfactory.hh:103
│ │ │ │ +
static Object * create(const Dune::GeometryType &gt, const Key &key)
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 * >
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:114
│ │ │ │ -
constexpr GeometryType(unsigned int topologyId, unsigned int dim)
Constructor, using the topologyId (integer) and the dimension.
Definition type.hh:251
│ │ │ │ -
constexpr bool operator<(const GeometryType &other) const
less-than operation for use with maps
Definition type.hh:393
│ │ │ │ -
constexpr bool operator!=(const GeometryType &other) const
Check for inequality.
Definition type.hh:388
│ │ │ │ -
constexpr bool isPyramid() const
Return true if entity is a pyramid.
Definition type.hh:304
│ │ │ │ -
constexpr bool isTetrahedron() const
Return true if entity is a tetrahedron.
Definition type.hh:299
│ │ │ │ -
constexpr bool isPrism() const
Return true if entity is a prism.
Definition type.hh:309
│ │ │ │ -
constexpr bool isVertex() const
Return true if entity is a vertex.
Definition type.hh:279
│ │ │ │ -
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:377
│ │ │ │ -
constexpr Id toId() const
Create an Id representation of this GeometryType.
Definition type.hh:210
│ │ │ │ -
constexpr bool isConical(const int &step) const
Return true if entity was constructed with a conical product in the chosen step.
Definition type.hh:337
│ │ │ │ -
constexpr unsigned int dim() const
Return dimension of the type.
Definition type.hh:360
│ │ │ │ -
constexpr bool isPrismatic(const int &step) const
Return true if entity was constructed with a prismatic product in the chosen step.
Definition type.hh:350
│ │ │ │ -
constexpr bool isTriangle() const
Return true if entity is a triangle.
Definition type.hh:289
│ │ │ │ -
GeometryType(TopologyType t)
Constructor from static TopologyType class.
Definition type.hh:267
│ │ │ │ -
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:242
│ │ │ │ -
BasicType
Each entity can be tagged by one of these basic types plus its space dimension.
Definition type.hh:120
│ │ │ │ -
@ cube
Cube element in any nonnegative dimension.
Definition type.hh:122
│ │ │ │ -
@ simplex
Simplicial element in any nonnegative dimension.
Definition type.hh:121
│ │ │ │ -
@ pyramid
Four sided pyramid in three dimensions.
Definition type.hh:123
│ │ │ │ -
@ extended
Other, more general topology, representable as topologyId.
Definition type.hh:125
│ │ │ │ -
@ none
Even more general topology, cannot be specified by a topologyId. Two GeometryTypes with 'none' type a...
Definition type.hh:126
│ │ │ │ -
@ prism
Prism element in three dimensions.
Definition type.hh:124
│ │ │ │ -
constexpr GeometryType(Id id)
Reconstruct a Geometry type from a GeometryType::Id.
Definition type.hh:222
│ │ │ │ -
constexpr bool isCube() const
Return true if entity is a cube of any dimension.
Definition type.hh:324
│ │ │ │ -
constexpr GeometryType()
Default constructor, not initializing anything.
Definition type.hh:232
│ │ │ │ -
constexpr bool isConical() const
Return true if entity was constructed with a conical product in the last step.
Definition type.hh:329
│ │ │ │ -
constexpr bool isLine() const
Return true if entity is a line segment.
Definition type.hh:284
│ │ │ │ -
constexpr bool isQuadrilateral() const
Return true if entity is a quadrilateral.
Definition type.hh:294
│ │ │ │ -
constexpr bool isPrismatic() const
Return true if entity was constructed with a prismatic product in the last step.
Definition type.hh:342
│ │ │ │
constexpr unsigned int id() const
Return the topology id of the type.
Definition type.hh:365
│ │ │ │ -
constexpr bool isNone() const
Return true if entity is a singular of any dimension.
Definition type.hh:355
│ │ │ │ -
constexpr bool isHexahedron() const
Return true if entity is a hexahedron.
Definition type.hh:314
│ │ │ │ -
constexpr bool isSimplex() const
Return true if entity is a simplex of any dimension.
Definition type.hh:319
│ │ │ │ -
IdType Id
An integral id representing a GeometryType.
Definition type.hh:181
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,542 +1,220 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -type.hh │ │ │ │ │ +topologyfactory.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 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 © 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#include │ │ │ │ │ -14 │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ -17 │ │ │ │ │ -18#include │ │ │ │ │ -19#include │ │ │ │ │ -20#include │ │ │ │ │ +8#include │ │ │ │ │ +9 │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15 │ │ │ │ │ +16#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ +17#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_i_n_d_e_x_._h_h> │ │ │ │ │ +18 │ │ │ │ │ +19namespace _D_u_n_e │ │ │ │ │ +20{ │ │ │ │ │ 21 │ │ │ │ │ -22namespace _D_u_n_e │ │ │ │ │ -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 │ │ │ │ │ +_4_1 struct _T_o_p_o_l_o_g_y_F_a_c_t_o_r_y │ │ │ │ │ 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 // GeometryType │ │ │ │ │ -99 // ------------- │ │ │ │ │ +43 // extract types from Traits class │ │ │ │ │ +_4_4 static const unsigned int _d_i_m_e_n_s_i_o_n = Traits::dimension; │ │ │ │ │ +_4_5 typedef typename Traits::Key _K_e_y; │ │ │ │ │ +_4_6 typedef typename Traits::Object _O_b_j_e_c_t; │ │ │ │ │ +_4_7 typedef typename Traits::Factory _F_a_c_t_o_r_y; │ │ │ │ │ +48 │ │ │ │ │ +_5_0 static _O_b_j_e_c_t *_c_r_e_a_t_e ( const _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e >, const _K_e_y &key ) │ │ │ │ │ +51 { │ │ │ │ │ +52 return Impl::toGeometryTypeIdConstant(gt, [&](auto id) { │ │ │ │ │ +53 return create(key); │ │ │ │ │ +54 }); │ │ │ │ │ +55 } │ │ │ │ │ +57 template< GeometryType::Id geometryId > │ │ │ │ │ +_5_8 static _O_b_j_e_c_t *_c_r_e_a_t_e ( const _K_e_y &key ) │ │ │ │ │ +59 { │ │ │ │ │ +60 return Factory::template createObject< geometryId >( key ); │ │ │ │ │ +61 } │ │ │ │ │ +62 │ │ │ │ │ +64 template< class Topology > │ │ │ │ │ +_6_5 static _O_b_j_e_c_t *_c_r_e_a_t_e ( const _K_e_y &key ) │ │ │ │ │ +66 { │ │ │ │ │ +67 return Factory::template createObject< Topology >( key ); │ │ │ │ │ +68 } │ │ │ │ │ +69 │ │ │ │ │ +_7_1 static void _r_e_l_e_a_s_e( _O_b_j_e_c_t *object ) { delete object; } │ │ │ │ │ +72 }; │ │ │ │ │ +73 │ │ │ │ │ +74 │ │ │ │ │ +75 │ │ │ │ │ +80 template │ │ │ │ │ +_8_1 struct _T_o_p_o_l_o_g_y_S_i_n_g_l_e_t_o_n_F_a_c_t_o_r_y │ │ │ │ │ +82 { │ │ │ │ │ +_8_3 static const unsigned int _d_i_m_e_n_s_i_o_n = Factory::dimension; │ │ │ │ │ +_8_4 typedef typename Factory::Key _K_e_y; │ │ │ │ │ +_8_5 typedef const typename Factory::Object _O_b_j_e_c_t; │ │ │ │ │ +86 │ │ │ │ │ +_8_8 static _O_b_j_e_c_t *_c_r_e_a_t_e ( const _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e >, const _K_e_y &key ) │ │ │ │ │ +89 { │ │ │ │ │ +90 assert( gt._i_d() < numTopologies ); │ │ │ │ │ +91 return instance().getObject( gt, key ); │ │ │ │ │ +92 } │ │ │ │ │ +94 template< GeometryType::Id geometryId > │ │ │ │ │ +_9_5 static auto _c_r_e_a_t_e ( const _K_e_y &key ) │ │ │ │ │ +96 -> std::enable_if_t< static_cast(geometryId).dim() == │ │ │ │ │ +_d_i_m_e_n_s_i_o_n, _O_b_j_e_c_t * > │ │ │ │ │ +97 { │ │ │ │ │ +98 return instance().template getObject< geometryId >( key ); │ │ │ │ │ +99 } │ │ │ │ │ 100 │ │ │ │ │ -_1_1_3 class _G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ -114 { │ │ │ │ │ -115 public: │ │ │ │ │ -116 │ │ │ │ │ -_1_1_9 enum │ │ │ │ │ -120 _B_a_s_i_c_T_y_p_e { │ │ │ │ │ -_1_2_1 _s_i_m_p_l_e_x, │ │ │ │ │ -_1_2_2 _c_u_b_e, │ │ │ │ │ -_1_2_3 _p_y_r_a_m_i_d, │ │ │ │ │ -_1_2_4 _p_r_i_s_m, │ │ │ │ │ -_1_2_5 _e_x_t_e_n_d_e_d, │ │ │ │ │ -126 _n_o_n_e │ │ │ │ │ -_1_2_7 }; │ │ │ │ │ +102 template< class Topology > │ │ │ │ │ +_1_0_3 static auto _c_r_e_a_t_e ( const _K_e_y &key ) │ │ │ │ │ +104 -> std::enable_if_t< Topology::dimension == dimension, Object * > │ │ │ │ │ +105 { │ │ │ │ │ +106 return instance().template getObject< Topology >( key ); │ │ │ │ │ +107 } │ │ │ │ │ +108 │ │ │ │ │ +_1_1_0 static void _r_e_l_e_a_s_e ( _O_b_j_e_c_t *object ) │ │ │ │ │ +111 {} │ │ │ │ │ +112 │ │ │ │ │ +113 private: │ │ │ │ │ +114 struct ObjectDeleter │ │ │ │ │ +115 { │ │ │ │ │ +116 void operator() ( _O_b_j_e_c_t *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 << _d_i_m_e_n_s_i_o_n); │ │ │ │ │ +126 typedef std::array< std::unique_ptr< Object, ObjectDeleter >, numTopologies │ │ │ │ │ +> Array; │ │ │ │ │ +127 typedef std::map< Key, Array > Storage; │ │ │ │ │ 128 │ │ │ │ │ -129 private: │ │ │ │ │ +129 TopologySingletonFactory () = default; │ │ │ │ │ 130 │ │ │ │ │ -132 unsigned char dim_; │ │ │ │ │ -133 │ │ │ │ │ -135 bool none_; │ │ │ │ │ -136 │ │ │ │ │ -138 unsigned int topologyId_; │ │ │ │ │ -139 │ │ │ │ │ -140 // Internal type used for the Id. The exact nature of this type is kept │ │ │ │ │ -141 // as an implementation detail on purpose. We use a scoped enum here │ │ │ │ │ -because scoped enums │ │ │ │ │ -142 // can be used as template parameters, but are not implicitly converted to │ │ │ │ │ -other integral │ │ │ │ │ -143 // types by the compiler. That way, we avoid unfortunate implicit │ │ │ │ │ -conversion chains, e.g. │ │ │ │ │ -144 // people trying to work with GlobalGeometryTypeIndex, but forgetting to │ │ │ │ │ -actually call │ │ │ │ │ -145 // GlobalGeometryTypeIndex::index(gt) and just using gt directly. │ │ │ │ │ -146 enum class IdType : std::uint64_t │ │ │ │ │ -147 {}; │ │ │ │ │ -148 │ │ │ │ │ -149 public: │ │ │ │ │ -150 │ │ │ │ │ -_1_8_1 using Id = IdType; │ │ │ │ │ -182 │ │ │ │ │ -_1_9_0 constexpr operator _I_d() const │ │ │ │ │ -191 { │ │ │ │ │ -192 // recreate the exact storage layout that this class is using, making │ │ │ │ │ -conversion │ │ │ │ │ -193 // extremely cheap │ │ │ │ │ -194 std::uint64_t id = dim_ | (std::uint64_t(none_) << 8) | (std::uint64_t │ │ │ │ │ -(topologyId_) << 32); │ │ │ │ │ -195 return static_cast(_i_d); │ │ │ │ │ -196 } │ │ │ │ │ -197 │ │ │ │ │ -_2_1_0 constexpr Id _t_o_I_d() const │ │ │ │ │ -211 { │ │ │ │ │ -212 return static_cast(*this); │ │ │ │ │ -213 } │ │ │ │ │ -214 │ │ │ │ │ -_2_2_2 constexpr _G_e_o_m_e_t_r_y_T_y_p_e(Id id) │ │ │ │ │ -223 : dim_(static_cast<_s_t_d::uint64_t>(_i_d) & 0xFF) │ │ │ │ │ -224 , none_(static_cast<_s_t_d::uint64_t>(_i_d) & 0x100) │ │ │ │ │ -225 , topologyId_(static_cast<_s_t_d::uint64_t>(_i_d) >> 32) │ │ │ │ │ -226 {} │ │ │ │ │ -227 │ │ │ │ │ -230 │ │ │ │ │ -_2_3_2 constexpr _G_e_o_m_e_t_r_y_T_y_p_e () │ │ │ │ │ -233 : dim_(0), none_(true), topologyId_(0) │ │ │ │ │ -234 {} │ │ │ │ │ -235 │ │ │ │ │ -_2_4_2 constexpr _G_e_o_m_e_t_r_y_T_y_p_e(unsigned int topologyId, unsigned int _d_i_m, bool │ │ │ │ │ -_i_s_N_o_n_e) │ │ │ │ │ -243 : dim_(_d_i_m), none_(_i_s_N_o_n_e), topologyId_(topologyId) │ │ │ │ │ -244 {} │ │ │ │ │ -245 │ │ │ │ │ -_2_5_1 constexpr _G_e_o_m_e_t_r_y_T_y_p_e(unsigned int topologyId, unsigned int _d_i_m) │ │ │ │ │ -252 : dim_(_d_i_m), none_(false), topologyId_(topologyId) │ │ │ │ │ -253 {} │ │ │ │ │ -254 │ │ │ │ │ -265 template> │ │ │ │ │ -_2_6_7 explicit _G_e_o_m_e_t_r_y_T_y_p_e(TopologyType t) │ │ │ │ │ -268 : dim_(TopologyType::dimension), none_(false), topologyId_(TopologyType:: │ │ │ │ │ -_i_d) │ │ │ │ │ -269 { │ │ │ │ │ -270 DUNE_UNUSED_PARAMETER(t); │ │ │ │ │ -271 } │ │ │ │ │ -272 │ │ │ │ │ -_2_7_9 constexpr bool _i_s_V_e_r_t_e_x() const { │ │ │ │ │ -280 return dim_==0; │ │ │ │ │ -281 } │ │ │ │ │ -282 │ │ │ │ │ -_2_8_4 constexpr bool _i_s_L_i_n_e() const { │ │ │ │ │ -285 return dim_==1; │ │ │ │ │ -286 } │ │ │ │ │ -287 │ │ │ │ │ -_2_8_9 constexpr bool _i_s_T_r_i_a_n_g_l_e() const { │ │ │ │ │ -290 return ! none_ && dim_==2 && (topologyId_ | 1) == 0b0001; │ │ │ │ │ -291 } │ │ │ │ │ -292 │ │ │ │ │ -_2_9_4 constexpr bool _i_s_Q_u_a_d_r_i_l_a_t_e_r_a_l() const { │ │ │ │ │ -295 return ! none_ && dim_==2 && (topologyId_ | 1) == 0b0011; │ │ │ │ │ -296 } │ │ │ │ │ -297 │ │ │ │ │ -_2_9_9 constexpr bool _i_s_T_e_t_r_a_h_e_d_r_o_n() const { │ │ │ │ │ -300 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0001; │ │ │ │ │ -301 } │ │ │ │ │ -302 │ │ │ │ │ -_3_0_4 constexpr bool _i_s_P_y_r_a_m_i_d() const { │ │ │ │ │ -305 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0011; │ │ │ │ │ -306 } │ │ │ │ │ -307 │ │ │ │ │ -_3_0_9 constexpr bool _i_s_P_r_i_s_m() const { │ │ │ │ │ -310 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0101; │ │ │ │ │ -311 } │ │ │ │ │ -312 │ │ │ │ │ -_3_1_4 constexpr bool _i_s_H_e_x_a_h_e_d_r_o_n() const { │ │ │ │ │ -315 return ! none_ && dim_==3 && (topologyId_ | 1) == 0b0111; │ │ │ │ │ -316 } │ │ │ │ │ -317 │ │ │ │ │ -_3_1_9 constexpr bool _i_s_S_i_m_p_l_e_x() const { │ │ │ │ │ -320 return ! none_ && (topologyId_ | 1) == 1; │ │ │ │ │ -321 } │ │ │ │ │ -322 │ │ │ │ │ -_3_2_4 constexpr bool _i_s_C_u_b_e() const { │ │ │ │ │ -325 return ! none_ && ((topologyId_ ^ ((1 << dim_)-1)) >> 1 == 0); │ │ │ │ │ -326 } │ │ │ │ │ -327 │ │ │ │ │ -_3_2_9 constexpr bool _i_s_C_o_n_i_c_a_l() const { │ │ │ │ │ -330 return ! none_ && (((topologyId_ & ~1) & (1u << (dim_-1))) == 0); │ │ │ │ │ -331 } │ │ │ │ │ -332 │ │ │ │ │ -_3_3_7 constexpr bool _i_s_C_o_n_i_c_a_l(const int& step) const { │ │ │ │ │ -338 return ! none_ && (((topologyId_ & ~1) & (1u << step)) == 0); │ │ │ │ │ -339 } │ │ │ │ │ -340 │ │ │ │ │ -_3_4_2 constexpr bool _i_s_P_r_i_s_m_a_t_i_c() const { │ │ │ │ │ -343 return ! none_ && (( (topologyId_ | 1) & (1u << (dim_-1))) != 0); │ │ │ │ │ -344 } │ │ │ │ │ -345 │ │ │ │ │ -_3_5_0 constexpr bool _i_s_P_r_i_s_m_a_t_i_c(const int& step) const { │ │ │ │ │ -351 return ! none_ && (( (topologyId_ | 1) & (1u << step)) != 0); │ │ │ │ │ -352 } │ │ │ │ │ -353 │ │ │ │ │ -_3_5_5 constexpr bool _i_s_N_o_n_e() const { │ │ │ │ │ -356 return none_; │ │ │ │ │ -357 } │ │ │ │ │ -358 │ │ │ │ │ -_3_6_0 constexpr unsigned int _d_i_m() const { │ │ │ │ │ -361 return dim_; │ │ │ │ │ -362 } │ │ │ │ │ -363 │ │ │ │ │ -_3_6_5 constexpr unsigned int _i_d() const { │ │ │ │ │ -366 return topologyId_; │ │ │ │ │ -367 } │ │ │ │ │ -368 │ │ │ │ │ -373 │ │ │ │ │ -_3_7_7 constexpr bool _o_p_e_r_a_t_o_r_=_=(const _G_e_o_m_e_t_r_y_T_y_p_e& other) const { │ │ │ │ │ -378 return ( ( none_ == other.none_ ) │ │ │ │ │ -379 && ( ( none_ == true ) │ │ │ │ │ -380 || ( ( dim_ == other.dim_ ) │ │ │ │ │ -381 && ( (topologyId_ >> 1) == (other.topologyId_ >> 1) ) │ │ │ │ │ -382 ) │ │ │ │ │ -383 ) │ │ │ │ │ -384 ); │ │ │ │ │ -385 } │ │ │ │ │ -386 │ │ │ │ │ -_3_8_8 constexpr bool _o_p_e_r_a_t_o_r_!_=(const _G_e_o_m_e_t_r_y_T_y_p_e& other) const { │ │ │ │ │ -389 return ! ((*this)==other); │ │ │ │ │ -390 } │ │ │ │ │ -391 │ │ │ │ │ -_3_9_3 constexpr bool _o_p_e_r_a_t_o_r_ _<_ (const _G_e_o_m_e_t_r_y_T_y_p_e& other) const { │ │ │ │ │ -394 return ( ( none_ < other.none_ ) │ │ │ │ │ -395 || ( !( other.none_ < none_ ) │ │ │ │ │ -396 && ( ( dim_ < other.dim_ ) │ │ │ │ │ -397 || ( (other.dim_ == dim_) │ │ │ │ │ -398 && ((topologyId_ >> 1) < (other.topologyId_ >> 1) ) │ │ │ │ │ -399 ) │ │ │ │ │ -400 ) │ │ │ │ │ -401 ) │ │ │ │ │ -402 ); │ │ │ │ │ -403 } │ │ │ │ │ -404 │ │ │ │ │ -407 }; │ │ │ │ │ -408 │ │ │ │ │ -_4_1_0 inline std::ostream& _o_p_e_r_a_t_o_r_<_<_ (std::ostream& s, const _G_e_o_m_e_t_r_y_T_y_p_e& a) │ │ │ │ │ -411 { │ │ │ │ │ -412 if (a._i_s_S_i_m_p_l_e_x()) │ │ │ │ │ -413 { │ │ │ │ │ -414 s << "(simplex, " << a._d_i_m() << ")"; │ │ │ │ │ -415 return s; │ │ │ │ │ -416 } │ │ │ │ │ -417 if (a._i_s_C_u_b_e()) │ │ │ │ │ -418 { │ │ │ │ │ -419 s << "(cube, " << a._d_i_m() << ")"; │ │ │ │ │ -420 return s; │ │ │ │ │ -421 } │ │ │ │ │ -422 if (a._i_s_P_y_r_a_m_i_d()) │ │ │ │ │ -423 { │ │ │ │ │ -424 s << "(pyramid, 3)"; │ │ │ │ │ -425 return s; │ │ │ │ │ -426 } │ │ │ │ │ -427 if (a._i_s_P_r_i_s_m()) │ │ │ │ │ -428 { │ │ │ │ │ -429 s << "(prism, 3)"; │ │ │ │ │ -430 return s; │ │ │ │ │ -431 } │ │ │ │ │ -432 if (a._i_s_N_o_n_e()) │ │ │ │ │ -433 { │ │ │ │ │ -434 s << "(none, " << a._d_i_m() << ")"; │ │ │ │ │ -435 return s; │ │ │ │ │ -436 } │ │ │ │ │ -437 s << "(other [" << a._i_d() << "], " << a._d_i_m() << ")"; │ │ │ │ │ -438 return s; │ │ │ │ │ -439 } │ │ │ │ │ -440 │ │ │ │ │ -441 │ │ │ │ │ -443 │ │ │ │ │ -_4_4_7 namespace GeometryTypes { │ │ │ │ │ -448 │ │ │ │ │ -450 │ │ │ │ │ -453 inline constexpr _G_e_o_m_e_t_r_y_T_y_p_e simplex(unsigned int dim) │ │ │ │ │ -454 { │ │ │ │ │ -455 return _G_e_o_m_e_t_r_y_T_y_p_e(0,dim,false); │ │ │ │ │ -456 } │ │ │ │ │ -457 │ │ │ │ │ -459 │ │ │ │ │ -462 inline constexpr _G_e_o_m_e_t_r_y_T_y_p_e cube(unsigned int dim) │ │ │ │ │ -463 { │ │ │ │ │ -464 return _G_e_o_m_e_t_r_y_T_y_p_e(((dim>1) ? ((1 << dim) - 1) : 0),dim,false); │ │ │ │ │ -465 } │ │ │ │ │ -466 │ │ │ │ │ -468 │ │ │ │ │ -471 inline constexpr _G_e_o_m_e_t_r_y_T_y_p_e none(unsigned int dim) │ │ │ │ │ -472 { │ │ │ │ │ -473 return _G_e_o_m_e_t_r_y_T_y_p_e(0,dim,true); │ │ │ │ │ -474 } │ │ │ │ │ -475 │ │ │ │ │ -477 inline constexpr _G_e_o_m_e_t_r_y_T_y_p_e conicalExtension(const _G_e_o_m_e_t_r_y_T_y_p_e& gt) │ │ │ │ │ -478 { │ │ │ │ │ -479 return _G_e_o_m_e_t_r_y_T_y_p_e(gt._i_d(), gt._d_i_m()+1, gt._i_s_N_o_n_e()); │ │ │ │ │ -480 } │ │ │ │ │ -481 │ │ │ │ │ -483 inline constexpr _G_e_o_m_e_t_r_y_T_y_p_e prismaticExtension(const _G_e_o_m_e_t_r_y_T_y_p_e& gt) │ │ │ │ │ -484 { │ │ │ │ │ -485 return _G_e_o_m_e_t_r_y_T_y_p_e(gt._i_d() | ((1 << gt._d_i_m())), gt._d_i_m()+1, gt._i_s_N_o_n_e()); │ │ │ │ │ -486 } │ │ │ │ │ -487 │ │ │ │ │ -489 │ │ │ │ │ -492 inline constexpr _G_e_o_m_e_t_r_y_T_y_p_e vertex = _G_e_o_m_e_t_r_y_T_y_p_e(0,0,false); │ │ │ │ │ -493 │ │ │ │ │ -495 │ │ │ │ │ -498 inline constexpr _G_e_o_m_e_t_r_y_T_y_p_e line = _G_e_o_m_e_t_r_y_T_y_p_e(0,1,false); │ │ │ │ │ -499 │ │ │ │ │ -501 │ │ │ │ │ -504 inline constexpr _G_e_o_m_e_t_r_y_T_y_p_e triangle = simplex(2); │ │ │ │ │ -505 │ │ │ │ │ -507 │ │ │ │ │ -510 inline constexpr _G_e_o_m_e_t_r_y_T_y_p_e quadrilateral = cube(2); │ │ │ │ │ -511 │ │ │ │ │ -513 │ │ │ │ │ -516 inline constexpr _G_e_o_m_e_t_r_y_T_y_p_e tetrahedron = simplex(3); │ │ │ │ │ -517 │ │ │ │ │ -519 │ │ │ │ │ -522 inline constexpr _G_e_o_m_e_t_r_y_T_y_p_e pyramid = _G_e_o_m_e_t_r_y_T_y_p_e(0b0011,3,false); │ │ │ │ │ -523 │ │ │ │ │ -525 │ │ │ │ │ -528 inline constexpr _G_e_o_m_e_t_r_y_T_y_p_e prism = _G_e_o_m_e_t_r_y_T_y_p_e(0b0101,3,false); │ │ │ │ │ -529 │ │ │ │ │ -531 │ │ │ │ │ -534 inline constexpr _G_e_o_m_e_t_r_y_T_y_p_e hexahedron = cube(3); │ │ │ │ │ -535 │ │ │ │ │ -536 } │ │ │ │ │ -537 │ │ │ │ │ -538 namespace Impl │ │ │ │ │ -539 { │ │ │ │ │ -540 │ │ │ │ │ -542 inline constexpr _G_e_o_m_e_t_r_y_T_y_p_e getBase(const _G_e_o_m_e_t_r_y_T_y_p_e& gt) { │ │ │ │ │ -543 return _G_e_o_m_e_t_r_y_T_y_p_e(gt._i_d() & ((1 << (gt._d_i_m()-1))-1), gt._d_i_m()-1, │ │ │ │ │ -gt._i_s_N_o_n_e()); │ │ │ │ │ -544 } │ │ │ │ │ -545 │ │ │ │ │ -546 │ │ │ │ │ -547 // IfGeometryType │ │ │ │ │ -548 // ---------- │ │ │ │ │ -549 │ │ │ │ │ -550 template< template< GeometryType::Id > class Operation, int dim, │ │ │ │ │ -_G_e_o_m_e_t_r_y_T_y_p_e_:_:_I_d geometryId = GeometryTypes::vertex > │ │ │ │ │ -551 struct IfGeometryType │ │ │ │ │ -552 { │ │ │ │ │ -553 static constexpr GeometryType geometry = geometryId; │ │ │ │ │ -554 template< class... Args > │ │ │ │ │ -555 static auto apply ( GeometryType gt, Args &&... args ) │ │ │ │ │ -556 { │ │ │ │ │ -557 GeometryType lowerGeometry(gt.id() >>1 , gt.dim()-1, gt.isNone()); │ │ │ │ │ -558 │ │ │ │ │ -559 if( gt.id() & 1 ) │ │ │ │ │ -560 return IfGeometryType< Operation, dim-1, GeometryTypes::prismaticExtension │ │ │ │ │ -(geometry).toId() >::apply( lowerGeometry, std::forward< Args >( args )... ); │ │ │ │ │ -561 else │ │ │ │ │ -562 return IfGeometryType< Operation, dim-1, GeometryTypes::conicalExtension │ │ │ │ │ -(geometry).toId() >::apply( lowerGeometry, std::forward< Args >( args )... ); │ │ │ │ │ -563 } │ │ │ │ │ -564 }; │ │ │ │ │ -565 │ │ │ │ │ -566 template< template< GeometryType::Id > class Operation, _G_e_o_m_e_t_r_y_T_y_p_e_:_:_I_d │ │ │ │ │ -geometryId > │ │ │ │ │ -567 struct IfGeometryType< Operation, 0, geometryId> │ │ │ │ │ -568 { │ │ │ │ │ -569 template< class... Args > │ │ │ │ │ -570 static auto apply ([[maybe_unused]] GeometryType gt, Args &&... args ) │ │ │ │ │ -571 { │ │ │ │ │ -572 return Operation< geometryId >::apply( std::forward< Args >( args )... ); │ │ │ │ │ -573 } │ │ │ │ │ -574 }; │ │ │ │ │ -575 } // namespace Impl │ │ │ │ │ -576} // namespace Dune │ │ │ │ │ -577 │ │ │ │ │ -578#endif // DUNE_GEOMETRY_TYPE_HH │ │ │ │ │ -_s_t_d │ │ │ │ │ -STL namespace. │ │ │ │ │ +131 std::unique_ptr< Object, ObjectDeleter > &find ( const unsigned int │ │ │ │ │ +topologyId, const _K_e_y &key ) │ │ │ │ │ +132 { │ │ │ │ │ +133 return storage_[ key ][ topologyId ]; │ │ │ │ │ +134 } │ │ │ │ │ +135 │ │ │ │ │ +136 _O_b_j_e_c_t *getObject ( const _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e >, const _K_e_y &key ) │ │ │ │ │ +137 { │ │ │ │ │ +138 auto &object = find( gt._i_d(), key ); │ │ │ │ │ +139 if( !object ) │ │ │ │ │ +140 object.reset( Factory::create( gt, key ) ); │ │ │ │ │ +141 return object.get(); │ │ │ │ │ +142 } │ │ │ │ │ +143 │ │ │ │ │ +144 template< GeometryType::Id geometryId > │ │ │ │ │ +145 _O_b_j_e_c_t *getObject ( const _K_e_y &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 _O_b_j_e_c_t *getObject ( const _K_e_y &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 │ │ │ │ │ +_t_y_p_e_._h_h │ │ │ │ │ +A unique label for each type of element that can occur in a grid. │ │ │ │ │ +_t_y_p_e_i_n_d_e_x_._h_h │ │ │ │ │ +Helper classes to provide indices for geometrytypes for use in a vector. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn affinegeometry.hh:21 │ │ │ │ │ -_D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ │ -std::ostream & operator<<(std::ostream &s, const GeometryType &a) │ │ │ │ │ -Prints the type to an output stream. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:410 │ │ │ │ │ +_D_u_n_e_:_:_T_o_p_o_l_o_g_y_F_a_c_t_o_r_y │ │ │ │ │ +Provide a factory over the generic topologies. │ │ │ │ │ +DDeeffiinniittiioonn topologyfactory.hh:42 │ │ │ │ │ +_D_u_n_e_:_:_T_o_p_o_l_o_g_y_F_a_c_t_o_r_y_:_:_F_a_c_t_o_r_y │ │ │ │ │ +Traits::Factory Factory │ │ │ │ │ +DDeeffiinniittiioonn topologyfactory.hh:47 │ │ │ │ │ +_D_u_n_e_:_:_T_o_p_o_l_o_g_y_F_a_c_t_o_r_y_:_:_c_r_e_a_t_e │ │ │ │ │ +static Object * create(const Dune::GeometryType >, const Key &key) │ │ │ │ │ +dynamically create objects │ │ │ │ │ +DDeeffiinniittiioonn topologyfactory.hh:50 │ │ │ │ │ +_D_u_n_e_:_:_T_o_p_o_l_o_g_y_F_a_c_t_o_r_y_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ +static const unsigned int dimension │ │ │ │ │ +DDeeffiinniittiioonn topologyfactory.hh:44 │ │ │ │ │ +_D_u_n_e_:_:_T_o_p_o_l_o_g_y_F_a_c_t_o_r_y_:_:_c_r_e_a_t_e │ │ │ │ │ +static Object * create(const Key &key) │ │ │ │ │ +statically create objects │ │ │ │ │ +DDeeffiinniittiioonn topologyfactory.hh:58 │ │ │ │ │ +_D_u_n_e_:_:_T_o_p_o_l_o_g_y_F_a_c_t_o_r_y_:_:_r_e_l_e_a_s_e │ │ │ │ │ +static void release(Object *object) │ │ │ │ │ +release the object returned by the create methods │ │ │ │ │ +DDeeffiinniittiioonn topologyfactory.hh:71 │ │ │ │ │ +_D_u_n_e_:_:_T_o_p_o_l_o_g_y_F_a_c_t_o_r_y_:_:_K_e_y │ │ │ │ │ +Traits::Key Key │ │ │ │ │ +DDeeffiinniittiioonn topologyfactory.hh:45 │ │ │ │ │ +_D_u_n_e_:_:_T_o_p_o_l_o_g_y_F_a_c_t_o_r_y_:_:_O_b_j_e_c_t │ │ │ │ │ +Traits::Object Object │ │ │ │ │ +DDeeffiinniittiioonn topologyfactory.hh:46 │ │ │ │ │ +_D_u_n_e_:_:_T_o_p_o_l_o_g_y_S_i_n_g_l_e_t_o_n_F_a_c_t_o_r_y │ │ │ │ │ +A wrapper for a TopologyFactory providing singleton storage. Same usage as │ │ │ │ │ +TopologyFactory but with e... │ │ │ │ │ +DDeeffiinniittiioonn topologyfactory.hh:82 │ │ │ │ │ +_D_u_n_e_:_:_T_o_p_o_l_o_g_y_S_i_n_g_l_e_t_o_n_F_a_c_t_o_r_y_:_:_c_r_e_a_t_e │ │ │ │ │ +static auto create(const Key &key) -> std::enable_if_t< Topology:: │ │ │ │ │ +dimension==dimension, Object * > │ │ │ │ │ +DDeeffiinniittiioonn topologyfactory.hh:103 │ │ │ │ │ +_D_u_n_e_:_:_T_o_p_o_l_o_g_y_S_i_n_g_l_e_t_o_n_F_a_c_t_o_r_y_:_:_c_r_e_a_t_e │ │ │ │ │ +static Object * create(const Dune::GeometryType >, const Key &key) │ │ │ │ │ +DDeeffiinniittiioonn topologyfactory.hh:88 │ │ │ │ │ +_D_u_n_e_:_:_T_o_p_o_l_o_g_y_S_i_n_g_l_e_t_o_n_F_a_c_t_o_r_y_:_:_r_e_l_e_a_s_e │ │ │ │ │ +static void release(Object *object) │ │ │ │ │ +release the object returned by the create methods │ │ │ │ │ +DDeeffiinniittiioonn topologyfactory.hh:110 │ │ │ │ │ +_D_u_n_e_:_:_T_o_p_o_l_o_g_y_S_i_n_g_l_e_t_o_n_F_a_c_t_o_r_y_:_:_O_b_j_e_c_t │ │ │ │ │ +const Factory::Object Object │ │ │ │ │ +DDeeffiinniittiioonn topologyfactory.hh:85 │ │ │ │ │ +_D_u_n_e_:_:_T_o_p_o_l_o_g_y_S_i_n_g_l_e_t_o_n_F_a_c_t_o_r_y_:_:_K_e_y │ │ │ │ │ +Factory::Key Key │ │ │ │ │ +DDeeffiinniittiioonn topologyfactory.hh:84 │ │ │ │ │ +_D_u_n_e_:_:_T_o_p_o_l_o_g_y_S_i_n_g_l_e_t_o_n_F_a_c_t_o_r_y_:_:_c_r_e_a_t_e │ │ │ │ │ +static auto create(const Key &key) -> std::enable_if_t< static_cast< │ │ │ │ │ +GeometryType >(geometryId).dim()==dimension, Object * > │ │ │ │ │ +DDeeffiinniittiioonn topologyfactory.hh:95 │ │ │ │ │ +_D_u_n_e_:_:_T_o_p_o_l_o_g_y_S_i_n_g_l_e_t_o_n_F_a_c_t_o_r_y_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ +static const unsigned int dimension │ │ │ │ │ +DDeeffiinniittiioonn topologyfactory.hh:83 │ │ │ │ │ _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ DDeeffiinniittiioonn type.hh:114 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ -constexpr GeometryType(unsigned int topologyId, unsigned int dim) │ │ │ │ │ -Constructor, using the topologyId (integer) and the dimension. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:251 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_o_p_e_r_a_t_o_r_< │ │ │ │ │ -constexpr bool operator<(const GeometryType &other) const │ │ │ │ │ -less-than operation for use with maps │ │ │ │ │ -DDeeffiinniittiioonn type.hh:393 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ -constexpr bool operator!=(const GeometryType &other) const │ │ │ │ │ -Check for inequality. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:388 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_P_y_r_a_m_i_d │ │ │ │ │ -constexpr bool isPyramid() const │ │ │ │ │ -Return true if entity is a pyramid. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:304 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_T_e_t_r_a_h_e_d_r_o_n │ │ │ │ │ -constexpr bool isTetrahedron() const │ │ │ │ │ -Return true if entity is a tetrahedron. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:299 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_P_r_i_s_m │ │ │ │ │ -constexpr bool isPrism() const │ │ │ │ │ -Return true if entity is a prism. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:309 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_V_e_r_t_e_x │ │ │ │ │ -constexpr bool isVertex() const │ │ │ │ │ -Return true if entity is a vertex. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:279 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ -constexpr bool operator==(const GeometryType &other) const │ │ │ │ │ -Check for equality. This method knows that in dimension 0 and 1 all BasicTypes │ │ │ │ │ -are equal. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:377 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_t_o_I_d │ │ │ │ │ -constexpr Id toId() const │ │ │ │ │ -Create an Id representation of this GeometryType. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:210 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_C_o_n_i_c_a_l │ │ │ │ │ -constexpr bool isConical(const int &step) const │ │ │ │ │ -Return true if entity was constructed with a conical product in the chosen │ │ │ │ │ -step. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:337 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_d_i_m │ │ │ │ │ -constexpr unsigned int dim() const │ │ │ │ │ -Return dimension of the type. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:360 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_P_r_i_s_m_a_t_i_c │ │ │ │ │ -constexpr bool isPrismatic(const int &step) const │ │ │ │ │ -Return true if entity was constructed with a prismatic product in the chosen │ │ │ │ │ -step. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:350 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_T_r_i_a_n_g_l_e │ │ │ │ │ -constexpr bool isTriangle() const │ │ │ │ │ -Return true if entity is a triangle. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:289 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ -GeometryType(TopologyType t) │ │ │ │ │ -Constructor from static TopologyType class. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:267 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ -constexpr GeometryType(unsigned int topologyId, unsigned int dim, bool isNone) │ │ │ │ │ -Constructor, using the topologyId (integer), the dimension and a flag for type │ │ │ │ │ -none. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:242 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_B_a_s_i_c_T_y_p_e │ │ │ │ │ -BasicType │ │ │ │ │ -Each entity can be tagged by one of these basic types plus its space dimension. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:120 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_c_u_b_e │ │ │ │ │ -@ cube │ │ │ │ │ -Cube element in any nonnegative dimension. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:122 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_s_i_m_p_l_e_x │ │ │ │ │ -@ simplex │ │ │ │ │ -Simplicial element in any nonnegative dimension. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:121 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_p_y_r_a_m_i_d │ │ │ │ │ -@ pyramid │ │ │ │ │ -Four sided pyramid in three dimensions. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:123 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_e_x_t_e_n_d_e_d │ │ │ │ │ -@ extended │ │ │ │ │ -Other, more general topology, representable as topologyId. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:125 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_n_o_n_e │ │ │ │ │ -@ none │ │ │ │ │ -Even more general topology, cannot be specified by a topologyId. Two │ │ │ │ │ -GeometryTypes with 'none' type a... │ │ │ │ │ -DDeeffiinniittiioonn type.hh:126 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_p_r_i_s_m │ │ │ │ │ -@ prism │ │ │ │ │ -Prism element in three dimensions. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:124 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ -constexpr GeometryType(Id id) │ │ │ │ │ -Reconstruct a Geometry type from a GeometryType::Id. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:222 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_C_u_b_e │ │ │ │ │ -constexpr bool isCube() const │ │ │ │ │ -Return true if entity is a cube of any dimension. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:324 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ -constexpr GeometryType() │ │ │ │ │ -Default constructor, not initializing anything. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:232 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_C_o_n_i_c_a_l │ │ │ │ │ -constexpr bool isConical() const │ │ │ │ │ -Return true if entity was constructed with a conical product in the last step. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:329 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_L_i_n_e │ │ │ │ │ -constexpr bool isLine() const │ │ │ │ │ -Return true if entity is a line segment. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:284 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_Q_u_a_d_r_i_l_a_t_e_r_a_l │ │ │ │ │ -constexpr bool isQuadrilateral() const │ │ │ │ │ -Return true if entity is a quadrilateral. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:294 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_P_r_i_s_m_a_t_i_c │ │ │ │ │ -constexpr bool isPrismatic() const │ │ │ │ │ -Return true if entity was constructed with a prismatic product in the last │ │ │ │ │ -step. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:342 │ │ │ │ │ _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_d │ │ │ │ │ constexpr unsigned int id() const │ │ │ │ │ Return the topology id of the type. │ │ │ │ │ DDeeffiinniittiioonn type.hh:365 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_N_o_n_e │ │ │ │ │ -constexpr bool isNone() const │ │ │ │ │ -Return true if entity is a singular of any dimension. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:355 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_H_e_x_a_h_e_d_r_o_n │ │ │ │ │ -constexpr bool isHexahedron() const │ │ │ │ │ -Return true if entity is a hexahedron. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:314 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_S_i_m_p_l_e_x │ │ │ │ │ -constexpr bool isSimplex() const │ │ │ │ │ -Return true if entity is a simplex of any dimension. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:319 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_I_d │ │ │ │ │ -IdType Id │ │ │ │ │ -An integral id representing a GeometryType. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:181 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00239.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: referenceelementimplementation.hh File Reference │ │ │ │ +dune-geometry: multilineargeometry.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,44 +70,57 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ +Classes | │ │ │ │ Namespaces
│ │ │ │ -
referenceelementimplementation.hh File Reference
│ │ │ │ +
multilineargeometry.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │
#include <cassert>
│ │ │ │ -#include <algorithm>
│ │ │ │ +#include <functional>
│ │ │ │ +#include <iterator>
│ │ │ │ #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>
│ │ │ │ +#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
 
namespace  Dune::Geo
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,33 +1,44 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -_N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -referenceelementimplementation.hh File Reference │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ +multilineargeometry.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ #include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_a_f_f_i_n_e_g_e_o_m_e_t_r_y_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ +CCllaasssseess │ │ │ │ │ +struct   _D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_T_r_a_i_t_s_<_ _c_t_ _> │ │ │ │ │ +  default traits class for _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_T_r_a_i_t_s_<_ _c_t_ _>_:_:_C_o_r_n_e_r_S_t_o_r_a_g_e_<_ _m_y_d_i_m_,_ _c_d_i_m_ _> │ │ │ │ │ +  template specifying the storage for the corners _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ +struct   _D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_T_r_a_i_t_s_<_ _c_t_ _>_:_:_h_a_s_S_i_n_g_l_e_G_e_o_m_e_t_r_y_T_y_p_e_<_ _d_i_m_ _> │ │ │ │ │ +  will there be only one geometry type for a dimension? _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_<_ _c_t_,_ _m_y_d_i_m_,_ _c_d_i_m_,_ _T_r_a_i_t_s_ _> │ │ │ │ │ +  generic geometry implementation based on corner coordinates _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_<_ _c_t_,_ _m_y_d_i_m_,_ _c_d_i_m_,_ _T_r_a_i_t_s_ _>_:_: │ │ │ │ │ + _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ +  │ │ │ │ │ + class   _D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_<_ _c_t_,_ _m_y_d_i_m_,_ _c_d_i_m_,_ _T_r_a_i_t_s_ _> │ │ │ │ │ +  Implement a _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y with additional caching. _M_o_r_e_._._. │ │ │ │ │ +  │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ -namespace   _D_u_n_e_:_:_G_e_o │ │ │ │ │ -  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00239_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: referenceelementimplementation.hh Source File │ │ │ │ +dune-geometry: multilineargeometry.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,724 +74,840 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
referenceelementimplementation.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 © 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
│ │ │ │ +
5#ifndef DUNE_GEOMETRY_MULTILINEARGEOMETRY_HH
│ │ │ │ +
6#define DUNE_GEOMETRY_MULTILINEARGEOMETRY_HH
│ │ │ │
7
│ │ │ │
8#include <cassert>
│ │ │ │ -
9
│ │ │ │ -
10#include <algorithm>
│ │ │ │ +
9#include <functional>
│ │ │ │ +
10#include <iterator>
│ │ │ │
11#include <limits>
│ │ │ │ -
12#include <tuple>
│ │ │ │ -
13#include <utility>
│ │ │ │ -
14#include <vector>
│ │ │ │ -
15#include <array>
│ │ │ │ -
16#include <bitset>
│ │ │ │ +
12#include <vector>
│ │ │ │ +
13
│ │ │ │ +
14#include <dune/common/fmatrix.hh>
│ │ │ │ +
15#include <dune/common/fvector.hh>
│ │ │ │ +
16#include <dune/common/typetraits.hh>
│ │ │ │
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>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
20#include <dune/geometry/type.hh>
│ │ │ │ +
21
│ │ │ │ +
22namespace Dune
│ │ │ │ +
23{
│ │ │ │
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;
│ │ │ │ -
60
│ │ │ │ -
62 unsigned int size ( unsigned int topologyId, int dim, int codim );
│ │ │ │ -
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 );
│ │ │ │ -
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 }
│ │ │ │ -
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 }
│ │ │ │ +
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
│ │ │ │ -
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 }
│ │ │ │ +
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
│ │ │ │ -
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 ) );
│ │ │ │ +
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 if( (0 < codim) && (codim <= dim) )
│ │ │ │ -
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 // !isPrism
│ │ │ │ -
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 if( codim < dim )
│ │ │ │ -
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 if( codim == 0 )
│ │ │ │ -
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
│ │ │ │ -
270 // this point should not be reached since all cases are handled before.
│ │ │ │ -
271 std::abort();
│ │ │ │ -
272 return 0;
│ │ │ │ -
273 }
│ │ │ │ -
274
│ │ │ │ -
275
│ │ │ │ -
276
│ │ │ │ -
277 // referenceIntegrationOuterNormals
│ │ │ │ -
278 // --------------------------------
│ │ │ │ -
279
│ │ │ │ -
280 template< class ct, int cdim >
│ │ │ │ -
281 inline unsigned int
│ │ │ │ -
282 referenceIntegrationOuterNormals ( unsigned int topologyId, int dim,
│ │ │ │ -
283 const FieldVector< ct, cdim > *origins,
│ │ │ │ -
284 FieldVector< ct, cdim > *normals )
│ │ │ │ -
285 {
│ │ │ │ -
286 assert( (dim > 0) && (dim <= cdim) );
│ │ │ │ -
287 assert( topologyId < numTopologies( dim ) );
│ │ │ │ -
288
│ │ │ │ -
289 if( dim > 1 )
│ │ │ │ -
290 {
│ │ │ │ -
291 const unsigned int baseId = baseTopologyId( topologyId, dim );
│ │ │ │ -
292 if( isPrism( topologyId, dim ) )
│ │ │ │ -
293 {
│ │ │ │ -
294 const unsigned int numBaseFaces
│ │ │ │ -
295 = referenceIntegrationOuterNormals( baseId, dim-1, origins, normals );
│ │ │ │ -
296
│ │ │ │ -
297 for( unsigned int i = 0; i < 2; ++i )
│ │ │ │ -
298 {
│ │ │ │ -
299 normals[ numBaseFaces+i ] = FieldVector< ct, cdim >( ct( 0 ) );
│ │ │ │ -
300 normals[ numBaseFaces+i ][ dim-1 ] = ct( 2*int( i )-1 );
│ │ │ │ -
301 }
│ │ │ │ -
302
│ │ │ │ -
303 return numBaseFaces+2;
│ │ │ │ -
304 }
│ │ │ │ -
305 else
│ │ │ │ -
306 {
│ │ │ │ -
307 normals[ 0 ] = FieldVector< ct, cdim >( ct( 0 ) );
│ │ │ │ -
308 normals[ 0 ][ dim-1 ] = ct( -1 );
│ │ │ │ -
309
│ │ │ │ -
310 const unsigned int numBaseFaces
│ │ │ │ -
311 = referenceIntegrationOuterNormals( baseId, dim-1, origins+1, normals+1 );
│ │ │ │ -
312 for( unsigned int i = 1; i <= numBaseFaces; ++i )
│ │ │ │ -
313 normals[ i ][ dim-1 ] = normals[ i ]*origins[ i ];
│ │ │ │ -
314
│ │ │ │ -
315 return numBaseFaces+1;
│ │ │ │ -
316 }
│ │ │ │ -
317 }
│ │ │ │ -
318 else
│ │ │ │ -
319 {
│ │ │ │ -
320 for( unsigned int i = 0; i < 2; ++i )
│ │ │ │ -
321 {
│ │ │ │ -
322 normals[ i ] = FieldVector< ct, cdim >( ct( 0 ) );
│ │ │ │ -
323 normals[ i ][ 0 ] = ct( 2*int( i )-1 );
│ │ │ │ -
324 }
│ │ │ │ -
325
│ │ │ │ -
326 return 2;
│ │ │ │ -
327 }
│ │ │ │ -
328 }
│ │ │ │ +
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 template< class ct, int cdim >
│ │ │ │ -
331 inline unsigned int
│ │ │ │ -
332 referenceIntegrationOuterNormals ( unsigned int topologyId, int dim,
│ │ │ │ -
333 FieldVector< ct, cdim > *normals )
│ │ │ │ -
334 {
│ │ │ │ -
335 assert( (dim > 0) && (dim <= cdim) );
│ │ │ │ -
336
│ │ │ │ -
337 FieldVector< ct, cdim > *origins
│ │ │ │ -
338 = new FieldVector< ct, cdim >[ size( topologyId, dim, 1 ) ];
│ │ │ │ -
339 referenceOrigins( topologyId, dim, 1, origins );
│ │ │ │ -
340
│ │ │ │ -
341 const unsigned int numFaces
│ │ │ │ -
342 = referenceIntegrationOuterNormals( topologyId, dim, origins, normals );
│ │ │ │ -
343 assert( numFaces == size( topologyId, dim, 1 ) );
│ │ │ │ -
344
│ │ │ │ -
345 delete[] origins;
│ │ │ │ -
346
│ │ │ │ -
347 return numFaces;
│ │ │ │ -
348 }
│ │ │ │ -
349
│ │ │ │ -
350 } // namespace Impl
│ │ │ │ -
351
│ │ │ │ -
352
│ │ │ │ -
353
│ │ │ │ -
354 // ReferenceElement
│ │ │ │ -
355 // ----------------
│ │ │ │ -
356
│ │ │ │ -
375 template< class ctype_, int dim >
│ │ │ │ -
376 class ReferenceElementImplementation
│ │ │ │ -
377 {
│ │ │ │ -
378
│ │ │ │ -
379 public:
│ │ │ │ +
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 using ctype = ctype_;
│ │ │ │ -
383
│ │ │ │ -
385 using CoordinateField = ctype;
│ │ │ │ + │ │ │ │ +
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
│ │ │ │ -
388 using Coordinate = Dune::FieldVector<ctype,dim>;
│ │ │ │ -
389
│ │ │ │ -
391 static constexpr int dimension = dim;
│ │ │ │ -
392
│ │ │ │ -
394 typedef ctype Volume;
│ │ │ │ -
395
│ │ │ │ -
396 private:
│ │ │ │ -
397
│ │ │ │ -
398 friend class Impl::ReferenceElementContainer< ctype, dim >;
│ │ │ │ +
│ │ │ │ +
393 JacobianInverseTransposed jacobianInverseTransposed ( const LocalCoordinate &local ) const;
│ │ │ │ +
394
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
396 {
│ │ │ │ +
397 return geometry.refElement();
│ │ │ │ +
398 }
│ │ │ │ +
│ │ │ │
399
│ │ │ │ -
400 struct SubEntityInfo;
│ │ │ │ -
401
│ │ │ │ -
402 template< int codim > struct CreateGeometries;
│ │ │ │ -
403
│ │ │ │ -
404 public:
│ │ │ │ -
406 template< int codim >
│ │ │ │ -
407 struct Codim
│ │ │ │ -
408 {
│ │ │ │ -
410 typedef AffineGeometry< ctype, dim-codim, dim > Geometry;
│ │ │ │ -
411 };
│ │ │ │ -
412
│ │ │ │ -
413 // ReferenceElement cannot be copied.
│ │ │ │ -
414 ReferenceElementImplementation ( const ReferenceElementImplementation& ) = delete;
│ │ │ │ -
415
│ │ │ │ -
416 // ReferenceElementImplementation cannot be copied.
│ │ │ │ -
417 ReferenceElementImplementation& operator= ( const ReferenceElementImplementation& ) = delete;
│ │ │ │ -
418
│ │ │ │ -
419 // ReferenceElementImplementation is default-constructible (required for storage in std::array)
│ │ │ │ -
420 ReferenceElementImplementation () = default;
│ │ │ │ -
421
│ │ │ │ -
426 int size ( int c ) const
│ │ │ │ -
427 {
│ │ │ │ -
428 assert( (c >= 0) && (c <= dim) );
│ │ │ │ -
429 return info_[ c ].size();
│ │ │ │ -
430 }
│ │ │ │ -
431
│ │ │ │ -
443 int size ( int i, int c, int cc ) const
│ │ │ │ -
444 {
│ │ │ │ -
445 assert( (i >= 0) && (i < size( c )) );
│ │ │ │ -
446 return info_[ c ][ i ].size( cc );
│ │ │ │ -
447 }
│ │ │ │ -
448
│ │ │ │ -
462 int subEntity ( int i, int c, int ii, int cc ) const
│ │ │ │ -
463 {
│ │ │ │ -
464 assert( (i >= 0) && (i < size( c )) );
│ │ │ │ -
465 return info_[ c ][ i ].number( ii, cc );
│ │ │ │ -
466 }
│ │ │ │ -
467
│ │ │ │ -
483 auto subEntities ( int i, int c, int cc ) const
│ │ │ │ -
484 {
│ │ │ │ -
485 assert( (i >= 0) && (i < size( c )) );
│ │ │ │ -
486 return info_[ c ][ i ].numbers( cc );
│ │ │ │ -
487 }
│ │ │ │ -
488
│ │ │ │ -
497 const GeometryType &type ( int i, int c ) const
│ │ │ │ -
498 {
│ │ │ │ -
499 assert( (i >= 0) && (i < size( c )) );
│ │ │ │ -
500 return info_[ c ][ i ].type();
│ │ │ │ -
501 }
│ │ │ │ -
502
│ │ │ │ -
504 const GeometryType &type () const { return type( 0, 0 ); }
│ │ │ │ -
505
│ │ │ │ -
515 const Coordinate &position( int i, int c ) const
│ │ │ │ -
516 {
│ │ │ │ -
517 assert( (c >= 0) && (c <= dim) );
│ │ │ │ -
518 return baryCenters_[ c ][ i ];
│ │ │ │ -
519 }
│ │ │ │ -
520
│ │ │ │ -
528 bool checkInside ( const Coordinate &local ) const
│ │ │ │ -
529 {
│ │ │ │ -
530 const ctype tolerance = ctype( 64 ) * std::numeric_limits< ctype >::epsilon();
│ │ │ │ -
531 return Impl::template checkInside< ctype, dim >( type().id(), dim, local, tolerance );
│ │ │ │ -
532 }
│ │ │ │ -
533
│ │ │ │ -
545 template< int codim >
│ │ │ │ -
546 typename Codim< codim >::Geometry geometry ( int i ) const
│ │ │ │ -
547 {
│ │ │ │ -
548 return std::get< codim >( geometries_ )[ i ];
│ │ │ │ -
549 }
│ │ │ │ -
550
│ │ │ │ -
552 Volume volume () const
│ │ │ │ -
553 {
│ │ │ │ -
554 return volume_;
│ │ │ │ -
555 }
│ │ │ │ -
556
│ │ │ │ -
564 const Coordinate &integrationOuterNormal ( int face ) const
│ │ │ │ -
565 {
│ │ │ │ -
566 assert( (face >= 0) && (face < int( integrationNormals_.size() )) );
│ │ │ │ -
567 return integrationNormals_[ face ];
│ │ │ │ -
568 }
│ │ │ │ -
569
│ │ │ │ -
570 private:
│ │ │ │ -
571 void initialize ( unsigned int topologyId )
│ │ │ │ -
572 {
│ │ │ │ -
573 assert( topologyId < Impl::numTopologies( dim ) );
│ │ │ │ -
574
│ │ │ │ -
575 // set up subentities
│ │ │ │ -
576 for( int codim = 0; codim <= dim; ++codim )
│ │ │ │ -
577 {
│ │ │ │ -
578 const unsigned int size = Impl::size( topologyId, dim, codim );
│ │ │ │ -
579 info_[ codim ].resize( size );
│ │ │ │ -
580 for( unsigned int i = 0; i < size; ++i )
│ │ │ │ -
581 info_[ codim ][ i ].initialize( topologyId, codim, i );
│ │ │ │ -
582 }
│ │ │ │ -
583
│ │ │ │ -
584 // compute corners
│ │ │ │ -
585 const unsigned int numVertices = size( dim );
│ │ │ │ -
586 baryCenters_[ dim ].resize( numVertices );
│ │ │ │ -
587 Impl::referenceCorners( topologyId, dim, &(baryCenters_[ dim ][ 0 ]) );
│ │ │ │ -
588
│ │ │ │ -
589 // compute barycenters
│ │ │ │ -
590 for( int codim = 0; codim < dim; ++codim )
│ │ │ │ -
591 {
│ │ │ │ -
592 baryCenters_[ codim ].resize( size(codim) );
│ │ │ │ -
593 for( int i = 0; i < size( codim ); ++i )
│ │ │ │ -
594 {
│ │ │ │ -
595 baryCenters_[ codim ][ i ] = Coordinate( ctype( 0 ) );
│ │ │ │ -
596 const unsigned int numCorners = size( i, codim, dim );
│ │ │ │ -
597 for( unsigned int j = 0; j < numCorners; ++j )
│ │ │ │ -
598 baryCenters_[ codim ][ i ] += baryCenters_[ dim ][ subEntity( i, codim, j, dim ) ];
│ │ │ │ -
599 baryCenters_[ codim ][ i ] *= ctype( 1 ) / ctype( numCorners );
│ │ │ │ -
600 }
│ │ │ │ -
601 }
│ │ │ │ -
602
│ │ │ │ -
603 // compute reference element volume
│ │ │ │ -
604 volume_ = Impl::template referenceVolume< ctype >( topologyId, dim );
│ │ │ │ -
605
│ │ │ │ -
606 // compute integration outer normals
│ │ │ │ -
607 if( dim > 0 )
│ │ │ │ -
608 {
│ │ │ │ -
609 integrationNormals_.resize( size( 1 ) );
│ │ │ │ -
610 Impl::referenceIntegrationOuterNormals( topologyId, dim, &(integrationNormals_[ 0 ]) );
│ │ │ │ -
611 }
│ │ │ │ -
612
│ │ │ │ -
613 // set up geometries
│ │ │ │ -
614 Hybrid::forEach( std::make_index_sequence< dim+1 >{}, [ & ]( auto i ){ CreateGeometries< i >::apply( *this, geometries_ ); } );
│ │ │ │ -
615 }
│ │ │ │ -
616
│ │ │ │ -
617 template< int... codim >
│ │ │ │ -
618 static std::tuple< std::vector< typename Codim< codim >::Geometry >... >
│ │ │ │ -
619 makeGeometryTable ( std::integer_sequence< int, codim... > );
│ │ │ │ -
620
│ │ │ │ -
622 typedef decltype( makeGeometryTable( std::make_integer_sequence< int, dim+1 >() ) ) GeometryTable;
│ │ │ │ -
623
│ │ │ │ -
625 ctype volume_;
│ │ │ │ -
626
│ │ │ │ -
627 std::vector< Coordinate > baryCenters_[ dim+1 ];
│ │ │ │ -
628 std::vector< Coordinate > integrationNormals_;
│ │ │ │ -
629
│ │ │ │ -
631 GeometryTable geometries_;
│ │ │ │ -
632
│ │ │ │ -
633 std::vector< SubEntityInfo > info_[ dim+1 ];
│ │ │ │ -
634 };
│ │ │ │ -
635
│ │ │ │ -
637 template< class ctype, int dim >
│ │ │ │ -
638 struct ReferenceElementImplementation< ctype, dim >::SubEntityInfo
│ │ │ │ -
639 {
│ │ │ │ -
640 // Compute upper bound for the number of subsentities.
│ │ │ │ -
641 // If someone knows an explicit formal feel free to
│ │ │ │ -
642 // implement it here.
│ │ │ │ -
643 static constexpr std::size_t maxSubEntityCount()
│ │ │ │ -
644 {
│ │ │ │ -
645 std::size_t maxCount=0;
│ │ │ │ -
646 for(std::size_t codim=0; codim<=dim; ++codim)
│ │ │ │ -
647 maxCount = std::max(maxCount, binomial(std::size_t(dim),codim)*(1 << codim));
│ │ │ │ -
648 return maxCount;
│ │ │ │ -
649 }
│ │ │ │ -
650
│ │ │ │ -
651 using SubEntityFlags = std::bitset<maxSubEntityCount()>;
│ │ │ │ -
652
│ │ │ │ -
653 class SubEntityRange
│ │ │ │ -
654 : public Dune::IteratorRange<const unsigned int*>
│ │ │ │ -
655 {
│ │ │ │ -
656 using Base = typename Dune::IteratorRange<const unsigned int*>;
│ │ │ │ -
657
│ │ │ │ -
658 public:
│ │ │ │ -
659
│ │ │ │ -
660 using iterator = Base::iterator;
│ │ │ │ -
661 using const_iterator = Base::const_iterator;
│ │ │ │ -
662
│ │ │ │ -
663 SubEntityRange(const iterator& begin, const iterator& end, const SubEntityFlags& contains) :
│ │ │ │ -
664 Base(begin, end),
│ │ │ │ -
665 containsPtr_(&contains),
│ │ │ │ -
666 size_(end-begin)
│ │ │ │ -
667 {}
│ │ │ │ -
668
│ │ │ │ -
669 SubEntityRange() :
│ │ │ │ -
670 Base(),
│ │ │ │ -
671 containsPtr_(nullptr),
│ │ │ │ -
672 size_(0)
│ │ │ │ -
673 {}
│ │ │ │ -
674
│ │ │ │ -
675 std::size_t size() const
│ │ │ │ -
676 {
│ │ │ │ -
677 return size_;
│ │ │ │ -
678 }
│ │ │ │ -
679
│ │ │ │ -
680 bool contains(std::size_t i) const
│ │ │ │ -
681 {
│ │ │ │ -
682 return (*containsPtr_)[i];
│ │ │ │ -
683 }
│ │ │ │ -
684
│ │ │ │ -
685 private:
│ │ │ │ -
686 const SubEntityFlags* containsPtr_;
│ │ │ │ -
687 std::size_t size_;
│ │ │ │ -
688 std::size_t offset_;
│ │ │ │ -
689 };
│ │ │ │ -
690
│ │ │ │ -
691 using NumberRange = typename Dune::IteratorRange<const unsigned int*>;
│ │ │ │ -
692
│ │ │ │ -
693 SubEntityInfo ()
│ │ │ │ -
694 : numbering_( nullptr )
│ │ │ │ -
695 {
│ │ │ │ -
696 std::fill( offset_.begin(), offset_.end(), 0 );
│ │ │ │ -
697 }
│ │ │ │ -
698
│ │ │ │ -
699 SubEntityInfo ( const SubEntityInfo &other )
│ │ │ │ -
700 : offset_( other.offset_ ),
│ │ │ │ -
701 type_( other.type_ ),
│ │ │ │ -
702 containsSubentity_( other.containsSubentity_ )
│ │ │ │ -
703 {
│ │ │ │ -
704 numbering_ = allocate();
│ │ │ │ -
705 std::copy( other.numbering_, other.numbering_ + capacity(), numbering_ );
│ │ │ │ -
706 }
│ │ │ │ -
707
│ │ │ │ -
708 ~SubEntityInfo () { deallocate( numbering_ ); }
│ │ │ │ -
709
│ │ │ │ -
710 const SubEntityInfo &operator= ( const SubEntityInfo &other )
│ │ │ │ -
711 {
│ │ │ │ -
712 type_ = other.type_;
│ │ │ │ -
713 offset_ = other.offset_;
│ │ │ │ -
714
│ │ │ │ -
715 deallocate( numbering_ );
│ │ │ │ -
716 numbering_ = allocate();
│ │ │ │ -
717 std::copy( other.numbering_, other.numbering_ + capacity(), numbering_ );
│ │ │ │ -
718
│ │ │ │ -
719 containsSubentity_ = other.containsSubentity_;
│ │ │ │ +
400
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
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 {
│ │ │ │ + │ │ │ │ +
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
│ │ │ │ + │ │ │ │ +
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
│ │ │ │ + │ │ │ │ +
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
│ │ │ │ + │ │ │ │ +
694 }
│ │ │ │ +
│ │ │ │ +
695
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
703 {
│ │ │ │ +
704 return jacobianTransposed(local).transposed();
│ │ │ │ +
705 }
│ │ │ │ +
│ │ │ │ +
706
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
714 {
│ │ │ │ +
715 return jacobianInverseTransposed(local).transposed();
│ │ │ │ +
716 }
│ │ │ │ +
│ │ │ │ +
717
│ │ │ │ +
718 protected:
│ │ │ │ +
719 using Base::refElement;
│ │ │ │
720
│ │ │ │ -
721 return *this;
│ │ │ │ -
722 }
│ │ │ │ -
723
│ │ │ │ -
724 int size ( int cc ) const
│ │ │ │ -
725 {
│ │ │ │ -
726 assert( (cc >= 0) && (cc <= dim) );
│ │ │ │ -
727 return (offset_[ cc+1 ] - offset_[ cc ]);
│ │ │ │ -
728 }
│ │ │ │ -
729
│ │ │ │ -
730 int number ( int ii, int cc ) const
│ │ │ │ -
731 {
│ │ │ │ -
732 assert( (ii >= 0) && (ii < size( cc )) );
│ │ │ │ -
733 return numbering_[ offset_[ cc ] + ii ];
│ │ │ │ -
734 }
│ │ │ │ +
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 auto numbers ( int cc ) const
│ │ │ │ -
737 {
│ │ │ │ -
738 return SubEntityRange( numbering_ + offset_[ cc ], numbering_ + offset_[ cc+1 ], containsSubentity_[cc]);
│ │ │ │ -
739 }
│ │ │ │ -
740
│ │ │ │ -
741 const GeometryType &type () const { return type_; }
│ │ │ │ -
742
│ │ │ │ -
743 void initialize ( unsigned int topologyId, int codim, unsigned int i )
│ │ │ │ -
744 {
│ │ │ │ -
745 const unsigned int subId = Impl::subTopologyId( topologyId, dim, codim, i );
│ │ │ │ -
746 type_ = GeometryType( subId, dim-codim );
│ │ │ │ -
747
│ │ │ │ -
748 // compute offsets
│ │ │ │ -
749 for( int cc = 0; cc <= codim; ++cc )
│ │ │ │ -
750 offset_[ cc ] = 0;
│ │ │ │ -
751 for( int cc = codim; cc <= dim; ++cc )
│ │ │ │ -
752 offset_[ cc+1 ] = offset_[ cc ] + Impl::size( subId, dim-codim, cc-codim );
│ │ │ │ -
753
│ │ │ │ -
754 // compute subnumbering
│ │ │ │ -
755 deallocate( numbering_ );
│ │ │ │ -
756 numbering_ = allocate();
│ │ │ │ -
757 for( int cc = codim; cc <= dim; ++cc )
│ │ │ │ -
758 Impl::subTopologyNumbering( topologyId, dim, codim, i, cc-codim, numbering_+offset_[ cc ], numbering_+offset_[ cc+1 ] );
│ │ │ │ -
759
│ │ │ │ -
760 // initialize containsSubentity lookup-table
│ │ │ │ -
761 for(std::size_t cc=0; cc<= dim; ++cc)
│ │ │ │ -
762 {
│ │ │ │ -
763 containsSubentity_[cc].reset();
│ │ │ │ -
764 for(std::size_t idx=0; idx<std::size_t(size(cc)); ++idx)
│ │ │ │ -
765 containsSubentity_[cc][number(idx,cc)] = true;
│ │ │ │ -
766 }
│ │ │ │ -
767 }
│ │ │ │ -
768
│ │ │ │ -
769 protected:
│ │ │ │ -
770 int codim () const { return dim - type().dim(); }
│ │ │ │ -
771
│ │ │ │ -
772 unsigned int *allocate () { return (capacity() != 0 ? new unsigned int[ capacity() ] : nullptr); }
│ │ │ │ -
773 void deallocate ( unsigned int *ptr ) { delete[] ptr; }
│ │ │ │ -
774 unsigned int capacity () const { return offset_[ dim+1 ]; }
│ │ │ │ -
775
│ │ │ │ -
776 private:
│ │ │ │ -
777 unsigned int *numbering_;
│ │ │ │ -
778 std::array< unsigned int, dim+2 > offset_;
│ │ │ │ -
779 GeometryType type_;
│ │ │ │ -
780 std::array< SubEntityFlags, dim+1> containsSubentity_;
│ │ │ │ -
781 };
│ │ │ │ -
782
│ │ │ │ -
783
│ │ │ │ -
784 template< class ctype, int dim >
│ │ │ │ -
785 template< int codim >
│ │ │ │ -
786 struct ReferenceElementImplementation< ctype, dim >::CreateGeometries
│ │ │ │ -
787 {
│ │ │ │ -
788 template< int cc >
│ │ │ │ -
789 static typename ReferenceElements< ctype, dim-cc >::ReferenceElement
│ │ │ │ -
790 subRefElement( const ReferenceElementImplementation< ctype, dim > &refElement, int i, std::integral_constant< int, cc > )
│ │ │ │ -
791 {
│ │ │ │ -
792 return ReferenceElements< ctype, dim-cc >::general( refElement.type( i, cc ) );
│ │ │ │ -
793 }
│ │ │ │ -
794
│ │ │ │ - │ │ │ │ -
796 subRefElement(const ReferenceElementImplementation< ctype, dim > &refElement,
│ │ │ │ -
797 [[maybe_unused]] int i, std::integral_constant<int, 0>)
│ │ │ │ -
798 {
│ │ │ │ -
799 return refElement;
│ │ │ │ -
800 }
│ │ │ │ -
801
│ │ │ │ -
802 static void apply ( const ReferenceElementImplementation< ctype, dim > &refElement, GeometryTable &geometries )
│ │ │ │ -
803 {
│ │ │ │ -
804 const int size = refElement.size( codim );
│ │ │ │ -
805 std::vector< FieldVector< ctype, dim > > origins( size );
│ │ │ │ -
806 std::vector< FieldMatrix< ctype, dim - codim, dim > > jacobianTransposeds( size );
│ │ │ │ -
807 Impl::referenceEmbeddings( refElement.type().id(), dim, codim, &(origins[ 0 ]), &(jacobianTransposeds[ 0 ]) );
│ │ │ │ -
808
│ │ │ │ -
809 std::get< codim >( geometries ).reserve( size );
│ │ │ │ -
810 for( int i = 0; i < size; ++i )
│ │ │ │ -
811 {
│ │ │ │ -
812 typename Codim< codim >::Geometry geometry( subRefElement( refElement, i, std::integral_constant< int, codim >() ), origins[ i ], jacobianTransposeds[ i ] );
│ │ │ │ -
813 std::get< codim >( geometries ).push_back( geometry );
│ │ │ │ -
814 }
│ │ │ │ -
815 }
│ │ │ │ -
816 };
│ │ │ │ -
817
│ │ │ │ -
818#endif // DOXYGEN
│ │ │ │ -
819
│ │ │ │ -
820 } // namespace Geo
│ │ │ │ -
821
│ │ │ │ -
822} // namespace Dune
│ │ │ │ -
823
│ │ │ │ -
824#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.
│ │ │ │ - │ │ │ │ +
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
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
A unique label for each type of element that can occur in a grid.
│ │ │ │ + │ │ │ │ +
An implementation of the Geometry interface for affine geometries.
│ │ │ │
Definition affinegeometry.hh:21
│ │ │ │ -
@ size
Definition quadraturerules.hh:194
│ │ │ │ +
Class providing access to the singletons of the reference elements.
Definition referenceelements.hh:128
│ │ │ │
typename Container::ReferenceElement ReferenceElement
The reference element type.
Definition referenceelements.hh:146
│ │ │ │ -
static const ReferenceElement & general(const GeometryType &type)
get general reference elements
Definition referenceelements.hh:156
│ │ │ │ +
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
│ │ │ │ +
LocalCoordinate local(const GlobalCoordinate &globalCoord) const
evaluate the inverse mapping
Definition multilineargeometry.hh:312
│ │ │ │ +
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
│ │ │ │ +
LocalCoordinate local(const GlobalCoordinate &global) const
evaluate the inverse mapping
Definition multilineargeometry.hh:604
│ │ │ │ +
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:114
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,767 +1,1022 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -referenceelementimplementation.hh │ │ │ │ │ +multilineargeometry.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 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 © 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 │ │ │ │ │ +5#ifndef DUNE_GEOMETRY_MULTILINEARGEOMETRY_HH │ │ │ │ │ +6#define DUNE_GEOMETRY_MULTILINEARGEOMETRY_HH │ │ │ │ │ 7 │ │ │ │ │ 8#include │ │ │ │ │ -9 │ │ │ │ │ -10#include │ │ │ │ │ +9#include │ │ │ │ │ +10#include │ │ │ │ │ 11#include │ │ │ │ │ -12#include │ │ │ │ │ -13#include │ │ │ │ │ -14#include │ │ │ │ │ -15#include │ │ │ │ │ -16#include │ │ │ │ │ +12#include │ │ │ │ │ +13 │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ 17 │ │ │ │ │ -18#include │ │ │ │ │ -19#include │ │ │ │ │ -20#include │ │ │ │ │ -21#include │ │ │ │ │ -22#include │ │ │ │ │ -23#include │ │ │ │ │ +18#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_a_f_f_i_n_e_g_e_o_m_e_t_r_y_._h_h> │ │ │ │ │ +19#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h> │ │ │ │ │ +20#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ +21 │ │ │ │ │ +22namespace _D_u_n_e │ │ │ │ │ +23{ │ │ │ │ │ 24 │ │ │ │ │ -25#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_._h_h> │ │ │ │ │ -26#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_a_f_f_i_n_e_g_e_o_m_e_t_r_y_._h_h> │ │ │ │ │ -27#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ -28 │ │ │ │ │ -29namespace _D_u_n_e │ │ │ │ │ -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; │ │ │ │ │ -60 │ │ │ │ │ -62 unsigned int _s_i_z_e ( unsigned int topologyId, int dim, int codim ); │ │ │ │ │ -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 ); │ │ │ │ │ -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 == _s_i_z_e( 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 } │ │ │ │ │ -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 } │ │ │ │ │ +25 // MultiLinearGeometryTraits │ │ │ │ │ +26 // ------------------------- │ │ │ │ │ +27 │ │ │ │ │ +37 template< class ct > │ │ │ │ │ +_3_8 struct _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_T_r_a_i_t_s │ │ │ │ │ +39 { │ │ │ │ │ +_5_8 typedef Impl::FieldMatrixHelper< ct > _M_a_t_r_i_x_H_e_l_p_e_r; │ │ │ │ │ +59 │ │ │ │ │ +_6_1 static ct _t_o_l_e_r_a_n_c_e () { return ct( 16 ) * std::numeric_limits< ct >:: │ │ │ │ │ +epsilon(); } │ │ │ │ │ +62 │ │ │ │ │ +127 template< int mydim, int cdim > │ │ │ │ │ +_1_2_8 struct _C_o_r_n_e_r_S_t_o_r_a_g_e │ │ │ │ │ +129 { │ │ │ │ │ +_1_3_0 typedef std::vector< FieldVector< ct, cdim > > _T_y_p_e; │ │ │ │ │ +131 }; │ │ │ │ │ +132 │ │ │ │ │ +146 template< int dim > │ │ │ │ │ +_1_4_7 struct _h_a_s_S_i_n_g_l_e_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ +148 { │ │ │ │ │ +_1_4_9 static const bool _v = false; │ │ │ │ │ +_1_5_0 static const unsigned int _t_o_p_o_l_o_g_y_I_d = ~0u; │ │ │ │ │ +151 }; │ │ │ │ │ +152 }; │ │ │ │ │ +153 │ │ │ │ │ +154 │ │ │ │ │ +155 │ │ │ │ │ +156 // MultiLinearGeometry │ │ │ │ │ +157 // ------------------- │ │ │ │ │ 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 } │ │ │ │ │ +179 template< class ct, int mydim, int cdim, class Traits = │ │ │ │ │ +MultiLinearGeometryTraits< ct > > │ │ │ │ │ +_1_8_0 class _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y │ │ │ │ │ +181 { │ │ │ │ │ +182 typedef _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_<_ _c_t_,_ _m_y_d_i_m_,_ _c_d_i_m_,_ _T_r_a_i_t_s_ _> This; │ │ │ │ │ +183 │ │ │ │ │ +184 public: │ │ │ │ │ +_1_8_6 typedef ct _c_t_y_p_e; │ │ │ │ │ +187 │ │ │ │ │ +_1_8_9 static const int _m_y_d_i_m_e_n_s_i_o_n= mydim; │ │ │ │ │ +_1_9_1 static const int _c_o_o_r_d_d_i_m_e_n_s_i_o_n = cdim; │ │ │ │ │ +192 │ │ │ │ │ +_1_9_4 typedef FieldVector< ctype, mydimension > _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ +_1_9_6 typedef FieldVector< ctype, coorddimension > _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ +_1_9_8 typedef _c_t_y_p_e _V_o_l_u_m_e; │ │ │ │ │ +199 │ │ │ │ │ +_2_0_1 typedef FieldMatrix< ctype, mydimension, coorddimension > │ │ │ │ │ +_J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d; │ │ │ │ │ +202 │ │ │ │ │ +204 class _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d; │ │ │ │ │ 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 ) ); │ │ │ │ │ +_2_0_7 typedef FieldMatrix< ctype, coorddimension, mydimension > _J_a_c_o_b_i_a_n; │ │ │ │ │ +208 │ │ │ │ │ +_2_1_0 typedef FieldMatrix< ctype, mydimension, coorddimension > _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e; │ │ │ │ │ +211 │ │ │ │ │ +212 protected: │ │ │ │ │ +213 │ │ │ │ │ +_2_1_4 typedef _D_u_n_e_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_<_ _c_t_y_p_e_,_ _m_y_d_i_m_e_n_s_i_o_n_ _> _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s; │ │ │ │ │ +215 │ │ │ │ │ +216 public: │ │ │ │ │ +217 │ │ │ │ │ +_2_1_9 typedef typename _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t; │ │ │ │ │ 220 │ │ │ │ │ -221 if( (0 < codim) && (codim <= dim) ) │ │ │ │ │ -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 // !isPrism │ │ │ │ │ -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 if( codim < dim ) │ │ │ │ │ -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 if( codim == 0 ) │ │ │ │ │ -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 │ │ │ │ │ -270 // this point should not be reached since all cases are handled before. │ │ │ │ │ -271 std::abort(); │ │ │ │ │ -272 return 0; │ │ │ │ │ -273 } │ │ │ │ │ -274 │ │ │ │ │ -275 │ │ │ │ │ -276 │ │ │ │ │ -277 // referenceIntegrationOuterNormals │ │ │ │ │ -278 // -------------------------------- │ │ │ │ │ -279 │ │ │ │ │ -280 template< class ct, int cdim > │ │ │ │ │ -281 inline unsigned int │ │ │ │ │ -282 referenceIntegrationOuterNormals ( unsigned int topologyId, int dim, │ │ │ │ │ -283 const FieldVector< ct, cdim > *origins, │ │ │ │ │ -284 FieldVector< ct, cdim > *normals ) │ │ │ │ │ -285 { │ │ │ │ │ -286 assert( (dim > 0) && (dim <= cdim) ); │ │ │ │ │ -287 assert( topologyId < numTopologies( dim ) ); │ │ │ │ │ -288 │ │ │ │ │ -289 if( dim > 1 ) │ │ │ │ │ -290 { │ │ │ │ │ -291 const unsigned int baseId = baseTopologyId( topologyId, dim ); │ │ │ │ │ -292 if( isPrism( topologyId, dim ) ) │ │ │ │ │ -293 { │ │ │ │ │ -294 const unsigned int numBaseFaces │ │ │ │ │ -295 = referenceIntegrationOuterNormals( baseId, dim-1, origins, normals ); │ │ │ │ │ -296 │ │ │ │ │ -297 for( unsigned int i = 0; i < 2; ++i ) │ │ │ │ │ -298 { │ │ │ │ │ -299 normals[ numBaseFaces+i ] = FieldVector< ct, cdim >( ct( 0 ) ); │ │ │ │ │ -300 normals[ numBaseFaces+i ][ dim-1 ] = ct( 2*int( i )-1 ); │ │ │ │ │ -301 } │ │ │ │ │ -302 │ │ │ │ │ -303 return numBaseFaces+2; │ │ │ │ │ -304 } │ │ │ │ │ -305 else │ │ │ │ │ -306 { │ │ │ │ │ -307 normals[ 0 ] = FieldVector< ct, cdim >( ct( 0 ) ); │ │ │ │ │ -308 normals[ 0 ][ dim-1 ] = ct( -1 ); │ │ │ │ │ -309 │ │ │ │ │ -310 const unsigned int numBaseFaces │ │ │ │ │ -311 = referenceIntegrationOuterNormals( baseId, dim-1, origins+1, normals+1 ); │ │ │ │ │ -312 for( unsigned int i = 1; i <= numBaseFaces; ++i ) │ │ │ │ │ -313 normals[ i ][ dim-1 ] = normals[ i ]*origins[ i ]; │ │ │ │ │ -314 │ │ │ │ │ -315 return numBaseFaces+1; │ │ │ │ │ -316 } │ │ │ │ │ -317 } │ │ │ │ │ -318 else │ │ │ │ │ +221 private: │ │ │ │ │ +222 static const bool hasSingleGeometryType = Traits::template │ │ │ │ │ +hasSingleGeometryType< mydimension >::v; │ │ │ │ │ +223 │ │ │ │ │ +224 protected: │ │ │ │ │ +_2_2_5 typedef typename Traits::MatrixHelper _M_a_t_r_i_x_H_e_l_p_e_r; │ │ │ │ │ +_2_2_6 typedef typename std::conditional< hasSingleGeometryType, std:: │ │ │ │ │ +integral_constant< unsigned int, Traits::template hasSingleGeometryType< │ │ │ │ │ +mydimension >::topologyId >, unsigned int >_:_:_t_y_p_e _T_o_p_o_l_o_g_y_I_d; │ │ │ │ │ +227 │ │ │ │ │ +228 public: │ │ │ │ │ +238 template< class Corners > │ │ │ │ │ +_2_3_9 _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y ( const _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t &_r_e_f_E_l_e_m_e_n_t, │ │ │ │ │ +240 const Corners &_c_o_r_n_e_r_s ) │ │ │ │ │ +241 : refElement_( _r_e_f_E_l_e_m_e_n_t ), │ │ │ │ │ +242 corners_( _c_o_r_n_e_r_s ) │ │ │ │ │ +243 {} │ │ │ │ │ +244 │ │ │ │ │ +254 template< class Corners > │ │ │ │ │ +_2_5_5 _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y ( _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e gt, │ │ │ │ │ +256 const Corners &_c_o_r_n_e_r_s ) │ │ │ │ │ +257 : refElement_( _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s::general( gt ) ), │ │ │ │ │ +258 corners_( _c_o_r_n_e_r_s ) │ │ │ │ │ +259 {} │ │ │ │ │ +260 │ │ │ │ │ +_2_6_2 bool _a_f_f_i_n_e () const │ │ │ │ │ +263 { │ │ │ │ │ +264 _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d jt; │ │ │ │ │ +265 return _a_f_f_i_n_e( jt ); │ │ │ │ │ +266 } │ │ │ │ │ +267 │ │ │ │ │ +_2_6_9 _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e _t_y_p_e () const { return _G_e_o_m_e_t_r_y_T_y_p_e( toUnsignedInt │ │ │ │ │ +(_t_o_p_o_l_o_g_y_I_d()), _m_y_d_i_m_e_n_s_i_o_n ); } │ │ │ │ │ +270 │ │ │ │ │ +_2_7_2 int _c_o_r_n_e_r_s () const { return _r_e_f_E_l_e_m_e_n_t().size( _m_y_d_i_m_e_n_s_i_o_n ); } │ │ │ │ │ +273 │ │ │ │ │ +_2_7_5 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _c_o_r_n_e_r ( int i ) const │ │ │ │ │ +276 { │ │ │ │ │ +277 assert( (i >= 0) && (i < _c_o_r_n_e_r_s()) ); │ │ │ │ │ +278 return std::cref(corners_).get()[ i ]; │ │ │ │ │ +279 } │ │ │ │ │ +280 │ │ │ │ │ +_2_8_2 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _c_e_n_t_e_r () const { return _g_l_o_b_a_l( _r_e_f_E_l_e_m_e_n_t().position( 0, │ │ │ │ │ +0 ) ); } │ │ │ │ │ +283 │ │ │ │ │ +_2_9_0 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _g_l_o_b_a_l ( const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l ) const │ │ │ │ │ +291 { │ │ │ │ │ +292 using std::begin; │ │ │ │ │ +293 │ │ │ │ │ +294 auto cit = begin(std::cref(corners_).get()); │ │ │ │ │ +295 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e y; │ │ │ │ │ +296 global< false >( _t_o_p_o_l_o_g_y_I_d(), std::integral_constant< int, mydimension > │ │ │ │ │ +(), cit, _c_t_y_p_e( 1 ), _l_o_c_a_l, _c_t_y_p_e( 1 ), y ); │ │ │ │ │ +297 return y; │ │ │ │ │ +298 } │ │ │ │ │ +299 │ │ │ │ │ +_3_1_2 _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e _l_o_c_a_l ( const _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e &globalCoord ) const │ │ │ │ │ +313 { │ │ │ │ │ +314 const _c_t_y_p_e tolerance = Traits::tolerance(); │ │ │ │ │ +315 _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e x = _r_e_f_E_l_e_m_e_n_t().position( 0, 0 ); │ │ │ │ │ +316 _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e dx; │ │ │ │ │ +317 const bool affineMapping = this->_a_f_f_i_n_e(); │ │ │ │ │ +318 do │ │ │ │ │ 319 { │ │ │ │ │ -320 for( unsigned int i = 0; i < 2; ++i ) │ │ │ │ │ -321 { │ │ │ │ │ -322 normals[ i ] = FieldVector< ct, cdim >( ct( 0 ) ); │ │ │ │ │ -323 normals[ i ][ 0 ] = ct( 2*int( i )-1 ); │ │ │ │ │ -324 } │ │ │ │ │ -325 │ │ │ │ │ -326 return 2; │ │ │ │ │ -327 } │ │ │ │ │ -328 } │ │ │ │ │ +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 > │ │ │ │ │ +( _j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d( x ), dglobal, dx ); │ │ │ │ │ +324 if( ! invertible ) │ │ │ │ │ +325 return _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e( std::numeric_limits< ctype > :: max() ); │ │ │ │ │ +326 │ │ │ │ │ +327 // update x with correction │ │ │ │ │ +328 x -= dx; │ │ │ │ │ 329 │ │ │ │ │ -330 template< class ct, int cdim > │ │ │ │ │ -331 inline unsigned int │ │ │ │ │ -332 referenceIntegrationOuterNormals ( unsigned int topologyId, int dim, │ │ │ │ │ -333 FieldVector< ct, cdim > *normals ) │ │ │ │ │ -334 { │ │ │ │ │ -335 assert( (dim > 0) && (dim <= cdim) ); │ │ │ │ │ -336 │ │ │ │ │ -337 FieldVector< ct, cdim > *origins │ │ │ │ │ -338 = new FieldVector< ct, cdim >[ _s_i_z_e( topologyId, dim, 1 ) ]; │ │ │ │ │ -339 referenceOrigins( topologyId, dim, 1, origins ); │ │ │ │ │ -340 │ │ │ │ │ -341 const unsigned int numFaces │ │ │ │ │ -342 = referenceIntegrationOuterNormals( topologyId, dim, origins, normals ); │ │ │ │ │ -343 assert( numFaces == _s_i_z_e( topologyId, dim, 1 ) ); │ │ │ │ │ -344 │ │ │ │ │ -345 delete[] origins; │ │ │ │ │ -346 │ │ │ │ │ -347 return numFaces; │ │ │ │ │ -348 } │ │ │ │ │ -349 │ │ │ │ │ -350 } // namespace Impl │ │ │ │ │ -351 │ │ │ │ │ -352 │ │ │ │ │ -353 │ │ │ │ │ -354 // ReferenceElement │ │ │ │ │ -355 // ---------------- │ │ │ │ │ -356 │ │ │ │ │ -375 template< class ctype_, int dim > │ │ │ │ │ -376 class ReferenceElementImplementation │ │ │ │ │ -377 { │ │ │ │ │ -378 │ │ │ │ │ -379 public: │ │ │ │ │ +330 // for affine mappings only one iteration is needed │ │ │ │ │ +331 if ( affineMapping ) break; │ │ │ │ │ +332 } while( dx.two_norm2() > tolerance ); │ │ │ │ │ +333 return x; │ │ │ │ │ +334 } │ │ │ │ │ +335 │ │ │ │ │ +_3_5_0 _V_o_l_u_m_e _i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t ( const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l ) const │ │ │ │ │ +351 { │ │ │ │ │ +352 return MatrixHelper::template sqrtDetAAT< mydimension, coorddimension > │ │ │ │ │ +( _j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d( _l_o_c_a_l ) ); │ │ │ │ │ +353 } │ │ │ │ │ +354 │ │ │ │ │ +_3_6_3 _V_o_l_u_m_e _v_o_l_u_m_e () const │ │ │ │ │ +364 { │ │ │ │ │ +365 return _i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t( _r_e_f_E_l_e_m_e_n_t().position( 0, 0 ) ) * _r_e_f_E_l_e_m_e_n_t │ │ │ │ │ +().volume(); │ │ │ │ │ +366 } │ │ │ │ │ +367 │ │ │ │ │ +_3_7_7 _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d _j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d ( const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l ) │ │ │ │ │ +const │ │ │ │ │ +378 { │ │ │ │ │ +379 using std::begin; │ │ │ │ │ 380 │ │ │ │ │ -382 using ctype = ctype_; │ │ │ │ │ -383 │ │ │ │ │ -385 using CoordinateField = ctype; │ │ │ │ │ +381 _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d jt; │ │ │ │ │ +382 auto cit = begin(std::cref(corners_).get()); │ │ │ │ │ +383 jacobianTransposed< false >( _t_o_p_o_l_o_g_y_I_d(), std::integral_constant< int, │ │ │ │ │ +mydimension >(), cit, _c_t_y_p_e( 1 ), _l_o_c_a_l, _c_t_y_p_e( 1 ), jt ); │ │ │ │ │ +384 return jt; │ │ │ │ │ +385 } │ │ │ │ │ 386 │ │ │ │ │ -388 using Coordinate = Dune::FieldVector; │ │ │ │ │ -389 │ │ │ │ │ -391 static constexpr int dimension = dim; │ │ │ │ │ -392 │ │ │ │ │ -394 typedef ctype Volume; │ │ │ │ │ -395 │ │ │ │ │ -396 private: │ │ │ │ │ -397 │ │ │ │ │ -398 friend class Impl::ReferenceElementContainer< ctype, dim >; │ │ │ │ │ +_3_9_3 JacobianInverseTransposed _j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d ( const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ +&_l_o_c_a_l ) const; │ │ │ │ │ +394 │ │ │ │ │ +_3_9_5 friend _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t _r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t ( const _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y │ │ │ │ │ +&geometry ) │ │ │ │ │ +396 { │ │ │ │ │ +397 return geometry._r_e_f_E_l_e_m_e_n_t(); │ │ │ │ │ +398 } │ │ │ │ │ 399 │ │ │ │ │ -400 struct SubEntityInfo; │ │ │ │ │ -401 │ │ │ │ │ -402 template< int codim > struct CreateGeometries; │ │ │ │ │ -403 │ │ │ │ │ -404 public: │ │ │ │ │ -406 template< int codim > │ │ │ │ │ -407 struct Codim │ │ │ │ │ +400 │ │ │ │ │ +_4_0_7 _J_a_c_o_b_i_a_n _j_a_c_o_b_i_a_n (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l) const │ │ │ │ │ 408 { │ │ │ │ │ -410 typedef AffineGeometry< ctype, dim-codim, dim > Geometry; │ │ │ │ │ -411 }; │ │ │ │ │ -412 │ │ │ │ │ -413 // ReferenceElement cannot be copied. │ │ │ │ │ -414 ReferenceElementImplementation ( const ReferenceElementImplementation& ) = │ │ │ │ │ -delete; │ │ │ │ │ -415 │ │ │ │ │ -416 // ReferenceElementImplementation cannot be copied. │ │ │ │ │ -417 ReferenceElementImplementation& operator= ( const │ │ │ │ │ -ReferenceElementImplementation& ) = delete; │ │ │ │ │ -418 │ │ │ │ │ -419 // ReferenceElementImplementation is default-constructible (required for │ │ │ │ │ -storage in std::array) │ │ │ │ │ -420 ReferenceElementImplementation () = default; │ │ │ │ │ -421 │ │ │ │ │ -426 int _s_i_z_e ( int c ) const │ │ │ │ │ -427 { │ │ │ │ │ -428 assert( (c >= 0) && (c <= dim) ); │ │ │ │ │ -429 return info_[ c ].size(); │ │ │ │ │ -430 } │ │ │ │ │ -431 │ │ │ │ │ -443 int _s_i_z_e ( int i, int c, int cc ) const │ │ │ │ │ -444 { │ │ │ │ │ -445 assert( (i >= 0) && (i < _s_i_z_e( c )) ); │ │ │ │ │ -446 return info_[ c ][ i ].size( cc ); │ │ │ │ │ -447 } │ │ │ │ │ -448 │ │ │ │ │ -462 int subEntity ( int i, int c, int ii, int cc ) const │ │ │ │ │ -463 { │ │ │ │ │ -464 assert( (i >= 0) && (i < _s_i_z_e( c )) ); │ │ │ │ │ -465 return info_[ c ][ i ].number( ii, cc ); │ │ │ │ │ -466 } │ │ │ │ │ -467 │ │ │ │ │ -483 auto subEntities ( int i, int c, int cc ) const │ │ │ │ │ -484 { │ │ │ │ │ -485 assert( (i >= 0) && (i < _s_i_z_e( c )) ); │ │ │ │ │ -486 return info_[ c ][ i ].numbers( cc ); │ │ │ │ │ -487 } │ │ │ │ │ -488 │ │ │ │ │ -497 const GeometryType &type ( int i, int c ) const │ │ │ │ │ +409 return _j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d(_l_o_c_a_l).transposed(); │ │ │ │ │ +410 } │ │ │ │ │ +411 │ │ │ │ │ +_4_1_8 _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e _j_a_c_o_b_i_a_n_I_n_v_e_r_s_e (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l) const │ │ │ │ │ +419 { │ │ │ │ │ +420 return _j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d(_l_o_c_a_l).transposed(); │ │ │ │ │ +421 } │ │ │ │ │ +422 │ │ │ │ │ +423 protected: │ │ │ │ │ +424 │ │ │ │ │ +_4_2_5 _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t _r_e_f_E_l_e_m_e_n_t () const │ │ │ │ │ +426 { │ │ │ │ │ +427 return refElement_; │ │ │ │ │ +428 } │ │ │ │ │ +429 │ │ │ │ │ +_4_3_0 _T_o_p_o_l_o_g_y_I_d _t_o_p_o_l_o_g_y_I_d () const │ │ │ │ │ +431 { │ │ │ │ │ +432 return _t_o_p_o_l_o_g_y_I_d( std::integral_constant< bool, hasSingleGeometryType >() │ │ │ │ │ +); │ │ │ │ │ +433 } │ │ │ │ │ +434 │ │ │ │ │ +435 template< bool add, int dim, class CornerIterator > │ │ │ │ │ +_4_3_6 static void _g_l_o_b_a_l ( _T_o_p_o_l_o_g_y_I_d _t_o_p_o_l_o_g_y_I_d, std::integral_constant< int, │ │ │ │ │ +dim >, │ │ │ │ │ +437 CornerIterator &cit, const _c_t_y_p_e &df, const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &x, │ │ │ │ │ +438 const _c_t_y_p_e &rf, _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e &y ); │ │ │ │ │ +439 template< bool add, class CornerIterator > │ │ │ │ │ +_4_4_0 static void _g_l_o_b_a_l ( _T_o_p_o_l_o_g_y_I_d _t_o_p_o_l_o_g_y_I_d, std::integral_constant< int, 0 │ │ │ │ │ +>, │ │ │ │ │ +441 CornerIterator &cit, const _c_t_y_p_e &df, const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &x, │ │ │ │ │ +442 const _c_t_y_p_e &rf, _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e &y ); │ │ │ │ │ +443 │ │ │ │ │ +444 template< bool add, int rows, int dim, class CornerIterator > │ │ │ │ │ +_4_4_5 static void _j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d ( _T_o_p_o_l_o_g_y_I_d _t_o_p_o_l_o_g_y_I_d, std:: │ │ │ │ │ +integral_constant< int, dim >, │ │ │ │ │ +446 CornerIterator &cit, const _c_t_y_p_e &df, const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &x, │ │ │ │ │ +447 const _c_t_y_p_e &rf, FieldMatrix< ctype, rows, cdim > &jt ); │ │ │ │ │ +448 template< bool add, int rows, class CornerIterator > │ │ │ │ │ +_4_4_9 static void _j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d ( _T_o_p_o_l_o_g_y_I_d _t_o_p_o_l_o_g_y_I_d, std:: │ │ │ │ │ +integral_constant< int, 0 >, │ │ │ │ │ +450 CornerIterator &cit, const _c_t_y_p_e &df, const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &x, │ │ │ │ │ +451 const _c_t_y_p_e &rf, FieldMatrix< ctype, rows, cdim > &jt ); │ │ │ │ │ +452 │ │ │ │ │ +453 template< int dim, class CornerIterator > │ │ │ │ │ +_4_5_4 static bool _a_f_f_i_n_e ( _T_o_p_o_l_o_g_y_I_d _t_o_p_o_l_o_g_y_I_d, std::integral_constant< int, │ │ │ │ │ +dim >, CornerIterator &cit, _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d &jt ); │ │ │ │ │ +455 template< class CornerIterator > │ │ │ │ │ +_4_5_6 static bool _a_f_f_i_n_e ( _T_o_p_o_l_o_g_y_I_d _t_o_p_o_l_o_g_y_I_d, std::integral_constant< int, 0 │ │ │ │ │ +>, CornerIterator &cit, _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d &jt ); │ │ │ │ │ +457 │ │ │ │ │ +_4_5_8 bool _a_f_f_i_n_e ( _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d &jacobianT ) const │ │ │ │ │ +459 { │ │ │ │ │ +460 using std::begin; │ │ │ │ │ +461 │ │ │ │ │ +462 auto cit = begin(std::cref(corners_).get()); │ │ │ │ │ +463 return _a_f_f_i_n_e( _t_o_p_o_l_o_g_y_I_d(), 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 _T_o_p_o_l_o_g_y_I_d _t_o_p_o_l_o_g_y_I_d ( std::integral_constant< bool, true > ) const │ │ │ │ │ +{ return _T_o_p_o_l_o_g_y_I_d(); } │ │ │ │ │ +474 unsigned int _t_o_p_o_l_o_g_y_I_d ( std::integral_constant< bool, false > ) const │ │ │ │ │ +{ return _r_e_f_E_l_e_m_e_n_t().type().id(); } │ │ │ │ │ +475 │ │ │ │ │ +476 _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t 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 > │ │ │ │ │ +_4_8_6 class _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y< ct, mydim, cdim, Traits >:: │ │ │ │ │ +_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ +487 : public FieldMatrix< ctype, coorddimension, mydimension > │ │ │ │ │ +488 { │ │ │ │ │ +489 typedef FieldMatrix< ctype, coorddimension, mydimension > Base; │ │ │ │ │ +490 │ │ │ │ │ +491 public: │ │ │ │ │ +_4_9_2 void _s_e_t_u_p ( const _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d &jt ) │ │ │ │ │ +493 { │ │ │ │ │ +494 detInv_ = MatrixHelper::template rightInvA< mydimension, coorddimension > │ │ │ │ │ +( jt, static_cast< Base & >( *this ) ); │ │ │ │ │ +495 } │ │ │ │ │ +496 │ │ │ │ │ +_4_9_7 void _s_e_t_u_p_D_e_t_e_r_m_i_n_a_n_t ( const _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d &jt ) │ │ │ │ │ 498 { │ │ │ │ │ -499 assert( (i >= 0) && (i < _s_i_z_e( c )) ); │ │ │ │ │ -500 return info_[ c ][ i ].type(); │ │ │ │ │ -501 } │ │ │ │ │ -502 │ │ │ │ │ -504 const GeometryType &type () const { return type( 0, 0 ); } │ │ │ │ │ -505 │ │ │ │ │ -515 const Coordinate &position( int i, int c ) const │ │ │ │ │ -516 { │ │ │ │ │ -517 assert( (c >= 0) && (c <= dim) ); │ │ │ │ │ -518 return baryCenters_[ c ][ i ]; │ │ │ │ │ -519 } │ │ │ │ │ -520 │ │ │ │ │ -528 bool checkInside ( const Coordinate &local ) const │ │ │ │ │ -529 { │ │ │ │ │ -530 const ctype tolerance = ctype( 64 ) * std::numeric_limits< ctype >::epsilon │ │ │ │ │ -(); │ │ │ │ │ -531 return Impl::template checkInside< ctype, dim >( type().id(), dim, local, │ │ │ │ │ -tolerance ); │ │ │ │ │ -532 } │ │ │ │ │ -533 │ │ │ │ │ -545 template< int codim > │ │ │ │ │ -546 typename Codim< codim >::Geometry geometry ( int i ) const │ │ │ │ │ -547 { │ │ │ │ │ -548 return std::get< codim >( geometries_ )[ i ]; │ │ │ │ │ -549 } │ │ │ │ │ -550 │ │ │ │ │ -552 Volume volume () const │ │ │ │ │ -553 { │ │ │ │ │ -554 return volume_; │ │ │ │ │ -555 } │ │ │ │ │ -556 │ │ │ │ │ -564 const Coordinate &integrationOuterNormal ( int face ) const │ │ │ │ │ -565 { │ │ │ │ │ -566 assert( (face >= 0) && (face < int( integrationNormals_.size() )) ); │ │ │ │ │ -567 return integrationNormals_[ face ]; │ │ │ │ │ -568 } │ │ │ │ │ -569 │ │ │ │ │ -570 private: │ │ │ │ │ -571 void initialize ( unsigned int topologyId ) │ │ │ │ │ -572 { │ │ │ │ │ -573 assert( topologyId < Impl::numTopologies( dim ) ); │ │ │ │ │ -574 │ │ │ │ │ -575 // set up subentities │ │ │ │ │ -576 for( int codim = 0; codim <= dim; ++codim ) │ │ │ │ │ -577 { │ │ │ │ │ -578 const unsigned int _s_i_z_e = Impl::size( topologyId, dim, codim ); │ │ │ │ │ -579 info_[ codim ].resize( size ); │ │ │ │ │ -580 for( unsigned int i = 0; i < _s_i_z_e; ++i ) │ │ │ │ │ -581 info_[ codim ][ i ].initialize( topologyId, codim, i ); │ │ │ │ │ -582 } │ │ │ │ │ -583 │ │ │ │ │ -584 // compute corners │ │ │ │ │ -585 const unsigned int numVertices = _s_i_z_e( dim ); │ │ │ │ │ -586 baryCenters_[ dim ].resize( numVertices ); │ │ │ │ │ -587 Impl::referenceCorners( topologyId, dim, &(baryCenters_[ dim ][ 0 ]) ); │ │ │ │ │ -588 │ │ │ │ │ -589 // compute barycenters │ │ │ │ │ -590 for( int codim = 0; codim < dim; ++codim ) │ │ │ │ │ -591 { │ │ │ │ │ -592 baryCenters_[ codim ].resize( _s_i_z_e(codim) ); │ │ │ │ │ -593 for( int i = 0; i < _s_i_z_e( codim ); ++i ) │ │ │ │ │ -594 { │ │ │ │ │ -595 baryCenters_[ codim ][ i ] = Coordinate( ctype( 0 ) ); │ │ │ │ │ -596 const unsigned int numCorners = _s_i_z_e( i, codim, dim ); │ │ │ │ │ -597 for( unsigned int j = 0; j < numCorners; ++j ) │ │ │ │ │ -598 baryCenters_[ codim ][ i ] += baryCenters_[ dim ][ subEntity( i, codim, j, │ │ │ │ │ -dim ) ]; │ │ │ │ │ -599 baryCenters_[ codim ][ i ] *= ctype( 1 ) / ctype( numCorners ); │ │ │ │ │ -600 } │ │ │ │ │ -601 } │ │ │ │ │ -602 │ │ │ │ │ -603 // compute reference element volume │ │ │ │ │ -604 volume_ = Impl::template referenceVolume< ctype >( topologyId, dim ); │ │ │ │ │ -605 │ │ │ │ │ -606 // compute integration outer normals │ │ │ │ │ -607 if( dim > 0 ) │ │ │ │ │ -608 { │ │ │ │ │ -609 integrationNormals_.resize( _s_i_z_e( 1 ) ); │ │ │ │ │ -610 Impl::referenceIntegrationOuterNormals( topologyId, dim, & │ │ │ │ │ -(integrationNormals_[ 0 ]) ); │ │ │ │ │ -611 } │ │ │ │ │ -612 │ │ │ │ │ -613 // set up geometries │ │ │ │ │ -614 Hybrid::forEach( std::make_index_sequence< dim+1 >{}, [ & ]( auto i ) │ │ │ │ │ -{ CreateGeometries< i >::apply( *this, geometries_ ); } ); │ │ │ │ │ -615 } │ │ │ │ │ -616 │ │ │ │ │ -617 template< int... codim > │ │ │ │ │ -618 static std::tuple< std::vector< typename Codim< codim >::Geometry >... > │ │ │ │ │ -619 makeGeometryTable ( std::integer_sequence< int, codim... > ); │ │ │ │ │ -620 │ │ │ │ │ -622 typedef decltype( makeGeometryTable( std::make_integer_sequence< int, dim+1 │ │ │ │ │ ->() ) ) GeometryTable; │ │ │ │ │ -623 │ │ │ │ │ -625 ctype volume_; │ │ │ │ │ -626 │ │ │ │ │ -627 std::vector< Coordinate > baryCenters_[ dim+1 ]; │ │ │ │ │ -628 std::vector< Coordinate > integrationNormals_; │ │ │ │ │ -629 │ │ │ │ │ -631 GeometryTable geometries_; │ │ │ │ │ -632 │ │ │ │ │ -633 std::vector< SubEntityInfo > info_[ dim+1 ]; │ │ │ │ │ -634 }; │ │ │ │ │ -635 │ │ │ │ │ -637 template< class ctype, int dim > │ │ │ │ │ -638 struct ReferenceElementImplementation< ctype, dim >::SubEntityInfo │ │ │ │ │ -639 { │ │ │ │ │ -640 // Compute upper bound for the number of subsentities. │ │ │ │ │ -641 // If someone knows an explicit formal feel free to │ │ │ │ │ -642 // implement it here. │ │ │ │ │ -643 static constexpr std::size_t maxSubEntityCount() │ │ │ │ │ -644 { │ │ │ │ │ -645 std::size_t maxCount=0; │ │ │ │ │ -646 for(std::size_t codim=0; codim<=dim; ++codim) │ │ │ │ │ -647 maxCount = std::max(maxCount, binomial(std::size_t(dim),codim)*(1 << │ │ │ │ │ -codim)); │ │ │ │ │ -648 return maxCount; │ │ │ │ │ -649 } │ │ │ │ │ -650 │ │ │ │ │ -651 using SubEntityFlags = std::bitset; │ │ │ │ │ -652 │ │ │ │ │ -653 class SubEntityRange │ │ │ │ │ -654 : public Dune::IteratorRange │ │ │ │ │ -655 { │ │ │ │ │ -656 using Base = typename Dune::IteratorRange; │ │ │ │ │ -657 │ │ │ │ │ -658 public: │ │ │ │ │ -659 │ │ │ │ │ -660 using iterator = Base::iterator; │ │ │ │ │ -661 using const_iterator = Base::const_iterator; │ │ │ │ │ -662 │ │ │ │ │ -663 SubEntityRange(const iterator& begin, const iterator& end, const │ │ │ │ │ -SubEntityFlags& contains) : │ │ │ │ │ -664 Base(begin, end), │ │ │ │ │ -665 containsPtr_(&contains), │ │ │ │ │ -666 size_(end-begin) │ │ │ │ │ -667 {} │ │ │ │ │ -668 │ │ │ │ │ -669 SubEntityRange() : │ │ │ │ │ -670 Base(), │ │ │ │ │ -671 containsPtr_(nullptr), │ │ │ │ │ -672 size_(0) │ │ │ │ │ -673 {} │ │ │ │ │ -674 │ │ │ │ │ -675 std::size_t _s_i_z_e() const │ │ │ │ │ -676 { │ │ │ │ │ -677 return size_; │ │ │ │ │ -678 } │ │ │ │ │ -679 │ │ │ │ │ -680 bool contains(std::size_t i) const │ │ │ │ │ +499 detInv_ = MatrixHelper::template sqrtDetAAT< mydimension, coorddimension > │ │ │ │ │ +( jt ); │ │ │ │ │ +500 } │ │ │ │ │ +501 │ │ │ │ │ +_5_0_2 _c_t_y_p_e _d_e_t () const { return _c_t_y_p_e( 1 ) / detInv_; } │ │ │ │ │ +_5_0_3 _c_t_y_p_e _d_e_t_I_n_v () const { return detInv_; } │ │ │ │ │ +504 │ │ │ │ │ +505 private: │ │ │ │ │ +506 _c_t_y_p_e detInv_; │ │ │ │ │ +507 }; │ │ │ │ │ +508 │ │ │ │ │ +509 │ │ │ │ │ +510 │ │ │ │ │ +523 template< class ct, int mydim, int cdim, class Traits = │ │ │ │ │ +MultiLinearGeometryTraits< ct > > │ │ │ │ │ +_5_2_4 class _C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y │ │ │ │ │ +525 : public _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y< ct, mydim, cdim, Traits > │ │ │ │ │ +526 { │ │ │ │ │ +527 typedef _C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_<_ _c_t_,_ _m_y_d_i_m_,_ _c_d_i_m_,_ _T_r_a_i_t_s_ _> This; │ │ │ │ │ +528 typedef _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_<_ _c_t_,_ _m_y_d_i_m_,_ _c_d_i_m_,_ _T_r_a_i_t_s_ _> _B_a_s_e; │ │ │ │ │ +529 │ │ │ │ │ +530 protected: │ │ │ │ │ +_5_3_1 typedef typename _B_a_s_e_:_:_M_a_t_r_i_x_H_e_l_p_e_r _M_a_t_r_i_x_H_e_l_p_e_r; │ │ │ │ │ +532 │ │ │ │ │ +533 public: │ │ │ │ │ +_5_3_4 typedef typename _B_a_s_e_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t; │ │ │ │ │ +535 │ │ │ │ │ +_5_3_6 typedef typename _B_a_s_e_:_:_c_t_y_p_e _c_t_y_p_e; │ │ │ │ │ +537 │ │ │ │ │ +538 using _B_a_s_e_:_:_m_y_d_i_m_e_n_s_i_o_n; │ │ │ │ │ +539 using _B_a_s_e_:_:_c_o_o_r_d_d_i_m_e_n_s_i_o_n; │ │ │ │ │ +540 │ │ │ │ │ +_5_4_1 typedef typename _B_a_s_e_:_:_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ +_5_4_2 typedef typename _B_a_s_e_:_:_G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ +_5_4_3 typedef typename _B_a_s_e_:_:_V_o_l_u_m_e _V_o_l_u_m_e; │ │ │ │ │ +544 │ │ │ │ │ +_5_4_5 typedef typename _B_a_s_e_:_:_J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d; │ │ │ │ │ +_5_4_6 typedef typename _B_a_s_e_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d; │ │ │ │ │ +_5_4_7 typedef typename _B_a_s_e_:_:_J_a_c_o_b_i_a_n _J_a_c_o_b_i_a_n; │ │ │ │ │ +_5_4_8 typedef typename _B_a_s_e_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e; │ │ │ │ │ +549 │ │ │ │ │ +550 template< class CornerStorage > │ │ │ │ │ +_5_5_1 _C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y ( const _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t &_r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t, const │ │ │ │ │ +CornerStorage &cornerStorage ) │ │ │ │ │ +552 : _B_a_s_e( _r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t, cornerStorage ), │ │ │ │ │ +553 affine_( _B_a_s_e::_a_f_f_i_n_e( jacobianTransposed_ ) ), │ │ │ │ │ +554 jacobianInverseTransposedComputed_( false ), │ │ │ │ │ +555 integrationElementComputed_( false ) │ │ │ │ │ +556 {} │ │ │ │ │ +557 │ │ │ │ │ +558 template< class CornerStorage > │ │ │ │ │ +_5_5_9 _C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y ( _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e gt, const CornerStorage │ │ │ │ │ +&cornerStorage ) │ │ │ │ │ +560 : _B_a_s_e( gt, cornerStorage ), │ │ │ │ │ +561 affine_( _B_a_s_e::_a_f_f_i_n_e( jacobianTransposed_ ) ), │ │ │ │ │ +562 jacobianInverseTransposedComputed_( false ), │ │ │ │ │ +563 integrationElementComputed_( false ) │ │ │ │ │ +564 {} │ │ │ │ │ +565 │ │ │ │ │ +_5_6_7 bool _a_f_f_i_n_e () const { return affine_; } │ │ │ │ │ +568 │ │ │ │ │ +569 using _B_a_s_e_:_:_c_o_r_n_e_r; │ │ │ │ │ +570 │ │ │ │ │ +_5_7_2 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _c_e_n_t_e_r () const { return _g_l_o_b_a_l( _r_e_f_E_l_e_m_e_n_t().position( 0, │ │ │ │ │ +0 ) ); } │ │ │ │ │ +573 │ │ │ │ │ +_5_8_0 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _g_l_o_b_a_l ( const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l ) const │ │ │ │ │ +581 { │ │ │ │ │ +582 if( _a_f_f_i_n_e() ) │ │ │ │ │ +583 { │ │ │ │ │ +584 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _g_l_o_b_a_l( _c_o_r_n_e_r( 0 ) ); │ │ │ │ │ +585 jacobianTransposed_.umtv( _l_o_c_a_l, _g_l_o_b_a_l ); │ │ │ │ │ +586 return _g_l_o_b_a_l; │ │ │ │ │ +587 } │ │ │ │ │ +588 else │ │ │ │ │ +589 return _B_a_s_e_:_:_g_l_o_b_a_l( _l_o_c_a_l ); │ │ │ │ │ +590 } │ │ │ │ │ +591 │ │ │ │ │ +_6_0_4 _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e _l_o_c_a_l ( const _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e &_g_l_o_b_a_l ) const │ │ │ │ │ +605 { │ │ │ │ │ +606 if( _a_f_f_i_n_e() ) │ │ │ │ │ +607 { │ │ │ │ │ +608 _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e _l_o_c_a_l; │ │ │ │ │ +609 if( jacobianInverseTransposedComputed_ ) │ │ │ │ │ +610 jacobianInverseTransposed_.mtv( _g_l_o_b_a_l - _c_o_r_n_e_r( 0 ), _l_o_c_a_l ); │ │ │ │ │ +611 else │ │ │ │ │ +612 MatrixHelper::template xTRightInvA< mydimension, coorddimension > │ │ │ │ │ +( jacobianTransposed_, _g_l_o_b_a_l - _c_o_r_n_e_r( 0 ), _l_o_c_a_l ); │ │ │ │ │ +613 return _l_o_c_a_l; │ │ │ │ │ +614 } │ │ │ │ │ +615 else │ │ │ │ │ +616 return _B_a_s_e_:_:_l_o_c_a_l( _g_l_o_b_a_l ); │ │ │ │ │ +617 } │ │ │ │ │ +618 │ │ │ │ │ +_6_3_3 _c_t_y_p_e _i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t ( const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l ) const │ │ │ │ │ +634 { │ │ │ │ │ +635 if( _a_f_f_i_n_e() ) │ │ │ │ │ +636 { │ │ │ │ │ +637 if( !integrationElementComputed_ ) │ │ │ │ │ +638 { │ │ │ │ │ +639 jacobianInverseTransposed_._s_e_t_u_p_D_e_t_e_r_m_i_n_a_n_t( jacobianTransposed_ ); │ │ │ │ │ +640 integrationElementComputed_ = true; │ │ │ │ │ +641 } │ │ │ │ │ +642 return jacobianInverseTransposed_._d_e_t_I_n_v(); │ │ │ │ │ +643 } │ │ │ │ │ +644 else │ │ │ │ │ +645 return _B_a_s_e_:_:_i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t( _l_o_c_a_l ); │ │ │ │ │ +646 } │ │ │ │ │ +647 │ │ │ │ │ +_6_4_9 _V_o_l_u_m_e _v_o_l_u_m_e () const │ │ │ │ │ +650 { │ │ │ │ │ +651 if( _a_f_f_i_n_e() ) │ │ │ │ │ +652 return _i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t( _r_e_f_E_l_e_m_e_n_t().position( 0, 0 ) ) * _r_e_f_E_l_e_m_e_n_t │ │ │ │ │ +().volume(); │ │ │ │ │ +653 else │ │ │ │ │ +654 return _B_a_s_e_:_:_v_o_l_u_m_e(); │ │ │ │ │ +655 } │ │ │ │ │ +656 │ │ │ │ │ +_6_6_6 _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d _j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d ( const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l ) │ │ │ │ │ +const │ │ │ │ │ +667 { │ │ │ │ │ +668 if( _a_f_f_i_n_e() ) │ │ │ │ │ +669 return jacobianTransposed_; │ │ │ │ │ +670 else │ │ │ │ │ +671 return _B_a_s_e_:_:_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d( _l_o_c_a_l ); │ │ │ │ │ +672 } │ │ │ │ │ +673 │ │ │ │ │ +_6_8_0 _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d _j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d ( const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ +&_l_o_c_a_l ) const │ │ │ │ │ 681 { │ │ │ │ │ -682 return (*containsPtr_)[i]; │ │ │ │ │ -683 } │ │ │ │ │ -684 │ │ │ │ │ -685 private: │ │ │ │ │ -686 const SubEntityFlags* containsPtr_; │ │ │ │ │ -687 std::size_t size_; │ │ │ │ │ -688 std::size_t offset_; │ │ │ │ │ -689 }; │ │ │ │ │ -690 │ │ │ │ │ -691 using NumberRange = typename Dune::IteratorRange; │ │ │ │ │ -692 │ │ │ │ │ -693 SubEntityInfo () │ │ │ │ │ -694 : numbering_( nullptr ) │ │ │ │ │ -695 { │ │ │ │ │ -696 std::fill( offset_.begin(), offset_.end(), 0 ); │ │ │ │ │ -697 } │ │ │ │ │ -698 │ │ │ │ │ -699 SubEntityInfo ( const SubEntityInfo &other ) │ │ │ │ │ -700 : offset_( other.offset_ ), │ │ │ │ │ -701 type_( other.type_ ), │ │ │ │ │ -702 containsSubentity_( other.containsSubentity_ ) │ │ │ │ │ +682 if( _a_f_f_i_n_e() ) │ │ │ │ │ +683 { │ │ │ │ │ +684 if( !jacobianInverseTransposedComputed_ ) │ │ │ │ │ +685 { │ │ │ │ │ +686 jacobianInverseTransposed_._s_e_t_u_p( jacobianTransposed_ ); │ │ │ │ │ +687 jacobianInverseTransposedComputed_ = true; │ │ │ │ │ +688 integrationElementComputed_ = true; │ │ │ │ │ +689 } │ │ │ │ │ +690 return jacobianInverseTransposed_; │ │ │ │ │ +691 } │ │ │ │ │ +692 else │ │ │ │ │ +693 return _B_a_s_e_:_:_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d( _l_o_c_a_l ); │ │ │ │ │ +694 } │ │ │ │ │ +695 │ │ │ │ │ +_7_0_2 _J_a_c_o_b_i_a_n _j_a_c_o_b_i_a_n (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l) const │ │ │ │ │ 703 { │ │ │ │ │ -704 numbering_ = allocate(); │ │ │ │ │ -705 std::copy( other.numbering_, other.numbering_ + capacity(), numbering_ ); │ │ │ │ │ -706 } │ │ │ │ │ -707 │ │ │ │ │ -708 ~SubEntityInfo () { deallocate( numbering_ ); } │ │ │ │ │ -709 │ │ │ │ │ -710 const SubEntityInfo &operator= ( const SubEntityInfo &other ) │ │ │ │ │ -711 { │ │ │ │ │ -712 type_ = other.type_; │ │ │ │ │ -713 offset_ = other.offset_; │ │ │ │ │ -714 │ │ │ │ │ -715 deallocate( numbering_ ); │ │ │ │ │ -716 numbering_ = allocate(); │ │ │ │ │ -717 std::copy( other.numbering_, other.numbering_ + capacity(), numbering_ ); │ │ │ │ │ -718 │ │ │ │ │ -719 containsSubentity_ = other.containsSubentity_; │ │ │ │ │ +704 return _j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d(_l_o_c_a_l).transposed(); │ │ │ │ │ +705 } │ │ │ │ │ +706 │ │ │ │ │ +_7_1_3 _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e _j_a_c_o_b_i_a_n_I_n_v_e_r_s_e (const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l) const │ │ │ │ │ +714 { │ │ │ │ │ +715 return _j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d(_l_o_c_a_l).transposed(); │ │ │ │ │ +716 } │ │ │ │ │ +717 │ │ │ │ │ +718 protected: │ │ │ │ │ +719 using _B_a_s_e_:_:_r_e_f_E_l_e_m_e_n_t; │ │ │ │ │ 720 │ │ │ │ │ -721 return *this; │ │ │ │ │ -722 } │ │ │ │ │ -723 │ │ │ │ │ -724 int _s_i_z_e ( int cc ) const │ │ │ │ │ -725 { │ │ │ │ │ -726 assert( (cc >= 0) && (cc <= dim) ); │ │ │ │ │ -727 return (offset_[ cc+1 ] - offset_[ cc ]); │ │ │ │ │ -728 } │ │ │ │ │ -729 │ │ │ │ │ -730 int number ( int ii, int cc ) const │ │ │ │ │ -731 { │ │ │ │ │ -732 assert( (ii >= 0) && (ii < _s_i_z_e( cc )) ); │ │ │ │ │ -733 return numbering_[ offset_[ cc ] + ii ]; │ │ │ │ │ -734 } │ │ │ │ │ +721 private: │ │ │ │ │ +722 mutable _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d jacobianTransposed_; │ │ │ │ │ +723 mutable _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d 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 auto numbers ( int cc ) const │ │ │ │ │ -737 { │ │ │ │ │ -738 return SubEntityRange( numbering_ + offset_[ cc ], numbering_ + offset_ │ │ │ │ │ -[ cc+1 ], containsSubentity_[cc]); │ │ │ │ │ -739 } │ │ │ │ │ -740 │ │ │ │ │ -741 const GeometryType &type () const { return type_; } │ │ │ │ │ -742 │ │ │ │ │ -743 void initialize ( unsigned int topologyId, int codim, unsigned int i ) │ │ │ │ │ -744 { │ │ │ │ │ -745 const unsigned int subId = Impl::subTopologyId( topologyId, dim, codim, i │ │ │ │ │ -); │ │ │ │ │ -746 type_ = GeometryType( subId, dim-codim ); │ │ │ │ │ -747 │ │ │ │ │ -748 // compute offsets │ │ │ │ │ -749 for( int cc = 0; cc <= codim; ++cc ) │ │ │ │ │ -750 offset_[ cc ] = 0; │ │ │ │ │ -751 for( int cc = codim; cc <= dim; ++cc ) │ │ │ │ │ -752 offset_[ cc+1 ] = offset_[ cc ] + Impl::size( subId, dim-codim, cc-codim ); │ │ │ │ │ -753 │ │ │ │ │ -754 // compute subnumbering │ │ │ │ │ -755 deallocate( numbering_ ); │ │ │ │ │ -756 numbering_ = allocate(); │ │ │ │ │ -757 for( int cc = codim; cc <= dim; ++cc ) │ │ │ │ │ -758 Impl::subTopologyNumbering( topologyId, dim, codim, i, cc-codim, │ │ │ │ │ -numbering_+offset_[ cc ], numbering_+offset_[ cc+1 ] ); │ │ │ │ │ -759 │ │ │ │ │ -760 // initialize containsSubentity lookup-table │ │ │ │ │ -761 for(std::size_t cc=0; cc<= dim; ++cc) │ │ │ │ │ -762 { │ │ │ │ │ -763 containsSubentity_[cc].reset(); │ │ │ │ │ -764 for(std::size_t idx=0; idx offset_; │ │ │ │ │ -779 GeometryType type_; │ │ │ │ │ -780 std::array< SubEntityFlags, dim+1> containsSubentity_; │ │ │ │ │ -781 }; │ │ │ │ │ -782 │ │ │ │ │ -783 │ │ │ │ │ -784 template< class ctype, int dim > │ │ │ │ │ -785 template< int codim > │ │ │ │ │ -786 struct ReferenceElementImplementation< ctype, dim >::CreateGeometries │ │ │ │ │ -787 { │ │ │ │ │ -788 template< int cc > │ │ │ │ │ -789 static typename ReferenceElements< ctype, dim-cc >::ReferenceElement │ │ │ │ │ -790 subRefElement( const ReferenceElementImplementation< ctype, dim > │ │ │ │ │ -&refElement, int i, std::integral_constant< int, cc > ) │ │ │ │ │ -791 { │ │ │ │ │ -792 return _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_<_ _c_t_y_p_e_,_ _d_i_m_-_c_c_ _>_:_:_g_e_n_e_r_a_l( refElement.type( i, cc │ │ │ │ │ -) ); │ │ │ │ │ -793 } │ │ │ │ │ -794 │ │ │ │ │ -795 static typename _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_<_ _c_t_y_p_e_,_ _d_i_m_ _>_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ -796 subRefElement(const ReferenceElementImplementation< ctype, dim > │ │ │ │ │ -&refElement, │ │ │ │ │ -797 [[maybe_unused]] int i, std::integral_constant) │ │ │ │ │ -798 { │ │ │ │ │ -799 return refElement; │ │ │ │ │ -800 } │ │ │ │ │ -801 │ │ │ │ │ -802 static void apply ( const ReferenceElementImplementation< ctype, dim > │ │ │ │ │ -&refElement, GeometryTable &geometries ) │ │ │ │ │ -803 { │ │ │ │ │ -804 const int _s_i_z_e = refElement.size( codim ); │ │ │ │ │ -805 std::vector< FieldVector< ctype, dim > > origins( size ); │ │ │ │ │ -806 std::vector< FieldMatrix< ctype, dim - codim, dim > > jacobianTransposeds │ │ │ │ │ -( size ); │ │ │ │ │ -807 Impl::referenceEmbeddings( refElement.type().id(), dim, codim, &(origins[ 0 │ │ │ │ │ -]), &(jacobianTransposeds[ 0 ]) ); │ │ │ │ │ -808 │ │ │ │ │ -809 std::get< codim >( geometries ).reserve( size ); │ │ │ │ │ -810 for( int i = 0; i < _s_i_z_e; ++i ) │ │ │ │ │ -811 { │ │ │ │ │ -812 typename Codim< codim >::Geometry geometry( subRefElement( refElement, i, │ │ │ │ │ -std::integral_constant< int, codim >() ), origins[ i ], jacobianTransposeds[ i │ │ │ │ │ -] ); │ │ │ │ │ -813 std::get< codim >( geometries ).push_back( geometry ); │ │ │ │ │ -814 } │ │ │ │ │ -815 } │ │ │ │ │ -816 }; │ │ │ │ │ -817 │ │ │ │ │ -818#endif // DOXYGEN │ │ │ │ │ -819 │ │ │ │ │ -820 } // namespace Geo │ │ │ │ │ -821 │ │ │ │ │ -822} // namespace Dune │ │ │ │ │ -823 │ │ │ │ │ -824#endif // #ifndef DUNE_GEOMETRY_REFERENCEELEMENTIMPLEMENTATION_HH │ │ │ │ │ -_a_f_f_i_n_e_g_e_o_m_e_t_r_y_._h_h │ │ │ │ │ -An implementation of the Geometry interface for affine geometries. │ │ │ │ │ +736 template< class ct, int mydim, int cdim, class Traits > │ │ │ │ │ +737 inline typename MultiLinearGeometry< ct, mydim, cdim, Traits >:: │ │ │ │ │ +JacobianInverseTransposed │ │ │ │ │ +_7_3_8 _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_<_ _c_t_,_ _m_y_d_i_m_,_ _c_d_i_m_,_ _T_r_a_i_t_s_ _>_:_:_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ +( const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &local ) const │ │ │ │ │ +739 { │ │ │ │ │ +740 _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d jit; │ │ │ │ │ +741 jit._s_e_t_u_p( 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 _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_<_ _c_t_,_ _m_y_d_i_m_,_ _c_d_i_m_,_ _T_r_a_i_t_s_ _> │ │ │ │ │ +_7_4_9_ _:_:_g_l_o_b_a_l ( _T_o_p_o_l_o_g_y_I_d topologyId, std::integral_constant< int, dim >, │ │ │ │ │ +750 CornerIterator &cit, const _c_t_y_p_e &df, const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &x, │ │ │ │ │ +751 const _c_t_y_p_e &rf, _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e &y ) │ │ │ │ │ +752 { │ │ │ │ │ +753 const _c_t_y_p_e xn = df*x[ dim-1 ]; │ │ │ │ │ +754 const _c_t_y_p_e cxn = _c_t_y_p_e( 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, _c_t_y_p_e( 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 _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_<_ _c_t_,_ _m_y_d_i_m_,_ _c_d_i_m_,_ _T_r_a_i_t_s_ _> │ │ │ │ │ +_7_8_0_ _:_:_g_l_o_b_a_l ( _T_o_p_o_l_o_g_y_I_d, std::integral_constant< int, 0 >, │ │ │ │ │ +781 CornerIterator &cit, const _c_t_y_p_e &, const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &, │ │ │ │ │ +782 const _c_t_y_p_e &rf, _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e &y ) │ │ │ │ │ +783 { │ │ │ │ │ +784 const _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e &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 _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_<_ _c_t_,_ _m_y_d_i_m_,_ _c_d_i_m_,_ _T_r_a_i_t_s_ _> │ │ │ │ │ +_7_9_4_ _:_:_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d ( _T_o_p_o_l_o_g_y_I_d topologyId, std::integral_constant< int, │ │ │ │ │ +dim >, │ │ │ │ │ +795 CornerIterator &cit, const _c_t_y_p_e &df, const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &x, │ │ │ │ │ +796 const _c_t_y_p_e &rf, FieldMatrix< ctype, rows, cdim > &jt ) │ │ │ │ │ +797 { │ │ │ │ │ +798 assert( rows >= dim ); │ │ │ │ │ +799 │ │ │ │ │ +800 const _c_t_y_p_e xn = df*x[ dim-1 ]; │ │ │ │ │ +801 const _c_t_y_p_e cxn = _c_t_y_p_e( 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 _c_t_y_p_e dfcxn = (cxn > Traits::tolerance() || cxn < -Traits::tolerance()) ? │ │ │ │ │ +_c_t_y_p_e(df / cxn) : _c_t_y_p_e(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< _c_t_y_p_e, 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 _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_<_ _c_t_,_ _m_y_d_i_m_,_ _c_d_i_m_,_ _T_r_a_i_t_s_ _> │ │ │ │ │ +_8_9_6_ _:_:_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d ( _T_o_p_o_l_o_g_y_I_d, std::integral_constant< int, 0 >, │ │ │ │ │ +897 CornerIterator &cit, const _c_t_y_p_e &, const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &, │ │ │ │ │ +898 const _c_t_y_p_e &, 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 _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_<_ _c_t_,_ _m_y_d_i_m_,_ _c_d_i_m_,_ _T_r_a_i_t_s_ _> │ │ │ │ │ +_9_0_8_ _:_:_a_f_f_i_n_e ( _T_o_p_o_l_o_g_y_I_d topologyId, std::integral_constant< int, dim >, │ │ │ │ │ +CornerIterator &cit, _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d &jt ) │ │ │ │ │ +909 { │ │ │ │ │ +910 const _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e &orgBottom = *cit; │ │ │ │ │ +911 if( !affine( topologyId, std::integral_constant< int, dim-1 >(), cit, jt ) │ │ │ │ │ +) │ │ │ │ │ +912 return false; │ │ │ │ │ +913 const _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e &orgTop = *cit; │ │ │ │ │ +914 │ │ │ │ │ +915 if( Impl::isPrism( toUnsignedInt(topologyId), mydimension, mydimension-dim │ │ │ │ │ +) ) │ │ │ │ │ +916 { │ │ │ │ │ +917 _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d 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 _c_t_y_p_e 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 _M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_<_ _c_t_,_ _m_y_d_i_m_,_ _c_d_i_m_,_ _T_r_a_i_t_s_ _> │ │ │ │ │ +_9_3_7_ _:_:_a_f_f_i_n_e ( _T_o_p_o_l_o_g_y_I_d, std::integral_constant< int, 0 >, CornerIterator │ │ │ │ │ +&cit, _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d & ) │ │ │ │ │ +938 { │ │ │ │ │ +939 ++cit; │ │ │ │ │ +940 return true; │ │ │ │ │ +941 } │ │ │ │ │ +942 │ │ │ │ │ +943} // namespace Dune │ │ │ │ │ +944 │ │ │ │ │ +945#endif // #ifndef DUNE_GEOMETRY_MULTILINEARGEOMETRY_HH │ │ │ │ │ _t_y_p_e_._h_h │ │ │ │ │ A unique label for each type of element that can occur in a grid. │ │ │ │ │ -_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_._h_h │ │ │ │ │ +_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_s_._h_h │ │ │ │ │ +_a_f_f_i_n_e_g_e_o_m_e_t_r_y_._h_h │ │ │ │ │ +An implementation of the Geometry interface for affine geometries. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn affinegeometry.hh:21 │ │ │ │ │ -_D_u_n_e_:_:_Q_u_a_d_r_a_t_u_r_e_T_y_p_e_:_:_s_i_z_e │ │ │ │ │ -@ size │ │ │ │ │ -DDeeffiinniittiioonn quadraturerules.hh:194 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s │ │ │ │ │ +Class providing access to the singletons of the reference elements. │ │ │ │ │ +DDeeffiinniittiioonn referenceelements.hh:128 │ │ │ │ │ _D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ typename Container::ReferenceElement ReferenceElement │ │ │ │ │ The reference element type. │ │ │ │ │ DDeeffiinniittiioonn referenceelements.hh:146 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_g_e_n_e_r_a_l │ │ │ │ │ -static const ReferenceElement & general(const GeometryType &type) │ │ │ │ │ -get general reference elements │ │ │ │ │ -DDeeffiinniittiioonn referenceelements.hh:156 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_T_r_a_i_t_s │ │ │ │ │ +default traits class for MultiLinearGeometry │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:39 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_T_r_a_i_t_s_:_:_M_a_t_r_i_x_H_e_l_p_e_r │ │ │ │ │ +Impl::FieldMatrixHelper< ct > MatrixHelper │ │ │ │ │ +helper structure containing some matrix routines │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:58 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_T_r_a_i_t_s_:_:_t_o_l_e_r_a_n_c_e │ │ │ │ │ +static ct tolerance() │ │ │ │ │ +tolerance to numerical algorithms │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:61 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_T_r_a_i_t_s_:_:_C_o_r_n_e_r_S_t_o_r_a_g_e │ │ │ │ │ +template specifying the storage for the corners │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:129 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_T_r_a_i_t_s_:_:_C_o_r_n_e_r_S_t_o_r_a_g_e_:_:_T_y_p_e │ │ │ │ │ +std::vector< FieldVector< ct, cdim > > Type │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:130 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_T_r_a_i_t_s_:_:_h_a_s_S_i_n_g_l_e_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ +will there be only one geometry type for a dimension? │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:148 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_T_r_a_i_t_s_:_:_h_a_s_S_i_n_g_l_e_G_e_o_m_e_t_r_y_T_y_p_e_:_:_t_o_p_o_l_o_g_y_I_d │ │ │ │ │ +static const unsigned int topologyId │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:150 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_T_r_a_i_t_s_:_:_h_a_s_S_i_n_g_l_e_G_e_o_m_e_t_r_y_T_y_p_e_:_:_v │ │ │ │ │ +static const bool v │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:149 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y │ │ │ │ │ +generic geometry implementation based on corner coordinates │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:181 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_g_l_o_b_a_l │ │ │ │ │ +static void global(TopologyId topologyId, std::integral_constant< int, dim >, │ │ │ │ │ +CornerIterator &cit, const ctype &df, const LocalCoordinate &x, const ctype │ │ │ │ │ +&rf, GlobalCoordinate &y) │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:749 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_m_y_d_i_m_e_n_s_i_o_n │ │ │ │ │ +static const int mydimension │ │ │ │ │ +geometry dimension │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:189 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_t_y_p_e │ │ │ │ │ +Dune::GeometryType type() const │ │ │ │ │ +obtain the name of the reference element │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:269 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_M_a_t_r_i_x_H_e_l_p_e_r │ │ │ │ │ +Traits::MatrixHelper MatrixHelper │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:225 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ +FieldVector< ctype, coorddimension > GlobalCoordinate │ │ │ │ │ +type of global coordinates │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:196 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ +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) │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:896 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ +JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const │ │ │ │ │ +obtain the transposed of the Jacobian │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:377 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_r_e_f_E_l_e_m_e_n_t │ │ │ │ │ +ReferenceElement refElement() const │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:425 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_g_l_o_b_a_l │ │ │ │ │ +GlobalCoordinate global(const LocalCoordinate &local) const │ │ │ │ │ +evaluate the mapping │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:290 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_c_e_n_t_e_r │ │ │ │ │ +GlobalCoordinate center() const │ │ │ │ │ +obtain the centroid of the mapping's image │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:282 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_c_o_r_n_e_r │ │ │ │ │ +GlobalCoordinate corner(int i) const │ │ │ │ │ +obtain coordinates of the i-th corner │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:275 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s │ │ │ │ │ +Dune::ReferenceElements< ctype, mydimension > ReferenceElements │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:214 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_c_t_y_p_e │ │ │ │ │ +ct ctype │ │ │ │ │ +coordinate type │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:186 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ +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) │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:794 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_c_o_o_r_d_d_i_m_e_n_s_i_o_n │ │ │ │ │ +static const int coorddimension │ │ │ │ │ +coordinate dimension │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:191 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_c_o_r_n_e_r_s │ │ │ │ │ +int corners() const │ │ │ │ │ +obtain number of corners of the corresponding reference element │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:272 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_t_o_p_o_l_o_g_y_I_d │ │ │ │ │ +TopologyId topologyId() const │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:430 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ +friend ReferenceElement referenceElement(const MultiLinearGeometry &geometry) │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:395 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_l_o_c_a_l │ │ │ │ │ +LocalCoordinate local(const GlobalCoordinate &globalCoord) const │ │ │ │ │ +evaluate the inverse mapping │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:312 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_g_l_o_b_a_l │ │ │ │ │ +static void global(TopologyId topologyId, std::integral_constant< int, 0 >, │ │ │ │ │ +CornerIterator &cit, const ctype &df, const LocalCoordinate &x, const ctype │ │ │ │ │ +&rf, GlobalCoordinate &y) │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:780 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_v_o_l_u_m_e │ │ │ │ │ +Volume volume() const │ │ │ │ │ +obtain the volume of the mapping's image │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:363 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ +FieldVector< ctype, mydimension > LocalCoordinate │ │ │ │ │ +type of local coordinates │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:194 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y │ │ │ │ │ +MultiLinearGeometry(const ReferenceElement &refElement, const Corners &corners) │ │ │ │ │ +constructor │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:239 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_a_f_f_i_n_e │ │ │ │ │ +static bool affine(TopologyId topologyId, std::integral_constant< int, 0 >, │ │ │ │ │ +CornerIterator &cit, JacobianTransposed &jt) │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:937 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_T_o_p_o_l_o_g_y_I_d │ │ │ │ │ +std::conditional< hasSingleGeometryType, std::integral_constant< unsignedint, │ │ │ │ │ +Traits::templatehasSingleGeometryType< mydimension >::topologyId >, unsignedint │ │ │ │ │ +>::type TopologyId │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:226 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_V_o_l_u_m_e │ │ │ │ │ +ctype Volume │ │ │ │ │ +type of volume │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:198 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_a_f_f_i_n_e │ │ │ │ │ +static bool affine(TopologyId topologyId, std::integral_constant< int, dim >, │ │ │ │ │ +CornerIterator &cit, JacobianTransposed &jt) │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:908 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e │ │ │ │ │ +JacobianInverse jacobianInverse(const LocalCoordinate &local) const │ │ │ │ │ +Obtain the Jacobian's inverse. │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:418 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y │ │ │ │ │ +MultiLinearGeometry(Dune::GeometryType gt, const Corners &corners) │ │ │ │ │ +constructor │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:255 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ +FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed │ │ │ │ │ +type of jacobian transposed │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:201 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ +ReferenceElements::ReferenceElement ReferenceElement │ │ │ │ │ +type of reference element │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:219 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ +JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate │ │ │ │ │ +&local) const │ │ │ │ │ +obtain the transposed of the Jacobian's inverse │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:738 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n │ │ │ │ │ +FieldMatrix< ctype, coorddimension, mydimension > Jacobian │ │ │ │ │ +Type for the Jacobian matrix. │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:207 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_a_f_f_i_n_e │ │ │ │ │ +bool affine() const │ │ │ │ │ +is this mapping affine? │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:262 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e │ │ │ │ │ +FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse │ │ │ │ │ +Type for the inverse Jacobian matrix. │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:210 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_a_f_f_i_n_e │ │ │ │ │ +bool affine(JacobianTransposed &jacobianT) const │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:458 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t │ │ │ │ │ +Volume integrationElement(const LocalCoordinate &local) const │ │ │ │ │ +obtain the integration element │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:350 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n │ │ │ │ │ +Jacobian jacobian(const LocalCoordinate &local) const │ │ │ │ │ +Obtain the Jacobian. │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:407 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:488 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d_:_:_s_e_t_u_p │ │ │ │ │ +void setup(const JacobianTransposed &jt) │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:492 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d_:_:_d_e_t │ │ │ │ │ +ctype det() const │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:502 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d_:_:_d_e_t_I_n_v │ │ │ │ │ +ctype detInv() const │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:503 │ │ │ │ │ +_D_u_n_e_:_:_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d_:_:_s_e_t_u_p_D_e_t_e_r_m_i_n_a_n_t │ │ │ │ │ +void setupDeterminant(const JacobianTransposed &jt) │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:497 │ │ │ │ │ +_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y │ │ │ │ │ +Implement a MultiLinearGeometry with additional caching. │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:526 │ │ │ │ │ +_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_g_l_o_b_a_l │ │ │ │ │ +GlobalCoordinate global(const LocalCoordinate &local) const │ │ │ │ │ +evaluate the mapping │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:580 │ │ │ │ │ +_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ +Base::ReferenceElement ReferenceElement │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:534 │ │ │ │ │ +_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_a_f_f_i_n_e │ │ │ │ │ +bool affine() const │ │ │ │ │ +is this mapping affine? │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:567 │ │ │ │ │ +_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y │ │ │ │ │ +CachedMultiLinearGeometry(const ReferenceElement &referenceElement, const │ │ │ │ │ +CornerStorage &cornerStorage) │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:551 │ │ │ │ │ +_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_r_e_f_E_l_e_m_e_n_t │ │ │ │ │ +ReferenceElement refElement() const │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:425 │ │ │ │ │ +_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_l_o_c_a_l │ │ │ │ │ +LocalCoordinate local(const GlobalCoordinate &global) const │ │ │ │ │ +evaluate the inverse mapping │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:604 │ │ │ │ │ +_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_M_a_t_r_i_x_H_e_l_p_e_r │ │ │ │ │ +Base::MatrixHelper MatrixHelper │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:531 │ │ │ │ │ +_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ +Base::LocalCoordinate LocalCoordinate │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:541 │ │ │ │ │ +_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e │ │ │ │ │ +JacobianInverse jacobianInverse(const LocalCoordinate &local) const │ │ │ │ │ +Obtain the Jacobian's inverse. │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:713 │ │ │ │ │ +_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ +JacobianTransposed jacobianTransposed(const LocalCoordinate &local) const │ │ │ │ │ +obtain the transposed of the Jacobian │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:666 │ │ │ │ │ +_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_c_o_r_n_e_r │ │ │ │ │ +GlobalCoordinate corner(int i) const │ │ │ │ │ +obtain coordinates of the i-th corner │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:275 │ │ │ │ │ +_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_v_o_l_u_m_e │ │ │ │ │ +Volume volume() const │ │ │ │ │ +obtain the volume of the mapping's image │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:649 │ │ │ │ │ +_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y │ │ │ │ │ +CachedMultiLinearGeometry(Dune::GeometryType gt, const CornerStorage │ │ │ │ │ +&cornerStorage) │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:559 │ │ │ │ │ +_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t │ │ │ │ │ +ctype integrationElement(const LocalCoordinate &local) const │ │ │ │ │ +obtain the integration element │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:633 │ │ │ │ │ +_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_c_t_y_p_e │ │ │ │ │ +Base::ctype ctype │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:536 │ │ │ │ │ +_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n │ │ │ │ │ +Jacobian jacobian(const LocalCoordinate &local) const │ │ │ │ │ +Obtain the Jacobian. │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:702 │ │ │ │ │ +_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ +Base::JacobianInverseTransposed JacobianInverseTransposed │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:546 │ │ │ │ │ +_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ +Base::JacobianTransposed JacobianTransposed │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:545 │ │ │ │ │ +_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e │ │ │ │ │ +Base::JacobianInverse JacobianInverse │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:548 │ │ │ │ │ +_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n │ │ │ │ │ +Base::Jacobian Jacobian │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:547 │ │ │ │ │ +_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_V_o_l_u_m_e │ │ │ │ │ +Base::Volume Volume │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:543 │ │ │ │ │ +_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ +Base::GlobalCoordinate GlobalCoordinate │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:542 │ │ │ │ │ +_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_c_e_n_t_e_r │ │ │ │ │ +GlobalCoordinate center() const │ │ │ │ │ +obtain the centroid of the mapping's image │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:572 │ │ │ │ │ +_D_u_n_e_:_:_C_a_c_h_e_d_M_u_l_t_i_L_i_n_e_a_r_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ +JacobianInverseTransposed jacobianInverseTransposed(const LocalCoordinate │ │ │ │ │ +&local) const │ │ │ │ │ +obtain the transposed of the Jacobian's inverse │ │ │ │ │ +DDeeffiinniittiioonn multilineargeometry.hh:680 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ +Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:114 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00242.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: referenceelement.hh File Reference │ │ │ │ +dune-geometry: referenceelements.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -71,37 +71,72 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
referenceelement.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Typedefs | │ │ │ │ +Functions
│ │ │ │ +
referenceelements.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <dune/geometry/type.hh>
│ │ │ │ +
#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.

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

│ │ │ │ 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...
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::ReferenceElement = decltype(referenceElement(std::declval< T >()...))
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

template<typename... T>
unspecified value type Dune::referenceElement (T &&... t)
 Returns a reference element for the objects t....
 
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.
 
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.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,25 +1,60 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -referenceelement.hh File Reference │ │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s │ │ │ │ │ +referenceelements.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_d_i_m_e_n_s_i_o_n_._h_h> │ │ │ │ │ #include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_._h_h> │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_i_m_p_l_e_m_e_n_t_a_t_i_o_n_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ - class   _D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_<_ _I_m_p_l_e_m_e_n_t_a_t_i_o_n_ _> │ │ │ │ │ -  This class provides access to geometric and topological properties of │ │ │ │ │ - a reference element. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -struct   _D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_<_ _I_m_p_l_e_m_e_n_t_a_t_i_o_n_ _>_:_:_C_o_d_i_m_<_ _c_o_d_i_m_ _> │ │ │ │ │ -  Collection of types depending on the codimension. _M_o_r_e_._._. │ │ │ │ │ +struct   _D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_<_ _c_t_y_p_e___,_ _d_i_m_ _> │ │ │ │ │ +  Class providing access to the singletons of the reference elements. │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ namespace   _D_u_n_e_:_:_G_e_o │ │ │ │ │   │ │ │ │ │ +namespace   _D_u_n_e_:_:_T_r_a_n_s_i_t_i_o_n_a_l │ │ │ │ │ +  │ │ │ │ │ +TTyyppeeddeeffss │ │ │ │ │ +template │ │ │ │ │ +using  _D_u_n_e_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t = decltype(_r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t(std::declval< T > │ │ │ │ │ + ()...)) │ │ │ │ │ +  │ │ │ │ │ +FFuunnccttiioonnss │ │ │ │ │ +template │ │ │ │ │ +unspecified value type  _D_u_n_e_:_:_r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t (T &&... t) │ │ │ │ │ +  Returns a reference element for the objects t.... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto  _D_u_n_e_:_:_r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t (const _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e >, │ │ │ │ │ + _D_u_n_e_:_:_D_i_m< dim >={}) │ │ │ │ │ +  Returns a reference element of dimension dim for the │ │ │ │ │ + given geometry type and coordinate field type. │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +>::value, int > = 0> │ │ │ │ │ + auto  _D_u_n_e_:_:_r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t (const T &, const _D_u_n_e_:_: │ │ │ │ │ + _G_e_o_m_e_t_r_y_T_y_p_e >, _D_u_n_e_:_:_D_i_m< dim >) │ │ │ │ │ +  Returns a reference element of dimension dim for the │ │ │ │ │ + given geometry type and coordinate field type. │ │ │ │ │ +  │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00242_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: referenceelement.hh Source File │ │ │ │ +dune-geometry: referenceelements.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,261 +74,317 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
referenceelement.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 © 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_REFERENCEELEMENTS_HH
│ │ │ │ +
6#define DUNE_GEOMETRY_REFERENCEELEMENTS_HH
│ │ │ │
7
│ │ │ │ - │ │ │ │ +
8#include <cassert>
│ │ │ │
9
│ │ │ │ -
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
│ │ │ │ -
19 }
│ │ │ │ +
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
│ │ │ │ -
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;
│ │ │ │ + │ │ │ │ +
22#include <dune/geometry/type.hh>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
25
│ │ │ │ +
26namespace Dune
│ │ │ │ +
27{
│ │ │ │
28
│ │ │ │ -
29 // ReferenceElement
│ │ │ │ -
30 // ----------------
│ │ │ │ +
29 namespace Geo
│ │ │ │ +
30 {
│ │ │ │
31
│ │ │ │ -
50 template<typename Implementation>
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
52 {
│ │ │ │ +
32#ifndef DOXYGEN
│ │ │ │ +
33
│ │ │ │ +
34
│ │ │ │ +
35 namespace Impl
│ │ │ │ +
36 {
│ │ │ │ +
37
│ │ │ │ +
38 // ReferenceElementContainer
│ │ │ │ +
39 // -------------------------
│ │ │ │ +
40
│ │ │ │ +
41 template< class ctype, int dim >
│ │ │ │ +
42 class ReferenceElementContainer
│ │ │ │ +
43 {
│ │ │ │ +
44 static const unsigned int numTopologies = dim >= 0 ? (1u << dim) : 0;
│ │ │ │ +
45
│ │ │ │ +
46 using Implementation = ReferenceElementImplementation< ctype, dim >;
│ │ │ │ +
47
│ │ │ │ +
48 public:
│ │ │ │ +
49
│ │ │ │ +
50 using ReferenceElement = Dune::Geo::ReferenceElement< Implementation >;
│ │ │ │ +
51 using value_type = ReferenceElement;
│ │ │ │ +
52 using const_iterator = const value_type*;
│ │ │ │
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
│ │ │ │ +
54 ReferenceElementContainer ()
│ │ │ │ +
55 {
│ │ │ │ +
56 for( unsigned int topologyId = 0; topologyId < numTopologies; ++topologyId )
│ │ │ │ +
57 {
│ │ │ │ +
58 implementations_[ topologyId ].initialize( topologyId );
│ │ │ │ +
59 reference_elements_[ topologyId ].setImplementation( implementations_[ topologyId ] );
│ │ │ │ +
60 }
│ │ │ │ +
61 }
│ │ │ │ +
62
│ │ │ │ +
63 const ReferenceElement& operator() ( const GeometryType &type ) const
│ │ │ │ +
64 {
│ │ │ │ +
65 assert( type.dim() == dim );
│ │ │ │ +
66 return reference_elements_[ type.id() ];
│ │ │ │ +
67 }
│ │ │ │ +
68
│ │ │ │ +
69 const ReferenceElement& simplex () const
│ │ │ │ +
70 {
│ │ │ │ +
71 return reference_elements_[ Dune::GeometryTypes::simplex(dim).id() ];
│ │ │ │ +
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;
│ │ │ │ +
74 const ReferenceElement& cube () const
│ │ │ │ +
75 {
│ │ │ │ +
76 return reference_elements_[ Dune::GeometryTypes::cube(dim).id() ];
│ │ │ │ +
77 }
│ │ │ │ +
78
│ │ │ │ +
79 const ReferenceElement& pyramid () const
│ │ │ │ +
80 {
│ │ │ │ +
81 return reference_elements_[ Dune::GeometryTypes::pyramid.id() ];
│ │ │ │ +
82 }
│ │ │ │ +
83
│ │ │ │ +
84 const ReferenceElement& prism () const
│ │ │ │ +
85 {
│ │ │ │ +
86 return reference_elements_[ Dune::GeometryTypes::prism.id() ];
│ │ │ │ +
87 }
│ │ │ │
88
│ │ │ │ -
89
│ │ │ │ -
│ │ │ │ -
94 int size(int c) const
│ │ │ │ -
95 {
│ │ │ │ -
96 return _impl->size(c);
│ │ │ │ -
97 }
│ │ │ │ -
│ │ │ │ +
89 const_iterator begin () const
│ │ │ │ +
90 {
│ │ │ │ +
91 return reference_elements_.data();
│ │ │ │ +
92 }
│ │ │ │ +
93
│ │ │ │ +
94 const_iterator end () const
│ │ │ │ +
95 {
│ │ │ │ +
96 return reference_elements_.data() + numTopologies;
│ │ │ │ +
97 }
│ │ │ │
98
│ │ │ │ -
99
│ │ │ │ -
│ │ │ │ -
111 int size(int i, int c, int cc) const
│ │ │ │ -
112 {
│ │ │ │ -
113 return _impl->size(i,c,cc);
│ │ │ │ -
114 }
│ │ │ │ -
│ │ │ │ +
99 private:
│ │ │ │ +
100
│ │ │ │ +
101 std::array<Implementation,numTopologies> implementations_;
│ │ │ │ +
102 std::array<ReferenceElement,numTopologies> reference_elements_;
│ │ │ │ +
103
│ │ │ │ +
104 };
│ │ │ │ +
105
│ │ │ │ +
106
│ │ │ │ +
107 } // namespace Impl
│ │ │ │ +
108
│ │ │ │ +
109
│ │ │ │ +
110#endif // DOXYGEN
│ │ │ │ +
111
│ │ │ │ +
112
│ │ │ │ +
113 // ReferenceElements
│ │ │ │ +
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
│ │ │ │ -
│ │ │ │ -
167 GeometryType type(int i, int c) const
│ │ │ │ -
168 {
│ │ │ │ -
169 return _impl->type(i,c);
│ │ │ │ -
170 }
│ │ │ │ +
126 template< class ctype_, int dim >
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
128 {
│ │ │ │ +
129
│ │ │ │ +
131 using ctype = ctype_;
│ │ │ │ +
132
│ │ │ │ + │ │ │ │ +
135
│ │ │ │ +
137 static constexpr int dimension = dim;
│ │ │ │ +
138
│ │ │ │ +
139 private:
│ │ │ │ +
140
│ │ │ │ +
141 using Container = Impl::ReferenceElementContainer< ctype, dim >;
│ │ │ │ +
142
│ │ │ │ +
143 public:
│ │ │ │ +
144
│ │ │ │ +
146 using ReferenceElement = typename Container::ReferenceElement;
│ │ │ │ +
147
│ │ │ │ +
149 using Iterator = typename Container::const_iterator;
│ │ │ │ +
150
│ │ │ │ + │ │ │ │ +
153
│ │ │ │ +
155 static const ReferenceElement&
│ │ │ │ +
│ │ │ │ +
156 general ( const GeometryType& type )
│ │ │ │ +
157 {
│ │ │ │ +
158 return container() ( type );
│ │ │ │ +
159 }
│ │ │ │ +
│ │ │ │ +
160
│ │ │ │ +
│ │ │ │ +
162 static const ReferenceElement& simplex ()
│ │ │ │ +
163 {
│ │ │ │ +
164 return container().simplex();
│ │ │ │ +
165 }
│ │ │ │ +
│ │ │ │ +
166
│ │ │ │ +
│ │ │ │ +
168 static const ReferenceElement& cube ()
│ │ │ │ +
169 {
│ │ │ │ +
170 return container().cube();
│ │ │ │ +
171 }
│ │ │ │
│ │ │ │ -
171
│ │ │ │
172
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
176 {
│ │ │ │ -
177 return _impl->type();
│ │ │ │ -
178 }
│ │ │ │ -
│ │ │ │ -
179
│ │ │ │ -
180
│ │ │ │ -
│ │ │ │ -
190 Coordinate position(int i, int c) const
│ │ │ │ -
191 {
│ │ │ │ -
192 return _impl->position(i,c);
│ │ │ │ -
193 }
│ │ │ │ -
│ │ │ │ -
194
│ │ │ │ -
195
│ │ │ │ -
│ │ │ │ -
203 bool checkInside(const Coordinate& local) const
│ │ │ │ -
204 {
│ │ │ │ -
205 return _impl->checkInside(local);
│ │ │ │ -
206 }
│ │ │ │ -
│ │ │ │ -
207
│ │ │ │ -
208
│ │ │ │ -
220 template<int codim>
│ │ │ │ -
│ │ │ │ -
221 typename Codim<codim>::Geometry geometry(int i) const
│ │ │ │ -
222 {
│ │ │ │ -
223 return _impl->template geometry<codim>(i);
│ │ │ │ -
224 }
│ │ │ │ -
│ │ │ │ -
225
│ │ │ │ -
226
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
229 {
│ │ │ │ -
230 return _impl->volume();
│ │ │ │ -
231 }
│ │ │ │ -
│ │ │ │ -
232
│ │ │ │ -
233
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
242 {
│ │ │ │ -
243 return _impl->integrationOuterNormal(face);
│ │ │ │ -
244 }
│ │ │ │ -
│ │ │ │ -
245
│ │ │ │ +
│ │ │ │ +
173 static Iterator begin ()
│ │ │ │ +
174 {
│ │ │ │ +
175 return container().begin();
│ │ │ │ +
176 }
│ │ │ │ +
│ │ │ │ +
177
│ │ │ │ +
│ │ │ │ +
178 static Iterator end ()
│ │ │ │ +
179 {
│ │ │ │ +
180 return container().end();
│ │ │ │ +
181 }
│ │ │ │ +
│ │ │ │ +
182
│ │ │ │ +
183 private:
│ │ │ │ +
184
│ │ │ │ +
185 DUNE_EXPORT static const Container& container ()
│ │ │ │ +
186 {
│ │ │ │ +
187 static Container container;
│ │ │ │ +
188 return container;
│ │ │ │ +
189 }
│ │ │ │ +
190 };
│ │ │ │ +
│ │ │ │ +
191
│ │ │ │ +
192 } // namespace Geo
│ │ │ │ +
193
│ │ │ │ +
195 using Geo::ReferenceElements;
│ │ │ │ +
196
│ │ │ │ +
197
│ │ │ │ +
198#ifdef DOXYGEN
│ │ │ │ +
199
│ │ │ │ +
201
│ │ │ │ +
244 template<typename... T>
│ │ │ │ +
245 unspecified-value-type referenceElement(T&&... t);
│ │ │ │
246
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
255 : _impl(nullptr)
│ │ │ │ -
256 {}
│ │ │ │ -
│ │ │ │ -
257
│ │ │ │ -
│ │ │ │ -
263 const Implementation& impl() const
│ │ │ │ -
264 {
│ │ │ │ -
265 return *_impl;
│ │ │ │ -
266 }
│ │ │ │ -
│ │ │ │ -
267
│ │ │ │ -
│ │ │ │ -
269 bool operator==(const ReferenceElement& r) const
│ │ │ │ -
270 {
│ │ │ │ -
271 return _impl == r._impl;
│ │ │ │ -
272 }
│ │ │ │ -
│ │ │ │ -
273
│ │ │ │ -
│ │ │ │ -
275 bool operator!=(const ReferenceElement& r) const
│ │ │ │ -
276 {
│ │ │ │ -
277 return not (*this == r);
│ │ │ │ -
278 }
│ │ │ │ -
│ │ │ │ -
279
│ │ │ │ -
│ │ │ │ -
281 friend std::size_t hash_value(const ReferenceElement& r)
│ │ │ │ -
282 {
│ │ │ │ -
283 return reinterpret_cast<std::size_t>(r._impl);
│ │ │ │ -
284 }
│ │ │ │ -
│ │ │ │ -
285
│ │ │ │ -
286 private:
│ │ │ │ -
287
│ │ │ │ -
288 // The implementation must be a friend to construct a wrapper around itself.
│ │ │ │ -
289 friend Implementation;
│ │ │ │ +
247#endif
│ │ │ │ +
248
│ │ │ │ +
249
│ │ │ │ +
251
│ │ │ │ +
264 template<typename T, int dim>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
266 {
│ │ │ │ + │ │ │ │ +
268 }
│ │ │ │ +
│ │ │ │ +
269
│ │ │ │ +
270
│ │ │ │ +
272
│ │ │ │ +
284 template<typename T, int dim, std::enable_if_t<IsNumber<std::decay_t<T>>::value, int> = 0>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
286 {
│ │ │ │ + │ │ │ │ +
288 }
│ │ │ │ +
│ │ │ │ +
289
│ │ │ │
290
│ │ │ │ -
291 // The reference container is a friend to be able to call setImplementation.
│ │ │ │ -
292 friend class Impl::ReferenceElementContainer<ctype,dimension>;
│ │ │ │ -
293
│ │ │ │ -
294 // Constructor for wrapping an implementation reference (required internally by the default implementation)
│ │ │ │ -
295 ReferenceElement(const Implementation& impl)
│ │ │ │ -
296 : _impl(&impl)
│ │ │ │ -
297 {}
│ │ │ │ -
298
│ │ │ │ -
299 void setImplementation(const Implementation& impl)
│ │ │ │ -
300 {
│ │ │ │ -
301 _impl = &impl;
│ │ │ │ -
302 }
│ │ │ │ +
291#ifndef DOXYGEN
│ │ │ │ +
292
│ │ │ │ +
293 // helpers for the ReferenceElement<> meta function
│ │ │ │ +
294 // the complete Impl block can be removed together with deprecated Transitional::ReferenceElement
│ │ │ │ +
295
│ │ │ │ +
296 namespace Impl {
│ │ │ │ +
297
│ │ │ │ +
298 // Evaluates to the correct reference element iff <T...> matches the pattern <number_type,Dim<int>>
│ │ │ │ +
299 // otherwise, it's ill-formed. Should be used with detected_or and friends.
│ │ │ │ +
300
│ │ │ │ +
301 template<typename... T>
│ │ │ │ +
302 struct DefaultReferenceElementExtractor;
│ │ │ │
303
│ │ │ │ -
304 const Implementation* _impl;
│ │ │ │ -
305
│ │ │ │ -
306 };
│ │ │ │ -
│ │ │ │ -
307
│ │ │ │ -
308 }
│ │ │ │ +
304 template<typename T, typename std::enable_if<IsNumber<T>::value,int>::type dim>
│ │ │ │ +
305 struct DefaultReferenceElementExtractor<T,Dim<dim>>
│ │ │ │ +
306 {
│ │ │ │ + │ │ │ │ +
308 };
│ │ │ │
309
│ │ │ │ -
310}
│ │ │ │ -
311
│ │ │ │ +
310 template<typename... T>
│ │ │ │ +
311 using DefaultReferenceElement = typename DefaultReferenceElementExtractor<T...>::type;
│ │ │ │
312
│ │ │ │ -
313#endif // DUNE_GEOMETRY_REFERENCEELEMENT_HH
│ │ │ │ -
A unique label for each type of element that can occur in a grid.
│ │ │ │ +
313 }
│ │ │ │ +
314
│ │ │ │ +
315 // looks up the type of a reference element by trying to instantiate the correct overload
│ │ │ │ +
316 // of referenceElement() for the given arguments. This will fail if there is no valid
│ │ │ │ +
317 // overload and should be used with detected_or or some other utility that places the
│ │ │ │ +
318 // instantiation in SFINAE context.
│ │ │ │ +
319 //
│ │ │ │ +
320 // this is placed directly in namespace Dune to avoid any weird surprises
│ │ │ │ +
321
│ │ │ │ +
322 template<typename... T>
│ │ │ │ +
323 using LookupReferenceElement = decltype(referenceElement(std::declval<T>()...));
│ │ │ │ +
324
│ │ │ │ +
325#endif // DOXYGEN
│ │ │ │ +
326
│ │ │ │ +
│ │ │ │ +
327 namespace [[deprecated]] Transitional {
│ │ │ │ +
328
│ │ │ │ +
329 // this abomination checks whether the template signature matches the special case
│ │ │ │ +
330 // ReferenceElement<number_type,Dune::Dim<int>> and otherwise defers the type lookup
│ │ │ │ +
331 // to a decltype on a call to referenceElement(std::declval<T>())
│ │ │ │ +
332
│ │ │ │ +
337 template<typename... T>
│ │ │ │ +
338 using ReferenceElement = detected_or_fallback_t<
│ │ │ │ +
339 Impl::DefaultReferenceElement,
│ │ │ │ +
340 LookupReferenceElement,
│ │ │ │ +
341 T...
│ │ │ │ +
342 >;
│ │ │ │ +
343
│ │ │ │ +
344 }
│ │ │ │ +
│ │ │ │ +
345
│ │ │ │ +
346 template<typename... T>
│ │ │ │ +
347 using ReferenceElement = decltype(referenceElement(std::declval<T>()...));
│ │ │ │ +
348
│ │ │ │ +
349} // namespace Dune
│ │ │ │ +
350
│ │ │ │ +
351#endif // #ifndef DUNE_GEOMETRY_REFERENCEELEMENTS_HH
│ │ │ │ + │ │ │ │ +
A unique label for each type of element that can occur in a grid.
│ │ │ │ + │ │ │ │ + │ │ │ │ +
unspecified value type referenceElement(T &&... t)
Returns a reference element for the objects t....
│ │ │ │
Definition affinegeometry.hh:21
│ │ │ │ +
decltype(referenceElement(std::declval< T >()...)) ReferenceElement
Definition referenceelements.hh:347
│ │ │ │
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:228
│ │ │ │ -
GeometryType type(int i, int c) const
obtain the type of subentity (i,c)
Definition referenceelement.hh:167
│ │ │ │ -
ReferenceElement()
Constructs an empty reference element.
Definition referenceelement.hh:254
│ │ │ │ -
bool operator!=(const ReferenceElement &r) const
Compares for inequality with another reference element.
Definition referenceelement.hh:275
│ │ │ │ -
Coordinate position(int i, int c) const
position of the barycenter of entity (i,c)
Definition referenceelement.hh:190
│ │ │ │ -
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:221
│ │ │ │ -
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
│ │ │ │ -
GeometryType type() const
obtain the type of this reference element
Definition referenceelement.hh:175
│ │ │ │ -
const Implementation & impl() const
Returns a reference to the internal implementation object.
Definition referenceelement.hh:263
│ │ │ │ -
bool checkInside(const Coordinate &local) const
check if a coordinate is in the reference element
Definition referenceelement.hh:203
│ │ │ │ -
Coordinate integrationOuterNormal(int face) const
obtain the integration outer normal of the reference element
Definition referenceelement.hh:241
│ │ │ │ -
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:269
│ │ │ │ -
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:281
│ │ │ │ -
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
│ │ │ │ +
Class providing access to the singletons of the reference elements.
Definition referenceelements.hh:128
│ │ │ │ +
static Iterator begin()
Definition referenceelements.hh:173
│ │ │ │ +
Iterator iterator
Iterator over available reference elements.
Definition referenceelements.hh:152
│ │ │ │ +
typename Container::ReferenceElement ReferenceElement
The reference element type.
Definition referenceelements.hh:146
│ │ │ │ +
static const ReferenceElement & cube()
get hypercube reference elements
Definition referenceelements.hh:168
│ │ │ │ +
static Iterator end()
Definition referenceelements.hh:178
│ │ │ │ +
ctype_ ctype
The coordinate field type of the contained reference elements.
Definition referenceelements.hh:131
│ │ │ │ +
static const ReferenceElement & general(const GeometryType &type)
get general reference elements
Definition referenceelements.hh:156
│ │ │ │ +
static const ReferenceElement & simplex()
get simplex reference elements
Definition referenceelements.hh:162
│ │ │ │ +
typename Container::const_iterator Iterator
Iterator over available reference elements.
Definition referenceelements.hh:149
│ │ │ │ +
static constexpr int dimension
The dimension of the contained reference elements.
Definition referenceelements.hh:137
│ │ │ │ +
ctype CoordinateField
The coordinate field type of the contained reference elements.
Definition referenceelements.hh:134
│ │ │ │ +
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:114
│ │ │ │ +
constexpr unsigned int id() const
Return the topology id of the type.
Definition type.hh:365
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,297 +1,356 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -referenceelement.hh │ │ │ │ │ +referenceelements.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 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 © 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_REFERENCEELEMENTS_HH │ │ │ │ │ +6#define DUNE_GEOMETRY_REFERENCEELEMENTS_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ +8#include │ │ │ │ │ 9 │ │ │ │ │ -10namespace _D_u_n_e { │ │ │ │ │ -11 namespace Geo { │ │ │ │ │ -12 │ │ │ │ │ -13 namespace Impl { │ │ │ │ │ -14 │ │ │ │ │ -15 // forward declaration for friend declaration │ │ │ │ │ -16 template │ │ │ │ │ -17 class ReferenceElementContainer; │ │ │ │ │ -18 │ │ │ │ │ -19 } │ │ │ │ │ +10#include │ │ │ │ │ +11#include │ │ │ │ │ +12#include │ │ │ │ │ +13#include │ │ │ │ │ +14#include │ │ │ │ │ +15#include │ │ │ │ │ +16 │ │ │ │ │ +17#include │ │ │ │ │ +18#include │ │ │ │ │ +19#include │ │ │ │ │ 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; │ │ │ │ │ +21#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_d_i_m_e_n_s_i_o_n_._h_h> │ │ │ │ │ +22#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ +23#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_._h_h> │ │ │ │ │ +24#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_i_m_p_l_e_m_e_n_t_a_t_i_o_n_._h_h> │ │ │ │ │ +25 │ │ │ │ │ +26namespace _D_u_n_e │ │ │ │ │ +27{ │ │ │ │ │ 28 │ │ │ │ │ -29 // ReferenceElement │ │ │ │ │ -30 // ---------------- │ │ │ │ │ +29 namespace Geo │ │ │ │ │ +30 { │ │ │ │ │ 31 │ │ │ │ │ -50 template │ │ │ │ │ -_5_1 class _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ -52 { │ │ │ │ │ +32#ifndef DOXYGEN │ │ │ │ │ +33 │ │ │ │ │ +34 │ │ │ │ │ +35 namespace Impl │ │ │ │ │ +36 { │ │ │ │ │ +37 │ │ │ │ │ +38 // ReferenceElementContainer │ │ │ │ │ +39 // ------------------------- │ │ │ │ │ +40 │ │ │ │ │ +41 template< class ctype, int dim > │ │ │ │ │ +42 class ReferenceElementContainer │ │ │ │ │ +43 { │ │ │ │ │ +44 static const unsigned int numTopologies = dim >= 0 ? (1u << dim) : 0; │ │ │ │ │ +45 │ │ │ │ │ +46 using Implementation = ReferenceElementImplementation< ctype, dim >; │ │ │ │ │ +47 │ │ │ │ │ +48 public: │ │ │ │ │ +49 │ │ │ │ │ +50 using ReferenceElement = _D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_<_ _I_m_p_l_e_m_e_n_t_a_t_i_o_n_ _>; │ │ │ │ │ +51 using value_type = ReferenceElement; │ │ │ │ │ +52 using const_iterator = const value_type*; │ │ │ │ │ 53 │ │ │ │ │ -54 public: │ │ │ │ │ -55 │ │ │ │ │ -56#ifndef DOXYGEN │ │ │ │ │ -57 │ │ │ │ │ -59 template │ │ │ │ │ -60 using _C_o_d_i_m = typename Implementation::template _C_o_d_i_m_<_c_o_d_i_m_>; │ │ │ │ │ -61 │ │ │ │ │ -62#else │ │ │ │ │ -63 │ │ │ │ │ -65 template< int codim > │ │ │ │ │ -_6_6 struct _C_o_d_i_m │ │ │ │ │ -67 { │ │ │ │ │ -_6_9 using _G_e_o_m_e_t_r_y = implementation-defined; │ │ │ │ │ -70 }; │ │ │ │ │ -71 │ │ │ │ │ -72#endif // DOXYGEN │ │ │ │ │ +54 ReferenceElementContainer () │ │ │ │ │ +55 { │ │ │ │ │ +56 for( unsigned int topologyId = 0; topologyId < numTopologies; ++topologyId ) │ │ │ │ │ +57 { │ │ │ │ │ +58 implementations_[ topologyId ].initialize( topologyId ); │ │ │ │ │ +59 reference_elements_[ topologyId ].setImplementation( implementations_ │ │ │ │ │ +[ topologyId ] ); │ │ │ │ │ +60 } │ │ │ │ │ +61 } │ │ │ │ │ +62 │ │ │ │ │ +63 const ReferenceElement& operator() ( const GeometryType &type ) const │ │ │ │ │ +64 { │ │ │ │ │ +65 assert( type.dim() == dim ); │ │ │ │ │ +66 return reference_elements_[ type.id() ]; │ │ │ │ │ +67 } │ │ │ │ │ +68 │ │ │ │ │ +69 const ReferenceElement& simplex () const │ │ │ │ │ +70 { │ │ │ │ │ +71 return reference_elements_[ Dune::GeometryTypes::simplex(dim)._i_d() ]; │ │ │ │ │ +72 } │ │ │ │ │ 73 │ │ │ │ │ -_7_5 using _c_t_y_p_e = typename Implementation::ctype; │ │ │ │ │ -76 │ │ │ │ │ -_7_8 using _C_o_o_r_d_i_n_a_t_e_F_i_e_l_d = _c_t_y_p_e; │ │ │ │ │ -79 │ │ │ │ │ -_8_1 using _C_o_o_r_d_i_n_a_t_e = typename Implementation::Coordinate; │ │ │ │ │ -82 │ │ │ │ │ -_8_4 typedef _c_t_y_p_e _V_o_l_u_m_e; │ │ │ │ │ -85 │ │ │ │ │ -_8_7 static constexpr int _d_i_m_e_n_s_i_o_n = Implementation::dimension; │ │ │ │ │ +74 const ReferenceElement& cube () const │ │ │ │ │ +75 { │ │ │ │ │ +76 return reference_elements_[ Dune::GeometryTypes::cube(dim)._i_d() ]; │ │ │ │ │ +77 } │ │ │ │ │ +78 │ │ │ │ │ +79 const ReferenceElement& pyramid () const │ │ │ │ │ +80 { │ │ │ │ │ +81 return reference_elements_[ Dune::GeometryTypes::pyramid._i_d() ]; │ │ │ │ │ +82 } │ │ │ │ │ +83 │ │ │ │ │ +84 const ReferenceElement& prism () const │ │ │ │ │ +85 { │ │ │ │ │ +86 return reference_elements_[ Dune::GeometryTypes::prism._i_d() ]; │ │ │ │ │ +87 } │ │ │ │ │ 88 │ │ │ │ │ -89 │ │ │ │ │ -_9_4 int _s_i_z_e(int c) const │ │ │ │ │ +89 const_iterator begin () const │ │ │ │ │ +90 { │ │ │ │ │ +91 return reference_elements_.data(); │ │ │ │ │ +92 } │ │ │ │ │ +93 │ │ │ │ │ +94 const_iterator end () const │ │ │ │ │ 95 { │ │ │ │ │ -96 return _impl->size(c); │ │ │ │ │ +96 return reference_elements_.data() + numTopologies; │ │ │ │ │ 97 } │ │ │ │ │ 98 │ │ │ │ │ -99 │ │ │ │ │ -_1_1_1 int _s_i_z_e(int i, int c, int cc) const │ │ │ │ │ -112 { │ │ │ │ │ -113 return _impl->size(i,c,cc); │ │ │ │ │ -114 } │ │ │ │ │ +99 private: │ │ │ │ │ +100 │ │ │ │ │ +101 std::array implementations_; │ │ │ │ │ +102 std::array reference_elements_; │ │ │ │ │ +103 │ │ │ │ │ +104 }; │ │ │ │ │ +105 │ │ │ │ │ +106 │ │ │ │ │ +107 } // namespace Impl │ │ │ │ │ +108 │ │ │ │ │ +109 │ │ │ │ │ +110#endif // DOXYGEN │ │ │ │ │ +111 │ │ │ │ │ +112 │ │ │ │ │ +113 // ReferenceElements │ │ │ │ │ +114 // ------------------------ │ │ │ │ │ 115 │ │ │ │ │ -116 │ │ │ │ │ -_1_3_0 int _s_u_b_E_n_t_i_t_y(int i, int c, int ii, int cc) const │ │ │ │ │ -131 { │ │ │ │ │ -132 return _impl->subEntity(i,c,ii,cc); │ │ │ │ │ -133 } │ │ │ │ │ -134 │ │ │ │ │ -_1_5_3 auto _s_u_b_E_n_t_i_t_i_e_s ( int i, int c, int cc ) const │ │ │ │ │ -154 { │ │ │ │ │ -155 return _impl->subEntities(i,c,cc); │ │ │ │ │ -156 } │ │ │ │ │ -157 │ │ │ │ │ -158 │ │ │ │ │ -_1_6_7 _G_e_o_m_e_t_r_y_T_y_p_e _t_y_p_e(int i, int c) const │ │ │ │ │ -168 { │ │ │ │ │ -169 return _impl->type(i,c); │ │ │ │ │ -170 } │ │ │ │ │ -171 │ │ │ │ │ +126 template< class ctype_, int dim > │ │ │ │ │ +_1_2_7 struct _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s │ │ │ │ │ +128 { │ │ │ │ │ +129 │ │ │ │ │ +_1_3_1 using _c_t_y_p_e = ctype_; │ │ │ │ │ +132 │ │ │ │ │ +_1_3_4 using _C_o_o_r_d_i_n_a_t_e_F_i_e_l_d = _c_t_y_p_e; │ │ │ │ │ +135 │ │ │ │ │ +_1_3_7 static constexpr int _d_i_m_e_n_s_i_o_n = dim; │ │ │ │ │ +138 │ │ │ │ │ +139 private: │ │ │ │ │ +140 │ │ │ │ │ +141 using Container = Impl::ReferenceElementContainer< ctype, dim >; │ │ │ │ │ +142 │ │ │ │ │ +143 public: │ │ │ │ │ +144 │ │ │ │ │ +_1_4_6 using _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t = typename Container::ReferenceElement; │ │ │ │ │ +147 │ │ │ │ │ +_1_4_9 using _I_t_e_r_a_t_o_r = typename Container::const_iterator; │ │ │ │ │ +150 │ │ │ │ │ +_1_5_2 using _i_t_e_r_a_t_o_r = _I_t_e_r_a_t_o_r; │ │ │ │ │ +153 │ │ │ │ │ +155 static const _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t& │ │ │ │ │ +_1_5_6 _g_e_n_e_r_a_l ( const _G_e_o_m_e_t_r_y_T_y_p_e& type ) │ │ │ │ │ +157 { │ │ │ │ │ +158 return container() ( type ); │ │ │ │ │ +159 } │ │ │ │ │ +160 │ │ │ │ │ +_1_6_2 static const _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t& _s_i_m_p_l_e_x () │ │ │ │ │ +163 { │ │ │ │ │ +164 return container().simplex(); │ │ │ │ │ +165 } │ │ │ │ │ +166 │ │ │ │ │ +_1_6_8 static const _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t& _c_u_b_e () │ │ │ │ │ +169 { │ │ │ │ │ +170 return container().cube(); │ │ │ │ │ +171 } │ │ │ │ │ 172 │ │ │ │ │ -_1_7_5 _G_e_o_m_e_t_r_y_T_y_p_e _t_y_p_e() const │ │ │ │ │ -176 { │ │ │ │ │ -177 return _impl->type(); │ │ │ │ │ -178 } │ │ │ │ │ -179 │ │ │ │ │ -180 │ │ │ │ │ -_1_9_0 _C_o_o_r_d_i_n_a_t_e _p_o_s_i_t_i_o_n(int i, int c) const │ │ │ │ │ -191 { │ │ │ │ │ -192 return _impl->position(i,c); │ │ │ │ │ -193 } │ │ │ │ │ -194 │ │ │ │ │ -195 │ │ │ │ │ -_2_0_3 bool _c_h_e_c_k_I_n_s_i_d_e(const _C_o_o_r_d_i_n_a_t_e& local) const │ │ │ │ │ -204 { │ │ │ │ │ -205 return _impl->checkInside(local); │ │ │ │ │ -206 } │ │ │ │ │ -207 │ │ │ │ │ -208 │ │ │ │ │ -220 template │ │ │ │ │ -_2_2_1 typename _C_o_d_i_m_<_c_o_d_i_m_>_:_:_G_e_o_m_e_t_r_y _g_e_o_m_e_t_r_y(int i) const │ │ │ │ │ -222 { │ │ │ │ │ -223 return _impl->template geometry(i); │ │ │ │ │ -224 } │ │ │ │ │ -225 │ │ │ │ │ -226 │ │ │ │ │ -_2_2_8 _C_o_o_r_d_i_n_a_t_e_F_i_e_l_d _v_o_l_u_m_e() const │ │ │ │ │ -229 { │ │ │ │ │ -230 return _impl->volume(); │ │ │ │ │ -231 } │ │ │ │ │ -232 │ │ │ │ │ -233 │ │ │ │ │ -_2_4_1 _C_o_o_r_d_i_n_a_t_e _i_n_t_e_g_r_a_t_i_o_n_O_u_t_e_r_N_o_r_m_a_l(int face) const │ │ │ │ │ -242 { │ │ │ │ │ -243 return _impl->integrationOuterNormal(face); │ │ │ │ │ -244 } │ │ │ │ │ -245 │ │ │ │ │ +_1_7_3 static _I_t_e_r_a_t_o_r _b_e_g_i_n () │ │ │ │ │ +174 { │ │ │ │ │ +175 return container().begin(); │ │ │ │ │ +176 } │ │ │ │ │ +177 │ │ │ │ │ +_1_7_8 static _I_t_e_r_a_t_o_r _e_n_d () │ │ │ │ │ +179 { │ │ │ │ │ +180 return container().end(); │ │ │ │ │ +181 } │ │ │ │ │ +182 │ │ │ │ │ +183 private: │ │ │ │ │ +184 │ │ │ │ │ +185 DUNE_EXPORT static const Container& container () │ │ │ │ │ +186 { │ │ │ │ │ +187 static Container container; │ │ │ │ │ +188 return container; │ │ │ │ │ +189 } │ │ │ │ │ +190 }; │ │ │ │ │ +191 │ │ │ │ │ +192 } // namespace Geo │ │ │ │ │ +193 │ │ │ │ │ +195 using Geo::ReferenceElements; │ │ │ │ │ +196 │ │ │ │ │ +197 │ │ │ │ │ +198#ifdef DOXYGEN │ │ │ │ │ +199 │ │ │ │ │ +201 │ │ │ │ │ +244 template │ │ │ │ │ +_2_4_5 unspecified-value-type _r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t(T&&... t); │ │ │ │ │ 246 │ │ │ │ │ -_2_5_4 _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t() │ │ │ │ │ -255 : _impl(nullptr) │ │ │ │ │ -256 {} │ │ │ │ │ -257 │ │ │ │ │ -_2_6_3 const Implementation& _i_m_p_l() const │ │ │ │ │ -264 { │ │ │ │ │ -265 return *_impl; │ │ │ │ │ -266 } │ │ │ │ │ -267 │ │ │ │ │ -_2_6_9 bool _o_p_e_r_a_t_o_r_=_=(const _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t& r) const │ │ │ │ │ -270 { │ │ │ │ │ -271 return _impl == r._impl; │ │ │ │ │ -272 } │ │ │ │ │ -273 │ │ │ │ │ -_2_7_5 bool _o_p_e_r_a_t_o_r_!_=(const _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t& r) const │ │ │ │ │ -276 { │ │ │ │ │ -277 return not (*this == r); │ │ │ │ │ -278 } │ │ │ │ │ -279 │ │ │ │ │ -_2_8_1 friend std::size_t _h_a_s_h___v_a_l_u_e(const _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t& r) │ │ │ │ │ -282 { │ │ │ │ │ -283 return reinterpret_cast(r._impl); │ │ │ │ │ -284 } │ │ │ │ │ -285 │ │ │ │ │ -286 private: │ │ │ │ │ -287 │ │ │ │ │ -288 // The implementation must be a friend to construct a wrapper around │ │ │ │ │ -itself. │ │ │ │ │ -289 friend Implementation; │ │ │ │ │ +247#endif │ │ │ │ │ +248 │ │ │ │ │ +249 │ │ │ │ │ +251 │ │ │ │ │ +264 template │ │ │ │ │ +_2_6_5 auto _r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t(const _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e& gt, _D_u_n_e_:_:_D_i_m_<_d_i_m_> = {}) │ │ │ │ │ +266 { │ │ │ │ │ +267 return _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_<_T_,_d_i_m_>_:_:_g_e_n_e_r_a_l(gt); │ │ │ │ │ +268 } │ │ │ │ │ +269 │ │ │ │ │ +270 │ │ │ │ │ +272 │ │ │ │ │ +284 template>:: │ │ │ │ │ +value, int> = 0> │ │ │ │ │ +_2_8_5 auto _r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t(const T&, const _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e& gt, _D_u_n_e_:_: │ │ │ │ │ +_D_i_m_<_d_i_m_>) │ │ │ │ │ +286 { │ │ │ │ │ +287 return _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_<_T_,_d_i_m_>_:_:_g_e_n_e_r_a_l(gt); │ │ │ │ │ +288 } │ │ │ │ │ +289 │ │ │ │ │ 290 │ │ │ │ │ -291 // The reference container is a friend to be able to call │ │ │ │ │ -setImplementation. │ │ │ │ │ -292 friend class Impl::ReferenceElementContainer<_c_t_y_p_e,_d_i_m_e_n_s_i_o_n>; │ │ │ │ │ -293 │ │ │ │ │ -294 // Constructor for wrapping an implementation reference (required │ │ │ │ │ -internally by the default implementation) │ │ │ │ │ -295 _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t(const Implementation& _i_m_p_l) │ │ │ │ │ -296 : _impl(&_i_m_p_l) │ │ │ │ │ -297 {} │ │ │ │ │ -298 │ │ │ │ │ -299 void setImplementation(const Implementation& _i_m_p_l) │ │ │ │ │ -300 { │ │ │ │ │ -301 _impl = &_i_m_p_l; │ │ │ │ │ -302 } │ │ │ │ │ +291#ifndef DOXYGEN │ │ │ │ │ +292 │ │ │ │ │ +293 // helpers for the ReferenceElement<> meta function │ │ │ │ │ +294 // the complete Impl block can be removed together with deprecated │ │ │ │ │ +Transitional::ReferenceElement │ │ │ │ │ +295 │ │ │ │ │ +296 namespace Impl { │ │ │ │ │ +297 │ │ │ │ │ +298 // Evaluates to the correct reference element iff matches the │ │ │ │ │ +pattern > │ │ │ │ │ +299 // otherwise, it's ill-formed. Should be used with detected_or and friends. │ │ │ │ │ +300 │ │ │ │ │ +301 template │ │ │ │ │ +302 struct DefaultReferenceElementExtractor; │ │ │ │ │ 303 │ │ │ │ │ -304 const Implementation* _impl; │ │ │ │ │ -305 │ │ │ │ │ -306 }; │ │ │ │ │ -307 │ │ │ │ │ -308 } │ │ │ │ │ +304 template::value,int>::type │ │ │ │ │ +dim> │ │ │ │ │ +305 struct DefaultReferenceElementExtractor> │ │ │ │ │ +306 { │ │ │ │ │ +307 using type = typename _D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_<_T_,_d_i_m_>_:_: │ │ │ │ │ +_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t; │ │ │ │ │ +308 }; │ │ │ │ │ 309 │ │ │ │ │ -310} │ │ │ │ │ -311 │ │ │ │ │ +310 template │ │ │ │ │ +311 using DefaultReferenceElement = typename │ │ │ │ │ +DefaultReferenceElementExtractor::type; │ │ │ │ │ 312 │ │ │ │ │ -313#endif // DUNE_GEOMETRY_REFERENCEELEMENT_HH │ │ │ │ │ +313 } │ │ │ │ │ +314 │ │ │ │ │ +315 // looks up the type of a reference element by trying to instantiate the │ │ │ │ │ +correct overload │ │ │ │ │ +316 // of referenceElement() for the given arguments. This will fail if there │ │ │ │ │ +is no valid │ │ │ │ │ +317 // overload and should be used with detected_or or some other utility that │ │ │ │ │ +places the │ │ │ │ │ +318 // instantiation in SFINAE context. │ │ │ │ │ +319 // │ │ │ │ │ +320 // this is placed directly in namespace Dune to avoid any weird surprises │ │ │ │ │ +321 │ │ │ │ │ +322 template │ │ │ │ │ +323 using LookupReferenceElement = decltype(_r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t(std::declval │ │ │ │ │ +()...)); │ │ │ │ │ +324 │ │ │ │ │ +325#endif // DOXYGEN │ │ │ │ │ +326 │ │ │ │ │ +_3_2_7 namespace [[deprecated]] Transitional { │ │ │ │ │ +328 │ │ │ │ │ +329 // this abomination checks whether the template signature matches the │ │ │ │ │ +special case │ │ │ │ │ +330 // ReferenceElement> and otherwise defers the │ │ │ │ │ +type lookup │ │ │ │ │ +331 // to a decltype on a call to referenceElement(std::declval()) │ │ │ │ │ +332 │ │ │ │ │ +337 template │ │ │ │ │ +338 using ReferenceElement = detected_or_fallback_t< │ │ │ │ │ +339 Impl::DefaultReferenceElement, │ │ │ │ │ +340 LookupReferenceElement, │ │ │ │ │ +341 T... │ │ │ │ │ +342 >; │ │ │ │ │ +343 │ │ │ │ │ +344 } │ │ │ │ │ +345 │ │ │ │ │ +346 template │ │ │ │ │ +_3_4_7 using _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t = decltype(_r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t(std::declval()...)); │ │ │ │ │ +348 │ │ │ │ │ +349} // namespace Dune │ │ │ │ │ +350 │ │ │ │ │ +351#endif // #ifndef DUNE_GEOMETRY_REFERENCEELEMENTS_HH │ │ │ │ │ +_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_._h_h │ │ │ │ │ _t_y_p_e_._h_h │ │ │ │ │ A unique label for each type of element that can occur in a grid. │ │ │ │ │ +_r_e_f_e_r_e_n_c_e_e_l_e_m_e_n_t_i_m_p_l_e_m_e_n_t_a_t_i_o_n_._h_h │ │ │ │ │ +_d_i_m_e_n_s_i_o_n_._h_h │ │ │ │ │ +_D_u_n_e_:_:_r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ +unspecified value type referenceElement(T &&... t) │ │ │ │ │ +Returns a reference element for the objects t.... │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn affinegeometry.hh:21 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ +decltype(referenceElement(std::declval< T >()...)) ReferenceElement │ │ │ │ │ +DDeeffiinniittiioonn referenceelements.hh:347 │ │ │ │ │ _D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ This class provides access to geometric and topological properties of a │ │ │ │ │ reference element. │ │ │ │ │ DDeeffiinniittiioonn referenceelement.hh:52 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_v_o_l_u_m_e │ │ │ │ │ -CoordinateField volume() const │ │ │ │ │ -obtain the volume of the reference element │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:228 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_t_y_p_e │ │ │ │ │ -GeometryType type(int i, int c) const │ │ │ │ │ -obtain the type of subentity (i,c) │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:167 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ -ReferenceElement() │ │ │ │ │ -Constructs an empty reference element. │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:254 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ │ -bool operator!=(const ReferenceElement &r) const │ │ │ │ │ -Compares for inequality with another reference element. │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:275 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_p_o_s_i_t_i_o_n │ │ │ │ │ -Coordinate position(int i, int c) const │ │ │ │ │ -position of the barycenter of entity (i,c) │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:190 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ -typename Implementation::Coordinate Coordinate │ │ │ │ │ -The coordinate type. │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:81 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_g_e_o_m_e_t_r_y │ │ │ │ │ -Codim< codim >::Geometry geometry(int i) const │ │ │ │ │ -obtain the embedding of subentity (i,codim) into the reference element │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:221 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s │ │ │ │ │ +Class providing access to the singletons of the reference elements. │ │ │ │ │ +DDeeffiinniittiioonn referenceelements.hh:128 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_b_e_g_i_n │ │ │ │ │ +static Iterator begin() │ │ │ │ │ +DDeeffiinniittiioonn referenceelements.hh:173 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_i_t_e_r_a_t_o_r │ │ │ │ │ +Iterator iterator │ │ │ │ │ +Iterator over available reference elements. │ │ │ │ │ +DDeeffiinniittiioonn referenceelements.hh:152 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ +typename Container::ReferenceElement ReferenceElement │ │ │ │ │ +The reference element type. │ │ │ │ │ +DDeeffiinniittiioonn referenceelements.hh:146 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_c_u_b_e │ │ │ │ │ +static const ReferenceElement & cube() │ │ │ │ │ +get hypercube reference elements │ │ │ │ │ +DDeeffiinniittiioonn referenceelements.hh:168 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_e_n_d │ │ │ │ │ +static Iterator end() │ │ │ │ │ +DDeeffiinniittiioonn referenceelements.hh:178 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_c_t_y_p_e │ │ │ │ │ +ctype_ ctype │ │ │ │ │ +The coordinate field type of the contained reference elements. │ │ │ │ │ +DDeeffiinniittiioonn referenceelements.hh:131 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_g_e_n_e_r_a_l │ │ │ │ │ +static const ReferenceElement & general(const GeometryType &type) │ │ │ │ │ +get general reference elements │ │ │ │ │ +DDeeffiinniittiioonn referenceelements.hh:156 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_s_i_m_p_l_e_x │ │ │ │ │ +static const ReferenceElement & simplex() │ │ │ │ │ +get simplex reference elements │ │ │ │ │ +DDeeffiinniittiioonn referenceelements.hh:162 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_I_t_e_r_a_t_o_r │ │ │ │ │ +typename Container::const_iterator Iterator │ │ │ │ │ +Iterator over available reference elements. │ │ │ │ │ +DDeeffiinniittiioonn referenceelements.hh:149 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_d_i_m_e_n_s_i_o_n │ │ │ │ │ static constexpr int dimension │ │ │ │ │ -The dimension of the reference element. │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:87 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_s_i_z_e │ │ │ │ │ -int size(int i, int c, int cc) const │ │ │ │ │ -number of subentities of codimension cc of subentity (i,c) │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:111 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_s_u_b_E_n_t_i_t_y │ │ │ │ │ -int subEntity(int i, int c, int ii, int cc) const │ │ │ │ │ -obtain number of ii-th subentity with codim cc of (i,c) │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:130 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_c_t_y_p_e │ │ │ │ │ -typename Implementation::ctype ctype │ │ │ │ │ -The coordinate field type. │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:75 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_s_i_z_e │ │ │ │ │ -int size(int c) const │ │ │ │ │ -number of subentities of codimension c │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:94 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_t_y_p_e │ │ │ │ │ -GeometryType type() const │ │ │ │ │ -obtain the type of this reference element │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:175 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_i_m_p_l │ │ │ │ │ -const Implementation & impl() const │ │ │ │ │ -Returns a reference to the internal implementation object. │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:263 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_c_h_e_c_k_I_n_s_i_d_e │ │ │ │ │ -bool checkInside(const Coordinate &local) const │ │ │ │ │ -check if a coordinate is in the reference element │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:203 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_i_n_t_e_g_r_a_t_i_o_n_O_u_t_e_r_N_o_r_m_a_l │ │ │ │ │ -Coordinate integrationOuterNormal(int face) const │ │ │ │ │ -obtain the integration outer normal of the reference element │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:241 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_C_o_o_r_d_i_n_a_t_e_F_i_e_l_d │ │ │ │ │ +The dimension of the contained reference elements. │ │ │ │ │ +DDeeffiinniittiioonn referenceelements.hh:137 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_:_:_C_o_o_r_d_i_n_a_t_e_F_i_e_l_d │ │ │ │ │ ctype CoordinateField │ │ │ │ │ -The coordinate field type. │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:78 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ │ -bool operator==(const ReferenceElement &r) const │ │ │ │ │ -Compares for equality with another reference element. │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:269 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_h_a_s_h___v_a_l_u_e │ │ │ │ │ -friend std::size_t hash_value(const ReferenceElement &r) │ │ │ │ │ -Yields a hash value suitable for storing the reference element a in hash table. │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:281 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_s_u_b_E_n_t_i_t_i_e_s │ │ │ │ │ -auto subEntities(int i, int c, int cc) const │ │ │ │ │ -Obtain the range of numbers of subentities with codim cc of (i,c) │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:153 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_V_o_l_u_m_e │ │ │ │ │ -ctype Volume │ │ │ │ │ -Type used for volume. │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:84 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_C_o_d_i_m │ │ │ │ │ -Collection of types depending on the codimension. │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:67 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_C_o_d_i_m_:_:_G_e_o_m_e_t_r_y │ │ │ │ │ -implementation-defined Geometry │ │ │ │ │ -type of geometry embedding a subentity into the reference element │ │ │ │ │ -DDeeffiinniittiioonn referenceelement.hh:69 │ │ │ │ │ +The coordinate field type of the contained reference elements. │ │ │ │ │ +DDeeffiinniittiioonn referenceelements.hh:134 │ │ │ │ │ +_D_u_n_e_:_:_D_i_m │ │ │ │ │ +Static tag representing a dimension. │ │ │ │ │ +DDeeffiinniittiioonn dimension.hh:16 │ │ │ │ │ _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ DDeeffiinniittiioonn type.hh:114 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_d │ │ │ │ │ +constexpr unsigned int id() const │ │ │ │ │ +Return the topology id of the type. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:365 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00245.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: dimension.hh File Reference │ │ │ │ +dune-geometry: typeindex.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -72,35 +72,43 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
dimension.hh File Reference
│ │ │ │ +
typeindex.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <type_traits>
│ │ │ │ + │ │ │ │ +

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

struct  Dune::Dim< dim >
 Static tag representing a dimension. More...
class  Dune::LocalGeometryTypeIndex
 Compute per-dimension indices for geometry types. More...
 
struct  Dune::Codim< codim >
 Static tag representing a codimension. More...
class  Dune::GlobalGeometryTypeIndex
 Compute indices for geometry types, taking the dimension into account. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

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

Detailed Description

│ │ │ │ +

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

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,22 +1,30 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -dimension.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ +typeindex.hh File Reference │ │ │ │ │ +Helper classes to provide indices for geometrytypes for use in a vector. │ │ │ │ │ +_M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "_t_y_p_e_._h_h" │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -struct   _D_u_n_e_:_:_D_i_m_<_ _d_i_m_ _> │ │ │ │ │ -  Static tag representing a dimension. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_L_o_c_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x │ │ │ │ │ +  Compute per-dimension indices for geometry types. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ -struct   _D_u_n_e_:_:_C_o_d_i_m_<_ _c_o_d_i_m_ _> │ │ │ │ │ -  Static tag representing a codimension. _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_G_l_o_b_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x │ │ │ │ │ +  Compute indices for geometry types, taking the dimension into account. │ │ │ │ │ + _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ +********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ +Helper classes to provide indices for geometrytypes for use in a vector. │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00245_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: dimension.hh Source File │ │ │ │ +dune-geometry: typeindex.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,54 +74,161 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
dimension.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 © 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
│ │ │ │ +
5#ifndef DUNE_GEOMETRY_TYPEINDEX_HH
│ │ │ │ +
6#define DUNE_GEOMETRY_TYPEINDEX_HH
│ │ │ │
7
│ │ │ │ -
8#include <type_traits>
│ │ │ │ -
9
│ │ │ │ -
10namespace Dune {
│ │ │ │ -
11
│ │ │ │ -
13 template<int dim>
│ │ │ │ -
│ │ │ │ -
14 struct Dim
│ │ │ │ -
15 : public std::integral_constant<int,dim>
│ │ │ │ -
16 {
│ │ │ │ -
17 typedef Dim type;
│ │ │ │ -
18 };
│ │ │ │ -
│ │ │ │ -
19
│ │ │ │ -
21 template<int codim>
│ │ │ │ -
│ │ │ │ -
22 struct Codim
│ │ │ │ -
23 : public std::integral_constant<int,codim>
│ │ │ │ -
24 {
│ │ │ │ -
25 typedef Codim type;
│ │ │ │ -
26 };
│ │ │ │ -
│ │ │ │ -
27
│ │ │ │ -
28}
│ │ │ │ -
29
│ │ │ │ -
30#endif // DUNE_GEOMETRY_DIMENSION_HH
│ │ │ │ +
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)) ?
│ │ │ │ +
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
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
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.
│ │ │ │
Definition affinegeometry.hh:21
│ │ │ │ -
Static tag representing a dimension.
Definition dimension.hh:16
│ │ │ │ -
Dim type
Definition dimension.hh:17
│ │ │ │ -
Static tag representing a codimension.
Definition dimension.hh:24
│ │ │ │ -
Codim type
Definition dimension.hh:25
│ │ │ │ +
Unique label for each type of entities that can occur in DUNE grids.
Definition type.hh:114
│ │ │ │ +
constexpr Id toId() const
Create an Id representation of this GeometryType.
Definition type.hh:210
│ │ │ │ +
constexpr unsigned int dim() const
Return dimension of the type.
Definition type.hh:360
│ │ │ │ +
constexpr unsigned int id() const
Return the topology id of the type.
Definition type.hh:365
│ │ │ │ +
constexpr bool isNone() const
Return true if entity is a singular of any dimension.
Definition type.hh:355
│ │ │ │ +
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 {} │ │ │ │ │ @@ -1,53 +1,183 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -dimension.hh │ │ │ │ │ +typeindex.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 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 © 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 │ │ │ │ │ +5#ifndef DUNE_GEOMETRY_TYPEINDEX_HH │ │ │ │ │ +6#define DUNE_GEOMETRY_TYPEINDEX_HH │ │ │ │ │ 7 │ │ │ │ │ -8#include │ │ │ │ │ -9 │ │ │ │ │ -10namespace _D_u_n_e { │ │ │ │ │ -11 │ │ │ │ │ -13 template │ │ │ │ │ -_1_4 struct _D_i_m │ │ │ │ │ -15 : public std::integral_constant │ │ │ │ │ -16 { │ │ │ │ │ -_1_7 typedef _D_i_m _t_y_p_e; │ │ │ │ │ -18 }; │ │ │ │ │ -19 │ │ │ │ │ -21 template │ │ │ │ │ -_2_2 struct _C_o_d_i_m │ │ │ │ │ -23 : public std::integral_constant │ │ │ │ │ -24 { │ │ │ │ │ -_2_5 typedef _C_o_d_i_m _t_y_p_e; │ │ │ │ │ -26 }; │ │ │ │ │ -27 │ │ │ │ │ -28} │ │ │ │ │ -29 │ │ │ │ │ -30#endif // DUNE_GEOMETRY_DIMENSION_HH │ │ │ │ │ +14#include │ │ │ │ │ +15 │ │ │ │ │ +16#include │ │ │ │ │ +17#include │ │ │ │ │ +18 │ │ │ │ │ +19#include "_t_y_p_e_._h_h" │ │ │ │ │ +20 │ │ │ │ │ +21namespace _D_u_n_e │ │ │ │ │ +22{ │ │ │ │ │ +_2_4 class _L_o_c_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x │ │ │ │ │ +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: │ │ │ │ │ +_6_1 inline static constexpr std::size_t _s_i_z_e(std::size_t dim) │ │ │ │ │ +62 { │ │ │ │ │ +63 // one for "none" │ │ │ │ │ +64 return regular_size(dim) + 1; │ │ │ │ │ +65 } │ │ │ │ │ +66 │ │ │ │ │ +_7_3 inline static constexpr std::size_t _i_n_d_e_x(const _G_e_o_m_e_t_r_y_T_y_p_e >) │ │ │ │ │ +74 { │ │ │ │ │ +75 return gt._i_s_N_o_n_e() ? regular_size(gt._d_i_m()) : (gt._i_d() >> 1); │ │ │ │ │ +76 } │ │ │ │ │ +77 │ │ │ │ │ +_7_9 inline static constexpr _G_e_o_m_e_t_r_y_T_y_p_e _t_y_p_e(std::size_t dim, std::size_t │ │ │ │ │ +_i_n_d_e_x) { │ │ │ │ │ +80 return (_i_n_d_e_x == regular_size(dim)) ? │ │ │ │ │ +81 GeometryTypes::none(dim) : │ │ │ │ │ +82 // the cast to unsigned makes sure this is interpreted as the topology │ │ │ │ │ +83 // ID constructor │ │ │ │ │ +84 _G_e_o_m_e_t_r_y_T_y_p_e(static_cast< unsigned int >(_i_n_d_e_x << 1), dim); │ │ │ │ │ +85 } │ │ │ │ │ +86 }; │ │ │ │ │ +87 │ │ │ │ │ +_8_9 class _G_l_o_b_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x │ │ │ │ │ +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: │ │ │ │ │ +_1_1_3 inline static constexpr std::size_t _o_f_f_s_e_t(std::size_t dim) │ │ │ │ │ +114 { │ │ │ │ │ +115 // dim times "none" │ │ │ │ │ +116 return regular_offset(dim) + dim; │ │ │ │ │ +117 } │ │ │ │ │ +118 │ │ │ │ │ +_1_2_5 inline static constexpr std::size_t _s_i_z_e(std::size_t maxdim) │ │ │ │ │ +126 { │ │ │ │ │ +127 return _o_f_f_s_e_t(maxdim+1); │ │ │ │ │ +128 } │ │ │ │ │ +129 │ │ │ │ │ +_1_3_8 inline static constexpr std::size_t _i_n_d_e_x(const _G_e_o_m_e_t_r_y_T_y_p_e >) │ │ │ │ │ +139 { │ │ │ │ │ +140 return _o_f_f_s_e_t(gt._d_i_m()) + _L_o_c_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x_:_:_i_n_d_e_x(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 = _L_o_c_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x_:_:_t_y_p_e(dim, decltype │ │ │ │ │ +(index)::value)._t_o_I_d(); │ │ │ │ │ +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<_L_o_c_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x_:_:_s_i_z_e │ │ │ │ │ +(dim)-1>{}; │ │ │ │ │ +158 return Dune::Hybrid::switchCases(allIndices, _L_o_c_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x_:_:_i_n_d_e_x │ │ │ │ │ +(gt), callWithId, fallBack); │ │ │ │ │ +159 } │ │ │ │ │ +160 │ │ │ │ │ +161 } // namespace Impl │ │ │ │ │ +162} // namespace Dune │ │ │ │ │ +163 │ │ │ │ │ +164#endif // DUNE_GEOMETRY_TYPEINDEX_HH │ │ │ │ │ +_t_y_p_e_._h_h │ │ │ │ │ +A unique label for each type of element that can occur in a grid. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn affinegeometry.hh:21 │ │ │ │ │ -_D_u_n_e_:_:_D_i_m │ │ │ │ │ -Static tag representing a dimension. │ │ │ │ │ -DDeeffiinniittiioonn dimension.hh:16 │ │ │ │ │ -_D_u_n_e_:_:_D_i_m_:_:_t_y_p_e │ │ │ │ │ -Dim type │ │ │ │ │ -DDeeffiinniittiioonn dimension.hh:17 │ │ │ │ │ -_D_u_n_e_:_:_C_o_d_i_m │ │ │ │ │ -Static tag representing a codimension. │ │ │ │ │ -DDeeffiinniittiioonn dimension.hh:24 │ │ │ │ │ -_D_u_n_e_:_:_C_o_d_i_m_:_:_t_y_p_e │ │ │ │ │ -Codim type │ │ │ │ │ -DDeeffiinniittiioonn dimension.hh:25 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ +Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:114 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_t_o_I_d │ │ │ │ │ +constexpr Id toId() const │ │ │ │ │ +Create an Id representation of this GeometryType. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:210 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_d_i_m │ │ │ │ │ +constexpr unsigned int dim() const │ │ │ │ │ +Return dimension of the type. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:360 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_d │ │ │ │ │ +constexpr unsigned int id() const │ │ │ │ │ +Return the topology id of the type. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:365 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_N_o_n_e │ │ │ │ │ +constexpr bool isNone() const │ │ │ │ │ +Return true if entity is a singular of any dimension. │ │ │ │ │ +DDeeffiinniittiioonn type.hh:355 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x │ │ │ │ │ +Compute per-dimension indices for geometry types. │ │ │ │ │ +DDeeffiinniittiioonn typeindex.hh:25 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x_:_:_s_i_z_e │ │ │ │ │ +static constexpr std::size_t size(std::size_t dim) │ │ │ │ │ +Compute total number of geometry types for the given dimension. │ │ │ │ │ +DDeeffiinniittiioonn typeindex.hh:61 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x_:_:_t_y_p_e │ │ │ │ │ +static constexpr GeometryType type(std::size_t dim, std::size_t index) │ │ │ │ │ +compute the geometry type for the given local index and dimension │ │ │ │ │ +DDeeffiinniittiioonn typeindex.hh:79 │ │ │ │ │ +_D_u_n_e_:_:_L_o_c_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x_:_:_i_n_d_e_x │ │ │ │ │ +static constexpr std::size_t index(const GeometryType >) │ │ │ │ │ +Compute the index for the given geometry type within its dimension. │ │ │ │ │ +DDeeffiinniittiioonn typeindex.hh:73 │ │ │ │ │ +_D_u_n_e_:_:_G_l_o_b_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x │ │ │ │ │ +Compute indices for geometry types, taking the dimension into account. │ │ │ │ │ +DDeeffiinniittiioonn typeindex.hh:90 │ │ │ │ │ +_D_u_n_e_:_:_G_l_o_b_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x_:_:_i_n_d_e_x │ │ │ │ │ +static constexpr std::size_t index(const GeometryType >) │ │ │ │ │ +Compute the index for the given geometry type over all dimensions. │ │ │ │ │ +DDeeffiinniittiioonn typeindex.hh:138 │ │ │ │ │ +_D_u_n_e_:_:_G_l_o_b_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x_:_:_o_f_f_s_e_t │ │ │ │ │ +static constexpr std::size_t offset(std::size_t dim) │ │ │ │ │ +Compute the starting index for a given dimension including irregular geometry │ │ │ │ │ +types. │ │ │ │ │ +DDeeffiinniittiioonn typeindex.hh:113 │ │ │ │ │ +_D_u_n_e_:_:_G_l_o_b_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x_:_:_s_i_z_e │ │ │ │ │ +static constexpr std::size_t size(std::size_t maxdim) │ │ │ │ │ +Compute total number of geometry types up to and including the given dimension. │ │ │ │ │ +DDeeffiinniittiioonn typeindex.hh:125 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00248.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: typeindex.hh File Reference │ │ │ │ +dune-geometry: affinegeometry.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -72,43 +72,43 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
typeindex.hh File Reference
│ │ │ │ +
affinegeometry.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

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

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

│ │ │ │ -
#include <cstddef>
│ │ │ │ -#include <dune/common/indices.hh>
│ │ │ │ -#include <dune/common/hybridutilities.hh>
│ │ │ │ -#include "type.hh"
│ │ │ │ +
#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::LocalGeometryTypeIndex
 Compute per-dimension indices for geometry types. More...
 
class  Dune::GlobalGeometryTypeIndex
 Compute indices for geometry types, taking the dimension into account. More...
class  Dune::AffineGeometry< ct, mydim, cdim >
 Implementation of the Geometry interface for affine geometries. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 
namespace  Dune::Geo
 
│ │ │ │

Detailed Description

│ │ │ │ -

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

│ │ │ │ +

An implementation of the Geometry interface for affine geometries.

│ │ │ │ +
Author
Martin Nolte
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -1,30 +1,29 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ _C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ │ -typeindex.hh File Reference │ │ │ │ │ -Helper classes to provide indices for geometrytypes for use in a vector. │ │ │ │ │ -_M_o_r_e_._._. │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "_t_y_p_e_._h_h" │ │ │ │ │ +affinegeometry.hh File Reference │ │ │ │ │ +An implementation of the Geometry interface for affine geometries. _M_o_r_e_._._. │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ CCllaasssseess │ │ │ │ │ -class   _D_u_n_e_:_:_L_o_c_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x │ │ │ │ │ -  Compute per-dimension indices for geometry types. _M_o_r_e_._._. │ │ │ │ │ -  │ │ │ │ │ -class   _D_u_n_e_:_:_G_l_o_b_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x │ │ │ │ │ -  Compute indices for geometry types, taking the dimension into account. │ │ │ │ │ - _M_o_r_e_._._. │ │ │ │ │ +class   _D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_<_ _c_t_,_ _m_y_d_i_m_,_ _c_d_i_m_ _> │ │ │ │ │ +  Implementation of the Geometry interface for affine geometries. _M_o_r_e_._._. │ │ │ │ │   │ │ │ │ │ NNaammeessppaacceess │ │ │ │ │ namespace   _D_u_n_e │ │ │ │ │   │ │ │ │ │ +namespace   _D_u_n_e_:_:_G_e_o │ │ │ │ │ +  │ │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ │ -Helper classes to provide indices for geometrytypes for use in a vector. │ │ │ │ │ +An implementation of the Geometry interface for affine geometries. │ │ │ │ │ + Author │ │ │ │ │ + Martin Nolte │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00248_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-geometry: typeindex.hh Source File │ │ │ │ +dune-geometry: affinegeometry.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,161 +74,706 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
typeindex.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 © 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_AFFINEGEOMETRY_HH
│ │ │ │ +
6#define DUNE_GEOMETRY_AFFINEGEOMETRY_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)) ?
│ │ │ │ -
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 };
│ │ │ │ -
│ │ │ │ +
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
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
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.
│ │ │ │ +
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 );
│ │ │ │ +
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 using std::abs;
│ │ │ │ +
419 if constexpr( (n == 2) && (m == 2) )
│ │ │ │ +
420 {
│ │ │ │ +
421 const ctype det = (A[ 0 ][ 0 ]*A[ 1 ][ 1 ] - A[ 1 ][ 0 ]*A[ 0 ][ 1 ]);
│ │ │ │ +
422 const ctype detInv = ctype( 1 ) / det;
│ │ │ │ +
423 ret[ 0 ][ 0 ] = A[ 1 ][ 1 ] * detInv;
│ │ │ │ +
424 ret[ 1 ][ 1 ] = A[ 0 ][ 0 ] * detInv;
│ │ │ │ +
425 ret[ 1 ][ 0 ] = -A[ 1 ][ 0 ] * detInv;
│ │ │ │ +
426 ret[ 0 ][ 1 ] = -A[ 0 ][ 1 ] * detInv;
│ │ │ │ +
427 return abs( det );
│ │ │ │ +
428 }
│ │ │ │ +
429 else
│ │ │ │ +
430 {
│ │ │ │ +
431 FieldMatrix< ctype, n, n > ata;
│ │ │ │ +
432 ATA_L( A, ata );
│ │ │ │ +
433 const ctype det = spdInvA( ata );
│ │ │ │ +
434 ATBT( ata, A, ret );
│ │ │ │ +
435 return det;
│ │ │ │ +
436 }
│ │ │ │ +
437 }
│ │ │ │ +
438
│ │ │ │ +
439 template< int m, int n >
│ │ │ │ +
440 static bool leftInvAx ( const FieldMatrix< ctype, m, n > &A, const FieldVector< ctype, m > &x, FieldVector< ctype, n > &y )
│ │ │ │ +
441 {
│ │ │ │ +
442 static_assert((m >= n), "Matrix has no left inverse.");
│ │ │ │ +
443 FieldMatrix< ctype, n, n > ata;
│ │ │ │ +
444 ATx( A, x, y );
│ │ │ │ +
445 ATA_L( A, ata );
│ │ │ │ +
446 return spdInvAx( ata, y, true );
│ │ │ │ +
447 }
│ │ │ │ +
448
│ │ │ │ +
450 template< int m, int n >
│ │ │ │ +
451 static ctype rightInvA ( const FieldMatrix< ctype, m, n > &A, FieldMatrix< ctype, n, m > &ret )
│ │ │ │ +
452 {
│ │ │ │ +
453 static_assert((n >= m), "Matrix has no right inverse.");
│ │ │ │ +
454 using std::abs;
│ │ │ │ +
455 if constexpr( (n == 2) && (m == 2) )
│ │ │ │ +
456 {
│ │ │ │ +
457 const ctype det = (A[ 0 ][ 0 ]*A[ 1 ][ 1 ] - A[ 1 ][ 0 ]*A[ 0 ][ 1 ]);
│ │ │ │ +
458 const ctype detInv = ctype( 1 ) / det;
│ │ │ │ +
459 ret[ 0 ][ 0 ] = A[ 1 ][ 1 ] * detInv;
│ │ │ │ +
460 ret[ 1 ][ 1 ] = A[ 0 ][ 0 ] * detInv;
│ │ │ │ +
461 ret[ 1 ][ 0 ] = -A[ 1 ][ 0 ] * detInv;
│ │ │ │ +
462 ret[ 0 ][ 1 ] = -A[ 0 ][ 1 ] * detInv;
│ │ │ │ +
463 return abs( det );
│ │ │ │ +
464 }
│ │ │ │ +
465 else
│ │ │ │ +
466 {
│ │ │ │ +
467 FieldMatrix< ctype, m , m > aat;
│ │ │ │ +
468 AAT_L( A, aat );
│ │ │ │ +
469 const ctype det = spdInvA( aat );
│ │ │ │ +
470 ATBT( A , aat , ret );
│ │ │ │ +
471 return det;
│ │ │ │ +
472 }
│ │ │ │ +
473 }
│ │ │ │ +
474
│ │ │ │ +
475 template< int m, int n >
│ │ │ │ +
476 static bool xTRightInvA ( const FieldMatrix< ctype, m, n > &A, const FieldVector< ctype, n > &x, FieldVector< ctype, m > &y )
│ │ │ │ +
477 {
│ │ │ │ +
478 static_assert((n >= m), "Matrix has no right inverse.");
│ │ │ │ +
479 FieldMatrix< ctype, m, m > aat;
│ │ │ │ +
480 Ax( A, x, y );
│ │ │ │ +
481 AAT_L( A, aat );
│ │ │ │ +
482 // check whether aat is singular and return true if non-singular
│ │ │ │ +
483 return spdInvAx( aat, y, true );
│ │ │ │ +
484 }
│ │ │ │ +
485 };
│ │ │ │ +
486
│ │ │ │ +
487 } // namespace Impl
│ │ │ │ +
488
│ │ │ │ +
489
│ │ │ │ +
490
│ │ │ │ +
496 template< class ct, int mydim, int cdim>
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
498 {
│ │ │ │ +
499 public:
│ │ │ │ +
500
│ │ │ │ +
502 typedef ct ctype;
│ │ │ │ +
503
│ │ │ │ +
505 static const int mydimension= mydim;
│ │ │ │ +
506
│ │ │ │ +
508 static const int coorddimension = cdim;
│ │ │ │ +
509
│ │ │ │ +
511 typedef FieldVector< ctype, mydimension > LocalCoordinate;
│ │ │ │ +
512
│ │ │ │ +
514 typedef FieldVector< ctype, coorddimension > GlobalCoordinate;
│ │ │ │ +
515
│ │ │ │ +
517 typedef ctype Volume;
│ │ │ │ +
518
│ │ │ │ +
520 typedef FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed;
│ │ │ │ +
521
│ │ │ │ +
523 typedef FieldMatrix< ctype, coorddimension, mydimension > JacobianInverseTransposed;
│ │ │ │ +
524
│ │ │ │ +
526 typedef FieldMatrix< ctype, coorddimension, mydimension > Jacobian;
│ │ │ │ +
527
│ │ │ │ +
529 typedef FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse;
│ │ │ │ +
530
│ │ │ │ +
531 private:
│ │ │ │ + │ │ │ │ +
534
│ │ │ │ + │ │ │ │ +
536
│ │ │ │ +
537 // Helper class to compute a matrix pseudo inverse
│ │ │ │ +
538 typedef Impl::FieldMatrixHelper< ct > MatrixHelper;
│ │ │ │ +
539
│ │ │ │ +
540 public:
│ │ │ │ +
547 AffineGeometry () = default;
│ │ │ │ +
548
│ │ │ │ +
│ │ │ │ +
550 AffineGeometry ( const ReferenceElement &refElement, const GlobalCoordinate &origin,
│ │ │ │ +
551 const JacobianTransposed &jt )
│ │ │ │ +
552 : refElement_(refElement), origin_(origin), jacobianTransposed_(jt)
│ │ │ │ +
553 {
│ │ │ │ +
554 integrationElement_ = MatrixHelper::template rightInvA< mydimension, coorddimension >( jacobianTransposed_, jacobianInverseTransposed_ );
│ │ │ │ +
555 }
│ │ │ │ +
│ │ │ │ +
556
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
559 const JacobianTransposed &jt )
│ │ │ │ +
560 : AffineGeometry(ReferenceElements::general( gt ), origin, jt)
│ │ │ │ +
561 { }
│ │ │ │ +
│ │ │ │ +
562
│ │ │ │ +
564 template< class CoordVector >
│ │ │ │ +
│ │ │ │ +
565 AffineGeometry ( const ReferenceElement &refElement, const CoordVector &coordVector )
│ │ │ │ +
566 : refElement_(refElement), origin_(coordVector[0])
│ │ │ │ +
567 {
│ │ │ │ +
568 for( int i = 0; i < mydimension; ++i )
│ │ │ │ +
569 jacobianTransposed_[ i ] = coordVector[ i+1 ] - origin_;
│ │ │ │ +
570 integrationElement_ = MatrixHelper::template rightInvA< mydimension, coorddimension >( jacobianTransposed_, jacobianInverseTransposed_ );
│ │ │ │ +
571 }
│ │ │ │ +
│ │ │ │ +
572
│ │ │ │ +
574 template< class CoordVector >
│ │ │ │ +
│ │ │ │ +
575 AffineGeometry ( Dune::GeometryType gt, const CoordVector &coordVector )
│ │ │ │ +
576 : AffineGeometry(ReferenceElements::general( gt ), coordVector)
│ │ │ │ +
577 { }
│ │ │ │ +
│ │ │ │ +
578
│ │ │ │ +
580 bool affine () const { return true; }
│ │ │ │ +
581
│ │ │ │ +
583 Dune::GeometryType type () const { return refElement_.type(); }
│ │ │ │ +
584
│ │ │ │ +
586 int corners () const { return refElement_.size( mydimension ); }
│ │ │ │ +
587
│ │ │ │ +
│ │ │ │ +
589 GlobalCoordinate corner ( int i ) const
│ │ │ │ +
590 {
│ │ │ │ +
591 return global( refElement_.position( i, mydimension ) );
│ │ │ │ +
592 }
│ │ │ │ +
│ │ │ │ +
593
│ │ │ │ +
595 GlobalCoordinate center () const { return global( refElement_.position( 0, 0 ) ); }
│ │ │ │ +
596
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
604 {
│ │ │ │ +
605 GlobalCoordinate global( origin_ );
│ │ │ │ +
606 jacobianTransposed_.umtv( local, global );
│ │ │ │ +
607 return global;
│ │ │ │ +
608 }
│ │ │ │ +
│ │ │ │ +
609
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
624 {
│ │ │ │ + │ │ │ │ +
626 jacobianInverseTransposed_.mtv( global - origin_, local );
│ │ │ │ +
627 return local;
│ │ │ │ +
628 }
│ │ │ │ +
│ │ │ │ +
629
│ │ │ │ +
│ │ │ │ +
640 ctype integrationElement ([[maybe_unused]] const LocalCoordinate &local) const
│ │ │ │ +
641 {
│ │ │ │ +
642 return integrationElement_;
│ │ │ │ +
643 }
│ │ │ │ +
│ │ │ │ +
644
│ │ │ │ +
│ │ │ │ +
646 Volume volume () const
│ │ │ │ +
647 {
│ │ │ │ +
648 return integrationElement_ * refElement_.volume();
│ │ │ │ +
649 }
│ │ │ │ +
│ │ │ │ +
650
│ │ │ │ +
│ │ │ │ +
657 const JacobianTransposed &jacobianTransposed ([[maybe_unused]] const LocalCoordinate &local) const
│ │ │ │ +
658 {
│ │ │ │ +
659 return jacobianTransposed_;
│ │ │ │ +
660 }
│ │ │ │ +
│ │ │ │ +
661
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
669 {
│ │ │ │ +
670 return jacobianInverseTransposed_;
│ │ │ │ +
671 }
│ │ │ │ +
│ │ │ │ +
672
│ │ │ │ +
│ │ │ │ +
679 Jacobian jacobian ([[maybe_unused]] const LocalCoordinate &local) const
│ │ │ │ +
680 {
│ │ │ │ +
681 return jacobianTransposed_.transposed();
│ │ │ │ +
682 }
│ │ │ │ +
│ │ │ │ +
683
│ │ │ │ +
│ │ │ │ +
690 JacobianInverse jacobianInverse ([[maybe_unused]] const LocalCoordinate &local) const
│ │ │ │ +
691 {
│ │ │ │ +
692 return jacobianInverseTransposed_.transposed();
│ │ │ │ +
693 }
│ │ │ │ +
│ │ │ │ +
694
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
696 {
│ │ │ │ +
697 return geometry.refElement_;
│ │ │ │ +
698 }
│ │ │ │ +
│ │ │ │ +
699
│ │ │ │ +
700 private:
│ │ │ │ +
701 ReferenceElement refElement_;
│ │ │ │ +
702 GlobalCoordinate origin_;
│ │ │ │ +
703 JacobianTransposed jacobianTransposed_;
│ │ │ │ +
704 JacobianInverseTransposed jacobianInverseTransposed_;
│ │ │ │ +
705 ctype integrationElement_;
│ │ │ │ +
706 };
│ │ │ │ +
│ │ │ │ +
707
│ │ │ │ +
708} // namespace Dune
│ │ │ │ +
│ │ │ │ +
709
│ │ │ │ +
710#endif // #ifndef DUNE_GEOMETRY_AFFINEGEOMETRY_HH
│ │ │ │ +
A unique label for each type of element that can occur in a grid.
│ │ │ │
Definition affinegeometry.hh:21
│ │ │ │ +
decltype(referenceElement(std::declval< T >()...)) ReferenceElement
Definition referenceelements.hh:347
│ │ │ │ +
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:228
│ │ │ │ +
GeometryType type(int i, int c) const
obtain the type of subentity (i,c)
Definition referenceelement.hh:167
│ │ │ │ +
Coordinate position(int i, int c) const
position of the barycenter of entity (i,c)
Definition referenceelement.hh:190
│ │ │ │ +
int size(int c) const
number of subentities of codimension c
Definition referenceelement.hh:94
│ │ │ │ +
Definition affinegeometry.hh:33
│ │ │ │ +
Class providing access to the singletons of the reference elements.
Definition referenceelements.hh:128
│ │ │ │ +
Implementation of the Geometry interface for affine geometries.
Definition affinegeometry.hh:498
│ │ │ │ +
AffineGeometry(const ReferenceElement &refElement, const CoordVector &coordVector)
Create affine geometry from reference element and a vector of vertex coordinates.
Definition affinegeometry.hh:565
│ │ │ │ +
AffineGeometry()=default
Constructs an empty geometry.
│ │ │ │ +
AffineGeometry(Dune::GeometryType gt, const GlobalCoordinate &origin, const JacobianTransposed &jt)
Create affine geometry from GeometryType, one vertex, and the Jacobian matrix.
Definition affinegeometry.hh:558
│ │ │ │ +
FieldVector< ctype, mydimension > LocalCoordinate
Type for local coordinate vector.
Definition affinegeometry.hh:511
│ │ │ │ +
Dune::GeometryType type() const
Obtain the type of the reference element.
Definition affinegeometry.hh:583
│ │ │ │ +
static const int mydimension
Dimension of the geometry.
Definition affinegeometry.hh:505
│ │ │ │ +
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:550
│ │ │ │ +
ctype Volume
Type used for volume.
Definition affinegeometry.hh:517
│ │ │ │ +
JacobianInverse jacobianInverse(const LocalCoordinate &local) const
Obtain the Jacobian's inverse.
Definition affinegeometry.hh:690
│ │ │ │ +
friend ReferenceElement referenceElement(const AffineGeometry &geometry)
Definition affinegeometry.hh:695
│ │ │ │ +
AffineGeometry(Dune::GeometryType gt, const CoordVector &coordVector)
Create affine geometry from GeometryType and a vector of vertex coordinates.
Definition affinegeometry.hh:575
│ │ │ │ +
ctype integrationElement(const LocalCoordinate &local) const
Obtain the integration element.
Definition affinegeometry.hh:640
│ │ │ │ +
FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse
Type for the inverse Jacobian matrix.
Definition affinegeometry.hh:529
│ │ │ │ +
FieldMatrix< ctype, coorddimension, mydimension > Jacobian
Type for the Jacobian matrix.
Definition affinegeometry.hh:526
│ │ │ │ +
const JacobianInverseTransposed & jacobianInverseTransposed(const LocalCoordinate &local) const
Obtain the transposed of the Jacobian's inverse.
Definition affinegeometry.hh:668
│ │ │ │ +
FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed
Type for the transposed Jacobian matrix.
Definition affinegeometry.hh:520
│ │ │ │ +
GlobalCoordinate corner(int i) const
Obtain coordinates of the i-th corner.
Definition affinegeometry.hh:589
│ │ │ │ +
int corners() const
Obtain number of corners of the corresponding reference element.
Definition affinegeometry.hh:586
│ │ │ │ +
LocalCoordinate local(const GlobalCoordinate &global) const
Evaluate the inverse mapping.
Definition affinegeometry.hh:623
│ │ │ │ +
FieldMatrix< ctype, coorddimension, mydimension > JacobianInverseTransposed
Type for the transposed inverse Jacobian matrix.
Definition affinegeometry.hh:523
│ │ │ │ +
static const int coorddimension
Dimension of the world space.
Definition affinegeometry.hh:508
│ │ │ │ +
GlobalCoordinate global(const LocalCoordinate &local) const
Evaluate the mapping.
Definition affinegeometry.hh:603
│ │ │ │ +
GlobalCoordinate center() const
Obtain the centroid of the mapping's image.
Definition affinegeometry.hh:595
│ │ │ │ +
Jacobian jacobian(const LocalCoordinate &local) const
Obtain the Jacobian.
Definition affinegeometry.hh:679
│ │ │ │ +
ct ctype
Type used for coordinates.
Definition affinegeometry.hh:502
│ │ │ │ +
FieldVector< ctype, coorddimension > GlobalCoordinate
Type for coordinate vector in world space.
Definition affinegeometry.hh:514
│ │ │ │ +
bool affine() const
Always true: this is an affine geometry.
Definition affinegeometry.hh:580
│ │ │ │ +
const JacobianTransposed & jacobianTransposed(const LocalCoordinate &local) const
Obtain the transposed of the Jacobian.
Definition affinegeometry.hh:657
│ │ │ │ +
Volume volume() const
Obtain the volume of the element.
Definition affinegeometry.hh:646
│ │ │ │
Unique label for each type of entities that can occur in DUNE grids.
Definition type.hh:114
│ │ │ │ -
constexpr Id toId() const
Create an Id representation of this GeometryType.
Definition type.hh:210
│ │ │ │ -
constexpr unsigned int dim() const
Return dimension of the type.
Definition type.hh:360
│ │ │ │ -
constexpr unsigned int id() const
Return the topology id of the type.
Definition type.hh:365
│ │ │ │ -
constexpr bool isNone() const
Return true if entity is a singular of any dimension.
Definition type.hh:355
│ │ │ │ -
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 {} │ │ │ │ │ @@ -1,183 +1,816 @@ │ │ │ │ │ dune-geometry 2.10 │ │ │ │ │ Loading... │ │ │ │ │ Searching... │ │ │ │ │ No Matches │ │ │ │ │ * _d_u_n_e │ │ │ │ │ * _g_e_o_m_e_t_r_y │ │ │ │ │ -typeindex.hh │ │ │ │ │ +affinegeometry.hh │ │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ │ 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 © 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_AFFINEGEOMETRY_HH │ │ │ │ │ +6#define DUNE_GEOMETRY_AFFINEGEOMETRY_HH │ │ │ │ │ 7 │ │ │ │ │ -14#include │ │ │ │ │ -15 │ │ │ │ │ -16#include │ │ │ │ │ -17#include │ │ │ │ │ -18 │ │ │ │ │ -19#include "_t_y_p_e_._h_h" │ │ │ │ │ -20 │ │ │ │ │ -21namespace _D_u_n_e │ │ │ │ │ -22{ │ │ │ │ │ -_2_4 class _L_o_c_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x │ │ │ │ │ -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: │ │ │ │ │ -_6_1 inline static constexpr std::size_t _s_i_z_e(std::size_t dim) │ │ │ │ │ -62 { │ │ │ │ │ -63 // one for "none" │ │ │ │ │ -64 return regular_size(dim) + 1; │ │ │ │ │ -65 } │ │ │ │ │ -66 │ │ │ │ │ -_7_3 inline static constexpr std::size_t _i_n_d_e_x(const _G_e_o_m_e_t_r_y_T_y_p_e >) │ │ │ │ │ -74 { │ │ │ │ │ -75 return gt._i_s_N_o_n_e() ? regular_size(gt._d_i_m()) : (gt._i_d() >> 1); │ │ │ │ │ -76 } │ │ │ │ │ -77 │ │ │ │ │ -_7_9 inline static constexpr _G_e_o_m_e_t_r_y_T_y_p_e _t_y_p_e(std::size_t dim, std::size_t │ │ │ │ │ -_i_n_d_e_x) { │ │ │ │ │ -80 return (_i_n_d_e_x == regular_size(dim)) ? │ │ │ │ │ -81 GeometryTypes::none(dim) : │ │ │ │ │ -82 // the cast to unsigned makes sure this is interpreted as the topology │ │ │ │ │ -83 // ID constructor │ │ │ │ │ -84 _G_e_o_m_e_t_r_y_T_y_p_e(static_cast< unsigned int >(_i_n_d_e_x << 1), dim); │ │ │ │ │ +13#include │ │ │ │ │ +14 │ │ │ │ │ +15#include │ │ │ │ │ +16#include │ │ │ │ │ +17 │ │ │ │ │ +18#include <_d_u_n_e_/_g_e_o_m_e_t_r_y_/_t_y_p_e_._h_h> │ │ │ │ │ +19 │ │ │ │ │ +_2_0namespace _D_u_n_e │ │ │ │ │ +21{ │ │ │ │ │ +22 │ │ │ │ │ +23 // External Forward Declarations │ │ │ │ │ +24 // ----------------------------- │ │ │ │ │ +25 │ │ │ │ │ +_2_6 namespace Geo │ │ │ │ │ +27 { │ │ │ │ │ +28 │ │ │ │ │ +29 template< typename Implementation > │ │ │ │ │ +30 class _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t; │ │ │ │ │ +31 │ │ │ │ │ +32 template< class ctype, int dim > │ │ │ │ │ +_3_3 class _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_I_m_p_l_e_m_e_n_t_a_t_i_o_n; │ │ │ │ │ +34 │ │ │ │ │ +35 template< class ctype, int dim > │ │ │ │ │ +36 struct _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s; │ │ │ │ │ +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 }; │ │ │ │ │ +86 } │ │ │ │ │ 87 │ │ │ │ │ -_8_9 class _G_l_o_b_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x │ │ │ │ │ +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 { │ │ │ │ │ -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: │ │ │ │ │ -_1_1_3 inline static constexpr std::size_t _o_f_f_s_e_t(std::size_t dim) │ │ │ │ │ -114 { │ │ │ │ │ -115 // dim times "none" │ │ │ │ │ -116 return regular_offset(dim) + dim; │ │ │ │ │ -117 } │ │ │ │ │ -118 │ │ │ │ │ -_1_2_5 inline static constexpr std::size_t _s_i_z_e(std::size_t maxdim) │ │ │ │ │ -126 { │ │ │ │ │ -127 return _o_f_f_s_e_t(maxdim+1); │ │ │ │ │ -128 } │ │ │ │ │ -129 │ │ │ │ │ -_1_3_8 inline static constexpr std::size_t _i_n_d_e_x(const _G_e_o_m_e_t_r_y_T_y_p_e >) │ │ │ │ │ -139 { │ │ │ │ │ -140 return _o_f_f_s_e_t(gt._d_i_m()) + _L_o_c_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x_:_:_i_n_d_e_x(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 = _L_o_c_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x_:_:_t_y_p_e(dim, decltype │ │ │ │ │ -(index)::value)._t_o_I_d(); │ │ │ │ │ -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<_L_o_c_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x_:_:_s_i_z_e │ │ │ │ │ -(dim)-1>{}; │ │ │ │ │ -158 return Dune::Hybrid::switchCases(allIndices, _L_o_c_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x_:_:_i_n_d_e_x │ │ │ │ │ -(gt), callWithId, fallBack); │ │ │ │ │ -159 } │ │ │ │ │ -160 │ │ │ │ │ -161 } // namespace Impl │ │ │ │ │ -162} // namespace Dune │ │ │ │ │ -163 │ │ │ │ │ -164#endif // DUNE_GEOMETRY_TYPEINDEX_HH │ │ │ │ │ +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 ); │ │ │ │ │ +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 using std::abs; │ │ │ │ │ +419 if constexpr( (n == 2) && (m == 2) ) │ │ │ │ │ +420 { │ │ │ │ │ +421 const ctype det = (A[ 0 ][ 0 ]*A[ 1 ][ 1 ] - A[ 1 ][ 0 ]*A[ 0 ][ 1 ]); │ │ │ │ │ +422 const ctype detInv = ctype( 1 ) / det; │ │ │ │ │ +423 ret[ 0 ][ 0 ] = A[ 1 ][ 1 ] * detInv; │ │ │ │ │ +424 ret[ 1 ][ 1 ] = A[ 0 ][ 0 ] * detInv; │ │ │ │ │ +425 ret[ 1 ][ 0 ] = -A[ 1 ][ 0 ] * detInv; │ │ │ │ │ +426 ret[ 0 ][ 1 ] = -A[ 0 ][ 1 ] * detInv; │ │ │ │ │ +427 return abs( det ); │ │ │ │ │ +428 } │ │ │ │ │ +429 else │ │ │ │ │ +430 { │ │ │ │ │ +431 FieldMatrix< ctype, n, n > ata; │ │ │ │ │ +432 ATA_L( A, ata ); │ │ │ │ │ +433 const ctype det = spdInvA( ata ); │ │ │ │ │ +434 ATBT( ata, A, ret ); │ │ │ │ │ +435 return det; │ │ │ │ │ +436 } │ │ │ │ │ +437 } │ │ │ │ │ +438 │ │ │ │ │ +439 template< int m, int n > │ │ │ │ │ +440 static bool leftInvAx ( const FieldMatrix< ctype, m, n > &A, const │ │ │ │ │ +FieldVector< ctype, m > &x, FieldVector< ctype, n > &y ) │ │ │ │ │ +441 { │ │ │ │ │ +442 static_assert((m >= n), "Matrix has no left inverse."); │ │ │ │ │ +443 FieldMatrix< ctype, n, n > ata; │ │ │ │ │ +444 ATx( A, x, y ); │ │ │ │ │ +445 ATA_L( A, ata ); │ │ │ │ │ +446 return spdInvAx( ata, y, true ); │ │ │ │ │ +447 } │ │ │ │ │ +448 │ │ │ │ │ +450 template< int m, int n > │ │ │ │ │ +451 static ctype rightInvA ( const FieldMatrix< ctype, m, n > &A, FieldMatrix< │ │ │ │ │ +ctype, n, m > &ret ) │ │ │ │ │ +452 { │ │ │ │ │ +453 static_assert((n >= m), "Matrix has no right inverse."); │ │ │ │ │ +454 using std::abs; │ │ │ │ │ +455 if constexpr( (n == 2) && (m == 2) ) │ │ │ │ │ +456 { │ │ │ │ │ +457 const ctype det = (A[ 0 ][ 0 ]*A[ 1 ][ 1 ] - A[ 1 ][ 0 ]*A[ 0 ][ 1 ]); │ │ │ │ │ +458 const ctype detInv = ctype( 1 ) / det; │ │ │ │ │ +459 ret[ 0 ][ 0 ] = A[ 1 ][ 1 ] * detInv; │ │ │ │ │ +460 ret[ 1 ][ 1 ] = A[ 0 ][ 0 ] * detInv; │ │ │ │ │ +461 ret[ 1 ][ 0 ] = -A[ 1 ][ 0 ] * detInv; │ │ │ │ │ +462 ret[ 0 ][ 1 ] = -A[ 0 ][ 1 ] * detInv; │ │ │ │ │ +463 return abs( det ); │ │ │ │ │ +464 } │ │ │ │ │ +465 else │ │ │ │ │ +466 { │ │ │ │ │ +467 FieldMatrix< ctype, m , m > aat; │ │ │ │ │ +468 AAT_L( A, aat ); │ │ │ │ │ +469 const ctype det = spdInvA( aat ); │ │ │ │ │ +470 ATBT( A , aat , ret ); │ │ │ │ │ +471 return det; │ │ │ │ │ +472 } │ │ │ │ │ +473 } │ │ │ │ │ +474 │ │ │ │ │ +475 template< int m, int n > │ │ │ │ │ +476 static bool xTRightInvA ( const FieldMatrix< ctype, m, n > &A, const │ │ │ │ │ +FieldVector< ctype, n > &x, FieldVector< ctype, m > &y ) │ │ │ │ │ +477 { │ │ │ │ │ +478 static_assert((n >= m), "Matrix has no right inverse."); │ │ │ │ │ +479 FieldMatrix< ctype, m, m > aat; │ │ │ │ │ +480 Ax( A, x, y ); │ │ │ │ │ +481 AAT_L( A, aat ); │ │ │ │ │ +482 // check whether aat is singular and return true if non-singular │ │ │ │ │ +483 return spdInvAx( aat, y, true ); │ │ │ │ │ +484 } │ │ │ │ │ +485 }; │ │ │ │ │ +486 │ │ │ │ │ +487 } // namespace Impl │ │ │ │ │ +488 │ │ │ │ │ +489 │ │ │ │ │ +490 │ │ │ │ │ +496 template< class ct, int mydim, int cdim> │ │ │ │ │ +_4_9_7 class _A_f_f_i_n_e_G_e_o_m_e_t_r_y │ │ │ │ │ +498 { │ │ │ │ │ +499 public: │ │ │ │ │ +500 │ │ │ │ │ +_5_0_2 typedef ct _c_t_y_p_e; │ │ │ │ │ +503 │ │ │ │ │ +_5_0_5 static const int _m_y_d_i_m_e_n_s_i_o_n= mydim; │ │ │ │ │ +506 │ │ │ │ │ +_5_0_8 static const int _c_o_o_r_d_d_i_m_e_n_s_i_o_n = cdim; │ │ │ │ │ +509 │ │ │ │ │ +_5_1_1 typedef FieldVector< ctype, mydimension > _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ +512 │ │ │ │ │ +_5_1_4 typedef FieldVector< ctype, coorddimension > _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e; │ │ │ │ │ +515 │ │ │ │ │ +_5_1_7 typedef _c_t_y_p_e _V_o_l_u_m_e; │ │ │ │ │ +518 │ │ │ │ │ +_5_2_0 typedef FieldMatrix< ctype, mydimension, coorddimension > │ │ │ │ │ +_J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d; │ │ │ │ │ +521 │ │ │ │ │ +_5_2_3 typedef FieldMatrix< ctype, coorddimension, mydimension > │ │ │ │ │ +_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d; │ │ │ │ │ +524 │ │ │ │ │ +_5_2_6 typedef FieldMatrix< ctype, coorddimension, mydimension > _J_a_c_o_b_i_a_n; │ │ │ │ │ +527 │ │ │ │ │ +_5_2_9 typedef FieldMatrix< ctype, mydimension, coorddimension > _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e; │ │ │ │ │ +530 │ │ │ │ │ +531 private: │ │ │ │ │ +533 typedef _G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_<_ _G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_I_m_p_l_e_m_e_n_t_a_t_i_o_n_<_ _c_t_y_p_e_, │ │ │ │ │ +_m_y_d_i_m_e_n_s_i_o_n_ _> > _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t; │ │ │ │ │ +534 │ │ │ │ │ +535 typedef _G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s_<_ _c_t_y_p_e_,_ _m_y_d_i_m_e_n_s_i_o_n_ _> _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s; │ │ │ │ │ +536 │ │ │ │ │ +537 // Helper class to compute a matrix pseudo inverse │ │ │ │ │ +538 typedef Impl::FieldMatrixHelper< ct > MatrixHelper; │ │ │ │ │ +539 │ │ │ │ │ +540 public: │ │ │ │ │ +_5_4_7 _A_f_f_i_n_e_G_e_o_m_e_t_r_y () = default; │ │ │ │ │ +548 │ │ │ │ │ +_5_5_0 _A_f_f_i_n_e_G_e_o_m_e_t_r_y ( const _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t &refElement, const _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ +&origin, │ │ │ │ │ +551 const _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d &jt ) │ │ │ │ │ +552 : refElement_(refElement), origin_(origin), jacobianTransposed_(jt) │ │ │ │ │ +553 { │ │ │ │ │ +554 integrationElement_ = MatrixHelper::template rightInvA< mydimension, │ │ │ │ │ +coorddimension >( jacobianTransposed_, jacobianInverseTransposed_ ); │ │ │ │ │ +555 } │ │ │ │ │ +556 │ │ │ │ │ +_5_5_8 _A_f_f_i_n_e_G_e_o_m_e_t_r_y ( _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e gt, const _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e &origin, │ │ │ │ │ +559 const _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d &jt ) │ │ │ │ │ +560 : _A_f_f_i_n_e_G_e_o_m_e_t_r_y(_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s::general( gt ), origin, jt) │ │ │ │ │ +561 { } │ │ │ │ │ +562 │ │ │ │ │ +564 template< class CoordVector > │ │ │ │ │ +_5_6_5 _A_f_f_i_n_e_G_e_o_m_e_t_r_y ( const _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t &refElement, const CoordVector │ │ │ │ │ +&coordVector ) │ │ │ │ │ +566 : refElement_(refElement), origin_(coordVector[0]) │ │ │ │ │ +567 { │ │ │ │ │ +568 for( int i = 0; i < _m_y_d_i_m_e_n_s_i_o_n; ++i ) │ │ │ │ │ +569 jacobianTransposed_[ i ] = coordVector[ i+1 ] - origin_; │ │ │ │ │ +570 integrationElement_ = MatrixHelper::template rightInvA< mydimension, │ │ │ │ │ +coorddimension >( jacobianTransposed_, jacobianInverseTransposed_ ); │ │ │ │ │ +571 } │ │ │ │ │ +572 │ │ │ │ │ +574 template< class CoordVector > │ │ │ │ │ +_5_7_5 _A_f_f_i_n_e_G_e_o_m_e_t_r_y ( _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e gt, const CoordVector &coordVector ) │ │ │ │ │ +576 : _A_f_f_i_n_e_G_e_o_m_e_t_r_y(_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s::general( gt ), coordVector) │ │ │ │ │ +577 { } │ │ │ │ │ +578 │ │ │ │ │ +_5_8_0 bool _a_f_f_i_n_e () const { return true; } │ │ │ │ │ +581 │ │ │ │ │ +_5_8_3 _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e _t_y_p_e () const { return refElement_._t_y_p_e(); } │ │ │ │ │ +584 │ │ │ │ │ +_5_8_6 int _c_o_r_n_e_r_s () const { return refElement_._s_i_z_e( _m_y_d_i_m_e_n_s_i_o_n ); } │ │ │ │ │ +587 │ │ │ │ │ +_5_8_9 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _c_o_r_n_e_r ( int i ) const │ │ │ │ │ +590 { │ │ │ │ │ +591 return _g_l_o_b_a_l( refElement_._p_o_s_i_t_i_o_n( i, _m_y_d_i_m_e_n_s_i_o_n ) ); │ │ │ │ │ +592 } │ │ │ │ │ +593 │ │ │ │ │ +_5_9_5 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _c_e_n_t_e_r () const { return _g_l_o_b_a_l( refElement_._p_o_s_i_t_i_o_n( 0, │ │ │ │ │ +0 ) ); } │ │ │ │ │ +596 │ │ │ │ │ +_6_0_3 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _g_l_o_b_a_l ( const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l ) const │ │ │ │ │ +604 { │ │ │ │ │ +605 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e _g_l_o_b_a_l( origin_ ); │ │ │ │ │ +606 jacobianTransposed_.umtv( _l_o_c_a_l, _g_l_o_b_a_l ); │ │ │ │ │ +607 return _g_l_o_b_a_l; │ │ │ │ │ +608 } │ │ │ │ │ +609 │ │ │ │ │ +_6_2_3 _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e _l_o_c_a_l ( const _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e &_g_l_o_b_a_l ) const │ │ │ │ │ +624 { │ │ │ │ │ +625 _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e _l_o_c_a_l; │ │ │ │ │ +626 jacobianInverseTransposed_.mtv( _g_l_o_b_a_l - origin_, _l_o_c_a_l ); │ │ │ │ │ +627 return _l_o_c_a_l; │ │ │ │ │ +628 } │ │ │ │ │ +629 │ │ │ │ │ +_6_4_0 _c_t_y_p_e _i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t ([[maybe_unused]] const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l) │ │ │ │ │ +const │ │ │ │ │ +641 { │ │ │ │ │ +642 return integrationElement_; │ │ │ │ │ +643 } │ │ │ │ │ +644 │ │ │ │ │ +_6_4_6 _V_o_l_u_m_e _v_o_l_u_m_e () const │ │ │ │ │ +647 { │ │ │ │ │ +648 return integrationElement_ * refElement_._v_o_l_u_m_e(); │ │ │ │ │ +649 } │ │ │ │ │ +650 │ │ │ │ │ +_6_5_7 const _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d &_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d ([[maybe_unused]] const │ │ │ │ │ +_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l) const │ │ │ │ │ +658 { │ │ │ │ │ +659 return jacobianTransposed_; │ │ │ │ │ +660 } │ │ │ │ │ +661 │ │ │ │ │ +_6_6_8 const _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d &_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d ([ │ │ │ │ │ +[maybe_unused]] const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l) const │ │ │ │ │ +669 { │ │ │ │ │ +670 return jacobianInverseTransposed_; │ │ │ │ │ +671 } │ │ │ │ │ +672 │ │ │ │ │ +_6_7_9 _J_a_c_o_b_i_a_n _j_a_c_o_b_i_a_n ([[maybe_unused]] const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e &_l_o_c_a_l) const │ │ │ │ │ +680 { │ │ │ │ │ +681 return jacobianTransposed_.transposed(); │ │ │ │ │ +682 } │ │ │ │ │ +683 │ │ │ │ │ +_6_9_0 _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e _j_a_c_o_b_i_a_n_I_n_v_e_r_s_e ([[maybe_unused]] const _L_o_c_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ +&_l_o_c_a_l) const │ │ │ │ │ +691 { │ │ │ │ │ +692 return jacobianInverseTransposed_.transposed(); │ │ │ │ │ +693 } │ │ │ │ │ +694 │ │ │ │ │ +_6_9_5 friend _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t _r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t ( const _A_f_f_i_n_e_G_e_o_m_e_t_r_y &geometry ) │ │ │ │ │ +696 { │ │ │ │ │ +697 return geometry.refElement_; │ │ │ │ │ +698 } │ │ │ │ │ +699 │ │ │ │ │ +700 private: │ │ │ │ │ +701 _R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t refElement_; │ │ │ │ │ +702 _G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e origin_; │ │ │ │ │ +703 _J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d jacobianTransposed_; │ │ │ │ │ +704 _J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d jacobianInverseTransposed_; │ │ │ │ │ +705 _c_t_y_p_e integrationElement_; │ │ │ │ │ +706 }; │ │ │ │ │ +707 │ │ │ │ │ +708} // namespace Dune │ │ │ │ │ +709 │ │ │ │ │ +710#endif // #ifndef DUNE_GEOMETRY_AFFINEGEOMETRY_HH │ │ │ │ │ _t_y_p_e_._h_h │ │ │ │ │ A unique label for each type of element that can occur in a grid. │ │ │ │ │ _D_u_n_e │ │ │ │ │ DDeeffiinniittiioonn affinegeometry.hh:21 │ │ │ │ │ +_D_u_n_e_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ +decltype(referenceElement(std::declval< T >()...)) ReferenceElement │ │ │ │ │ +DDeeffiinniittiioonn referenceelements.hh:347 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ +This class provides access to geometric and topological properties of a │ │ │ │ │ +reference element. │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:52 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_v_o_l_u_m_e │ │ │ │ │ +CoordinateField volume() const │ │ │ │ │ +obtain the volume of the reference element │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:228 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_t_y_p_e │ │ │ │ │ +GeometryType type(int i, int c) const │ │ │ │ │ +obtain the type of subentity (i,c) │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:167 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_p_o_s_i_t_i_o_n │ │ │ │ │ +Coordinate position(int i, int c) const │ │ │ │ │ +position of the barycenter of entity (i,c) │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:190 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_:_:_s_i_z_e │ │ │ │ │ +int size(int c) const │ │ │ │ │ +number of subentities of codimension c │ │ │ │ │ +DDeeffiinniittiioonn referenceelement.hh:94 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_I_m_p_l_e_m_e_n_t_a_t_i_o_n │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:33 │ │ │ │ │ +_D_u_n_e_:_:_G_e_o_:_:_R_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t_s │ │ │ │ │ +Class providing access to the singletons of the reference elements. │ │ │ │ │ +DDeeffiinniittiioonn referenceelements.hh:128 │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y │ │ │ │ │ +Implementation of the Geometry interface for affine geometries. │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:498 │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y │ │ │ │ │ +AffineGeometry(const ReferenceElement &refElement, const CoordVector │ │ │ │ │ +&coordVector) │ │ │ │ │ +Create affine geometry from reference element and a vector of vertex │ │ │ │ │ +coordinates. │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:565 │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y │ │ │ │ │ +AffineGeometry()=default │ │ │ │ │ +Constructs an empty geometry. │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y │ │ │ │ │ +AffineGeometry(Dune::GeometryType gt, const GlobalCoordinate &origin, const │ │ │ │ │ +JacobianTransposed &jt) │ │ │ │ │ +Create affine geometry from GeometryType, one vertex, and the Jacobian matrix. │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:558 │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_L_o_c_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ +FieldVector< ctype, mydimension > LocalCoordinate │ │ │ │ │ +Type for local coordinate vector. │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:511 │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_t_y_p_e │ │ │ │ │ +Dune::GeometryType type() const │ │ │ │ │ +Obtain the type of the reference element. │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:583 │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_m_y_d_i_m_e_n_s_i_o_n │ │ │ │ │ +static const int mydimension │ │ │ │ │ +Dimension of the geometry. │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:505 │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y │ │ │ │ │ +AffineGeometry(const ReferenceElement &refElement, const GlobalCoordinate │ │ │ │ │ +&origin, const JacobianTransposed &jt) │ │ │ │ │ +Create affine geometry from reference element, one vertex, and the Jacobian │ │ │ │ │ +matrix. │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:550 │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_V_o_l_u_m_e │ │ │ │ │ +ctype Volume │ │ │ │ │ +Type used for volume. │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:517 │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e │ │ │ │ │ +JacobianInverse jacobianInverse(const LocalCoordinate &local) const │ │ │ │ │ +Obtain the Jacobian's inverse. │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:690 │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_r_e_f_e_r_e_n_c_e_E_l_e_m_e_n_t │ │ │ │ │ +friend ReferenceElement referenceElement(const AffineGeometry &geometry) │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:695 │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y │ │ │ │ │ +AffineGeometry(Dune::GeometryType gt, const CoordVector &coordVector) │ │ │ │ │ +Create affine geometry from GeometryType and a vector of vertex coordinates. │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:575 │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_i_n_t_e_g_r_a_t_i_o_n_E_l_e_m_e_n_t │ │ │ │ │ +ctype integrationElement(const LocalCoordinate &local) const │ │ │ │ │ +Obtain the integration element. │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:640 │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e │ │ │ │ │ +FieldMatrix< ctype, mydimension, coorddimension > JacobianInverse │ │ │ │ │ +Type for the inverse Jacobian matrix. │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:529 │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n │ │ │ │ │ +FieldMatrix< ctype, coorddimension, mydimension > Jacobian │ │ │ │ │ +Type for the Jacobian matrix. │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:526 │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ +const JacobianInverseTransposed & jacobianInverseTransposed(const │ │ │ │ │ +LocalCoordinate &local) const │ │ │ │ │ +Obtain the transposed of the Jacobian's inverse. │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:668 │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ +FieldMatrix< ctype, mydimension, coorddimension > JacobianTransposed │ │ │ │ │ +Type for the transposed Jacobian matrix. │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:520 │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_c_o_r_n_e_r │ │ │ │ │ +GlobalCoordinate corner(int i) const │ │ │ │ │ +Obtain coordinates of the i-th corner. │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:589 │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_c_o_r_n_e_r_s │ │ │ │ │ +int corners() const │ │ │ │ │ +Obtain number of corners of the corresponding reference element. │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:586 │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_l_o_c_a_l │ │ │ │ │ +LocalCoordinate local(const GlobalCoordinate &global) const │ │ │ │ │ +Evaluate the inverse mapping. │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:623 │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_J_a_c_o_b_i_a_n_I_n_v_e_r_s_e_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ +FieldMatrix< ctype, coorddimension, mydimension > JacobianInverseTransposed │ │ │ │ │ +Type for the transposed inverse Jacobian matrix. │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:523 │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_c_o_o_r_d_d_i_m_e_n_s_i_o_n │ │ │ │ │ +static const int coorddimension │ │ │ │ │ +Dimension of the world space. │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:508 │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_g_l_o_b_a_l │ │ │ │ │ +GlobalCoordinate global(const LocalCoordinate &local) const │ │ │ │ │ +Evaluate the mapping. │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:603 │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_c_e_n_t_e_r │ │ │ │ │ +GlobalCoordinate center() const │ │ │ │ │ +Obtain the centroid of the mapping's image. │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:595 │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n │ │ │ │ │ +Jacobian jacobian(const LocalCoordinate &local) const │ │ │ │ │ +Obtain the Jacobian. │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:679 │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_c_t_y_p_e │ │ │ │ │ +ct ctype │ │ │ │ │ +Type used for coordinates. │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:502 │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_G_l_o_b_a_l_C_o_o_r_d_i_n_a_t_e │ │ │ │ │ +FieldVector< ctype, coorddimension > GlobalCoordinate │ │ │ │ │ +Type for coordinate vector in world space. │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:514 │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_a_f_f_i_n_e │ │ │ │ │ +bool affine() const │ │ │ │ │ +Always true: this is an affine geometry. │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:580 │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_j_a_c_o_b_i_a_n_T_r_a_n_s_p_o_s_e_d │ │ │ │ │ +const JacobianTransposed & jacobianTransposed(const LocalCoordinate &local) │ │ │ │ │ +const │ │ │ │ │ +Obtain the transposed of the Jacobian. │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:657 │ │ │ │ │ +_D_u_n_e_:_:_A_f_f_i_n_e_G_e_o_m_e_t_r_y_:_:_v_o_l_u_m_e │ │ │ │ │ +Volume volume() const │ │ │ │ │ +Obtain the volume of the element. │ │ │ │ │ +DDeeffiinniittiioonn affinegeometry.hh:646 │ │ │ │ │ _D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e │ │ │ │ │ Unique label for each type of entities that can occur in DUNE grids. │ │ │ │ │ DDeeffiinniittiioonn type.hh:114 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_t_o_I_d │ │ │ │ │ -constexpr Id toId() const │ │ │ │ │ -Create an Id representation of this GeometryType. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:210 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_d_i_m │ │ │ │ │ -constexpr unsigned int dim() const │ │ │ │ │ -Return dimension of the type. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:360 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_d │ │ │ │ │ -constexpr unsigned int id() const │ │ │ │ │ -Return the topology id of the type. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:365 │ │ │ │ │ -_D_u_n_e_:_:_G_e_o_m_e_t_r_y_T_y_p_e_:_:_i_s_N_o_n_e │ │ │ │ │ -constexpr bool isNone() const │ │ │ │ │ -Return true if entity is a singular of any dimension. │ │ │ │ │ -DDeeffiinniittiioonn type.hh:355 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x │ │ │ │ │ -Compute per-dimension indices for geometry types. │ │ │ │ │ -DDeeffiinniittiioonn typeindex.hh:25 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x_:_:_s_i_z_e │ │ │ │ │ -static constexpr std::size_t size(std::size_t dim) │ │ │ │ │ -Compute total number of geometry types for the given dimension. │ │ │ │ │ -DDeeffiinniittiioonn typeindex.hh:61 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x_:_:_t_y_p_e │ │ │ │ │ -static constexpr GeometryType type(std::size_t dim, std::size_t index) │ │ │ │ │ -compute the geometry type for the given local index and dimension │ │ │ │ │ -DDeeffiinniittiioonn typeindex.hh:79 │ │ │ │ │ -_D_u_n_e_:_:_L_o_c_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x_:_:_i_n_d_e_x │ │ │ │ │ -static constexpr std::size_t index(const GeometryType >) │ │ │ │ │ -Compute the index for the given geometry type within its dimension. │ │ │ │ │ -DDeeffiinniittiioonn typeindex.hh:73 │ │ │ │ │ -_D_u_n_e_:_:_G_l_o_b_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x │ │ │ │ │ -Compute indices for geometry types, taking the dimension into account. │ │ │ │ │ -DDeeffiinniittiioonn typeindex.hh:90 │ │ │ │ │ -_D_u_n_e_:_:_G_l_o_b_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x_:_:_i_n_d_e_x │ │ │ │ │ -static constexpr std::size_t index(const GeometryType >) │ │ │ │ │ -Compute the index for the given geometry type over all dimensions. │ │ │ │ │ -DDeeffiinniittiioonn typeindex.hh:138 │ │ │ │ │ -_D_u_n_e_:_:_G_l_o_b_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x_:_:_o_f_f_s_e_t │ │ │ │ │ -static constexpr std::size_t offset(std::size_t dim) │ │ │ │ │ -Compute the starting index for a given dimension including irregular geometry │ │ │ │ │ -types. │ │ │ │ │ -DDeeffiinniittiioonn typeindex.hh:113 │ │ │ │ │ -_D_u_n_e_:_:_G_l_o_b_a_l_G_e_o_m_e_t_r_y_T_y_p_e_I_n_d_e_x_:_:_s_i_z_e │ │ │ │ │ -static constexpr std::size_t size(std::size_t maxdim) │ │ │ │ │ -Compute total number of geometry types up to and including the given dimension. │ │ │ │ │ -DDeeffiinniittiioonn typeindex.hh:125 │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00260.html │ │ │ │ @@ -274,15 +274,15 @@ │ │ │ │
GeometryTypes::cube(2), 2>
│ │ │ │
{
│ │ │ │
typedef SquaringTheCircle::RefinementImp<CoordType> Imp;
│ │ │ │
};
│ │ │ │
}
│ │ │ │
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

    │ │ │ │

    The (non-virtual) Refinement system is organized in the following way into namespaces:

      │ │ │ │
    • Only template class StaticRefinement lives directly in namespace Dune.
    • │ │ │ │
    • Use namespace Dune::RefinementImp for all the Implementation.
    • │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a00263.html │ │ │ │ @@ -647,16 +647,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/a01091.html │ │ │ │ @@ -82,15 +82,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
      │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -883,16 +883,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/a01095.html │ │ │ │ @@ -83,15 +83,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01099.html │ │ │ │ @@ -81,15 +81,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>

      │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -389,16 +389,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/a01107.html │ │ │ │ @@ -81,15 +81,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.
       
      using CoordinateField = ctype
      │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -1028,15 +1028,15 @@ │ │ │ │
      │ │ │ │ │ │ │ │

      Dimension of the geometry.

      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01111.html │ │ │ │ @@ -81,15 +81,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.
       
      typedef FieldVector< ctype, mydimensionLocalCoordinate
      │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -933,15 +933,15 @@ │ │ │ │
      │ │ │ │ │ │ │ │

      Dimension of the cube element.

      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01115.html │ │ │ │ @@ -79,15 +79,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
      │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -117,15 +117,15 @@ │ │ │ │ │ │ │ │

      │ │ │ │ Public Types

      typedef CoordType ctype
       Type used for single coordinate coefficients.
       
      typedef FieldVector< ctype, dim > LocalCoordinate
      │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01119.html │ │ │ │ @@ -79,15 +79,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
      │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -123,15 +123,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │
      │ │ │ │
      The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01123.html │ │ │ │ @@ -82,15 +82,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...
       
      │ │ │ │ @@ -417,15 +417,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/a01127.html │ │ │ │ @@ -79,15 +79,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
      │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -341,15 +341,15 @@ │ │ │ │ │ │ │ │
      │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01131.html │ │ │ │ @@ -82,15 +82,15 @@ │ │ │ │
      Dune::LocalFiniteElementGeometry< LFE, cdim > Class Template Reference
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │

      Geometry implementation based on local-basis function parametrization. │ │ │ │ More...

      │ │ │ │ │ │ │ │ -

      #include <dune/geometry/localfiniteelementgeometry.hh>

      │ │ │ │ +

      #include <dune/geometry/localfiniteelementgeometry.hh>

      │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -1267,15 +1267,15 @@ │ │ │ │
      │ │ │ │ │ │ │ │

      geometry dimension

      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01135.html │ │ │ │ @@ -83,15 +83,15 @@ │ │ │ │
      Dune::MappedGeometry< Map, Geo > Class Template Reference
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │

      Geometry parametrized by a LocalFunction and a LocalGeometry. │ │ │ │ More...

      │ │ │ │ │ │ │ │ -

      #include <dune/geometry/mappedgeometry.hh>

      │ │ │ │ +

      #include <dune/geometry/mappedgeometry.hh>

      │ │ │ │

      │ │ │ │ Public Types

      using ctype = typename LocalBasisTraits::DomainFieldType
       coordinate type
       
      using LocalCoordinate = FieldVector< ctype, mydimension >
      │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -1074,15 +1074,15 @@ │ │ │ │
      │ │ │ │ │ │ │ │

      geometry dimension

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

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

      │ │ │ │ │ │ │ │ -

      #include <dune/geometry/multilineargeometry.hh>

      │ │ │ │ +

      #include <dune/geometry/multilineargeometry.hh>

      │ │ │ │

      │ │ │ │ Public Types

      using LocalCoordinate = typename Geo::LocalCoordinate
       type of local coordinates
       
      using GlobalCoordinate = std::remove_reference_t< decltype(std::declval< Map >()(std::declval< typename Geo::GlobalCoordinate >()))>
      │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -176,15 +176,15 @@ │ │ │ │
      │ │ │ │ │ │ │ │

      tolerance to numerical algorithms

      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01143.html │ │ │ │ @@ -79,15 +79,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

      │ │ │ │ @@ -143,15 +143,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01147.html │ │ │ │ @@ -79,15 +79,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>

      │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -149,15 +149,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/a01151.html │ │ │ │ @@ -85,15 +85,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
      │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -1521,15 +1521,15 @@ │ │ │ │
      │ │ │ │ │ │ │ │

      geometry dimension

      │ │ │ │ │ │ │ │
      │ │ │ │
      │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01155.html │ │ │ │ @@ -76,15 +76,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
      │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -211,15 +211,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │
      │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01159.html │ │ │ │ @@ -84,15 +84,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
      │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -1479,15 +1479,15 @@ │ │ │ │
      │ │ │ │ │ │ │ │

      geometry dimension

      │ │ │ │ │ │ │ │
      │ │ │ │
      │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01163.html │ │ │ │ @@ -82,15 +82,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>

      │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -392,15 +392,15 @@ │ │ │ │ │ │ │ │

      │ │ │ │ Public Types

      typedef ct Field
       Number type used for coordinates and quadrature weights.
       
      typedef Dune::FieldVector< ct, dim > Vector
      │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01167.html │ │ │ │ @@ -73,27 +73,27 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │
      std::tuple_size< Dune::QuadraturePoint< ct, dim > > Struct Template Reference
      │ │ │ │
      │ │ │ │
      │ │ │ │ │ │ │ │ -

      #include <dune/geometry/quadraturerules.hh>

      │ │ │ │ +

      #include <dune/geometry/quadraturerules.hh>

      │ │ │ │
      │ │ │ │ Inheritance diagram for std::tuple_size< Dune::QuadraturePoint< ct, dim > >:
      │ │ │ │
      │ │ │ │
      Inheritance graph
      │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │
      The documentation for this struct was generated from the following file: │ │ │ │
      │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01171.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
      │ │ │ │ Public Types | │ │ │ │ List of all members
      │ │ │ │
      std::tuple_element< 0, Dune::QuadraturePoint< ct, dim > > Struct Template Reference
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │ -

      #include <dune/geometry/quadraturerules.hh>

      │ │ │ │ +

      #include <dune/geometry/quadraturerules.hh>

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

      │ │ │ │ Public Types

      using type = Dune::FieldVector< ct, dim >
       
      │ │ │ │

      Member Typedef Documentation

      │ │ │ │ @@ -101,15 +101,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01175.html │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │
      │ │ │ │ Public Types | │ │ │ │ List of all members
      │ │ │ │
      std::tuple_element< 1, Dune::QuadraturePoint< ct, dim > > Struct Template Reference
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │ -

      #include <dune/geometry/quadraturerules.hh>

      │ │ │ │ +

      #include <dune/geometry/quadraturerules.hh>

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

      │ │ │ │ Public Types

      using type = ct
       
      │ │ │ │

      Member Typedef Documentation

      │ │ │ │ @@ -101,15 +101,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01179.html │ │ │ │ @@ -76,29 +76,29 @@ │ │ │ │
      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/a01183.html │ │ │ │ @@ -84,15 +84,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
      │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -482,15 +482,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │
      │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01187.html │ │ │ │ @@ -78,21 +78,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/a01191.html │ │ │ │ @@ -79,15 +79,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>

      │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -230,15 +230,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/a01195.html │ │ │ │ @@ -75,17 +75,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/a01199.html │ │ │ │ @@ -75,17 +75,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/a01203.html │ │ │ │ @@ -75,17 +75,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/a01207.html │ │ │ │ @@ -75,17 +75,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/a01215.html │ │ │ │ @@ -79,15 +79,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
       
      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
       
      │ │ │ │ @@ -113,15 +113,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/a01219.html │ │ │ │ @@ -96,15 +96,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/a01223.html │ │ │ │ @@ -143,15 +143,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01227.html │ │ │ │ @@ -461,15 +461,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/a01231.html │ │ │ │ @@ -118,15 +118,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/a01235.html │ │ │ │ @@ -412,15 +412,15 @@ │ │ │ │
      │ │ │ │ │ │ │ │

      Know your own dimension.

      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01239.html │ │ │ │ @@ -101,15 +101,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01243.html │ │ │ │ @@ -98,15 +98,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/a01247.html │ │ │ │ @@ -161,15 +161,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01251.html │ │ │ │ @@ -200,15 +200,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01255.html │ │ │ │ @@ -265,15 +265,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01259.html │ │ │ │ @@ -83,15 +83,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01263.html │ │ │ │ @@ -395,15 +395,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01267.html │ │ │ │ @@ -101,15 +101,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01271.html │ │ │ │ @@ -452,15 +452,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01275.html │ │ │ │ @@ -513,15 +513,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01279.html │ │ │ │ @@ -196,15 +196,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01283.html │ │ │ │ @@ -83,15 +83,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01287.html │ │ │ │ @@ -402,15 +402,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01291.html │ │ │ │ @@ -101,15 +101,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01295.html │ │ │ │ @@ -452,15 +452,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 │ │ │ │ @@ -196,15 +196,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01307.html │ │ │ │ @@ -83,15 +83,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01311.html │ │ │ │ @@ -402,15 +402,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01315.html │ │ │ │ @@ -101,15 +101,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01319.html │ │ │ │ @@ -452,15 +452,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01323.html │ │ │ │ @@ -491,15 +491,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01327.html │ │ │ │ @@ -196,15 +196,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01331.html │ │ │ │ @@ -395,15 +395,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01335.html │ │ │ │ @@ -101,15 +101,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this struct was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01339.html │ │ │ │ @@ -83,15 +83,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01343.html │ │ │ │ @@ -384,15 +384,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01347.html │ │ │ │ @@ -503,15 +503,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01351.html │ │ │ │ @@ -152,15 +152,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01355.html │ │ │ │ @@ -81,15 +81,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>

      │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -328,15 +328,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/a01359.html │ │ │ │ @@ -82,15 +82,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>

      │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -309,15 +309,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/a01367.html │ │ │ │ @@ -80,15 +80,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 │ │ │ │ @@ -1059,15 +1059,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/a01379.html │ │ │ │ @@ -79,15 +79,15 @@ │ │ │ │
      Dune::LocalGeometryTypeIndex Class Reference
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │

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

      │ │ │ │ │ │ │ │ -

      #include <dune/geometry/typeindex.hh>

      │ │ │ │ +

      #include <dune/geometry/typeindex.hh>

      │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -193,15 +193,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/a01383.html │ │ │ │ @@ -79,15 +79,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.
       
      static constexpr std::size_t index (const GeometryType &gt)
      │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -183,15 +183,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/a01395.html │ │ │ │ @@ -83,15 +83,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01399.html │ │ │ │ @@ -73,15 +73,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/a01403.html │ │ │ │ @@ -161,15 +161,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.
       
      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/a01407.html │ │ │ │ @@ -367,15 +367,15 @@ │ │ │ │
      │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01411.html │ │ │ │ @@ -83,15 +83,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01415.html │ │ │ │ @@ -110,15 +110,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01419.html │ │ │ │ @@ -181,15 +181,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01423.html │ │ │ │ @@ -344,15 +344,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01427.html │ │ │ │ @@ -579,15 +579,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01431.html │ │ │ │ @@ -341,15 +341,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01435.html │ │ │ │ @@ -83,15 +83,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01439.html │ │ │ │ @@ -83,15 +83,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01443.html │ │ │ │ @@ -207,15 +207,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01447.html │ │ │ │ @@ -121,15 +121,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01451.html │ │ │ │ @@ -121,15 +121,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01455.html │ │ │ │ @@ -121,15 +121,15 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      The documentation for this class was generated from the following file: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01459.html │ │ │ │ @@ -82,15 +82,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
      │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -607,16 +607,16 @@ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ │ │ │ │
      │ │ │ │
      │ │ │ │
      The documentation for this class was generated from the following files: │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/a01463.html │ │ │ │ @@ -76,21 +76,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 │ │ │ │ @@ -69,14 +69,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_000004_000007.html │ │ │ │ @@ -69,14 +69,14 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │ -

      geometry → utility Relation

      File in dune/geometryIncludes file in dune/geometry/utility
      localfiniteelementgeometry.hhalgorithms.hh
      localfiniteelementgeometry.hhconvergence.hh
      mappedgeometry.hhalgorithms.hh
      mappedgeometry.hhconvergence.hh
      │ │ │ │ +

      geometry → utility Relation

      File in dune/geometryIncludes file in dune/geometry/utility
      localfiniteelementgeometry.hhalgorithms.hh
      localfiniteelementgeometry.hhconvergence.hh
      mappedgeometry.hhalgorithms.hh
      mappedgeometry.hhconvergence.hh
      │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/dir_18620fa9f137864b479f21357cfac10d.html │ │ │ │ @@ -97,56 +97,56 @@ │ │ │ │  refinement │ │ │ │   │ │ │ │  utility │ │ │ │   │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

      │ │ │ │ Files

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

      │ │ │ │ Files

       algorithms.hh
       algorithms.hh
       
       convergence.hh
       convergence.hh
       
       typefromvertexcount.hh
       typefromvertexcount.hh
       
      │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/dir_b609f53bbb5e26b8e9292001c59476a3.html │ │ │ │ @@ -84,29 +84,29 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │

      │ │ │ │ Files

       base.cc
       This file contains the parts independent of a particular Refinement implementation.
       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, etc.).
       hcube.cc
       This file contains the Refinement implementation for hypercubes (quadrilaterals, hexahedrons, etc.).
       
       hcubetriangulation.cc
       This file contains the Refinement implementation for triangulating hypercubes (quadrilateral -> triangle, hexahedron -> tetrahedron)
       hcubetriangulation.cc
       This file contains the Refinement implementation for triangulating hypercubes (quadrilateral -> triangle, hexahedron -> tetrahedron)
       
       prismtriangulation.cc
       prismtriangulation.cc
       
       pyramidtriangulation.cc
       pyramidtriangulation.cc
       
       simplex.cc
       This file contains the Refinement implementation for simplices (triangles, tetrahedrons...)
       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,107 +1,107 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ referenceelementspage.txt │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.10.0/doc/appl/refelements/ │ │ │ │ │ │ - a00038.html │ │ │ │ │ │ + a00008.html │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ mainpage.txt │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.10.0/doc/doxygen/ │ │ │ │ │ │ a00164.html │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ modules.txt │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.10.0/doc/doxygen/ │ │ │ │ │ │ a00167.html │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ affinegeometry.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.10.0/dune/geometry/ │ │ │ │ │ │ - a00233.html │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ + a00248.html │ │ │ │ │ │ + dune/geometry/type.hh │ │ │ │ │ │ Dune::AffineGeometry │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Geo │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ axisalignedcubegeometry.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.10.0/dune/geometry/ │ │ │ │ │ │ - a00224.html │ │ │ │ │ │ - dune/geometry/referenceelements.hh │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ + a00182.html │ │ │ │ │ │ + dune/geometry/referenceelements.hh │ │ │ │ │ │ + dune/geometry/type.hh │ │ │ │ │ │ Dune::AxisAlignedCubeGeometry │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dimension.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.10.0/dune/geometry/ │ │ │ │ │ │ - a00245.html │ │ │ │ │ │ + a00221.html │ │ │ │ │ │ Dune::Dim │ │ │ │ │ │ Dune::Codim │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ generalvertexorder.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.10.0/dune/geometry/ │ │ │ │ │ │ - a00191.html │ │ │ │ │ │ - type.hh │ │ │ │ │ │ - dune/geometry/referenceelements.hh │ │ │ │ │ │ + a00176.html │ │ │ │ │ │ + type.hh │ │ │ │ │ │ + dune/geometry/referenceelements.hh │ │ │ │ │ │ Dune::GeneralVertexOrder │ │ │ │ │ │ Dune::GeneralVertexOrder::iterator │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ localfiniteelementgeometry.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.10.0/dune/geometry/ │ │ │ │ │ │ - a00182.html │ │ │ │ │ │ - dune/geometry/affinegeometry.hh │ │ │ │ │ │ - dune/geometry/quadraturerules.hh │ │ │ │ │ │ - dune/geometry/referenceelements.hh │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ - dune/geometry/utility/algorithms.hh │ │ │ │ │ │ - dune/geometry/utility/convergence.hh │ │ │ │ │ │ + a00173.html │ │ │ │ │ │ + dune/geometry/affinegeometry.hh │ │ │ │ │ │ + dune/geometry/quadraturerules.hh │ │ │ │ │ │ + dune/geometry/referenceelements.hh │ │ │ │ │ │ + dune/geometry/type.hh │ │ │ │ │ │ + dune/geometry/utility/algorithms.hh │ │ │ │ │ │ + dune/geometry/utility/convergence.hh │ │ │ │ │ │ Dune::LocalFiniteElementGeometry │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ mappedgeometry.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.10.0/dune/geometry/ │ │ │ │ │ │ - a00185.html │ │ │ │ │ │ - dune/geometry/affinegeometry.hh │ │ │ │ │ │ - dune/geometry/quadraturerules.hh │ │ │ │ │ │ - dune/geometry/referenceelements.hh │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ - dune/geometry/utility/algorithms.hh │ │ │ │ │ │ - dune/geometry/utility/convergence.hh │ │ │ │ │ │ + a00215.html │ │ │ │ │ │ + dune/geometry/affinegeometry.hh │ │ │ │ │ │ + dune/geometry/quadraturerules.hh │ │ │ │ │ │ + dune/geometry/referenceelements.hh │ │ │ │ │ │ + dune/geometry/type.hh │ │ │ │ │ │ + dune/geometry/utility/algorithms.hh │ │ │ │ │ │ + dune/geometry/utility/convergence.hh │ │ │ │ │ │ Dune::MappedGeometry │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ multilineargeometry.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.10.0/dune/geometry/ │ │ │ │ │ │ - a00203.html │ │ │ │ │ │ - dune/geometry/affinegeometry.hh │ │ │ │ │ │ - dune/geometry/referenceelements.hh │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ + a00239.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.10.0/dune/geometry/ │ │ │ │ │ │ - a00227.html │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ - dune/geometry/typeindex.hh │ │ │ │ │ │ + a00224.html │ │ │ │ │ │ + dune/geometry/type.hh │ │ │ │ │ │ + dune/geometry/typeindex.hh │ │ │ │ │ │ std::tuple_size< Dune::QuadraturePoint< ct, dim > > │ │ │ │ │ │ std::tuple_element< 0, Dune::QuadraturePoint< ct, dim > > │ │ │ │ │ │ std::tuple_element< 1, Dune::QuadraturePoint< ct, dim > > │ │ │ │ │ │ Dune::QuadratureOrderOutOfRange │ │ │ │ │ │ Dune::QuadraturePoint │ │ │ │ │ │ Dune::QuadratureRule │ │ │ │ │ │ Dune::QuadratureRules │ │ │ │ │ │ @@ -112,206 +112,206 @@ │ │ │ │ │ │ Dune::QuadratureRuleFactory< ctype, 3 > │ │ │ │ │ │ Dune │ │ │ │ │ │ std │ │ │ │ │ │ Dune::QuadratureType │ │ │ │ │ │ │ │ │ │ │ │ #define │ │ │ │ │ │ DUNE_INCLUDING_IMPLEMENTATION │ │ │ │ │ │ - a00227.html │ │ │ │ │ │ + a00224.html │ │ │ │ │ │ a0aeda817d7161b7c1afd8dd15ff12f17 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ referenceelement.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.10.0/dune/geometry/ │ │ │ │ │ │ - a00242.html │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ + a00206.html │ │ │ │ │ │ + dune/geometry/type.hh │ │ │ │ │ │ Dune::Geo::ReferenceElement │ │ │ │ │ │ Dune::Geo::ReferenceElement::Codim │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Geo │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ referenceelementimplementation.cc │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.10.0/dune/geometry/ │ │ │ │ │ │ - a00230.html │ │ │ │ │ │ - dune/geometry/referenceelementimplementation.hh │ │ │ │ │ │ + a00179.html │ │ │ │ │ │ + dune/geometry/referenceelementimplementation.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Geo │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ referenceelementimplementation.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.10.0/dune/geometry/ │ │ │ │ │ │ - a00239.html │ │ │ │ │ │ - dune/geometry/referenceelement.hh │ │ │ │ │ │ - dune/geometry/affinegeometry.hh │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ + a00218.html │ │ │ │ │ │ + dune/geometry/referenceelement.hh │ │ │ │ │ │ + dune/geometry/affinegeometry.hh │ │ │ │ │ │ + dune/geometry/type.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::Geo │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ referenceelements.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.10.0/dune/geometry/ │ │ │ │ │ │ - a00200.html │ │ │ │ │ │ - dune/geometry/dimension.hh │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ - dune/geometry/referenceelement.hh │ │ │ │ │ │ - dune/geometry/referenceelementimplementation.hh │ │ │ │ │ │ + a00242.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 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ refinement.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.10.0/dune/geometry/ │ │ │ │ │ │ - a00194.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.10.0/dune/geometry/refinement/ │ │ │ │ │ │ - a00218.html │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ + a00194.html │ │ │ │ │ │ + dune/geometry/type.hh │ │ │ │ │ │ Dune::RefinementImp::Traits │ │ │ │ │ │ Dune::RefinementIntervals │ │ │ │ │ │ Dune::StaticRefinement │ │ │ │ │ │ Dune::StaticRefinement::Codim │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::RefinementImp │ │ │ │ │ │ │ │ │ │ │ │ #define │ │ │ │ │ │ DUNE_GEOMETRY_REFINEMENT_BASE_CC │ │ │ │ │ │ - a00218.html │ │ │ │ │ │ + a00194.html │ │ │ │ │ │ ab8232ef779e57c3676c54a73bd759f72 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ hcube.cc │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.10.0/dune/geometry/refinement/ │ │ │ │ │ │ - a00209.html │ │ │ │ │ │ - dune/geometry/referenceelements.hh │ │ │ │ │ │ - dune/geometry/axisalignedcubegeometry.hh │ │ │ │ │ │ - base.cc │ │ │ │ │ │ + a00188.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 │ │ │ │ │ │ + a00188.html │ │ │ │ │ │ a2be7a03e64dedaaa1cf5c7c8e2a9cf60 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ hcubetriangulation.cc │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.10.0/dune/geometry/refinement/ │ │ │ │ │ │ - a00206.html │ │ │ │ │ │ - dune/geometry/referenceelements.hh │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ - base.cc │ │ │ │ │ │ - simplex.cc │ │ │ │ │ │ + a00200.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 │ │ │ │ │ │ - a00206.html │ │ │ │ │ │ + a00200.html │ │ │ │ │ │ a3fe24de9b756cd18f014979a41cb0843 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ prismtriangulation.cc │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.10.0/dune/geometry/refinement/ │ │ │ │ │ │ - a00221.html │ │ │ │ │ │ - dune/geometry/referenceelements.hh │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ - base.cc │ │ │ │ │ │ - simplex.cc │ │ │ │ │ │ + a00191.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 │ │ │ │ │ │ - a00221.html │ │ │ │ │ │ + a00191.html │ │ │ │ │ │ ae56eb72b98f97f57cc224eb9b4394ef8 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ pyramidtriangulation.cc │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.10.0/dune/geometry/refinement/ │ │ │ │ │ │ - a00215.html │ │ │ │ │ │ - dune/geometry/referenceelements.hh │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ - base.cc │ │ │ │ │ │ - simplex.cc │ │ │ │ │ │ + a00203.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 │ │ │ │ │ │ - a00215.html │ │ │ │ │ │ + a00203.html │ │ │ │ │ │ a5f431ee98541c17b3d9aea2dbc726941 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ simplex.cc │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.10.0/dune/geometry/refinement/ │ │ │ │ │ │ - a00212.html │ │ │ │ │ │ - dune/geometry/multilineargeometry.hh │ │ │ │ │ │ - dune/geometry/referenceelements.hh │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ - base.cc │ │ │ │ │ │ + a00197.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 │ │ │ │ │ │ - a00212.html │ │ │ │ │ │ + a00197.html │ │ │ │ │ │ a944407dc4f6f9a372b10b69bbb5a0792 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ int │ │ │ │ │ │ pointIndex │ │ │ │ │ │ a00274.html │ │ │ │ │ │ @@ -367,64 +367,64 @@ │ │ │ │ │ │ afd47205aa1691498b073d9681fb23f6d │ │ │ │ │ │ (FieldVector< CoordType, dimension > point, const FieldVector< int, dimension > &kuhn) │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ topologyfactory.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.10.0/dune/geometry/ │ │ │ │ │ │ - a00188.html │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ - dune/geometry/typeindex.hh │ │ │ │ │ │ + a00236.html │ │ │ │ │ │ + dune/geometry/type.hh │ │ │ │ │ │ + dune/geometry/typeindex.hh │ │ │ │ │ │ Dune::TopologyFactory │ │ │ │ │ │ Dune::TopologySingletonFactory │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ type.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.10.0/dune/geometry/ │ │ │ │ │ │ - a00236.html │ │ │ │ │ │ + a00212.html │ │ │ │ │ │ Dune::GeometryType │ │ │ │ │ │ Dune │ │ │ │ │ │ Dune::GeometryTypes │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ typeindex.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.10.0/dune/geometry/ │ │ │ │ │ │ - a00248.html │ │ │ │ │ │ - type.hh │ │ │ │ │ │ + a00245.html │ │ │ │ │ │ + type.hh │ │ │ │ │ │ Dune::LocalGeometryTypeIndex │ │ │ │ │ │ Dune::GlobalGeometryTypeIndex │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ algorithms.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.10.0/dune/geometry/utility/ │ │ │ │ │ │ - a00176.html │ │ │ │ │ │ - dune/geometry/affinegeometry.hh │ │ │ │ │ │ + a00227.html │ │ │ │ │ │ + dune/geometry/affinegeometry.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ convergence.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.10.0/dune/geometry/utility/ │ │ │ │ │ │ - a00173.html │ │ │ │ │ │ + a00230.html │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ typefromvertexcount.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.10.0/dune/geometry/utility/ │ │ │ │ │ │ - a00179.html │ │ │ │ │ │ - dune/geometry/type.hh │ │ │ │ │ │ + a00233.html │ │ │ │ │ │ + dune/geometry/type.hh │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ virtualrefinement.cc │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.10.0/dune/geometry/ │ │ │ │ │ │ - a00170.html │ │ │ │ │ │ - type.hh │ │ │ │ │ │ - refinement.hh │ │ │ │ │ │ + a00209.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 │ │ │ │ │ │ @@ -434,26 +434,26 @@ │ │ │ │ │ │ Dune::RefinementBuilder │ │ │ │ │ │ Dune::RefinementBuilder< 1, CoordType > │ │ │ │ │ │ Dune::RefinementBuilder< 3, CoordType > │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ #define │ │ │ │ │ │ DUNE_GEOMETRY_VIRTUALREFINEMENT_CC │ │ │ │ │ │ - a00170.html │ │ │ │ │ │ + a00209.html │ │ │ │ │ │ ac82d420bff6cce87d06ad71b4f1cb0c8 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ virtualrefinement.hh │ │ │ │ │ │ /build/reproducible-path/dune-geometry-2.10.0/dune/geometry/ │ │ │ │ │ │ - a00197.html │ │ │ │ │ │ - refinement.hh │ │ │ │ │ │ - type.hh │ │ │ │ │ │ - virtualrefinement.cc │ │ │ │ │ │ + a00185.html │ │ │ │ │ │ + refinement.hh │ │ │ │ │ │ + type.hh │ │ │ │ │ │ + virtualrefinement.cc │ │ │ │ │ │ Dune::VirtualRefinement │ │ │ │ │ │ Dune::VirtualRefinement::Codim │ │ │ │ │ │ Dune │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ Dune::AffineGeometry │ │ │ │ │ │ a01107.html │ │ │ ├── ./usr/share/doc/libdune-geometry-doc/doxygen/files.html │ │ │ │ @@ -77,42 +77,42 @@ │ │ │ │   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 │ │ │ │ - algorithms.hh │ │ │ │ - convergence.hh │ │ │ │ - typefromvertexcount.hh │ │ │ │ - affinegeometry.hhAn implementation of the Geometry interface for affine geometries │ │ │ │ - axisalignedcubegeometry.hhA geometry implementation for axis-aligned hypercubes │ │ │ │ - dimension.hh │ │ │ │ - generalvertexorder.hh │ │ │ │ - localfiniteelementgeometry.hh │ │ │ │ - mappedgeometry.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 │ │ │ │ + algorithms.hh │ │ │ │ + convergence.hh │ │ │ │ + typefromvertexcount.hh │ │ │ │ + affinegeometry.hhAn implementation of the Geometry interface for affine geometries │ │ │ │ + axisalignedcubegeometry.hhA geometry implementation for axis-aligned hypercubes │ │ │ │ + dimension.hh │ │ │ │ + generalvertexorder.hh │ │ │ │ + localfiniteelementgeometry.hh │ │ │ │ + mappedgeometry.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 │ │ │ │ @@ -66,22 +66,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 │ │ │ │ @@ -66,22 +66,22 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
      │ │ │ │
      Here is a list of all macros with links to the files they belong to:
      │ │ │ │
      │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ --- ./usr/share/doc/libdune-geometry-doc/doxygen/a00038.html │ │ │ ├── +++ ./usr/share/doc/libdune-geometry-doc/doxygen/a00008.html │ │ │ │┄ Files identical despite different names